From e22a7a5eb4ba4d9afca768a4af2cbc39cb45d484 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 23 Aug 2022 12:09:04 -0700 Subject: [PATCH] move focus manager up one view level --- .../omnivore/omnivore/ui/auth/EmailLogin.kt | 91 ++++++++++--------- .../omnivore/ui/auth/WelcomeScreen.kt | 51 ++++++++--- 2 files changed, 88 insertions(+), 54 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/EmailLogin.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/EmailLogin.kt index 574106aa2..eb29f52c9 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/EmailLogin.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/EmailLogin.kt @@ -15,11 +15,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController +import app.omnivore.omnivore.R import kotlinx.coroutines.launch //@Composable @@ -41,52 +43,61 @@ import kotlinx.coroutines.launch fun EmailLoginView(viewModel: LoginViewModel, onAuthProviderButtonTap: () -> Unit) { var email by rememberSaveable { mutableStateOf("") } var password by rememberSaveable { mutableStateOf("") } - val focusManager = LocalFocusManager.current - val snackBarHostState = remember { SnackbarHostState() } - val coroutineScope = rememberCoroutineScope() - Column( - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .background(MaterialTheme.colorScheme.background) - .fillMaxSize() - .clickable { focusManager.clearFocus() } + Row( + horizontalArrangement = Arrangement.Center ) { - LoginFields( - email, - password, - onEmailChange = { email = it }, - onPasswordChange = { password = it }, - onLoginClick = { viewModel.login(email, password) } - ) + Spacer(modifier = Modifier.weight(1.0F)) + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + LoginFields( + email, + password, + onEmailChange = { email = it }, + onPasswordChange = { password = it }, + onLoginClick = { viewModel.login(email, password) } + ) - // TODO: add a activity indicator (maybe after a delay?) - if (viewModel.isLoading) { - Text("Loading...") - } - - if (viewModel.errorMessage != null) { - coroutineScope.launch { - val result = snackBarHostState - .showSnackbar( - viewModel.errorMessage!!, - actionLabel = "Dismiss", - duration = SnackbarDuration.Indefinite - ) - when (result) { - SnackbarResult.ActionPerformed -> viewModel.resetErrorMessage() - } + // TODO: add a activity indicator (maybe after a delay?) + if (viewModel.isLoading) { + Text("Loading...") } - SnackbarHost(hostState = snackBarHostState) + ClickableText( + text = AnnotatedString("Continue with Google/Apple ->"), + onClick = { onAuthProviderButtonTap() } + ) } - - ClickableText( - text = AnnotatedString("Continue with Google/Apple ->"), - onClick = { onAuthProviderButtonTap() } - ) + Spacer(modifier = Modifier.weight(1.0F)) } + +// Column( +// verticalArrangement = Arrangement.Center, +// horizontalAlignment = Alignment.CenterHorizontally, +// modifier = Modifier +// .fillMaxSize() +// .clickable { focusManager.clearFocus() } +// ) { +// LoginFields( +// email, +// password, +// onEmailChange = { email = it }, +// onPasswordChange = { password = it }, +// onLoginClick = { viewModel.login(email, password) } +// ) +// +// // TODO: add a activity indicator (maybe after a delay?) +// if (viewModel.isLoading) { +// Text("Loading...") +// } +// +// ClickableText( +// text = AnnotatedString("Continue with Google/Apple ->"), +// onClick = { onAuthProviderButtonTap() } +// ) +// } } @OptIn(ExperimentalMaterial3Api::class) @@ -108,8 +119,6 @@ fun LoginFields( verticalArrangement = Arrangement.spacedBy(25.dp), horizontalAlignment = Alignment.CenterHorizontally ) { - Text("Never miss a great read") - OutlinedTextField( value = email, placeholder = { Text(text = "user@email.com") }, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/WelcomeScreen.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/WelcomeScreen.kt index 85a2a955b..a0f77a040 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/WelcomeScreen.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/WelcomeScreen.kt @@ -1,9 +1,11 @@ package app.omnivore.omnivore.ui.auth +import android.annotation.SuppressLint import android.content.Intent import android.net.Uri import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.text.ClickableText import androidx.compose.material.ExperimentalMaterialApi @@ -14,6 +16,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString @@ -22,17 +25,16 @@ import androidx.navigation.NavHostController import app.omnivore.omnivore.R import app.omnivore.omnivore.Routes import com.google.android.gms.common.GoogleApiAvailability +import kotlinx.coroutines.launch @Composable fun WelcomeScreen(viewModel: LoginViewModel) { -// val systemUiController = rememberSystemUiController() -// systemUiController.isSystemBarsVisible = false - Surface(modifier = Modifier.fillMaxSize(), color = Color(0xFFFBEAA8 )) { WelcomeScreenContent(viewModel = viewModel) } } +@SuppressLint("CoroutineCreationDuringComposition") @Composable fun WelcomeScreenContent(viewModel: LoginViewModel) { var registrationState by rememberSaveable { mutableStateOf(RegistrationState.AuthProviderButtons) } @@ -41,7 +43,12 @@ fun WelcomeScreenContent(viewModel: LoginViewModel) { registrationState = state } - Column( + val snackBarHostState = remember { SnackbarHostState() } + val coroutineScope = rememberCoroutineScope() + val focusManager = LocalFocusManager.current + + + Column( verticalArrangement = Arrangement.SpaceAround, horizontalAlignment = Alignment.Start, modifier = Modifier @@ -49,6 +56,7 @@ fun WelcomeScreenContent(viewModel: LoginViewModel) { .fillMaxSize() .navigationBarsPadding() .padding(horizontal = 16.dp) + .clickable { focusManager.clearFocus() } ) { Spacer(modifier = Modifier.height(50.dp)) Image( @@ -57,6 +65,15 @@ fun WelcomeScreenContent(viewModel: LoginViewModel) { ) Spacer(modifier = Modifier.height(50.dp)) + Text( + text = stringResource(id = R.string.welcome_title), + style = MaterialTheme.typography.headlineLarge + ) + + MoreInfoButton() + + Spacer(modifier = Modifier.height(50.dp)) + when(registrationState) { RegistrationState.EmailSignIn -> { EmailLoginView( @@ -76,6 +93,22 @@ fun WelcomeScreenContent(viewModel: LoginViewModel) { Spacer(modifier = Modifier.weight(1.0F)) } + + if (viewModel.errorMessage != null) { + coroutineScope.launch { + val result = snackBarHostState + .showSnackbar( + viewModel.errorMessage!!, + actionLabel = "Dismiss", + duration = SnackbarDuration.Indefinite + ) + when (result) { + SnackbarResult.ActionPerformed -> viewModel.resetErrorMessage() + } + } + + SnackbarHost(hostState = snackBarHostState) + } } @Composable @@ -87,14 +120,6 @@ fun AuthProviderView( .getInstance() .isGooglePlayServicesAvailable(LocalContext.current) == 0 - Text( - text = stringResource(id = R.string.welcome_title), - style = MaterialTheme.typography.headlineLarge - ) - MoreInfoButton() - - Spacer(modifier = Modifier.height(50.dp)) - Row( horizontalArrangement = Arrangement.Center ) { @@ -135,7 +160,7 @@ fun MoreInfoButton() { onClick = { context.startActivity(intent) }, - modifier = Modifier.padding(vertical = 6.dp) + modifier = Modifier.padding(vertical = 6.dp) ) }