move focus manager up one view level

This commit is contained in:
Satindar Dhillon
2022-08-23 12:09:04 -07:00
parent 9fb4ae35cf
commit e22a7a5eb4
2 changed files with 88 additions and 54 deletions

View File

@ -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") },

View File

@ -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)
)
}