From 77be90e39ea8d4a7321227f4f1868e8ff68537c3 Mon Sep 17 00:00:00 2001 From: balajitechlabs <212744006+Balajitechlabs@users.noreply.github.com> Date: Sun, 11 Oct 2026 18:59:07 +0530 Subject: [PATCH 01/10] feat(search): add frosted glass active screen blur option for search overlay --- app/src/main/AndroidManifest.xml | 2 +- .../essentials/data/repository/SettingsRepository.kt | 4 ++++ .../ui/activities/PixelSearchResultsActivity.kt | 6 ++++++ .../ui/activities/PixelSearchbarSettingsActivity.kt | 12 ++++++++++++ .../sameerasw/essentials/viewmodels/MainViewModel.kt | 7 +++++++ app/src/main/res/values/strings.xml | 2 ++ 6 files changed, 32 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c2a85aacdd..df0ad8d519 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -296,7 +296,7 @@ android:label="@string/essential_search_label" android:launchMode="singleInstance" android:taskAffinity="com.sameerasw.essentials.search" - android:theme="@style/Theme.Essentials.WallpaperTranslucent" + android:theme="@style/Theme.Essentials.Translucent" android:windowSoftInputMode="stateVisible|adjustResize" /> + HapticUtil.performVirtualKeyHaptic(view) + viewModel.setPixelSearchWallpaperBackgroundEnabled(checked) + }, + ) } } } diff --git a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt index af2c0b8800..611a5a1e25 100644 --- a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt +++ b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt @@ -2890,6 +2890,7 @@ class MainViewModel : ViewModel() { pixelSearchResultShortcuts.value = settingsRepository.isPixelSearchResultShortcutsEnabled() pixelSearchResultWeb.value = settingsRepository.isPixelSearchResultWebEnabled() pixelSearchBubblesWeb.value = settingsRepository.isPixelSearchBubblesWebEnabled() + pixelSearchWallpaperBackground.value = settingsRepository.isPixelSearchWallpaperBackgroundEnabled() pixelSearchEngine.value = settingsRepository.getPixelSearchEngine() isPocketModeEnabled.value = settingsRepository.getBoolean(SettingsRepository.KEY_POCKET_MODE_ENABLED) @@ -4682,6 +4683,7 @@ class MainViewModel : ViewModel() { val pixelSearchResultShortcuts = mutableStateOf(true) val pixelSearchResultWeb = mutableStateOf(true) val pixelSearchBubblesWeb = mutableStateOf(false) + val pixelSearchWallpaperBackground = mutableStateOf(false) val pixelSearchEngine = mutableStateOf("Google") fun setPixelSearchResultAppsEnabled(enabled: Boolean) { @@ -4724,6 +4726,11 @@ class MainViewModel : ViewModel() { settingsRepository.setPixelSearchBubblesWebEnabled(enabled) } + fun setPixelSearchWallpaperBackgroundEnabled(enabled: Boolean) { + pixelSearchWallpaperBackground.value = enabled + settingsRepository.setPixelSearchWallpaperBackgroundEnabled(enabled) + } + fun setPixelSearchEngine(engine: String) { pixelSearchEngine.value = engine settingsRepository.setPixelSearchEngine(engine) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9f8312f3d9..aa192e22fc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2666,6 +2666,8 @@ Custom tap action Use DIY tap action instead of widget\'s own Music + Show wallpaper in background + Blur the home screen wallpaper instead of the active screen Restart Shizuku Please enter Shizuku auth token in settings first From 8375b3ab6e630a09df23da51e443f32d77f9583c Mon Sep 17 00:00:00 2001 From: balajitechlabs <212744006+Balajitechlabs@users.noreply.github.com> Date: Sun, 11 Oct 2026 19:49:04 +0530 Subject: [PATCH 02/10] fix(ui): prevent action buttons from being pushed off-screen in unsupported features sheet --- .../ui/core/sheets/UnsupportedFeaturesConfirmationSheet.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/core/sheets/UnsupportedFeaturesConfirmationSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/core/sheets/UnsupportedFeaturesConfirmationSheet.kt index 6517af9b7a..2de0f142d3 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/core/sheets/UnsupportedFeaturesConfirmationSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/core/sheets/UnsupportedFeaturesConfirmationSheet.kt @@ -74,7 +74,10 @@ fun UnsupportedFeaturesConfirmationSheet( ) RoundedCardContainer( - modifier = Modifier.fillMaxWidth(), + modifier = + Modifier + .fillMaxWidth() + .weight(1f, fill = false), ) { LazyColumn( verticalArrangement = Arrangement.spacedBy(8.dp), From 09229dbfe01ef9059aa9c34171e7cff5bbdc998a Mon Sep 17 00:00:00 2001 From: balajitechlabs <212744006+Balajitechlabs@users.noreply.github.com> Date: Sun, 11 Oct 2026 21:00:47 +0530 Subject: [PATCH 03/10] fix(search): preserve system predictive back gesture and add back handler for frosted glass --- app/src/main/AndroidManifest.xml | 2 +- .../data/repository/SettingsRepository.kt | 2 +- .../activities/PixelSearchResultsActivity.kt | 38 +++++++++++++++++-- .../essentials/viewmodels/MainViewModel.kt | 2 +- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index df0ad8d519..c2a85aacdd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -296,7 +296,7 @@ android:label="@string/essential_search_label" android:launchMode="singleInstance" android:taskAffinity="com.sameerasw.essentials.search" - android:theme="@style/Theme.Essentials.Translucent" + android:theme="@style/Theme.Essentials.WallpaperTranslucent" android:windowSoftInputMode="stateVisible|adjustResize" /> + try { + progress.collect { backEvent -> + backProgress.snapTo(backEvent.progress) + } + onFinish() + } catch (e: java.util.concurrent.CancellationException) { + scope.launch { + backProgress.animateTo(0f, tween(250)) + } + } + } + } + var query by remember { mutableStateOf(initialQuery) } val focusRequester = remember { FocusRequester() } var selectedTab by remember { mutableStateOf(PixelSearchTab.ALL) } @@ -648,6 +669,17 @@ fun PixelSearchResultsScreen( Box( modifier = Modifier .fillMaxSize() + .graphicsLayer { + if (!isWallpaperBg && backProgress.value > 0f) { + val p = backProgress.value + val scale = 1f - (p * 0.08f) + scaleX = scale + scaleY = scale + alpha = 1f - (p * 0.35f) + shape = RoundedCornerShape((p * 28).dp) + clip = true + } + } .background(scrimColor), ) { Box( diff --git a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt index 611a5a1e25..5cb7b7f397 100644 --- a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt +++ b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt @@ -4683,7 +4683,7 @@ class MainViewModel : ViewModel() { val pixelSearchResultShortcuts = mutableStateOf(true) val pixelSearchResultWeb = mutableStateOf(true) val pixelSearchBubblesWeb = mutableStateOf(false) - val pixelSearchWallpaperBackground = mutableStateOf(false) + val pixelSearchWallpaperBackground = mutableStateOf(true) val pixelSearchEngine = mutableStateOf("Google") fun setPixelSearchResultAppsEnabled(enabled: Boolean) { From 7b0760e0a0e72c006ae3e2cae9b43ea6e0020ce5 Mon Sep 17 00:00:00 2001 From: balajitechlabs <212744006+Balajitechlabs@users.noreply.github.com> Date: Sun, 11 Oct 2026 22:07:03 +0530 Subject: [PATCH 04/10] feat(search): add blur toggle option for wallpaper background --- .../data/repository/SettingsRepository.kt | 6 +-- .../activities/PixelSearchResultsActivity.kt | 49 ++++--------------- .../PixelSearchbarSettingsActivity.kt | 12 ++--- .../essentials/viewmodels/MainViewModel.kt | 10 ++-- app/src/main/res/values/strings.xml | 4 +- 5 files changed, 25 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt index 41e5603667..ce8c0e984a 100644 --- a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt +++ b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt @@ -439,7 +439,7 @@ class SettingsRepository( const val KEY_PIXEL_SEARCH_RESULT_FILES = "pixel_search_result_files" const val KEY_PIXEL_SEARCH_BUBBLES_WEB = "pixel_search_bubbles_web" const val KEY_PIXEL_SEARCH_ENGINE = "pixel_search_engine" - const val KEY_PIXEL_SEARCH_WALLPAPER_BG = "pixel_search_wallpaper_bg" + const val KEY_PIXEL_SEARCH_BLUR = "pixel_search_blur" const val KEY_AUTO_ACCESSIBILITY_ENABLED = "auto_accessibility_enabled" const val KEY_USE_BLUR = "use_blur" const val KEY_USE_RIPPLE = "use_ripple" @@ -3703,8 +3703,8 @@ class SettingsRepository( fun getPixelSearchEngine(): String = getString(KEY_PIXEL_SEARCH_ENGINE, "Google") ?: "Google" fun setPixelSearchEngine(engine: String) = putString(KEY_PIXEL_SEARCH_ENGINE, engine) - fun isPixelSearchWallpaperBackgroundEnabled(): Boolean = getBoolean(KEY_PIXEL_SEARCH_WALLPAPER_BG, true) - fun setPixelSearchWallpaperBackgroundEnabled(enabled: Boolean) = putBoolean(KEY_PIXEL_SEARCH_WALLPAPER_BG, enabled) + fun isPixelSearchBlurEnabled(): Boolean = getBoolean(KEY_PIXEL_SEARCH_BLUR, true) + fun setPixelSearchBlurEnabled(enabled: Boolean) = putBoolean(KEY_PIXEL_SEARCH_BLUR, enabled) fun isBubbleWebFullscreen(): Boolean = getBoolean(KEY_BUBBLE_WEB_FULLSCREEN, false) fun setBubbleWebFullscreen(fullscreen: Boolean) = putBoolean(KEY_BUBBLE_WEB_FULLSCREEN, fullscreen) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt index 70982b39c4..5f61a13231 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt @@ -23,14 +23,11 @@ import android.view.WindowInsetsAnimationController import android.view.WindowManager import androidx.activity.ComponentActivity import androidx.activity.SystemBarStyle -import androidx.activity.compose.PredictiveBackHandler import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.Spring import androidx.compose.animation.core.animate import androidx.compose.animation.core.spring -import androidx.compose.animation.core.tween import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -92,7 +89,6 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.input.nestedscroll.nestedScroll @@ -157,11 +153,6 @@ import kotlinx.coroutines.withContext class PixelSearchResultsActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { - val repository = SettingsRepository(this) - if (!repository.isPixelSearchWallpaperBackgroundEnabled()) { - setTheme(R.style.Theme_Essentials_Translucent) - window.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) - } WindowCompat.setDecorFitsSystemWindows(window, false) super.onCreate(savedInstanceState) enableEdgeToEdge( @@ -182,9 +173,16 @@ class PixelSearchResultsActivity : ComponentActivity() { val isSystemDark = (resources.configuration.uiMode and android.content.res.Configuration.UI_MODE_NIGHT_MASK) == android.content.res.Configuration.UI_MODE_NIGHT_YES val dimAmount = if (isSystemDark) 0.2f else 0.08f + val repository = SettingsRepository(this) + val isBlurEnabled = repository.isPixelSearchBlurEnabled() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - window.addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND) - window.attributes.blurBehindRadius = 60 + if (isBlurEnabled) { + window.addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND) + window.attributes.blurBehindRadius = 60 + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND) + } window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) window.setDimAmount(dimAmount) } else { @@ -228,24 +226,6 @@ fun PixelSearchResultsScreen( val keyboardController = LocalSoftwareKeyboardController.current val density = LocalDensity.current - val isWallpaperBg = remember { repository.isPixelSearchWallpaperBackgroundEnabled() } - val backProgress = remember { Animatable(0f) } - - if (!isWallpaperBg) { - PredictiveBackHandler { progress -> - try { - progress.collect { backEvent -> - backProgress.snapTo(backEvent.progress) - } - onFinish() - } catch (e: java.util.concurrent.CancellationException) { - scope.launch { - backProgress.animateTo(0f, tween(250)) - } - } - } - } - var query by remember { mutableStateOf(initialQuery) } val focusRequester = remember { FocusRequester() } var selectedTab by remember { mutableStateOf(PixelSearchTab.ALL) } @@ -669,17 +649,6 @@ fun PixelSearchResultsScreen( Box( modifier = Modifier .fillMaxSize() - .graphicsLayer { - if (!isWallpaperBg && backProgress.value > 0f) { - val p = backProgress.value - val scale = 1f - (p * 0.08f) - scaleX = scale - scaleY = scale - alpha = 1f - (p * 0.35f) - shape = RoundedCornerShape((p * 28).dp) - clip = true - } - } .background(scrimColor), ) { Box( diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt index 451a6f6cdf..869cd170c6 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt @@ -989,15 +989,15 @@ fun PixelSearchbarSettingsUI( } } - val wallpaperBgEnabled = viewModel.pixelSearchWallpaperBackground.value + val blurEnabled = viewModel.pixelSearchBlur.value IconToggleItem( - iconRes = R.drawable.rounded_wallpaper_24, - title = stringResource(R.string.pref_pixel_search_wallpaper_bg_title), - description = stringResource(R.string.pref_pixel_search_wallpaper_bg_desc), - isChecked = wallpaperBgEnabled, + iconRes = R.drawable.rounded_blur_on_24, + title = stringResource(R.string.pref_pixel_search_blur_title), + description = stringResource(R.string.pref_pixel_search_blur_desc), + isChecked = blurEnabled, onCheckedChange = { checked -> HapticUtil.performVirtualKeyHaptic(view) - viewModel.setPixelSearchWallpaperBackgroundEnabled(checked) + viewModel.setPixelSearchBlurEnabled(checked) }, ) } diff --git a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt index 5cb7b7f397..a3a1b96dc8 100644 --- a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt +++ b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt @@ -2890,7 +2890,7 @@ class MainViewModel : ViewModel() { pixelSearchResultShortcuts.value = settingsRepository.isPixelSearchResultShortcutsEnabled() pixelSearchResultWeb.value = settingsRepository.isPixelSearchResultWebEnabled() pixelSearchBubblesWeb.value = settingsRepository.isPixelSearchBubblesWebEnabled() - pixelSearchWallpaperBackground.value = settingsRepository.isPixelSearchWallpaperBackgroundEnabled() + pixelSearchBlur.value = settingsRepository.isPixelSearchBlurEnabled() pixelSearchEngine.value = settingsRepository.getPixelSearchEngine() isPocketModeEnabled.value = settingsRepository.getBoolean(SettingsRepository.KEY_POCKET_MODE_ENABLED) @@ -4683,7 +4683,7 @@ class MainViewModel : ViewModel() { val pixelSearchResultShortcuts = mutableStateOf(true) val pixelSearchResultWeb = mutableStateOf(true) val pixelSearchBubblesWeb = mutableStateOf(false) - val pixelSearchWallpaperBackground = mutableStateOf(true) + val pixelSearchBlur = mutableStateOf(true) val pixelSearchEngine = mutableStateOf("Google") fun setPixelSearchResultAppsEnabled(enabled: Boolean) { @@ -4726,9 +4726,9 @@ class MainViewModel : ViewModel() { settingsRepository.setPixelSearchBubblesWebEnabled(enabled) } - fun setPixelSearchWallpaperBackgroundEnabled(enabled: Boolean) { - pixelSearchWallpaperBackground.value = enabled - settingsRepository.setPixelSearchWallpaperBackgroundEnabled(enabled) + fun setPixelSearchBlurEnabled(enabled: Boolean) { + pixelSearchBlur.value = enabled + settingsRepository.setPixelSearchBlurEnabled(enabled) } fun setPixelSearchEngine(engine: String) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aa192e22fc..8bcb0ba7d7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2666,8 +2666,8 @@ Custom tap action Use DIY tap action instead of widget\'s own Music - Show wallpaper in background - Blur the home screen wallpaper instead of the active screen + Blur + Blur the wallpaper background Restart Shizuku Please enter Shizuku auth token in settings first From df0281a69a6560fa7cfcc18101279353f032c3b7 Mon Sep 17 00:00:00 2001 From: sameerasw Date: Tue, 13 Oct 2026 11:55:53 +0530 Subject: [PATCH 05/10] fix: broken cofigs after changes --- .../sameerasw/essentials/data/repository/SettingsRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt index ce8c0e984a..143010566b 100644 --- a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt +++ b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt @@ -439,7 +439,7 @@ class SettingsRepository( const val KEY_PIXEL_SEARCH_RESULT_FILES = "pixel_search_result_files" const val KEY_PIXEL_SEARCH_BUBBLES_WEB = "pixel_search_bubbles_web" const val KEY_PIXEL_SEARCH_ENGINE = "pixel_search_engine" - const val KEY_PIXEL_SEARCH_BLUR = "pixel_search_blur" + const val KEY_PIXEL_SEARCH_BLUR = "pixel_search_blur_enabled" const val KEY_AUTO_ACCESSIBILITY_ENABLED = "auto_accessibility_enabled" const val KEY_USE_BLUR = "use_blur" const val KEY_USE_RIPPLE = "use_ripple" From 011c3aae59673e1a12f03d9f32ab60ccd7c1a6a5 Mon Sep 17 00:00:00 2001 From: balajitechlabs <212744006+Balajitechlabs@users.noreply.github.com> Date: Sun, 18 Oct 2026 10:07:04 +0530 Subject: [PATCH 06/10] feat(search): refine blur behind lifecycle and frosted glass scrim --- .../activities/PixelSearchResultsActivity.kt | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt index 5f61a13231..b6fa430013 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt @@ -170,25 +170,7 @@ class PixelSearchResultsActivity : ComponentActivity() { window.isNavigationBarContrastEnforced = false } - val isSystemDark = (resources.configuration.uiMode and android.content.res.Configuration.UI_MODE_NIGHT_MASK) == android.content.res.Configuration.UI_MODE_NIGHT_YES - val dimAmount = if (isSystemDark) 0.2f else 0.08f - - val repository = SettingsRepository(this) - val isBlurEnabled = repository.isPixelSearchBlurEnabled() - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - if (isBlurEnabled) { - window.addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND) - window.attributes.blurBehindRadius = 60 - } else { - window.clearFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND) - } - window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) - window.setDimAmount(dimAmount) - } else { - window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) - window.setDimAmount(if (isSystemDark) 0.35f else 0.15f) - } + applyBlur() val initialQuery = intent.getStringExtra(SearchManager.QUERY) ?: intent.getStringExtra("query") @@ -207,9 +189,37 @@ class PixelSearchResultsActivity : ComponentActivity() { } } + override fun onResume() { + super.onResume() + applyBlur() + } + override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) setIntent(intent) + applyBlur() + } + + private fun applyBlur() { + val isSystemDark = (resources.configuration.uiMode and android.content.res.Configuration.UI_MODE_NIGHT_MASK) == android.content.res.Configuration.UI_MODE_NIGHT_YES + val dimAmount = if (isSystemDark) 0.2f else 0.08f + + val repository = SettingsRepository(this) + val isBlurEnabled = repository.isPixelSearchBlurEnabled() + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + if (isBlurEnabled) { + window.addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND) + window.attributes.blurBehindRadius = 60 + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND) + } + window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + window.setDimAmount(dimAmount) + } else { + window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + window.setDimAmount(if (isSystemDark) 0.35f else 0.15f) + } } } @@ -644,7 +654,9 @@ fun PixelSearchResultsScreen( } } - val scrimColor = MaterialTheme.colorScheme.surfaceContainer.copy(alpha = 0.55f) + val isBlurEnabled = remember { repository.isPixelSearchBlurEnabled() } + val scrimAlpha = if (isBlurEnabled) 0.55f else 0.85f + val scrimColor = MaterialTheme.colorScheme.surfaceContainer.copy(alpha = scrimAlpha) Box( modifier = Modifier From d003ee8f98a92d8a31d92aafc6abdce5d6d35525 Mon Sep 17 00:00:00 2001 From: balajitechlabs <212744006+Balajitechlabs@users.noreply.github.com> Date: Sun, 18 Oct 2026 10:19:02 +0530 Subject: [PATCH 07/10] feat(search): gate blur setting to Android 12+ and handle cross-window blur state --- .../activities/PixelSearchResultsActivity.kt | 16 ++++++++++--- .../PixelSearchbarSettingsActivity.kt | 24 ++++++++++--------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt index b6fa430013..a110524aef 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt @@ -208,12 +208,15 @@ class PixelSearchResultsActivity : ComponentActivity() { val isBlurEnabled = repository.isPixelSearchBlurEnabled() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + val params = window.attributes if (isBlurEnabled) { window.addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND) - window.attributes.blurBehindRadius = 60 + params.blurBehindRadius = 60 } else { window.clearFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND) + params.blurBehindRadius = 0 } + window.attributes = params window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) window.setDimAmount(dimAmount) } else { @@ -654,8 +657,15 @@ fun PixelSearchResultsScreen( } } - val isBlurEnabled = remember { repository.isPixelSearchBlurEnabled() } - val scrimAlpha = if (isBlurEnabled) 0.55f else 0.85f + val isBlurEffective = remember(context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + val windowManager = context.getSystemService(WindowManager::class.java) + repository.isPixelSearchBlurEnabled() && (windowManager?.isCrossWindowBlurEnabled == true) + } else { + false + } + } + val scrimAlpha = if (isBlurEffective) 0.55f else 0.85f val scrimColor = MaterialTheme.colorScheme.surfaceContainer.copy(alpha = scrimAlpha) Box( diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt index 869cd170c6..be921f959b 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt @@ -989,17 +989,19 @@ fun PixelSearchbarSettingsUI( } } - val blurEnabled = viewModel.pixelSearchBlur.value - IconToggleItem( - iconRes = R.drawable.rounded_blur_on_24, - title = stringResource(R.string.pref_pixel_search_blur_title), - description = stringResource(R.string.pref_pixel_search_blur_desc), - isChecked = blurEnabled, - onCheckedChange = { checked -> - HapticUtil.performVirtualKeyHaptic(view) - viewModel.setPixelSearchBlurEnabled(checked) - }, - ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + val blurEnabled = viewModel.pixelSearchBlur.value + IconToggleItem( + iconRes = R.drawable.rounded_blur_on_24, + title = stringResource(R.string.pref_pixel_search_blur_title), + description = stringResource(R.string.pref_pixel_search_blur_desc), + isChecked = blurEnabled, + onCheckedChange = { checked -> + HapticUtil.performVirtualKeyHaptic(view) + viewModel.setPixelSearchBlurEnabled(checked) + }, + ) + } } } } From ad3ae903dfaeab05cbff7535d27af7c8ca927212 Mon Sep 17 00:00:00 2001 From: balajitechlabs <212744006+Balajitechlabs@users.noreply.github.com> Date: Sun, 18 Oct 2026 11:40:27 +0530 Subject: [PATCH 08/10] feat(search): add blur options sheet with wallpaper toggle and intensity control --- .../data/repository/SettingsRepository.kt | 8 ++ .../activities/PixelSearchResultsActivity.kt | 10 ++- .../PixelSearchbarSettingsActivity.kt | 10 +++ .../PixelSearchBlurOptionsBottomSheet.kt | 82 +++++++++++++++++++ .../essentials/viewmodels/MainViewModel.kt | 14 ++++ app/src/main/res/values/strings.xml | 6 +- 6 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/sameerasw/essentials/ui/core/sheets/PixelSearchBlurOptionsBottomSheet.kt diff --git a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt index 143010566b..a13899bfdc 100644 --- a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt +++ b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt @@ -440,6 +440,8 @@ class SettingsRepository( const val KEY_PIXEL_SEARCH_BUBBLES_WEB = "pixel_search_bubbles_web" const val KEY_PIXEL_SEARCH_ENGINE = "pixel_search_engine" const val KEY_PIXEL_SEARCH_BLUR = "pixel_search_blur_enabled" + const val KEY_PIXEL_SEARCH_WALLPAPER_BG = "pixel_search_wallpaper_bg" + const val KEY_PIXEL_SEARCH_BLUR_RADIUS = "pixel_search_blur_radius" const val KEY_AUTO_ACCESSIBILITY_ENABLED = "auto_accessibility_enabled" const val KEY_USE_BLUR = "use_blur" const val KEY_USE_RIPPLE = "use_ripple" @@ -3706,6 +3708,12 @@ class SettingsRepository( fun isPixelSearchBlurEnabled(): Boolean = getBoolean(KEY_PIXEL_SEARCH_BLUR, true) fun setPixelSearchBlurEnabled(enabled: Boolean) = putBoolean(KEY_PIXEL_SEARCH_BLUR, enabled) + fun isPixelSearchWallpaperBackgroundEnabled(): Boolean = getBoolean(KEY_PIXEL_SEARCH_WALLPAPER_BG, true) + fun setPixelSearchWallpaperBackgroundEnabled(enabled: Boolean) = putBoolean(KEY_PIXEL_SEARCH_WALLPAPER_BG, enabled) + + fun getPixelSearchBlurRadius(): Float = getFloat(KEY_PIXEL_SEARCH_BLUR_RADIUS, 60f) + fun setPixelSearchBlurRadius(radius: Float) = putFloat(KEY_PIXEL_SEARCH_BLUR_RADIUS, radius) + fun isBubbleWebFullscreen(): Boolean = getBoolean(KEY_BUBBLE_WEB_FULLSCREEN, false) fun setBubbleWebFullscreen(fullscreen: Boolean) = putBoolean(KEY_BUBBLE_WEB_FULLSCREEN, fullscreen) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt index a110524aef..08a79740b1 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt @@ -206,12 +206,20 @@ class PixelSearchResultsActivity : ComponentActivity() { val repository = SettingsRepository(this) val isBlurEnabled = repository.isPixelSearchBlurEnabled() + val isWallpaperBg = repository.isPixelSearchWallpaperBackgroundEnabled() + val blurRadius = repository.getPixelSearchBlurRadius().toInt().coerceIn(1, 300) + + if (isWallpaperBg) { + window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { val params = window.attributes if (isBlurEnabled) { window.addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND) - params.blurBehindRadius = 60 + params.blurBehindRadius = blurRadius } else { window.clearFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND) params.blurBehindRadius = 0 diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt index be921f959b..0ae050a25b 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchbarSettingsActivity.kt @@ -87,6 +87,7 @@ import com.sameerasw.essentials.ui.core.containers.RoundedCardContainer import com.sameerasw.essentials.ui.core.pickers.SegmentedPicker import com.sameerasw.essentials.ui.core.sheets.FeatureHelpBottomSheet import com.sameerasw.essentials.ui.core.sheets.PermissionsBottomSheet +import com.sameerasw.essentials.ui.core.sheets.PixelSearchBlurOptionsBottomSheet import com.sameerasw.essentials.ui.modifiers.BlurDirection import com.sameerasw.essentials.ui.modifiers.progressiveBlur import com.sameerasw.essentials.ui.modifiers.scrollMotionBlur @@ -324,6 +325,7 @@ fun PixelSearchbarSettingsUI( var pendingWidgetId by remember { mutableStateOf(AppWidgetManager.INVALID_APPWIDGET_ID) } var showWidgetPicker by remember { mutableStateOf(false) } var isWidgetUnsupported by remember { mutableStateOf(false) } + var showBlurOptionsSheet by remember { mutableStateOf(false) } LaunchedEffect(currentType) { while (currentType == "widget") { @@ -1000,6 +1002,7 @@ fun PixelSearchbarSettingsUI( HapticUtil.performVirtualKeyHaptic(view) viewModel.setPixelSearchBlurEnabled(checked) }, + onSettingsClick = { showBlurOptionsSheet = true }, ) } } @@ -1007,6 +1010,13 @@ fun PixelSearchbarSettingsUI( } } + if (showBlurOptionsSheet) { + PixelSearchBlurOptionsBottomSheet( + viewModel = viewModel, + onDismissRequest = { showBlurOptionsSheet = false }, + ) + } + if (showPermissionSheet) { val permissionItem = remember(context, viewModel) { diff --git a/app/src/main/java/com/sameerasw/essentials/ui/core/sheets/PixelSearchBlurOptionsBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/core/sheets/PixelSearchBlurOptionsBottomSheet.kt new file mode 100644 index 0000000000..75fbafc740 --- /dev/null +++ b/app/src/main/java/com/sameerasw/essentials/ui/core/sheets/PixelSearchBlurOptionsBottomSheet.kt @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2026 sameerasw.com + * License: MIT License + * + * Feature Module: UI Core Sheets + * File: PixelSearchBlurOptionsBottomSheet.kt + * Description: Bottom sheet for configuring Pixel Search blur and wallpaper background options. + */ + +package com.sameerasw.essentials.ui.core.sheets + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.sameerasw.essentials.R +import com.sameerasw.essentials.ui.components.sliders.ConfigSliderItem +import com.sameerasw.essentials.ui.core.cards.IconToggleItem +import com.sameerasw.essentials.ui.core.containers.RoundedCardContainer +import com.sameerasw.essentials.utils.HapticUtil +import com.sameerasw.essentials.viewmodels.MainViewModel + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun PixelSearchBlurOptionsBottomSheet( + viewModel: MainViewModel, + onDismissRequest: () -> Unit, +) { + val view = LocalView.current + + EssentialsBottomSheet(onDismissRequest = onDismissRequest) { + Column( + modifier = + Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .padding(bottom = 24.dp), + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + Text( + text = stringResource(R.string.pixel_search_blur_options_title), + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier.padding(start = 8.dp, bottom = 4.dp), + ) + + RoundedCardContainer(spacing = 2.dp, cornerRadius = 24.dp) { + IconToggleItem( + iconRes = R.drawable.rounded_wallpaper_24, + title = stringResource(R.string.pref_pixel_search_wallpaper_bg_title), + description = stringResource(R.string.pref_pixel_search_wallpaper_bg_desc), + isChecked = viewModel.pixelSearchWallpaperBackground.value, + onCheckedChange = { checked -> + HapticUtil.performVirtualKeyHaptic(view) + viewModel.setPixelSearchWallpaperBackgroundEnabled(checked) + }, + ) + + ConfigSliderItem( + title = stringResource(R.string.pref_pixel_search_blur_intensity_title), + value = viewModel.pixelSearchBlurRadius.floatValue, + onValueChange = { + HapticUtil.performUIHaptic(view) + viewModel.setPixelSearchBlurRadius(it) + }, + valueRange = 10f..150f, + increment = 5f, + iconRes = R.drawable.rounded_blur_on_24, + valueFormatter = { "${it.toInt()} dp" }, + ) + } + } + } +} diff --git a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt index a3a1b96dc8..bdb6e767b5 100644 --- a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt +++ b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt @@ -2891,6 +2891,8 @@ class MainViewModel : ViewModel() { pixelSearchResultWeb.value = settingsRepository.isPixelSearchResultWebEnabled() pixelSearchBubblesWeb.value = settingsRepository.isPixelSearchBubblesWebEnabled() pixelSearchBlur.value = settingsRepository.isPixelSearchBlurEnabled() + pixelSearchWallpaperBackground.value = settingsRepository.isPixelSearchWallpaperBackgroundEnabled() + pixelSearchBlurRadius.floatValue = settingsRepository.getPixelSearchBlurRadius() pixelSearchEngine.value = settingsRepository.getPixelSearchEngine() isPocketModeEnabled.value = settingsRepository.getBoolean(SettingsRepository.KEY_POCKET_MODE_ENABLED) @@ -4684,6 +4686,8 @@ class MainViewModel : ViewModel() { val pixelSearchResultWeb = mutableStateOf(true) val pixelSearchBubblesWeb = mutableStateOf(false) val pixelSearchBlur = mutableStateOf(true) + val pixelSearchWallpaperBackground = mutableStateOf(true) + val pixelSearchBlurRadius = mutableFloatStateOf(60f) val pixelSearchEngine = mutableStateOf("Google") fun setPixelSearchResultAppsEnabled(enabled: Boolean) { @@ -4731,6 +4735,16 @@ class MainViewModel : ViewModel() { settingsRepository.setPixelSearchBlurEnabled(enabled) } + fun setPixelSearchWallpaperBackgroundEnabled(enabled: Boolean) { + pixelSearchWallpaperBackground.value = enabled + settingsRepository.setPixelSearchWallpaperBackgroundEnabled(enabled) + } + + fun setPixelSearchBlurRadius(radius: Float) { + pixelSearchBlurRadius.floatValue = radius + settingsRepository.setPixelSearchBlurRadius(radius) + } + fun setPixelSearchEngine(engine: String) { pixelSearchEngine.value = engine settingsRepository.setPixelSearchEngine(engine) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8bcb0ba7d7..a2ee28a962 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2667,7 +2667,11 @@ Use DIY tap action instead of widget\'s own Music Blur - Blur the wallpaper background + Blur the background of search results + Blur options + Show wallpaper in background + Blur the home screen wallpaper instead of the active screen + Blur intensity Restart Shizuku Please enter Shizuku auth token in settings first From abc7bb1711569f26355d8814f760b968dc26a273 Mon Sep 17 00:00:00 2001 From: balajitechlabs <212744006+Balajitechlabs@users.noreply.github.com> Date: Sun, 18 Oct 2026 12:11:15 +0530 Subject: [PATCH 09/10] fix(search): enable active screen transparency when wallpaper background is disabled --- .../ui/activities/PixelSearchResultsActivity.kt | 11 ++++++++++- app/src/main/res/values/themes.xml | 1 - 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt index 08a79740b1..e7908b67af 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/PixelSearchResultsActivity.kt @@ -14,6 +14,8 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.Uri +import android.graphics.PixelFormat +import android.graphics.drawable.ColorDrawable import android.os.Build import android.os.Bundle import android.provider.ContactsContract @@ -155,6 +157,8 @@ class PixelSearchResultsActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { WindowCompat.setDecorFitsSystemWindows(window, false) super.onCreate(savedInstanceState) + window.setBackgroundDrawable(ColorDrawable(android.graphics.Color.TRANSPARENT)) + window.setFormat(PixelFormat.TRANSLUCENT) enableEdgeToEdge( statusBarStyle = SystemBarStyle.auto( android.graphics.Color.TRANSPARENT, @@ -665,6 +669,7 @@ fun PixelSearchResultsScreen( } } + val isWallpaperBg = remember { repository.isPixelSearchWallpaperBackgroundEnabled() } val isBlurEffective = remember(context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { val windowManager = context.getSystemService(WindowManager::class.java) @@ -673,7 +678,11 @@ fun PixelSearchResultsScreen( false } } - val scrimAlpha = if (isBlurEffective) 0.55f else 0.85f + val scrimAlpha = when { + !isBlurEffective -> 0.85f + !isWallpaperBg -> 0.45f + else -> 0.55f + } val scrimColor = MaterialTheme.colorScheme.surfaceContainer.copy(alpha = scrimAlpha) Box( diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index f7434c70f2..5ec4b65e8e 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -20,7 +20,6 @@ @android:color/transparent @null true - true @null true @null From 568c9c5349edf86ec49aa1521ca1cd80686bb362 Mon Sep 17 00:00:00 2001 From: balajitechlabs <212744006+Balajitechlabs@users.noreply.github.com> Date: Sun, 18 Oct 2026 14:29:23 +0530 Subject: [PATCH 10/10] refactor(search): remove redundant description from wallpaper toggle in blur options --- .../ui/core/sheets/PixelSearchBlurOptionsBottomSheet.kt | 1 - app/src/main/res/values/strings.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/core/sheets/PixelSearchBlurOptionsBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/core/sheets/PixelSearchBlurOptionsBottomSheet.kt index 75fbafc740..863c9c0851 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/core/sheets/PixelSearchBlurOptionsBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/core/sheets/PixelSearchBlurOptionsBottomSheet.kt @@ -56,7 +56,6 @@ fun PixelSearchBlurOptionsBottomSheet( IconToggleItem( iconRes = R.drawable.rounded_wallpaper_24, title = stringResource(R.string.pref_pixel_search_wallpaper_bg_title), - description = stringResource(R.string.pref_pixel_search_wallpaper_bg_desc), isChecked = viewModel.pixelSearchWallpaperBackground.value, onCheckedChange = { checked -> HapticUtil.performVirtualKeyHaptic(view) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a2ee28a962..fab55033d9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2670,7 +2670,6 @@ Blur the background of search results Blur options Show wallpaper in background - Blur the home screen wallpaper instead of the active screen Blur intensity Restart Shizuku Please enter Shizuku auth token in settings first