diff --git a/src/main/kotlin/org/briarproject/briar/desktop/login/ErrorScreen.kt b/src/main/kotlin/org/briarproject/briar/desktop/login/ErrorScreen.kt index bad371c4c82ef021de02b3bad852bba4d8b0c92e..4ea03ecc1542e777cd9ca7159b9dac395ba77852 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/login/ErrorScreen.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/login/ErrorScreen.kt @@ -19,6 +19,7 @@ package org.briarproject.briar.desktop.login import androidx.compose.foundation.layout.Arrangement.spacedBy +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize @@ -34,11 +35,13 @@ import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Error +import androidx.compose.material.icons.filled.Info import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @@ -69,16 +72,19 @@ fun main() = preview { } } - ErrorScreen(error) {} + ErrorScreen(error, {}) {} } @Composable -fun ErrorScreen(viewHolder: ErrorSubViewModel) = - ErrorScreen(viewHolder.error, viewHolder.onBackButton) +fun ErrorScreen( + onShowAbout: () -> Unit, + viewHolder: ErrorSubViewModel +) = ErrorScreen(viewHolder.error, onShowAbout, viewHolder.onBackButton) @Composable fun ErrorScreen( error: ErrorSubViewModel.Error, + onShowAbout: () -> Unit, onBackButton: (() -> Unit)?, ) { val text = when (error) { @@ -95,37 +101,47 @@ fun ErrorScreen( } } - ErrorScreen(text, onBackButton) + ErrorScreen(text, onShowAbout, onBackButton) } @Composable fun ErrorScreen( text: String, + onShowAbout: () -> Unit, onBackButton: (() -> Unit)? = null, ) = Surface { - if (onBackButton != null) { - IconButton(onClick = onBackButton) { - Icon(Icons.Filled.ArrowBack, i18n("back")) + Box { + Column( + modifier = Modifier.fillMaxSize().padding(32.dp), + horizontalAlignment = CenterHorizontally, + verticalArrangement = spacedBy(32.dp) + ) { + Icon( + imageVector = Icons.Filled.Error, + contentDescription = i18n("error"), + modifier = Modifier.size(128.dp), + tint = Red500 + ) + + Text(i18n("sorry"), style = MaterialTheme.typography.h5) + Text( + text = text, + style = MaterialTheme.typography.body1, + modifier = Modifier.widthIn(max = STARTUP_FIELDS_WIDTH) + ) } - } - Column( - modifier = Modifier.fillMaxSize().padding(32.dp), - horizontalAlignment = CenterHorizontally, - verticalArrangement = spacedBy(32.dp) - ) { - Icon( - imageVector = Icons.Filled.Error, - contentDescription = i18n("error"), - modifier = Modifier.size(128.dp), - tint = Red500 - ) + if (onBackButton != null) { + IconButton(onClick = onBackButton) { + Icon(Icons.Filled.ArrowBack, i18n("back")) + } + } - Text(i18n("sorry"), style = MaterialTheme.typography.h5) - Text( - text = text, - style = MaterialTheme.typography.body1, - modifier = Modifier.widthIn(max = STARTUP_FIELDS_WIDTH) - ) + IconButton( + onClick = onShowAbout, + modifier = Modifier.align(Alignment.BottomStart) + ) { + Icon(Icons.Filled.Info, i18n("access.about_briar_desktop")) + } } } diff --git a/src/main/kotlin/org/briarproject/briar/desktop/login/LoginScreen.kt b/src/main/kotlin/org/briarproject/briar/desktop/login/LoginScreen.kt index a6eeb71f506f3e2c4f28b6fb3af9f9c2d2f8edea..540cc31fa74e1750ae9ebf20accca96e6bb60439 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/login/LoginScreen.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/login/LoginScreen.kt @@ -47,8 +47,12 @@ import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n @OptIn(ExperimentalMaterialApi::class) @Composable fun LoginScreen( + onShowAbout: () -> Unit, viewHolder: LoginSubViewModel, -) = StartupScreenScaffold(i18n("startup.title.login")) { +) = StartupScreenScaffold( + title = i18n("startup.title.login"), + onShowAbout = onShowAbout, +) { when (viewHolder.state.value) { SIGNED_OUT -> FormScaffold( diff --git a/src/main/kotlin/org/briarproject/briar/desktop/login/RegistrationScreen.kt b/src/main/kotlin/org/briarproject/briar/desktop/login/RegistrationScreen.kt index 6d40b83b6a230ff9b2617ea0a0a9654c30465579..d223cb9b17996e26bb25c14dc292d13f2a517c9b 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/login/RegistrationScreen.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/login/RegistrationScreen.kt @@ -47,9 +47,11 @@ import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n @Composable fun RegistrationScreen( + onShowAbout: () -> Unit, viewHolder: RegistrationSubViewModel, ) = StartupScreenScaffold( title = i18n("startup.title.registration"), + onShowAbout = onShowAbout, showBackButton = viewHolder.showBackButton.value, onBackButton = viewHolder::goBack ) { diff --git a/src/main/kotlin/org/briarproject/briar/desktop/login/StartupScreen.kt b/src/main/kotlin/org/briarproject/briar/desktop/login/StartupScreen.kt index bc40de1c498ec8274c4dc630b48c58999e86794b..0485c3e38ce8f54f90088c0bd5309b00fa68ca06 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/login/StartupScreen.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/login/StartupScreen.kt @@ -19,6 +19,7 @@ package org.briarproject.briar.desktop.login import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize @@ -31,7 +32,9 @@ import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.Info import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier @@ -42,12 +45,13 @@ import org.briarproject.briar.desktop.viewmodel.viewModel @Composable fun StartupScreen( + onShowAbout: () -> Unit, viewModel: StartupViewModel = viewModel(), ) { when (val holder = viewModel.currentSubViewModel.value) { - is LoginSubViewModel -> LoginScreen(holder) - is RegistrationSubViewModel -> RegistrationScreen(holder) - is ErrorSubViewModel -> ErrorScreen(holder) + is LoginSubViewModel -> LoginScreen(onShowAbout, holder) + is RegistrationSubViewModel -> RegistrationScreen(onShowAbout, holder) + is ErrorSubViewModel -> ErrorScreen(onShowAbout, holder) } } @@ -56,20 +60,33 @@ fun StartupScreenScaffold( title: String, showBackButton: Boolean = false, onBackButton: () -> Unit = {}, + onShowAbout: () -> Unit = {}, content: @Composable () -> Unit ) = Surface { - if (showBackButton) { - IconButton(onClick = onBackButton) { - Icon(Icons.Filled.ArrowBack, i18n("back")) + Box { + Column( + modifier = Modifier.padding(16.dp).fillMaxSize(), + horizontalAlignment = CenterHorizontally + ) { + HeaderLine(title) + content() } - } - Column( - modifier = Modifier.padding(16.dp).fillMaxSize(), - horizontalAlignment = CenterHorizontally - ) { - HeaderLine(title) - content() + if (showBackButton) { + IconButton( + onClick = onBackButton, + modifier = Modifier.align(Alignment.TopStart) + ) { + Icon(Icons.Filled.ArrowBack, i18n("back")) + } + } + + IconButton( + onClick = onShowAbout, + modifier = Modifier.align(Alignment.BottomStart) + ) { + Icon(Icons.Filled.Info, i18n("access.about_briar_desktop")) + } } } diff --git a/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt b/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt index fb0066b873303541a2abd26cad1008b93f402d3b..2cb889f21b53d0e2c3ea413ef64bf6f51da64355 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt @@ -126,9 +126,9 @@ constructor( Column(Modifier.fillMaxSize()) { ExpirationBanner { screenState = EXPIRED; stop() } when (screenState) { - STARTUP -> StartupScreen() + STARTUP -> StartupScreen(onShowAbout = { showAbout = true }) MAIN -> MainScreen(settingsViewModel, showAbout = { showAbout = true }) - EXPIRED -> ErrorScreen(i18n("startup.failed.expired")) + EXPIRED -> ErrorScreen(i18n("startup.failed.expired"), onShowAbout = { showAbout = true }) } } if (showAbout) {