From a4e7820e6f2fccf86d5551c8402657a16afa7ac5 Mon Sep 17 00:00:00 2001 From: darken Date: Mon, 13 Apr 2026 17:48:04 +0200 Subject: [PATCH] Add delayed retry for permission recheck when returning from settings --- .../capod/main/ui/overview/OverviewScreen.kt | 6 +++--- .../capod/main/ui/overview/OverviewViewModel.kt | 15 ++++++++++++--- .../main/ui/overview/OverviewViewModelTest.kt | 15 ++++++++++++--- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt index 551d1fc8..60623e60 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt @@ -77,15 +77,15 @@ fun OverviewScreenHost(vm: OverviewViewModel = hiltViewModel()) { val permissionLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.RequestPermission() - ) { granted -> - vm.onPermissionResult(granted) + ) { + vm.onPermissionResult() } // When returning from settings-based permissions LifecycleEventEffect(Lifecycle.Event.ON_RESUME) { if (awaitingPermission) { awaitingPermission = false - vm.onPermissionResult(true) + vm.onSettingsPermissionResult() } } diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewViewModel.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewViewModel.kt index 927b5608..043b097c 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewViewModel.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewViewModel.kt @@ -1,6 +1,7 @@ package eu.darken.capod.main.ui.overview import dagger.hilt.android.lifecycle.HiltViewModel +import eu.darken.capod.common.TimeSource import eu.darken.capod.common.bluetooth.BluetoothManager2 import eu.darken.capod.common.coroutine.DispatcherProvider import eu.darken.capod.common.datastore.valueBlocking @@ -12,7 +13,6 @@ import eu.darken.capod.common.flow.combine import eu.darken.capod.common.flow.throttleLatest import eu.darken.capod.common.navigation.Nav import eu.darken.capod.common.permissions.Permission -import eu.darken.capod.common.TimeSource import eu.darken.capod.common.uix.ViewModel4 import eu.darken.capod.common.upgrade.UpgradeRepo import eu.darken.capod.main.core.GeneralSettings @@ -21,8 +21,8 @@ import eu.darken.capod.main.core.PermissionTool import eu.darken.capod.monitor.core.DeviceMonitor import eu.darken.capod.monitor.core.PodDevice import eu.darken.capod.monitor.core.worker.MonitorControl -import eu.darken.capod.pods.core.apple.aap.protocol.AapCommand import eu.darken.capod.pods.core.apple.aap.AapConnectionManager +import eu.darken.capod.pods.core.apple.aap.protocol.AapCommand import eu.darken.capod.pods.core.apple.aap.protocol.AapSetting import eu.darken.capod.profiles.core.DeviceProfile import eu.darken.capod.profiles.core.DeviceProfilesRepo @@ -143,10 +143,19 @@ class OverviewViewModel @Inject constructor( val unmatchedDevices: List get() = devices.filter { it.profileId == null } } - fun onPermissionResult(@Suppress("UNUSED_PARAMETER") granted: Boolean) { + fun onPermissionResult() { permissionTool.recheck() } + fun onSettingsPermissionResult() { + permissionTool.recheck() + + launch { + delay(1000L) + permissionTool.recheck() + } + } + fun goToSettings() { navTo(Nav.Settings.Index) } diff --git a/app/src/test/java/eu/darken/capod/main/ui/overview/OverviewViewModelTest.kt b/app/src/test/java/eu/darken/capod/main/ui/overview/OverviewViewModelTest.kt index ccfbc7e4..25bc39fa 100644 --- a/app/src/test/java/eu/darken/capod/main/ui/overview/OverviewViewModelTest.kt +++ b/app/src/test/java/eu/darken/capod/main/ui/overview/OverviewViewModelTest.kt @@ -12,8 +12,6 @@ import eu.darken.capod.main.core.PermissionTool import eu.darken.capod.monitor.core.DeviceMonitor import eu.darken.capod.monitor.core.PodDevice import eu.darken.capod.monitor.core.worker.MonitorControl -import eu.darken.capod.pods.core.apple.ble.BlePodSnapshot -import eu.darken.capod.profiles.core.AppleDeviceProfile import eu.darken.capod.profiles.core.DeviceProfile import eu.darken.capod.profiles.core.DeviceProfilesRepo import io.kotest.matchers.shouldBe @@ -26,6 +24,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain @@ -416,11 +415,21 @@ class OverviewViewModelTest : BaseTest() { fun `onPermissionResult calls permissionTool recheck`() = runTest(testDispatcher) { val vm = createViewModel() - vm.onPermissionResult(true) + vm.onPermissionResult() verify(exactly = 1) { permissionTool.recheck() } } + @Test + fun `onSettingsPermissionResult retries permission recheck`() = runTest(testDispatcher) { + val vm = createViewModel() + + vm.onSettingsPermissionResult() + advanceUntilIdle() + + verify(exactly = 2) { permissionTool.recheck() } + } + @Test fun `requestPermission emits event`() = runTest(testDispatcher) { val vm = createViewModel()