diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/assistant/AssistantScaffold.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/assistant/AssistantScaffold.kt index 17637bd8..b433fcef 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/assistant/AssistantScaffold.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/assistant/AssistantScaffold.kt @@ -121,10 +121,6 @@ fun AssistantScaffold( } } - WallpaperBlur { - true - } - LaunchedEffect(darkNavBarIcons, showNavBarScrim) { if (showNavBarScrim) { systemUiController.setNavigationBarColor( diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt index c86f281d..7e1b864f 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt @@ -122,6 +122,10 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent { val wallpaperBlur = dataStore.data.map { it.appearance.blurWallpaper } .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), true) + val wallpaperBlurRadius = dataStore.data.map { it.appearance.blurWallpaperRadius } + .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), 32) + + val fillClockHeight = dataStore.data.map { it.clockWidget.fillHeight } .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), true) val searchBarColor = dataStore.data.map { it.searchBar.color } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt index d5fb2265..0e38bfd0 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt @@ -217,6 +217,7 @@ fun PagerScaffold( } val blurEnabled by viewModel.wallpaperBlur.collectAsState() + val blurRadius by viewModel.wallpaperBlurRadius.collectAsState() val blurWallpaper by remember { derivedStateOf { @@ -225,7 +226,7 @@ fun PagerScaffold( } WallpaperBlur { - blurWallpaper + if (blurWallpaper) blurRadius else 0 } val currentPage = pagerState.currentPage diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt index 6e3268f5..c6f027b5 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt @@ -211,6 +211,7 @@ fun PullDownScaffold( val maxSearchBarOffset = with(density) { 128.dp.toPx() } val blurEnabled by viewModel.wallpaperBlur.collectAsState() + val blurRadius by viewModel.wallpaperBlurRadius.collectAsState() val blurWallpaper by remember { derivedStateOf { @@ -219,7 +220,7 @@ fun PullDownScaffold( } WallpaperBlur { - blurWallpaper + if (blurWallpaper) blurRadius else 0 } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/helper/WallpaperBlur.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/helper/WallpaperBlur.kt index 0a736eb2..11ce62b9 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/helper/WallpaperBlur.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/helper/WallpaperBlur.kt @@ -10,15 +10,15 @@ import androidx.compose.ui.unit.dp import de.mm20.launcher2.ktx.isAtLeastApiLevel @Composable -fun WallpaperBlur(blur: () -> Boolean) { +fun WallpaperBlur(blurRadius: () -> Int) { val context = LocalContext.current val density = LocalDensity.current - val blurWallpaper = blur() - LaunchedEffect(blurWallpaper) { + val radius = blurRadius() + LaunchedEffect(radius) { if (!isAtLeastApiLevel(31)) return@LaunchedEffect (context as Activity).window.attributes = context.window.attributes.also { - if (blurWallpaper) { - it.blurBehindRadius = with(density) { 32.dp.toPx().toInt() } + if (radius > 0) { + it.blurBehindRadius = with(density) { radius.dp.toPx().toInt() } it.flags = it.flags or WindowManager.LayoutParams.FLAG_BLUR_BEHIND } else { it.blurBehindRadius = 0 diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreen.kt index 59efe033..775b73eb 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreen.kt @@ -34,6 +34,7 @@ import de.mm20.launcher2.ui.component.preferences.ListPreference import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import de.mm20.launcher2.ui.component.preferences.SliderPreference import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.locals.LocalNavController import kotlinx.coroutines.delay @@ -57,6 +58,7 @@ fun HomescreenSettingsScreen() { val lightStatusBar by viewModel.statusBarIcons.collectAsStateWithLifecycle(null) val dimWallpaper by viewModel.dimWallpaper.collectAsStateWithLifecycle() val blurWallpaper by viewModel.blurWallpaper.collectAsStateWithLifecycle() + val blurWallpaperRadius by viewModel.blurWallpaperRadius.collectAsStateWithLifecycle() val lightNavBar by viewModel.navBarIcons.collectAsStateWithLifecycle(null) val hideStatusBar by viewModel.hideStatusBar.collectAsStateWithLifecycle(null) val hideNavBar by viewModel.hideNavBar.collectAsStateWithLifecycle(null) @@ -172,6 +174,18 @@ fun HomescreenSettingsScreen() { }, enabled = isBlurSupported ) + AnimatedVisibility(blurWallpaper && isBlurSupported) { + SliderPreference( + title = stringResource(R.string.preference_blur_wallpaper_radius), + value = blurWallpaperRadius, + onValueChanged = { + viewModel.setBlurWallpaperRadius(it) + }, + min = 4, + max = 64, + step = 4, + ) + } } } item { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreenVM.kt index b2d44275..e0593647 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreenVM.kt @@ -52,6 +52,20 @@ class HomescreenSettingsScreenVM( } } + val blurWallpaperRadius = dataStore.data.map { it.appearance.blurWallpaperRadius } + .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), 32) + fun setBlurWallpaperRadius(blurWallpaperRadius: Int) { + viewModelScope.launch { + dataStore.updateData { + it.toBuilder() + .setAppearance( + it.appearance.toBuilder() + .setBlurWallpaperRadius(blurWallpaperRadius) + ).build() + } + } + } + fun openWallpaperChooser(context: AppCompatActivity) { context.startActivity(Intent.createChooser(Intent(Intent.ACTION_SET_WALLPAPER), null)) } diff --git a/core/i18n/src/main/res/values/strings.xml b/core/i18n/src/main/res/values/strings.xml index 4b493a47..0d176c46 100644 --- a/core/i18n/src/main/res/values/strings.xml +++ b/core/i18n/src/main/res/values/strings.xml @@ -532,6 +532,7 @@ Blur wallpaper Use a blur effect on the wallpaper Not supported on this device + Blur radius Choose a wallpaper Badges Configure icon badges diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt index 309d05c7..e1608ccb 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt +++ b/core/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 = 17 +internal const val SchemaVersion = 18 internal fun getMigrations(context: Context): List> { return listOf( @@ -43,5 +43,6 @@ internal fun getMigrations(context: Context): List> { Migration_14_15(), Migration_15_16(), Migration_16_17(), + Migration_17_18(), ) } \ No newline at end of file diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt index 61a52548..bf63dc8a 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt @@ -15,6 +15,7 @@ fun createFactorySettings(context: Context): Settings { .setTheme(Settings.AppearanceSettings.Theme.System) .setDimWallpaper(false) .setBlurWallpaper(true) + .setBlurWallpaperRadius(32) .setThemeId(UUID(0L, 0L).toString()) .setFont(Settings.AppearanceSettings.Font.Outfit) .build() diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_17_18.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_17_18.kt new file mode 100644 index 00000000..94330910 --- /dev/null +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_17_18.kt @@ -0,0 +1,12 @@ +package de.mm20.launcher2.preferences.migrations + +import de.mm20.launcher2.preferences.Settings + +class Migration_17_18 : VersionedMigration(17, 18) { + override suspend fun applyMigrations(builder: Settings.Builder): Settings.Builder { + return builder + .setAppearance(builder.appearance.toBuilder() + .setBlurWallpaperRadius(32) + ) + } +} \ No newline at end of file diff --git a/core/preferences/src/main/proto/settings.proto b/core/preferences/src/main/proto/settings.proto index 23c4cc4e..35f18a24 100644 --- a/core/preferences/src/main/proto/settings.proto +++ b/core/preferences/src/main/proto/settings.proto @@ -89,6 +89,7 @@ message Settings { bool blur_wallpaper = 11; // UUID of the selected theme string theme_id = 12; + uint32 blur_wallpaper_radius = 13; } AppearanceSettings appearance = 2;