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))
}