From 24242c45cd668d1a1cd7646fbe13093863237cb0 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Mon, 11 Jul 2022 18:11:25 +0200 Subject: [PATCH] Add an preference to disable the blur effect on Android 12+ --- i18n/src/main/res/values/strings.xml | 3 +++ .../mm20/launcher2/preferences/DataStore.kt | 3 ++- .../de/mm20/launcher2/preferences/Defaults.kt | 1 + .../preferences/migrations/Migration_7_8.kt | 13 ++++++++++++ preferences/src/main/proto/settings.proto | 2 ++ .../ui/launcher/LauncherScaffoldVM.kt | 3 +++ .../launcher2/ui/launcher/PagerScaffold.kt | 9 ++++++--- .../launcher2/ui/launcher/PullDownScaffold.kt | 4 +++- .../appearance/AppearanceSettingsScreen.kt | 19 ++++++++++++++++-- .../appearance/AppearanceSettingsScreenVM.kt | 20 +++++++++++++++++++ 10 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_7_8.kt diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index c0ca71d3..d2b08152 100644 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -469,6 +469,9 @@ Wallpaper Dim wallpaper In dark themes, darken wallpaper + Blur wallpaper + Use a blur effect for the wallpaper + Not supported on this device Choose a wallpaper Badges Configure icon badges diff --git a/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt b/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt index ca8ea0cc..42dad212 100644 --- a/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt +++ b/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt @@ -22,7 +22,7 @@ internal val Context.dataStore: LauncherDataStore by dataStore( } ) -internal const val SchemaVersion = 7 +internal const val SchemaVersion = 8 internal fun getMigrations(context: Context): List> { return listOf( @@ -33,5 +33,6 @@ internal fun getMigrations(context: Context): List> { Migration_4_5(), Migration_5_6(), Migration_6_7(), + Migration_7_8(), ) } \ No newline at end of file diff --git a/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt b/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt index 7ddad708..2ad79f26 100644 --- a/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt +++ b/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt @@ -11,6 +11,7 @@ fun createFactorySettings(context: Context): Settings { .setTheme(Settings.AppearanceSettings.Theme.System) .setColorScheme(Settings.AppearanceSettings.ColorScheme.Default) .setDimWallpaper(false) + .setBlurWallpaper(true) .setCustomColors(Settings.AppearanceSettings.CustomColors.newBuilder() .setAdvancedMode(false) .setBaseColors(DefaultCustomColorsBase) diff --git a/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_7_8.kt b/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_7_8.kt new file mode 100644 index 00000000..9be5ffdd --- /dev/null +++ b/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_7_8.kt @@ -0,0 +1,13 @@ +package de.mm20.launcher2.preferences.migrations + +import de.mm20.launcher2.preferences.Settings + +class Migration_7_8: VersionedMigration(7, 8) { + override suspend fun applyMigrations(builder: Settings.Builder): Settings.Builder { + return builder.setAppearance( + builder.appearance.toBuilder() + .setBlurWallpaper(true) + ) + } + +} \ No newline at end of file diff --git a/preferences/src/main/proto/settings.proto b/preferences/src/main/proto/settings.proto index 279e7581..4c456c5f 100644 --- a/preferences/src/main/proto/settings.proto +++ b/preferences/src/main/proto/settings.proto @@ -77,6 +77,8 @@ message Settings { SystemDefault = 1; } Font font = 10; + + bool blur_wallpaper = 11; } AppearanceSettings appearance = 2; diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt index 30810d3b..cf9a99d3 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt @@ -2,6 +2,7 @@ package de.mm20.launcher2.ui.launcher import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope import de.mm20.launcher2.preferences.LauncherDataStore import kotlinx.coroutines.flow.first @@ -47,4 +48,6 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent { isSearchOpen.value = false isWidgetEditMode.value = editMode } + + val wallpaperBlur = dataStore.data.map { it.appearance.blurWallpaper }.asLiveData() } \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt index 133d81dc..adf54c9a 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt @@ -126,11 +126,14 @@ fun PagerScaffold( } } + val blurEnabled by viewModel.wallpaperBlur.observeAsState(false) + val blurWallpaper by remember { derivedStateOf { - isSearchOpen || swipeableState.progress.to == Page.Widgets && swipeableState.progress.fraction <= 0.5f || - swipeableState.progress.to == Page.Search && swipeableState.progress.fraction > 0.5f || - !isWidgetsScrollZero + blurEnabled && ( + isSearchOpen || swipeableState.progress.to == Page.Widgets && swipeableState.progress.fraction <= 0.5f || + swipeableState.progress.to == Page.Search && swipeableState.progress.fraction > 0.5f || + !isWidgetsScrollZero) } } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt index 341dab53..b9eb1148 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt @@ -131,9 +131,11 @@ fun PullDownScaffold( val maxSearchBarOffset = with(density) { 128.dp.toPx() } + val blurEnabled by viewModel.wallpaperBlur.observeAsState(false) + val blurWallpaper by remember { derivedStateOf { - isSearchOpen || offsetY.value > toggleSearchThreshold || widgetsScrollState.value > 0 + blurEnabled && (isSearchOpen || offsetY.value > toggleSearchThreshold || widgetsScrollState.value > 0) } } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt index 1c591ace..4c0fbb21 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt @@ -2,7 +2,6 @@ package de.mm20.launcher2.ui.settings.appearance import android.graphics.drawable.ColorDrawable import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.grid.GridCells @@ -28,9 +27,9 @@ import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.HorizontalPager import com.google.accompanist.pager.HorizontalPagerIndicator import com.google.accompanist.pager.rememberPagerState -import de.mm20.launcher2.icons.ColorLayer import de.mm20.launcher2.icons.StaticIconLayer import de.mm20.launcher2.icons.StaticLauncherIcon +import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.preferences.Settings.* import de.mm20.launcher2.preferences.Settings.AppearanceSettings.ColorScheme import de.mm20.launcher2.preferences.Settings.AppearanceSettings.Theme @@ -155,6 +154,22 @@ fun AppearanceSettingsScreen() { viewModel.setDimWallpaper(it) } ) + if (isAtLeastApiLevel(31)) { + val isBlurSupported = remember { viewModel.isBlurAvailable(context) } + val blurWallpaper by viewModel.blurWallpaper.observeAsState() + SwitchPreference( + title = stringResource(R.string.preference_blur_wallpaper), + summary = stringResource( + if (isBlurSupported) R.string.preference_blur_wallpaper_summary + else R.string.preference_blur_wallpaper_unsupported + ), + value = blurWallpaper == true && isBlurSupported, + onValueChanged = { + viewModel.setBlurWallpaper(it) + }, + enabled = isBlurSupported + ) + } } PreferenceCategory(stringResource(R.string.preference_category_icons)) { val iconShape by viewModel.iconShape.observeAsState(IconSettings.IconShape.PlatformDefault) diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt index b110cea8..700a41d8 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt @@ -1,10 +1,14 @@ package de.mm20.launcher2.ui.settings.appearance +import android.content.Context import android.content.Intent +import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.getSystemService import androidx.lifecycle.* import de.mm20.launcher2.icons.IconPack import de.mm20.launcher2.icons.IconRepository +import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.Settings import de.mm20.launcher2.preferences.Settings.AppearanceSettings.* @@ -85,6 +89,22 @@ class AppearanceSettingsScreenVM : ViewModel(), KoinComponent { } } + fun isBlurAvailable(context: Context): Boolean { + if (!isAtLeastApiLevel(31)) return false + return context.getSystemService()?.isCrossWindowBlurEnabled == true + } + + val blurWallpaper = dataStore.data.map { it.appearance.blurWallpaper }.asLiveData() + fun setBlurWallpaper(blurWallpaper: Boolean) { + viewModelScope.launch { + dataStore.updateData { + it.toBuilder() + .setAppearance(it.appearance.toBuilder().setBlurWallpaper(blurWallpaper)) + .build() + } + } + } + fun openWallpaperChooser(context: AppCompatActivity) { context.startActivity(Intent.createChooser(Intent(Intent.ACTION_SET_WALLPAPER), null)) }