Fix behavior of DefaultPermissionsPresenter. Do not show dialog immediately.
This commit is contained in:
parent
da61b8970a
commit
a43e82e2ff
2 changed files with 25 additions and 17 deletions
|
|
@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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…
Add table
Add a link
Reference in a new issue