From 692550770b7938eaa57220d10879d89af72d715e Mon Sep 17 00:00:00 2001 From: Mudit200408 Date: Sat, 4 Jul 2026 19:17:47 +0530 Subject: [PATCH] fixup: Fix exlusion of pocket mode --- .../domain/registry/FeatureRegistry.kt | 2 +- .../services/handlers/AppFlowHandler.kt | 41 +++++++++++-------- .../tiles/ScreenOffAccessibilityService.kt | 40 +++++++++++------- .../configs/PocketModeSettingsUI.kt | 2 +- .../essentials/utils/ServiceUtils.kt | 7 +++- .../essentials/viewmodels/MainViewModel.kt | 5 ++- 6 files changed, 62 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt b/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt index 35c2e0bea..991a0af67 100644 --- a/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt +++ b/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt @@ -962,7 +962,7 @@ object FeatureRegistry { override fun isEnabled(viewModel: MainViewModel) = viewModel.isPocketModeEnabled.value override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) = - viewModel.setPocketModeEnabled(enabled) + viewModel.setPocketModeEnabled(enabled, context) override fun isDeviceSupported(context: Context) = !DeviceUtils.isGoogleDevice() }, diff --git a/app/src/main/java/com/sameerasw/essentials/services/handlers/AppFlowHandler.kt b/app/src/main/java/com/sameerasw/essentials/services/handlers/AppFlowHandler.kt index 1a6b75f94..b4f0d6eac 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/handlers/AppFlowHandler.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/handlers/AppFlowHandler.kt @@ -35,9 +35,6 @@ class AppFlowHandler( private val handler = Handler(Looper.getMainLooper()) private val scope = CoroutineScope(Dispatchers.Main) - private val authenticatedPackages = mutableSetOf() - private val lastLeaveTimes = mutableMapOf() - private val activeCountdowns = mutableMapOf() private val shutUpReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -86,21 +83,11 @@ class AppFlowHandler( } } - // App Lock State - private var lockingPackage: String? = null - private var lastLockRequestTime: Long = 0 - var currentPackage: String? = null - private set - private var currentUsageStatsPackage: String? = null + private val nlDebounceDelay = 500L - // App Automation State - private val activeAppAutomationIds = mutableSetOf() + val currentPackage: String? + get() = Companion.currentPackage - // Night Light State - private var wasNightLightOnBeforeAutoToggle = false - private var isNightLightAutoToggledOff = false - private var pendingNLRunnable: Runnable? = null - private val nlDebounceDelay = 500L private val ignoredSystemPackages = listOf( "android", @@ -114,7 +101,7 @@ class AppFlowHandler( val oldPackage = currentPackage if (isFromUsageStats == useUsageAccess) { - currentPackage = packageName + Companion.currentPackage = packageName if (oldPackage != null && oldPackage != packageName) { lastLeaveTimes[oldPackage] = System.currentTimeMillis() checkShutUpRestore(oldPackage, packageName) @@ -126,6 +113,12 @@ class AppFlowHandler( checkHighlightNightLight(packageName) checkAppAutomations(packageName) checkGestureBarAutomation(packageName) + + // Dismiss pocket mode if the new foreground package is bypassed/excluded + val serviceInstance = com.sameerasw.essentials.services.tiles.ScreenOffAccessibilityService.instance + if (serviceInstance != null && serviceInstance.isAppBypassedForPocketMode(packageName)) { + serviceInstance.dismissPocketMode() + } } } @@ -840,5 +833,19 @@ class AppFlowHandler( const val EXTRA_PACKAGE_NAME = "package_name" const val EXTRA_AUTO_ARCHIVE_PACKAGE = "auto_archive_package" const val NOTIFICATION_ID_SHUTUP_RESTORE = 9999 + + // Shared State + internal val authenticatedPackages = mutableSetOf() + internal val lastLeaveTimes = mutableMapOf() + internal val activeCountdowns = mutableMapOf() + internal var lockingPackage: String? = null + internal var lastLockRequestTime: Long = 0 + var currentPackage: String? = null + internal set + internal var currentUsageStatsPackage: String? = null + internal val activeAppAutomationIds = mutableSetOf() + internal var wasNightLightOnBeforeAutoToggle = false + internal var isNightLightAutoToggledOff = false + internal var pendingNLRunnable: Runnable? = null } } diff --git a/app/src/main/java/com/sameerasw/essentials/services/tiles/ScreenOffAccessibilityService.kt b/app/src/main/java/com/sameerasw/essentials/services/tiles/ScreenOffAccessibilityService.kt index 26d8eaf1d..351c32804 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/tiles/ScreenOffAccessibilityService.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/tiles/ScreenOffAccessibilityService.kt @@ -198,8 +198,10 @@ class ScreenOffAccessibilityService : AccessibilityService(), SensorEventListene statusBarIconHandler.updateAll() } else if (key == "pocket_mode_enabled" || key == "pocket_mode_use_light_sensor") { updatePocketModeSensors() + com.sameerasw.essentials.utils.ServiceUtils.startRequiredServices(this) } else if (key == "pocket_mode_excluded_apps") { updatePocketModeExcludedAppsSet() + com.sameerasw.essentials.utils.ServiceUtils.startRequiredServices(this) } } @@ -389,6 +391,22 @@ class ScreenOffAccessibilityService : AccessibilityService(), SensorEventListene override fun onInterrupt() {} + fun isAppBypassedForPocketMode(packageName: String?): Boolean { + val prefs = getSharedPreferences("essentials_prefs", MODE_PRIVATE) + val lockScreenOnly = prefs.getBoolean("pocket_mode_lock_screen_only", false) + val isExcluded = packageName != null && ( + pocketModeExcludedAppsSet.contains(packageName) || + isGameOrVideoApp(packageName) || + hasActiveMediaSession(packageName) + ) + val isKeyguardBypassed = lockScreenOnly && !keyguardManager.isKeyguardLocked + return isExcluded || isKeyguardBypassed + } + + fun dismissPocketMode() { + pocketModeHandler.onScreenOff() + } + private fun updatePocketModeSensors() { val prefs = getSharedPreferences("essentials_prefs", MODE_PRIVATE) val pocketModeEnabled = prefs.getBoolean("pocket_mode_enabled", false) @@ -434,15 +452,12 @@ class ScreenOffAccessibilityService : AccessibilityService(), SensorEventListene val pocketModeEnabled = prefs.getBoolean("pocket_mode_enabled", false) val useLightSensor = prefs.getBoolean("pocket_mode_use_light_sensor", false) val triggerDelayMs = (prefs.getFloat("pocket_mode_trigger_delay", 3f) * 1000).toLong() - val lockScreenOnly = prefs.getBoolean("pocket_mode_lock_screen_only", false) if (pocketModeEnabled && !pocketModeHandler.isBypassed) { val currentApp = appFlowHandler.currentPackage - val shouldBypass = (currentApp != null && ( - pocketModeExcludedAppsSet.contains(currentApp) || - isGameOrVideoApp(currentApp) || - hasActiveMediaSession(currentApp) - )) || (lockScreenOnly && !keyguardManager.isKeyguardLocked) - if (!shouldBypass) { + val shouldBypass = isAppBypassedForPocketMode(currentApp) + if (shouldBypass) { + pocketModeHandler.onScreenOff() + } else { pocketModeHandler.onProximityChanged( isBlocked = flashlightHandler.isProximityBlocked, isLightDark = lightSensorLux <= 3f, @@ -470,15 +485,12 @@ class ScreenOffAccessibilityService : AccessibilityService(), SensorEventListene val pocketModeEnabled = prefs.getBoolean("pocket_mode_enabled", false) val useLightSensor = prefs.getBoolean("pocket_mode_use_light_sensor", false) val triggerDelayMs = (prefs.getFloat("pocket_mode_trigger_delay", 3f) * 1000).toLong() - val lockScreenOnly = prefs.getBoolean("pocket_mode_lock_screen_only", false) if (pocketModeEnabled && !pocketModeHandler.isBypassed) { val currentApp = appFlowHandler.currentPackage - val shouldBypass = (currentApp != null && ( - pocketModeExcludedAppsSet.contains(currentApp) || - isGameOrVideoApp(currentApp) || - hasActiveMediaSession(currentApp) - )) || (lockScreenOnly && !keyguardManager.isKeyguardLocked) - if (!shouldBypass) { + val shouldBypass = isAppBypassedForPocketMode(currentApp) + if (shouldBypass) { + pocketModeHandler.onScreenOff() + } else { pocketModeHandler.onProximityChanged( isBlocked = isBlocked, isLightDark = lightSensorLux <= 3f, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/PocketModeSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/PocketModeSettingsUI.kt index 0e82ae603..eb2754d20 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/PocketModeSettingsUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/PocketModeSettingsUI.kt @@ -62,7 +62,7 @@ fun PocketModeSettingsUI( description = stringResource(R.string.feat_pocket_mode_desc), isChecked = viewModel.isPocketModeEnabled.value, onCheckedChange = { isChecked -> - viewModel.setPocketModeEnabled(isChecked) + viewModel.setPocketModeEnabled(isChecked, context) }, enabled = true, iconRes = R.drawable.ic_pocket_mode, diff --git a/app/src/main/java/com/sameerasw/essentials/utils/ServiceUtils.kt b/app/src/main/java/com/sameerasw/essentials/utils/ServiceUtils.kt index dc7a83829..f7c0105a5 100644 --- a/app/src/main/java/com/sameerasw/essentials/utils/ServiceUtils.kt +++ b/app/src/main/java/com/sameerasw/essentials/utils/ServiceUtils.kt @@ -31,6 +31,11 @@ object ServiceUtils { val isUseUsageAccess = settingsRepository.getBoolean(SettingsRepository.KEY_USE_USAGE_ACCESS) + val isPocketModeEnabled = + settingsRepository.getBoolean(SettingsRepository.KEY_POCKET_MODE_ENABLED) + val pocketModeExcludedApps = settingsRepository.loadPocketModeExcludedApps() + val hasPocketModeExcludedApps = isPocketModeEnabled && pocketModeExcludedApps.any { it.isEnabled } + val hasAppAutomations = DIYRepository.automations.value.any { it.isEnabled && it.type == Automation.Type.APP } @@ -39,7 +44,7 @@ object ServiceUtils { val hasShutUpApps = shutUpConfigs.any { it.isEnabled } val shouldRun = - (isUseUsageAccess && (isAppLockEnabled || isDynamicNightLightEnabled || isHideGestureBarOnLauncherEnabled || hasAppAutomations)) || hasShutUpApps + (isUseUsageAccess && (isAppLockEnabled || isDynamicNightLightEnabled || isHideGestureBarOnLauncherEnabled || hasAppAutomations || hasPocketModeExcludedApps)) || hasShutUpApps val intent = Intent(context, AppDetectionService::class.java) if (shouldRun) { 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 30de864cb..e84f30414 100644 --- a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt +++ b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt @@ -4015,9 +4015,10 @@ class MainViewModel : ViewModel() { isAodForceTurnOffEnabled.value = enabled } - fun setPocketModeEnabled(enabled: Boolean) { + fun setPocketModeEnabled(enabled: Boolean, context: Context) { settingsRepository.putBoolean(SettingsRepository.KEY_POCKET_MODE_ENABLED, enabled) isPocketModeEnabled.value = enabled + updateAppDetectionService(context) } fun setPocketModeUseLightSensor(enabled: Boolean) { @@ -4065,6 +4066,7 @@ class MainViewModel : ViewModel() { fun savePocketModeExcludedApps(context: Context, apps: List) { settingsRepository.savePocketModeExcludedApps(apps) + updateAppDetectionService(context) } fun updatePocketModeExcludedAppEnabled( @@ -4073,6 +4075,7 @@ class MainViewModel : ViewModel() { enabled: Boolean ) { settingsRepository.updatePocketModeExcludedAppSelection(packageName, enabled) + updateAppDetectionService(context) } override fun onCleared() {