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