From 911a09c743ddb64cad847648e681f86e6e29b6d1 Mon Sep 17 00:00:00 2001 From: Matthias Urhahn Date: Fri, 17 Jul 2026 17:24:48 +0200 Subject: [PATCH] fix(permissions): Offer battery optimization card in AUTOMATIC mode --- .../darken/capod/main/core/PermissionTool.kt | 8 ++++--- .../capod/main/core/PermissionToolTest.kt | 24 +++++++++++++++---- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/eu/darken/capod/main/core/PermissionTool.kt b/app/src/main/java/eu/darken/capod/main/core/PermissionTool.kt index 9313f686..1f4e43ab 100644 --- a/app/src/main/java/eu/darken/capod/main/core/PermissionTool.kt +++ b/app/src/main/java/eu/darken/capod/main/core/PermissionTool.kt @@ -64,8 +64,10 @@ class PermissionTool @Inject constructor( /** * Whether [permission] is applicable for the user's current configuration. * Three permissions are conditional on monitor mode or popup usage: - * - [Permission.IGNORE_BATTERY_OPTIMIZATION] only when always-on scanning is needed - * - [Permission.ACCESS_BACKGROUND_LOCATION] same + * - [Permission.IGNORE_BATTERY_OPTIMIZATION] whenever the monitor service is expected to + * run unattended (AUTOMATIC and ALWAYS) — those users depend on a long-lived foreground + * service that aggressive vendor battery management may otherwise kill + * - [Permission.ACCESS_BACKGROUND_LOCATION] only when always-on scanning is needed * - [Permission.SYSTEM_ALERT_WINDOW] only when at least one popup reaction is enabled * Everything else is unconditionally applicable. */ @@ -74,7 +76,7 @@ class PermissionTool @Inject constructor( monitorMode: MonitorMode, anyPopupEnabled: Boolean, ): Boolean = when (permission) { - Permission.IGNORE_BATTERY_OPTIMIZATION, + Permission.IGNORE_BATTERY_OPTIMIZATION -> monitorMode != MonitorMode.MANUAL Permission.ACCESS_BACKGROUND_LOCATION -> monitorMode == MonitorMode.ALWAYS Permission.SYSTEM_ALERT_WINDOW -> anyPopupEnabled else -> true diff --git a/app/src/test/java/eu/darken/capod/main/core/PermissionToolTest.kt b/app/src/test/java/eu/darken/capod/main/core/PermissionToolTest.kt index 2087a517..fe89384c 100644 --- a/app/src/test/java/eu/darken/capod/main/core/PermissionToolTest.kt +++ b/app/src/test/java/eu/darken/capod/main/core/PermissionToolTest.kt @@ -8,7 +8,7 @@ import testhelpers.BaseTest class PermissionToolTest : BaseTest() { @Test - fun `IGNORE_BATTERY_OPTIMIZATION is applicable only in ALWAYS mode`() { + fun `IGNORE_BATTERY_OPTIMIZATION is applicable in ALWAYS and AUTOMATIC modes`() { PermissionTool.isApplicable( Permission.IGNORE_BATTERY_OPTIMIZATION, MonitorMode.ALWAYS, @@ -18,7 +18,7 @@ class PermissionToolTest : BaseTest() { Permission.IGNORE_BATTERY_OPTIMIZATION, MonitorMode.AUTOMATIC, anyPopupEnabled = false, - ) shouldBe false + ) shouldBe true PermissionTool.isApplicable( Permission.IGNORE_BATTERY_OPTIMIZATION, MonitorMode.MANUAL, @@ -73,13 +73,27 @@ class PermissionToolTest : BaseTest() { @Test fun `mode-gated permissions don't depend on popup state`() { - // IGNORE_BATTERY_OPTIMIZATION and ACCESS_BACKGROUND_LOCATION gate on mode only. + // IGNORE_BATTERY_OPTIMIZATION and ACCESS_BACKGROUND_LOCATION gate on mode only — + // but on different modes: battery optimization applies to all unattended modes, + // background location only to ALWAYS. listOf(Permission.IGNORE_BATTERY_OPTIMIZATION, Permission.ACCESS_BACKGROUND_LOCATION).forEach { perm -> PermissionTool.isApplicable(perm, MonitorMode.ALWAYS, anyPopupEnabled = true) shouldBe true PermissionTool.isApplicable(perm, MonitorMode.ALWAYS, anyPopupEnabled = false) shouldBe true - PermissionTool.isApplicable(perm, MonitorMode.AUTOMATIC, anyPopupEnabled = true) shouldBe false - PermissionTool.isApplicable(perm, MonitorMode.AUTOMATIC, anyPopupEnabled = false) shouldBe false + PermissionTool.isApplicable(perm, MonitorMode.MANUAL, anyPopupEnabled = true) shouldBe false + PermissionTool.isApplicable(perm, MonitorMode.MANUAL, anyPopupEnabled = false) shouldBe false } + PermissionTool.isApplicable( + Permission.IGNORE_BATTERY_OPTIMIZATION, MonitorMode.AUTOMATIC, anyPopupEnabled = true, + ) shouldBe true + PermissionTool.isApplicable( + Permission.IGNORE_BATTERY_OPTIMIZATION, MonitorMode.AUTOMATIC, anyPopupEnabled = false, + ) shouldBe true + PermissionTool.isApplicable( + Permission.ACCESS_BACKGROUND_LOCATION, MonitorMode.AUTOMATIC, anyPopupEnabled = true, + ) shouldBe false + PermissionTool.isApplicable( + Permission.ACCESS_BACKGROUND_LOCATION, MonitorMode.AUTOMATIC, anyPopupEnabled = false, + ) shouldBe false } @Test