diff --git a/build.gradle b/build.gradle
index 0bda043a55..34c50a4030 100644
--- a/build.gradle
+++ b/build.gradle
@@ -416,6 +416,8 @@ dependencies {
implementation('com.kieronquinn.smartspacer:sdk-client:1.0.11') {
exclude group: "com.github.skydoves", module: "balloon"
}
+
+ implementation("com.github.android:renderscript-intrinsics-replacement-toolkit:b6363490c3")
}
ksp {
diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml
index 604cff0040..017e8307e5 100644
--- a/lawnchair/res/values/strings.xml
+++ b/lawnchair/res/values/strings.xml
@@ -470,6 +470,10 @@
Home screen rotation
Allow home screen rotation when device is rotated
+ Enable wallpaper blur
+ Blur intensity
+ Factor threshold
+
Add new apps to home screen
Show feed
@@ -524,7 +528,7 @@
Lawnchair
Google Search bar
- Tranparency
+ Opacity
Corner radius
Apply accent color
Search provider
diff --git a/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt b/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt
index 3da793f790..fe799124d1 100644
--- a/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt
+++ b/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt
@@ -96,6 +96,10 @@ class PreferenceManager private constructor(private val context: Context) : Base
val hotseatQsbCornerRadius = FloatPref("pref_hotseatQsbCornerRadius", 1F, recreate)
val searchBackgroundHotseatTransparency = IntPref("pref_searchHotseatTranparency", 0, recreate)
+ val enableWallpaperBlur = BoolPref("pref_enableWallpaperBlur", false, recreate)
+ val wallpaperBlur = IntPref("pref_wallpaperBlur", 25, recreate)
+ val wallpaperBlurFactorThreshold = IntPref("pref_wallpaperBlurFactor", 25, recreate)
+
val recentsActionScreenshot = BoolPref("pref_recentsActionScreenshot", !isOnePlusStock)
val recentsActionShare = BoolPref("pref_recentsActionShare", isOnePlusStock)
val recentsActionLens = BoolPref("pref_recentsActionLens", true)
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenPreferences.kt
index 9c7b3a6802..c378ec3fed 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenPreferences.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenPreferences.kt
@@ -107,6 +107,31 @@ fun HomeScreenPreferences(
adapter = prefs2.showTopShadow.getAdapter(),
label = stringResource(id = R.string.show_sys_ui_scrim),
)
+
+ val enableWallpaperBlur = prefs.enableWallpaperBlur.getAdapter()
+
+ SwitchPreference(
+ adapter = enableWallpaperBlur,
+ label = stringResource(id = R.string.wallpaper_blur),
+ )
+ ExpandAndShrink(visible = enableWallpaperBlur.state.value) {
+ SliderPreference(
+ label = stringResource(id = R.string.wallpaper_background_blur),
+ adapter = prefs.wallpaperBlur.getAdapter(),
+ step = 5,
+ valueRange = 0..100,
+ showUnit = "%",
+ )
+ }
+ ExpandAndShrink(visible = enableWallpaperBlur.state.value) {
+ SliderPreference(
+ label = stringResource(id = R.string.wallpaper_background_blur_factor),
+ adapter = prefs.wallpaperBlurFactorThreshold.getAdapter(),
+ step = 5,
+ valueRange = 0..100,
+ showUnit = "%",
+ )
+ }
}
PreferenceGroup(heading = stringResource(id = R.string.layout)) {
val columns by prefs.workspaceColumns.getAdapter()
diff --git a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt
index f4bd917e2c..26cf5bd2b5 100644
--- a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt
+++ b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt
@@ -29,9 +29,15 @@ import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
import android.content.res.Resources
import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.graphics.RectF
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Looper
import android.provider.OpenableColumns
+import android.util.Log
import android.util.Size
import android.view.View
import android.widget.TextView
@@ -45,6 +51,7 @@ import com.android.launcher3.Utilities
import com.android.launcher3.util.Executors.MAIN_EXECUTOR
import com.android.launcher3.util.Themes
import com.android.systemui.shared.system.QuickStepContract
+import com.google.android.renderscript.Toolkit
import com.patrykmichalik.opto.core.firstBlocking
import java.util.concurrent.Callable
import java.util.concurrent.ExecutionException
@@ -245,3 +252,41 @@ fun Context.getDefaultResolveInfo(): ResolveInfo? {
val intent = Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)
return packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY)
}
+
+fun Drawable.toBitmap(): Bitmap {
+ if (this is BitmapDrawable) {
+ return bitmap
+ }
+
+ val bitmap = Bitmap.createBitmap(
+ intrinsicWidth.takeIf { it > 0 } ?: 1,
+ intrinsicHeight.takeIf { it > 0 } ?: 1,
+ Bitmap.Config.ARGB_8888,
+ )
+ val canvas = Canvas(bitmap)
+ setBounds(0, 0, canvas.width, canvas.height)
+ draw(canvas)
+
+ return bitmap
+}
+
+fun createRoundedBitmap(color: Int, cornerRadius: Float): Bitmap {
+ val bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
+ val canvas = Canvas(bitmap)
+ val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
+ this.color = color
+ }
+ val rect = RectF(0f, 0f, canvas.width.toFloat(), canvas.height.toFloat())
+ canvas.drawRoundRect(rect, cornerRadius, cornerRadius, paint)
+ return bitmap
+}
+
+fun blurBitmap(source: Bitmap, percent: Int, factorThreshold: Int = 25): Bitmap {
+ try {
+ val factor = percent.toFloat().div(100f) * factorThreshold
+ return Toolkit.blur(source, factor.toInt())
+ } catch (e: Exception) {
+ Log.e("LawnchairUtil", "Error bluring bitmap: $e")
+ return source
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index a77a8daf38..eb42690204 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -6249,6 +6249,7 @@ public abstract class RecentsView extends PagedView
private final StatsLogManager mStatsLogManager;
PreferenceManager2 mPreferenceManager2;
+ PreferenceManager mPreferenceManger;
/**
* Used to inflate the Workspace from XML.
@@ -329,6 +337,7 @@ public class Workspace extends PagedView
mAllAppsIconSize = mLauncher.getDeviceProfile().allAppsIconSizePx;
mWallpaperManager = WallpaperManager.getInstance(context);
mPreferenceManager2 = PreferenceManager2.getInstance(context);
+ mPreferenceManger = PreferenceManager.getInstance(context);
mWallpaperOffset = new WallpaperOffsetInterpolator(this);
@@ -339,6 +348,18 @@ public class Workspace extends PagedView
setMotionEventSplittingEnabled(true);
setOnTouchListener(new WorkspaceTouchListener(mLauncher, this));
mStatsLogManager = StatsLogManager.newInstance(context);
+
+ if (mPreferenceManger.getEnableWallpaperBlur().get() && mWallpaperManager.getDrawable() != null) {
+ var blurWallpaper = mPreferenceManger.getWallpaperBlur().get();
+ var blurThreshold = mPreferenceManger.getWallpaperBlurFactorThreshold().get();
+ var wallpaperBitmap = mWallpaperManager.getDrawable();
+ try {
+ mWallpaperManager.setBitmap(LawnchairUtilsKt.blurBitmap(toBitmap(wallpaperBitmap),blurWallpaper, blurThreshold), null, true, WallpaperManager.FLAG_SYSTEM);
+ mWallpaperManager.forgetLoadedWallpaper();
+ } catch (Exception ex) {
+ Log.e(TAG, "error failed bluring wallpaper");
+ }
+ }
}
@Override