From ce582249ec391eec78fc85943d696ea82b3547fd Mon Sep 17 00:00:00 2001 From: Michelle Tang Date: Wed, 15 Apr 2026 11:02:19 -0400 Subject: [PATCH] Ask for permissions on the same screen. --- .../registration/RegistrationNavigation.kt | 16 +++++++++------- .../screens/permissions/PermissionsScreen.kt | 7 +++++-- .../registration/RegistrationNavigationTest.kt | 7 ++++--- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/feature/registration/src/main/java/org/signal/registration/RegistrationNavigation.kt b/feature/registration/src/main/java/org/signal/registration/RegistrationNavigation.kt index 490ab78f49..6eec14c2ef 100644 --- a/feature/registration/src/main/java/org/signal/registration/RegistrationNavigation.kt +++ b/feature/registration/src/main/java/org/signal/registration/RegistrationNavigation.kt @@ -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.navigationEntries( registrationRepository: RegistrationRepository, registrationViewModel: RegistrationViewModel, - permissionsState: MultiplePermissionsState, + permissionsState: MultiplePermissionsState?, onRegistrationComplete: () -> Unit ) { val parentEventEmitter: (RegistrationFlowEvent) -> Unit = registrationViewModel::onEvent @@ -259,11 +258,14 @@ private fun EntryProviderScope.navigationEntries( // --- Permissions Screen entry { 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 ) } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/permissions/PermissionsScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/permissions/PermissionsScreen.kt index a585b9b473..6aab1ab3dd 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/permissions/PermissionsScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/permissions/PermissionsScreen.kt @@ -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( diff --git a/feature/registration/src/test/java/org/signal/registration/RegistrationNavigationTest.kt b/feature/registration/src/test/java/org/signal/registration/RegistrationNavigationTest.kt index db0ab90521..35564729d7 100644 --- a/feature/registration/src/test/java/org/signal/registration/RegistrationNavigationTest.kt +++ b/feature/registration/src/test/java/org/signal/registration/RegistrationNavigationTest.kt @@ -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) } ) }