Browse Source

Fix behavior of DefaultPermissionsPresenter. Do not show dialog immediately.

pull/1400/head
Benoit Marty 1 year ago
parent
commit
4b928af21b
  1. 11
      libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt
  2. 31
      libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenterTest.kt

11
libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt

@ -98,12 +98,12 @@ class DefaultPermissionsPresenter @AssistedInject constructor(
LaunchedEffect(this) { LaunchedEffect(this) {
if (permissionState.status.isGranted) { 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) permissionsStore.resetPermission(permission)
} }
} }
val showDialog = rememberSaveable { mutableStateOf(permissionState.status !is PermissionStatus.Granted) } val showDialog = rememberSaveable { mutableStateOf(false) }
fun handleEvents(event: PermissionsEvents) { fun handleEvents(event: PermissionsEvents) {
when (event) { when (event) {
@ -111,8 +111,11 @@ class DefaultPermissionsPresenter @AssistedInject constructor(
showDialog.value = false showDialog.value = false
} }
PermissionsEvents.OpenSystemDialog -> { PermissionsEvents.OpenSystemDialog -> {
permissionState.launchPermissionRequest() if (permissionState.status !is PermissionStatus.Granted && isAlreadyDenied) {
showDialog.value = false showDialog.value = true
} else {
permissionState.launchPermissionRequest()
}
} }
} }
} }

31
libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenterTest.kt

@ -69,7 +69,10 @@ class DefaultPermissionsPresenterTest {
@Test @Test
fun `present - user closes dialog`() = runTest { fun `present - user closes dialog`() = runTest {
val permissionsStore = InMemoryPermissionsStore() val permissionsStore = InMemoryPermissionsStore(
permissionDenied = true,
permissionAsked = true
)
val permissionState = FakePermissionState( val permissionState = FakePermissionState(
A_PERMISSION, A_PERMISSION,
PermissionStatus.Denied(shouldShowRationale = false) PermissionStatus.Denied(shouldShowRationale = false)
@ -86,9 +89,12 @@ class DefaultPermissionsPresenterTest {
moleculeFlow(RecompositionMode.Immediate) { moleculeFlow(RecompositionMode.Immediate) {
presenter.present() presenter.present()
}.test { }.test {
skipItems(1)
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.showDialog).isTrue() initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog)
initialState.eventSink.invoke(PermissionsEvents.CloseDialog) val withDialogState = awaitItem()
assertThat(withDialogState.showDialog).isTrue()
withDialogState.eventSink.invoke(PermissionsEvents.CloseDialog)
assertThat(awaitItem().showDialog).isFalse() assertThat(awaitItem().showDialog).isFalse()
} }
} }
@ -113,10 +119,9 @@ class DefaultPermissionsPresenterTest {
presenter.present() presenter.present()
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.showDialog).isTrue() assertThat(initialState.showDialog).isFalse()
initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog) initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog)
assertThat(permissionState.launchPermissionRequestCalled).isTrue() assertThat(permissionState.launchPermissionRequestCalled).isTrue()
assertThat(awaitItem().showDialog).isFalse()
// User does not grant permission // User does not grant permission
permissionStateProvider.userGiveAnswer(answer = false, firstTime = true) permissionStateProvider.userGiveAnswer(answer = false, firstTime = true)
skipItems(1) skipItems(1)
@ -148,10 +153,9 @@ class DefaultPermissionsPresenterTest {
presenter.present() presenter.present()
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.showDialog).isTrue() assertThat(initialState.showDialog).isFalse()
initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog) initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog)
assertThat(permissionState.launchPermissionRequestCalled).isTrue() assertThat(permissionState.launchPermissionRequestCalled).isTrue()
assertThat(awaitItem().showDialog).isFalse()
// User does not grant permission // User does not grant permission
permissionStateProvider.userGiveAnswer(answer = false, firstTime = false) permissionStateProvider.userGiveAnswer(answer = false, firstTime = false)
skipItems(2) skipItems(2)
@ -188,10 +192,12 @@ class DefaultPermissionsPresenterTest {
}.test { }.test {
skipItems(1) skipItems(1)
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.showDialog).isTrue() initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog)
assertThat(initialState.permissionGranted).isFalse() val withDialogState = awaitItem()
assertThat(initialState.permissionAlreadyDenied).isTrue() assertThat(withDialogState.showDialog).isTrue()
assertThat(initialState.permissionAlreadyAsked).isTrue() assertThat(withDialogState.permissionGranted).isFalse()
assertThat(withDialogState.permissionAlreadyDenied).isTrue()
assertThat(withDialogState.permissionAlreadyAsked).isTrue()
} }
} }
@ -215,10 +221,9 @@ class DefaultPermissionsPresenterTest {
presenter.present() presenter.present()
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.showDialog).isTrue() assertThat(initialState.showDialog).isFalse()
initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog) initialState.eventSink.invoke(PermissionsEvents.OpenSystemDialog)
assertThat(permissionState.launchPermissionRequestCalled).isTrue() assertThat(permissionState.launchPermissionRequestCalled).isTrue()
assertThat(awaitItem().showDialog).isFalse()
// User grants permission // User grants permission
permissionStateProvider.userGiveAnswer(answer = true, firstTime = true) permissionStateProvider.userGiveAnswer(answer = true, firstTime = true)
skipItems(1) skipItems(1)

Loading…
Cancel
Save