Update regV5 permissions screen to use RegistrationScaffold.

This commit is contained in:
jeffrey-signal
2026-05-14 13:50:32 -04:00
parent 10d969ea35
commit 28edcdf62d
@@ -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<String>,
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<String>,
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<String>,
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