diff --git a/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepScreen.kt index 8309b262ed..8f14fb02c3 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepScreen.kt @@ -78,6 +78,7 @@ private fun OnePaneLayout( modifier: Modifier = Modifier ) { val scrollState = rememberScrollState() + OnePaneRegistrationScaffold( modifier = modifier.fillMaxSize(), params = params, @@ -129,7 +130,9 @@ private fun TwoPaneLayout( onEvent: (EnterAepEvents) -> Unit, modifier: Modifier = Modifier ) { - val scrollState = rememberScrollState() + val firstPaneScrollState = rememberScrollState() + val secondPaneScrollState = rememberScrollState() + TwoPaneRegistrationScaffold( modifier = modifier.fillMaxSize(), params = params, @@ -138,7 +141,7 @@ private fun TwoPaneLayout( modifier = Modifier .weight(1f) .fillMaxHeight() - .verticalScroll(scrollState) + .verticalScroll(firstPaneScrollState) .padding(paddingValues) ) { Description() @@ -149,7 +152,7 @@ private fun TwoPaneLayout( modifier = Modifier .weight(1f) .fillMaxHeight() - .verticalScroll(scrollState) + .verticalScroll(secondPaneScrollState) .padding(paddingValues) ) { RecoveryKeyTextField(state, onEvent) @@ -157,7 +160,7 @@ private fun TwoPaneLayout( }, footer = { RegistrationScaffold.FooterSurface( - isContentScrolledUnder = scrollState.canScrollForward + isContentScrolledUnder = firstPaneScrollState.canScrollForward || secondPaneScrollState.canScrollForward ) { Row( horizontalArrangement = Arrangement.End, diff --git a/feature/registration/src/main/java/org/signal/registration/screens/allownotifications/AllowNotificationsScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/allownotifications/AllowNotificationsScreen.kt index bce78acb72..39e0fa2eb9 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/allownotifications/AllowNotificationsScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/allownotifications/AllowNotificationsScreen.kt @@ -11,7 +11,10 @@ import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -56,6 +59,8 @@ fun AllowNotificationsScreen( @OptIn(ExperimentalPermissionsApi::class) @Composable private fun OnePane(params: RegistrationScaffold.Params.OnePane, permissionState: PermissionState, onProceed: () -> Unit) { + val scrollState = rememberScrollState() + OnePaneRegistrationScaffold( params = params, footer = { @@ -64,10 +69,12 @@ private fun OnePane(params: RegistrationScaffold.Params.OnePane, permissionState onProceed = onProceed ) } - ) { + ) { paddingValues -> Column( horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.padding(it) + modifier = Modifier + .verticalScroll(scrollState) + .padding(paddingValues) ) { FirstPaneContent() SecondPaneContent() @@ -78,20 +85,27 @@ private fun OnePane(params: RegistrationScaffold.Params.OnePane, permissionState @OptIn(ExperimentalPermissionsApi::class) @Composable private fun TwoPane(params: RegistrationScaffold.Params.TwoPane, permissionState: PermissionState, onProceed: () -> Unit) { + val firstPaneScrollState = rememberScrollState() + val secondPaneScrollState = rememberScrollState() + TwoPaneRegistrationScaffold( params = params, - firstPane = { + firstPane = { paddingValues -> FirstPaneContent( modifier = Modifier - .padding(it) .weight(1f) + .fillMaxHeight() + .verticalScroll(firstPaneScrollState) + .padding(paddingValues) ) }, - secondPane = { + secondPane = { paddingValues -> SecondPaneContent( modifier = Modifier - .padding(it) .weight(1f) + .fillMaxHeight() + .verticalScroll(secondPaneScrollState) + .padding(paddingValues) ) }, footer = { diff --git a/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreen.kt index c5b4c31bd7..5a879ad692 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreen.kt @@ -113,17 +113,18 @@ private fun OnePane( state: LinkAccountScreenState, onEvent: (LinkAccountScreenEvent) -> Unit ) { + val scrollState = rememberScrollState() + OnePaneRegistrationScaffold( params = params, footer = { OnePaneFooterContent(onEvent = onEvent) } - ) { - val scroller = rememberScrollState() + ) { paddingValues -> Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = spacedBy(64.dp), modifier = Modifier - .padding(it) - .verticalScroll(scroller) + .padding(paddingValues) + .verticalScroll(scrollState) ) { Title() @@ -142,21 +143,21 @@ private fun TwoPane( ) { TwoPaneRegistrationScaffold( params = params, - firstPane = { + firstPane = { paddingValues -> FirstPaneContent( onEvent = onEvent, modifier = Modifier - .padding(it) + .padding(paddingValues) .weight(1f) ) }, - secondPane = { + secondPane = { paddingValues -> QrCodeContent( state = state, onEvent = onEvent, modifier = Modifier .weight(1f) - .padding(it) + .padding(paddingValues) ) }, footer = { TwoPaneFooterContent(onEvent = onEvent) } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/EnterLocalBackupV1PassphaseScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/EnterLocalBackupV1PassphaseScreen.kt index a3a270b866..53f9d0500f 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/EnterLocalBackupV1PassphaseScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/EnterLocalBackupV1PassphaseScreen.kt @@ -148,7 +148,9 @@ private fun TwoPaneLayout( onCancel: () -> Unit, modifier: Modifier ) { - val scrollState = rememberScrollState() + val firstPaneScrollState = rememberScrollState() + val secondPaneScrollState = rememberScrollState() + TwoPaneRegistrationScaffold( modifier = modifier.fillMaxSize(), params = params, @@ -157,7 +159,7 @@ private fun TwoPaneLayout( modifier = Modifier .weight(1f) .fillMaxHeight() - .verticalScroll(scrollState) + .verticalScroll(firstPaneScrollState) .padding(paddingValues) ) { Description() @@ -168,7 +170,7 @@ private fun TwoPaneLayout( modifier = Modifier .weight(1f) .fillMaxHeight() - .verticalScroll(scrollState) + .verticalScroll(secondPaneScrollState) .padding(paddingValues) ) { PassphraseTextField( diff --git a/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreScaffold.kt b/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreScaffold.kt index 0a6aed6aac..d3608892c3 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreScaffold.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreScaffold.kt @@ -44,6 +44,7 @@ internal fun LocalBackupRestoreLayout( when (val params = RegistrationScaffold.rememberLayoutParams()) { is RegistrationScaffold.Params.OnePane -> { val scrollState = rememberScrollState() + OnePaneRegistrationScaffold( modifier = modifier.fillMaxSize(), params = params, @@ -87,6 +88,7 @@ internal fun LocalBackupRestoreLayout( is RegistrationScaffold.Params.TwoPane -> { val firstPaneScrollState = rememberScrollState() val secondPaneScrollState = rememberScrollState() + TwoPaneRegistrationScaffold( modifier = modifier .fillMaxSize() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreen.kt index 02aca97c21..b3d7f91e4a 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreen.kt @@ -10,9 +10,12 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Icon import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme @@ -68,13 +71,17 @@ fun MessageSyncScreen( @Composable private fun OnePane(params: RegistrationScaffold.Params.OnePane, state: MessageSyncScreenState, onEvent: (MessageSyncScreenEvent) -> Unit) { + val scrollState = rememberScrollState() + OnePaneRegistrationScaffold( params = params, footer = { FooterContent(params = params, onEvent = onEvent) } - ) { + ) { paddingValues -> Column( horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.padding(it) + modifier = Modifier + .verticalScroll(scrollState) + .padding(paddingValues) ) { FirstPaneContent(state) SecondPaneContent() @@ -84,21 +91,27 @@ private fun OnePane(params: RegistrationScaffold.Params.OnePane, state: MessageS @Composable private fun TwoPane(params: RegistrationScaffold.Params.TwoPane, state: MessageSyncScreenState, onEvent: (MessageSyncScreenEvent) -> Unit) { + val firstPaneScrollState = rememberScrollState() + val secondPaneScrollState = rememberScrollState() + TwoPaneRegistrationScaffold( params = params, - firstPane = { + firstPane = { paddingValues -> FirstPaneContent( state = state, modifier = Modifier - .padding(it) .weight(1f) + .fillMaxHeight() + .verticalScroll(firstPaneScrollState) + .padding(paddingValues) ) }, - secondPane = { + secondPane = { paddingValues -> SecondPaneContent( modifier = Modifier - .padding(it) .weight(1f) + .verticalScroll(secondPaneScrollState) + .padding(paddingValues) ) }, footer = { FooterContent(params = params, onEvent = onEvent) } @@ -253,7 +266,9 @@ private fun Notice(modifier: Modifier, onEvent: (MessageSyncScreenEvent) -> Unit textAlign = TextAlign.Center, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.testTag(TestTags.MESSAGE_SYNC_LEARN_MORE_LINK).widthIn(max = 405.dp) + modifier = Modifier + .testTag(TestTags.MESSAGE_SYNC_LEARN_MORE_LINK) + .widthIn(max = 405.dp) ) Spacer(modifier = Modifier.weight(1f)) 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 74a9883648..bf6944fb82 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 @@ -113,7 +113,9 @@ private fun OnePaneLayout( Text( text = stringResource(id = R.string.GrantPermissionsFragment__allow_permissions), style = MaterialTheme.typography.headlineMedium, - modifier = Modifier.fillMaxWidth().attachDebugLogHelper() + modifier = Modifier + .fillMaxWidth() + .attachDebugLogHelper() ) Text( @@ -146,7 +148,8 @@ private fun TwoPaneLayout( permissionsState: MultiplePermissionsState, onProceed: () -> Unit ) { - val scrollState = rememberScrollState() + val firstPaneScrollState = rememberScrollState() + val secondPaneScrollState = rememberScrollState() TwoPaneRegistrationScaffold( modifier = modifier.fillMaxSize(), @@ -156,12 +159,15 @@ private fun TwoPaneLayout( modifier = Modifier .weight(1f) .fillMaxHeight() + .verticalScroll(firstPaneScrollState) .padding(paddingValues) ) { Text( text = stringResource(id = R.string.GrantPermissionsFragment__allow_permissions), style = MaterialTheme.typography.headlineMedium, - modifier = Modifier.fillMaxWidth().attachDebugLogHelper() + modifier = Modifier + .fillMaxWidth() + .attachDebugLogHelper() ) Text( @@ -177,7 +183,7 @@ private fun TwoPaneLayout( modifier = Modifier .weight(1f) .fillMaxHeight() - .verticalScroll(scrollState) + .verticalScroll(secondPaneScrollState) .padding(paddingValues) ) { PermissionList(permissions) @@ -187,7 +193,7 @@ private fun TwoPaneLayout( PermissionButtons( onProceed = onProceed, permissionsState = permissionsState, - showElevation = scrollState.canScrollForward, + showElevation = firstPaneScrollState.canScrollForward || secondPaneScrollState.canScrollForward, modifier = Modifier.padding(params.footerPadding) ) } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationScreen.kt index a2ecce1a79..37561ba82f 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationScreen.kt @@ -170,7 +170,8 @@ private fun TwoPaneLayout( onEvent: (PinCreationScreenEvents) -> Unit, modifier: Modifier = Modifier ) { - val scrollState = rememberScrollState() + val firstPaneScrollState = rememberScrollState() + val secondPaneScrollState = rememberScrollState() TwoPaneRegistrationScaffold( modifier = modifier.fillMaxSize(), @@ -180,6 +181,7 @@ private fun TwoPaneLayout( modifier = Modifier .weight(1f) .fillMaxHeight() + .verticalScroll(firstPaneScrollState) .padding(paddingValues) ) { PinDescription( @@ -193,7 +195,7 @@ private fun TwoPaneLayout( modifier = Modifier .weight(1f) .fillMaxHeight() - .verticalScroll(scrollState) + .verticalScroll(secondPaneScrollState) .padding(paddingValues) ) { PinInputField( @@ -219,7 +221,7 @@ private fun TwoPaneLayout( NextButton( params = params, canSubmitPin = canSubmitPin, - showElevation = scrollState.canScrollForward, + showElevation = firstPaneScrollState.canScrollForward || secondPaneScrollState.canScrollForward, onNext = { onEvent(PinCreationScreenEvents.PinSubmitted(pin)) } ) } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreen.kt index ad10db9365..5a41fb17d5 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreen.kt @@ -175,7 +175,8 @@ private fun TwoPaneLayout( onEvent: (PinEntryScreenEvents) -> Unit, modifier: Modifier = Modifier ) { - val scrollState = rememberScrollState() + val firstPaneScrollState = rememberScrollState() + val secondPaneScrollState = rememberScrollState() TwoPaneRegistrationScaffold( modifier = modifier.fillMaxSize(), @@ -185,6 +186,7 @@ private fun TwoPaneLayout( modifier = Modifier .weight(1f) .fillMaxHeight() + .verticalScroll(firstPaneScrollState) .padding(paddingValues) ) { PinDescription( @@ -201,7 +203,7 @@ private fun TwoPaneLayout( ) { Column( modifier = Modifier - .verticalScroll(scrollState) + .verticalScroll(secondPaneScrollState) .padding(paddingValues) ) { PinInputField( @@ -232,7 +234,7 @@ private fun TwoPaneLayout( ContinueButton( params = params, canSubmitPin = canSubmitPin, - showElevation = scrollState.canScrollForward, + showElevation = firstPaneScrollState.canScrollForward || secondPaneScrollState.canScrollForward, onContinue = { onEvent(PinEntryScreenEvents.PinEntered(pin)) } ) } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionScreen.kt index 3a372c6845..cd1f8e3a3e 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionScreen.kt @@ -122,7 +122,9 @@ private fun TwoPaneLayout( onEvent: (ArchiveRestoreSelectionScreenEvents) -> Unit, modifier: Modifier ) { - val scrollState = rememberScrollState() + val firstPaneScrollState = rememberScrollState() + val secondPaneScrollState = rememberScrollState() + TwoPaneRegistrationScaffold( modifier = modifier .fillMaxSize() @@ -132,7 +134,7 @@ private fun TwoPaneLayout( Column( modifier = Modifier .weight(1f) - .verticalScroll(scrollState) + .verticalScroll(firstPaneScrollState) .padding(paddingValues) ) { Description() @@ -142,7 +144,7 @@ private fun TwoPaneLayout( Column( modifier = Modifier .weight(1f) - .verticalScroll(scrollState) + .verticalScroll(secondPaneScrollState) .padding(paddingValues) ) { RestoreOptions(state, onEvent) @@ -150,7 +152,7 @@ private fun TwoPaneLayout( }, footer = { RegistrationScaffold.FooterSurface( - isContentScrolledUnder = scrollState.canScrollForward + isContentScrolledUnder = firstPaneScrollState.canScrollForward || secondPaneScrollState.canScrollForward ) { if (state.showSkipButton) { Row( diff --git a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreen.kt index 368ec1599a..158ec12441 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreen.kt @@ -231,7 +231,9 @@ private fun TwoPaneLayout( onEvent: (VerificationCodeScreenEvents) -> Unit, onDigitsChanged: (List) -> Unit ) { - val scrollState = rememberScrollState() + val firstPaneScrollState = rememberScrollState() + val secondPaneScrollState = rememberScrollState() + TwoPaneRegistrationScaffold( modifier = Modifier .fillMaxSize() @@ -241,7 +243,7 @@ private fun TwoPaneLayout( Column( modifier = Modifier .weight(1f) - .verticalScroll(scrollState) + .verticalScroll(firstPaneScrollState) .padding(paddingValues) ) { Description(state, onEvent) @@ -251,7 +253,7 @@ private fun TwoPaneLayout( Column( modifier = Modifier .weight(1f) - .verticalScroll(scrollState) + .verticalScroll(secondPaneScrollState) .padding(paddingValues) ) { CodeField( @@ -270,7 +272,7 @@ private fun TwoPaneLayout( }, footer = { RegistrationScaffold.FooterSurface( - isContentScrolledUnder = scrollState.canScrollForward + isContentScrolledUnder = firstPaneScrollState.canScrollForward || secondPaneScrollState.canScrollForward ) { Row( modifier = Modifier