Ask for permissions on the same screen.

This commit is contained in:
Michelle Tang
2026-04-15 11:02:19 -04:00
committed by jeffrey-signal
parent b21a72153a
commit ce582249ec
3 changed files with 18 additions and 12 deletions
@@ -171,7 +171,6 @@ fun RegistrationNavHost(
)
val registrationState by viewModel.state.collectAsStateWithLifecycle()
val permissions: MultiplePermissionsState = permissionsState ?: rememberMultiplePermissionsState(viewModel.getRequiredPermissions())
if (registrationState.isRestoringNavigationState) {
Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
@@ -184,7 +183,7 @@ fun RegistrationNavHost(
navigationEntries(
registrationRepository = registrationRepository,
registrationViewModel = viewModel,
permissionsState = permissions,
permissionsState = permissionsState,
onRegistrationComplete = onRegistrationComplete
)
}
@@ -238,7 +237,7 @@ fun RegistrationNavHost(
private fun EntryProviderScope<NavKey>.navigationEntries(
registrationRepository: RegistrationRepository,
registrationViewModel: RegistrationViewModel,
permissionsState: MultiplePermissionsState,
permissionsState: MultiplePermissionsState?,
onRegistrationComplete: () -> Unit
) {
val parentEventEmitter: (RegistrationFlowEvent) -> Unit = registrationViewModel::onEvent
@@ -259,11 +258,14 @@ private fun EntryProviderScope<NavKey>.navigationEntries(
// --- Permissions Screen
entry<RegistrationRoute.Permissions> { key ->
val onProceed = { parentEventEmitter.navigateTo(key.nextRoute) }
val localPermissionsState = permissionsState ?: rememberMultiplePermissionsState(
permissions = registrationViewModel.getRequiredPermissions(),
onPermissionsResult = { onProceed() }
)
PermissionsScreen(
permissionsState = permissionsState,
onProceed = {
parentEventEmitter.navigateTo(key.nextRoute)
}
permissionsState = localPermissionsState,
onProceed = onProceed
)
}
@@ -377,8 +377,11 @@ private fun PermissionButtons(onProceed: () -> Unit, permissionsState: MultipleP
Buttons.LargeTonal(
modifier = Modifier.testTag(TestTags.PERMISSIONS_NEXT_BUTTON),
onClick = {
permissionsState.launchMultiplePermissionRequest()
onProceed()
if (permissionsState.allPermissionsGranted) {
onProceed()
} else {
permissionsState.launchMultiplePermissionRequest()
}
}
) {
Text(
@@ -105,9 +105,9 @@ class RegistrationNavigationTest {
}
@Test
fun `clicking Next on Permissions navigates to PhoneNumber`() {
fun `clicking Next on Permissions when they are all granted navigates to PhoneNumber`() {
// Given
val permissionsState = createMockPermissionsState()
val permissionsState = createMockPermissionsState(allPermissionsGranted = true)
composeTestRule.setContent {
SignalTheme {
@@ -216,8 +216,9 @@ class RegistrationNavigationTest {
* Creates a mock permissions state for testing.
* Since we're in JUnit tests, we can't use the real rememberMultiplePermissionsState.
*/
private fun createMockPermissionsState(): MockMultiplePermissionsState {
private fun createMockPermissionsState(allPermissionsGranted: Boolean = false): MockMultiplePermissionsState {
return MockMultiplePermissionsState(
allPermissionsGranted = allPermissionsGranted,
permissions = viewModel.getRequiredPermissions().map { MockPermissionsState(it) }
)
}