Add delayed retry for permission recheck when returning from settings

This commit is contained in:
darken
2026-04-14 11:28:41 +02:00
committed by Matthias Urhahn
parent e6e66c3831
commit a4e7820e6f
3 changed files with 27 additions and 9 deletions
@@ -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()
}
}
@@ -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<PodDevice> 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)
}
@@ -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()