diff --git a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt index 1684833d70..a6149164d1 100644 --- a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt +++ b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt @@ -98,12 +98,12 @@ class DefaultPermissionsPresenter @AssistedInject constructor( LaunchedEffect(this) { if (permissionState.status.isGranted) { - // User may have granted permission from the settings, to reset the store regarding this permission + // User may have granted permission from the settings, so reset the store regarding this permission permissionsStore.resetPermission(permission) } } - val showDialog = rememberSaveable { mutableStateOf(permissionState.status !is PermissionStatus.Granted) } + val showDialog = rememberSaveable { mutableStateOf(false) } fun handleEvents(event: PermissionsEvents) { when (event) { @@ -111,8 +111,11 @@ class DefaultPermissionsPresenter @AssistedInject constructor( showDialog.value = false } PermissionsEvents.OpenSystemDialog -> { - permissionState.launchPermissionRequest() - showDialog.value = false + if (permissionState.status !is PermissionStatus.Granted && isAlreadyDenied) { + showDialog.value = true + } else { + permissionState.launchPermissionRequest() + } } } } diff --git a/libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenterTest.kt b/libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenterTest.kt index 316ce7bc67..915b240598 100644 --- a/libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenterTest.kt +++ b/libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenterTest.kt @@ -69,7 +69,10 @@ class DefaultPermissionsPresenterTest { @Test fun `present - user closes dialog`() = runTest { - val permissionsStore = InMemoryPermissionsStore() + val permissionsStore = InMemoryPermissionsStore( + permissionDenied = true, + permissionAsked = true + ) val permissionState = FakePermissionState( A_PERMISSION, PermissionStatus.Denied(shouldShowRationale = false) @@ -86,9 +89,12 @@ class DefaultPermissionsPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { + skipItems(1) val initialState = awaitItem() - assertThat(initialState.showDialog).isTrue() - initialState.eventSink.invoke(PermissionsEvents.CloseDialog) + initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog) + val withDialogState = awaitItem() + assertThat(withDialogState.showDialog).isTrue() + withDialogState.eventSink.invoke(PermissionsEvents.CloseDialog) assertThat(awaitItem().showDialog).isFalse() } } @@ -113,10 +119,9 @@ class DefaultPermissionsPresenterTest { presenter.present() }.test { val initialState = awaitItem() - assertThat(initialState.showDialog).isTrue() + assertThat(initialState.showDialog).isFalse() initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog) assertThat(permissionState.launchPermissionRequestCalled).isTrue() - assertThat(awaitItem().showDialog).isFalse() // User does not grant permission permissionStateProvider.userGiveAnswer(answer = false, firstTime = true) skipItems(1) @@ -148,10 +153,9 @@ class DefaultPermissionsPresenterTest { presenter.present() }.test { val initialState = awaitItem() - assertThat(initialState.showDialog).isTrue() + assertThat(initialState.showDialog).isFalse() initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog) assertThat(permissionState.launchPermissionRequestCalled).isTrue() - assertThat(awaitItem().showDialog).isFalse() // User does not grant permission permissionStateProvider.userGiveAnswer(answer = false, firstTime = false) skipItems(2) @@ -188,10 +192,12 @@ class DefaultPermissionsPresenterTest { }.test { skipItems(1) val initialState = awaitItem() - assertThat(initialState.showDialog).isTrue() - assertThat(initialState.permissionGranted).isFalse() - assertThat(initialState.permissionAlreadyDenied).isTrue() - assertThat(initialState.permissionAlreadyAsked).isTrue() + initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog) + val withDialogState = awaitItem() + assertThat(withDialogState.showDialog).isTrue() + assertThat(withDialogState.permissionGranted).isFalse() + assertThat(withDialogState.permissionAlreadyDenied).isTrue() + assertThat(withDialogState.permissionAlreadyAsked).isTrue() } } @@ -215,10 +221,9 @@ class DefaultPermissionsPresenterTest { presenter.present() }.test { val initialState = awaitItem() - assertThat(initialState.showDialog).isTrue() + assertThat(initialState.showDialog).isFalse() initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog) assertThat(permissionState.launchPermissionRequestCalled).isTrue() - assertThat(awaitItem().showDialog).isFalse() // User grants permission permissionStateProvider.userGiveAnswer(answer = true, firstTime = true) skipItems(1)