From 28edcdf62dc99cf145f5af1d19d2468d437eb81e Mon Sep 17 00:00:00 2001 From: jeffrey-signal Date: Thu, 14 May 2026 13:50:32 -0400 Subject: [PATCH] Update regV5 permissions screen to use RegistrationScaffold. --- .../screens/permissions/PermissionsScreen.kt | 225 +++++++----------- 1 file changed, 80 insertions(+), 145 deletions(-) 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 82288c4154..6efceedffe 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 @@ -10,7 +10,6 @@ package org.signal.registration.screens.permissions import android.Manifest import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Arrangement.SpaceAround import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -27,7 +26,6 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.testTag @@ -36,14 +34,12 @@ import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.dp import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.MultiplePermissionsState -import org.signal.core.ui.WindowBreakpoint import org.signal.core.ui.compose.AllDevicePreviews import org.signal.core.ui.compose.Buttons import org.signal.core.ui.compose.Previews -import org.signal.core.ui.compose.horizontalGutters -import org.signal.core.ui.rememberWindowBreakpoint import org.signal.registration.R import org.signal.registration.screens.RegistrationScaffold +import org.signal.registration.screens.TwoPaneRegistrationScaffold import org.signal.registration.screens.util.MockMultiplePermissionsState import org.signal.registration.screens.util.MockPermissionsState import org.signal.registration.test.TestTags @@ -59,55 +55,43 @@ import org.signal.registration.test.TestTags @Composable fun PermissionsScreen( permissionsState: MultiplePermissionsState, - onProceed: () -> Unit = {}, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + onProceed: () -> Unit = {} ) { - val windowBreakpoint = rememberWindowBreakpoint() + val layoutParams = RegistrationScaffold.rememberLayoutParams() val permissions = permissionsState.permissions.map { it.permission } - when (windowBreakpoint) { - WindowBreakpoint.SMALL -> { - Surface(modifier = modifier.testTag(TestTags.PERMISSIONS_SCREEN)) { - CompactLayout( - permissionsState = permissionsState, - permissions = permissions, - onProceed = onProceed, - modifier = modifier - ) - } - } + Surface(modifier = modifier.testTag(TestTags.PERMISSIONS_SCREEN)) { + when (layoutParams) { + is RegistrationScaffold.Params.OnePane -> OnePaneLayout( + params = layoutParams, + permissionsState = permissionsState, + permissions = permissions, + onProceed = onProceed, + modifier = modifier + ) - WindowBreakpoint.MEDIUM -> { - Surface(modifier = modifier.testTag(TestTags.PERMISSIONS_SCREEN)) { - MediumLayout( - permissionsState = permissionsState, - permissions = permissions, - onProceed = onProceed, - modifier = modifier - ) - } - } - - WindowBreakpoint.LARGE_WIDTH, WindowBreakpoint.LARGE_HEIGHT -> { - Surface(modifier = modifier.testTag(TestTags.PERMISSIONS_SCREEN)) { - LargeLayout( - permissionsState = permissionsState, - permissions = permissions, - onProceed = onProceed, - modifier = modifier - ) - } + is RegistrationScaffold.Params.TwoPane -> TwoPaneLayout( + params = layoutParams, + permissionsState = permissionsState, + permissions = permissions, + onProceed = onProceed, + modifier = modifier + ) } } } @Composable -private fun CompactLayout( +private fun OnePaneLayout( + params: RegistrationScaffold.Params.OnePane, modifier: Modifier, permissions: List, permissionsState: MultiplePermissionsState, onProceed: () -> Unit ) { + val scrollState = rememberScrollState() + RegistrationScaffold( modifier = modifier.fillMaxSize(), content = { @@ -115,17 +99,12 @@ private fun CompactLayout( modifier = Modifier .fillMaxWidth() .fillMaxHeight() - .padding(top = 24.dp), - contentAlignment = Alignment.BottomCenter ) { - val scrollState = rememberScrollState() - Column( modifier = Modifier .fillMaxHeight() .verticalScroll(scrollState) - .padding(top = 16.dp) - .horizontalGutters() + .padding(params.panePadding) ) { Text( text = stringResource(id = R.string.GrantPermissionsFragment__allow_permissions), @@ -141,118 +120,72 @@ private fun CompactLayout( ) PermissionList(permissions) - - Spacer(modifier = Modifier.padding(48.dp)) } - - PermissionButtons(onProceed, permissionsState, scrollState.canScrollForward) } + }, + footer = { + PermissionButtons( + onProceed = onProceed, + permissionsState = permissionsState, + showElevation = scrollState.canScrollForward, + modifier = Modifier.padding(params.bottomInset) + ) } ) } @Composable -private fun MediumLayout( - modifier: Modifier, +private fun TwoPaneLayout( + params: RegistrationScaffold.Params.TwoPane, + modifier: Modifier = Modifier, permissions: List, permissionsState: MultiplePermissionsState, onProceed: () -> Unit ) { val scrollState = rememberScrollState() - RegistrationScaffold( + TwoPaneRegistrationScaffold( modifier = modifier.fillMaxSize(), - content = { - Row( - horizontalArrangement = SpaceAround, - modifier = Modifier.padding(top = 56.dp) + params = params, + firstPane = { paddingValues -> + Column( + modifier = Modifier + .weight(1f) + .fillMaxHeight() + .padding(paddingValues) ) { - Column( - modifier = Modifier - .weight(1f) - .padding(horizontal = 24.dp) - ) { - Text( - text = stringResource(id = R.string.GrantPermissionsFragment__allow_permissions), - style = MaterialTheme.typography.headlineMedium, - modifier = Modifier.fillMaxWidth() - ) + Text( + text = stringResource(id = R.string.GrantPermissionsFragment__allow_permissions), + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.fillMaxWidth() + ) - Text( - text = stringResource(id = R.string.GrantPermissionsFragment__to_help_you_message_people_you_know), - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(top = 16.dp) - ) - } - - Column( - modifier = Modifier - .weight(1f) - .fillMaxHeight() - .verticalScroll(scrollState) - .padding(horizontal = 24.dp) - ) { - PermissionList(permissions) - Spacer(modifier = Modifier.padding(48.dp)) - } + Text( + text = stringResource(id = R.string.GrantPermissionsFragment__to_help_you_message_people_you_know), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = 16.dp) + ) + } + }, + secondPane = { paddingValues -> + Column( + modifier = Modifier + .weight(1f) + .fillMaxHeight() + .verticalScroll(scrollState) + .padding(paddingValues) + ) { + PermissionList(permissions) } }, footer = { - PermissionButtons(onProceed, permissionsState, scrollState.canScrollForward) - } - ) -} - -@Composable -private fun LargeLayout( - modifier: Modifier, - permissions: List, - permissionsState: MultiplePermissionsState, - onProceed: () -> Unit -) { - val scrollState = rememberScrollState() - - RegistrationScaffold( - modifier = modifier.fillMaxSize(), - content = { - Row( - horizontalArrangement = SpaceAround, - modifier = Modifier.padding(top = 76.dp) - ) { - Column( - modifier = Modifier - .weight(1f) - .padding(horizontal = 24.dp) - ) { - Text( - text = stringResource(id = R.string.GrantPermissionsFragment__allow_permissions), - style = MaterialTheme.typography.headlineMedium, - modifier = Modifier.fillMaxWidth() - ) - - Text( - text = stringResource(id = R.string.GrantPermissionsFragment__to_help_you_message_people_you_know), - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(top = 16.dp) - ) - } - - Column( - modifier = Modifier - .weight(1f) - .fillMaxHeight() - .verticalScroll(scrollState) - .padding(horizontal = 24.dp) - ) { - PermissionList(permissions) - Spacer(modifier = Modifier.padding(48.dp)) - } - } - }, - footer = { - PermissionButtons(onProceed, permissionsState, scrollState.canScrollForward) + PermissionButtons( + onProceed = onProceed, + permissionsState = permissionsState, + showElevation = scrollState.canScrollForward, + modifier = Modifier.padding(params.bottomInset) + ) } ) } @@ -331,17 +264,19 @@ private fun PermissionRow( } @Composable -private fun PermissionButtons(onProceed: () -> Unit, permissionsState: MultiplePermissionsState, showElevation: Boolean) { +private fun PermissionButtons( + onProceed: () -> Unit, + permissionsState: MultiplePermissionsState, + showElevation: Boolean, + modifier: Modifier = Modifier +) { Surface( modifier = Modifier.fillMaxWidth(), shadowElevation = if (showElevation) 8.dp else 0.dp ) { Row( - horizontalArrangement = Arrangement.Absolute.Right, - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 16.dp) - .horizontalGutters() + horizontalArrangement = Arrangement.End, + modifier = modifier.fillMaxWidth() ) { TextButton( modifier = Modifier