Fix background blur on Pixel 8

(and other devices (?))

Close #590
This commit is contained in:
MM20 2024-05-23 00:41:43 +02:00
parent 13d2f522e2
commit 6b36fe1963
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
2 changed files with 20 additions and 7 deletions

View File

@ -2,8 +2,11 @@ package de.mm20.launcher2.ui.launcher.helper
import android.app.Activity import android.app.Activity
import android.view.WindowManager import android.view.WindowManager
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.VectorConverter
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@ -11,19 +14,28 @@ import de.mm20.launcher2.ktx.isAtLeastApiLevel
@Composable @Composable
fun WallpaperBlur(blurRadius: () -> Int) { fun WallpaperBlur(blurRadius: () -> Int) {
if (!isAtLeastApiLevel(31)) return
val context = LocalContext.current val context = LocalContext.current
val density = LocalDensity.current val density = LocalDensity.current
val radius = blurRadius() val radius = blurRadius()
val animatable = remember { Animatable(radius, Int.VectorConverter) }
LaunchedEffect(radius) { LaunchedEffect(radius) {
if (!isAtLeastApiLevel(31)) return@LaunchedEffect animatable.animateTo(with(density) { radius.dp.toPx().toInt() }) {
(context as Activity).window.attributes = context.window.attributes.also { if (value > 0) {
if (radius > 0) { val windowAttributes = (context as Activity).window.attributes
it.blurBehindRadius = with(density) { radius.dp.toPx().toInt() } windowAttributes.flags =
it.flags = it.flags or WindowManager.LayoutParams.FLAG_BLUR_BEHIND windowAttributes.flags or WindowManager.LayoutParams.FLAG_BLUR_BEHIND
context.window.attributes = windowAttributes
context.window.setBackgroundBlurRadius(value)
} else { } else {
it.blurBehindRadius = 0 val windowAttributes = (context as Activity).window.attributes
it.flags = it.flags and WindowManager.LayoutParams.FLAG_BLUR_BEHIND.inv() windowAttributes.flags =
windowAttributes.flags and WindowManager.LayoutParams.FLAG_BLUR_BEHIND.inv()
context.window.attributes = windowAttributes
context.window.setBackgroundBlurRadius(0)
} }
} }
} }
} }

View File

@ -30,6 +30,7 @@
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowIsTranslucent">true</item>
</style> </style>
<style name="DialogTheme" parent="BaseTheme"> <style name="DialogTheme" parent="BaseTheme">