From 53b8f7eeac08fb1abc46671dc2a501ac5afd4a08 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 22 Aug 2022 09:15:45 -0700 Subject: [PATCH 01/10] organize android views into packages --- .../Omnivore/app/src/main/AndroidManifest.xml | 23 +------------------ .../app/omnivore/omnivore/MainActivity.kt | 14 +++-------- .../{screen => ui/auth}/EmailLogin.kt | 6 +---- .../omnivore/{ => ui/auth}/GoogleAuth.kt | 5 ++-- .../{ => ui/auth}/GoogleSignInButton.kt | 2 +- .../omnivore/{ => ui/auth}/LoginViewModel.kt | 5 ++-- .../{screen => ui/auth}/SplashPage.kt | 11 +-------- .../omnivore/{ => ui/main}/ScreenMain.kt | 8 ++++--- .../omnivore/{ => ui/save}/NewFlowActivity.kt | 3 ++- .../omnivore/{ => ui/save}/SaveContent.kt | 2 +- .../{ => ui/save}/SaveSheetActivity.kt | 3 ++- .../omnivore/{ => ui/save}/SaveViewModel.kt | 5 +++- 12 files changed, 25 insertions(+), 62 deletions(-) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{screen => ui/auth}/EmailLogin.kt (87%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{ => ui/auth}/GoogleAuth.kt (94%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{ => ui/auth}/GoogleSignInButton.kt (98%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{ => ui/auth}/LoginViewModel.kt (96%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{screen => ui/auth}/SplashPage.kt (83%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{ => ui/main}/ScreenMain.kt (74%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{ => ui/save}/NewFlowActivity.kt (72%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{ => ui/save}/SaveContent.kt (96%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{ => ui/save}/SaveSheetActivity.kt (98%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{ => ui/save}/SaveViewModel.kt (92%) diff --git a/android/Omnivore/app/src/main/AndroidManifest.xml b/android/Omnivore/app/src/main/AndroidManifest.xml index ed213ee7f..bf65b39f7 100644 --- a/android/Omnivore/app/src/main/AndroidManifest.xml +++ b/android/Omnivore/app/src/main/AndroidManifest.xml @@ -29,7 +29,7 @@ @@ -38,26 +38,5 @@ - diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt index fbdd52768..b17bcfde6 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt @@ -1,16 +1,11 @@ package app.omnivore.omnivore import android.annotation.SuppressLint -import android.app.Activity -import android.content.Context import android.os.Bundle import android.view.View import android.widget.Toast import androidx.activity.ComponentActivity -import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.setContent -import androidx.activity.result.ActivityResult -import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -32,13 +27,10 @@ import androidx.compose.runtime.livedata.observeAsState import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat -import com.google.android.gms.auth.api.signin.GoogleSignIn -import com.google.android.gms.auth.api.signin.GoogleSignInAccount -import com.google.android.gms.auth.api.signin.GoogleSignInClient -import com.google.android.gms.auth.api.signin.GoogleSignInOptions +import app.omnivore.omnivore.ui.auth.GoogleAuthButton +import app.omnivore.omnivore.ui.auth.LoginViewModel +import app.omnivore.omnivore.ui.main.ScreenMain import com.google.android.gms.common.GoogleApiAvailability -import com.google.android.gms.common.GooglePlayServicesUtil.isGooglePlayServicesAvailable -import com.google.android.gms.tasks.Task import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/screen/EmailLogin.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/EmailLogin.kt similarity index 87% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/screen/EmailLogin.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/EmailLogin.kt index 8d2784eb8..ef4c30c78 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/screen/EmailLogin.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/EmailLogin.kt @@ -1,7 +1,5 @@ -package app.omnivore.omnivore.screen +package app.omnivore.omnivore.ui.auth -import android.content.Intent -import android.net.Uri import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -13,8 +11,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import app.omnivore.omnivore.EmailLoginView -import app.omnivore.omnivore.LoginViewModel - @Composable fun EmailLoginPage(viewModel: LoginViewModel, navController: NavHostController) { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/GoogleAuth.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleAuth.kt similarity index 94% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/GoogleAuth.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleAuth.kt index ba8b9eae0..cd27ceb50 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/GoogleAuth.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleAuth.kt @@ -1,16 +1,15 @@ -package app.omnivore.omnivore +package app.omnivore.omnivore.ui.auth import android.app.Activity import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material3.Button -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import app.omnivore.omnivore.R import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.auth.api.signin.GoogleSignInAccount import com.google.android.gms.auth.api.signin.GoogleSignInOptions diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/GoogleSignInButton.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleSignInButton.kt similarity index 98% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/GoogleSignInButton.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleSignInButton.kt index e80f8c0ce..0a55344eb 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/GoogleSignInButton.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleSignInButton.kt @@ -1,4 +1,4 @@ -package app.omnivore.omnivore +package app.omnivore.omnivore.ui.auth import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.clickable diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/LoginViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt similarity index 96% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/LoginViewModel.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt index 14db1873b..202e38eda 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/LoginViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt @@ -1,13 +1,12 @@ -package app.omnivore.omnivore +package app.omnivore.omnivore.ui.auth import android.content.ContentValues import android.util.Log -import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue -import androidx.compose.ui.platform.LocalUriHandler import androidx.lifecycle.* +import app.omnivore.omnivore.* import com.google.android.gms.auth.api.signin.GoogleSignInAccount import com.google.android.gms.common.api.ApiException import com.google.android.gms.tasks.Task diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/screen/SplashPage.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/SplashPage.kt similarity index 83% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/screen/SplashPage.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/SplashPage.kt index 8e79e6930..cb275fc52 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/screen/SplashPage.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/SplashPage.kt @@ -1,15 +1,13 @@ -package app.omnivore.omnivore.screen +package app.omnivore.omnivore.ui.auth import android.content.Intent import android.net.Uri import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.text.ClickableText -import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -17,17 +15,10 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.text.AnnotatedString -import androidx.core.content.ContextCompat.startActivity -import androidx.lifecycle.viewModelScope import androidx.navigation.NavHostController -import app.omnivore.omnivore.EmailLoginView -import app.omnivore.omnivore.GoogleAuthButton -import app.omnivore.omnivore.LoginViewModel import app.omnivore.omnivore.Routes import com.google.android.gms.common.GoogleApiAvailability -import kotlinx.coroutines.launch @Composable fun SplashPage(viewModel: LoginViewModel, navController: NavHostController) { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ScreenMain.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/main/ScreenMain.kt similarity index 74% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/ScreenMain.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/main/ScreenMain.kt index a2248f02e..cef82c262 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ScreenMain.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/main/ScreenMain.kt @@ -1,11 +1,13 @@ -package app.omnivore.omnivore +package app.omnivore.omnivore.ui.main import androidx.compose.runtime.Composable import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController -import app.omnivore.omnivore.screen.EmailLoginPage -import app.omnivore.omnivore.screen.SplashPage +import app.omnivore.omnivore.Routes +import app.omnivore.omnivore.ui.auth.EmailLoginPage +import app.omnivore.omnivore.ui.auth.SplashPage +import app.omnivore.omnivore.ui.auth.LoginViewModel @Composable fun ScreenMain(viewModel: LoginViewModel){ diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/NewFlowActivity.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/NewFlowActivity.kt similarity index 72% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/NewFlowActivity.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/NewFlowActivity.kt index 0748fda0f..571a622f8 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/NewFlowActivity.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/NewFlowActivity.kt @@ -1,6 +1,7 @@ -package app.omnivore.omnivore +package app.omnivore.omnivore.ui.save import androidx.compose.material.ExperimentalMaterialApi +import app.omnivore.omnivore.ui.save.SaveSheetActivity // Not sure why we need this class, but directly opening SaveSheetActivity // causes the app to crash. diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/SaveContent.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveContent.kt similarity index 96% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/SaveContent.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveContent.kt index 4a569178b..62a355061 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/SaveContent.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveContent.kt @@ -8,9 +8,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.material.* -import androidx.compose.material.MaterialTheme.colors import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.unit.dp +import app.omnivore.omnivore.ui.save.SaveViewModel import kotlinx.coroutines.launch @Composable diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/SaveSheetActivity.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt similarity index 98% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/SaveSheetActivity.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt index 521e5c3df..4ffc0fcae 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/SaveSheetActivity.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveSheetActivity.kt @@ -1,4 +1,4 @@ -package app.omnivore.omnivore +package app.omnivore.omnivore.ui.save import android.content.ContentValues import android.content.Intent @@ -18,6 +18,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp +import app.omnivore.omnivore.SaveContent import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/SaveViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveViewModel.kt similarity index 92% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/SaveViewModel.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveViewModel.kt index 1cbf43078..710554047 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/SaveViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/save/SaveViewModel.kt @@ -1,4 +1,4 @@ -package app.omnivore.omnivore +package app.omnivore.omnivore.ui.save import android.content.ContentValues import android.util.Log @@ -7,6 +7,9 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import app.omnivore.omnivore.Constants +import app.omnivore.omnivore.DatastoreKeys +import app.omnivore.omnivore.DatastoreRepository import app.omnivore.omnivore.graphql.generated.SaveUrlMutation import app.omnivore.omnivore.graphql.generated.type.SaveUrlInput import com.apollographql.apollo3.ApolloClient From a50e39efc376d78fb1ad6412e4690c25968424c4 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 22 Aug 2022 10:39:29 -0700 Subject: [PATCH 02/10] move login fields code out of main activity and into email view --- .../app/omnivore/omnivore/MainActivity.kt | 192 ------------------ .../main/java/app/omnivore/omnivore/Routes.kt | 4 +- .../omnivore/omnivore/ui/auth/EmailLogin.kt | 129 +++++++++++- .../auth/{SplashPage.kt => WelcomeScreen.kt} | 34 ++-- .../app/omnivore/omnivore/ui/home/HomeView.kt | 33 +++ .../omnivore/omnivore/ui/main/ScreenMain.kt | 35 +++- 6 files changed, 204 insertions(+), 223 deletions(-) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/{SplashPage.kt => WelcomeScreen.kt} (68%) create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt index b17bcfde6..5ddc0927d 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt @@ -1,38 +1,17 @@ package app.omnivore.omnivore -import android.annotation.SuppressLint import android.os.Bundle import android.view.View -import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.viewModels -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.runtime.saveable.rememberSaveable -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.text.input.ImeAction -import androidx.compose.ui.text.input.PasswordVisualTransformation -import androidx.compose.ui.unit.dp import app.omnivore.omnivore.ui.theme.OmnivoreTheme -import androidx.compose.runtime.livedata.observeAsState import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat -import app.omnivore.omnivore.ui.auth.GoogleAuthButton import app.omnivore.omnivore.ui.auth.LoginViewModel import app.omnivore.omnivore.ui.main.ScreenMain -import com.google.android.gms.common.GoogleApiAvailability import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch @AndroidEntryPoint class MainActivity : ComponentActivity() { @@ -43,11 +22,7 @@ class MainActivity : ComponentActivity() { setContent { OmnivoreTheme { - // A surface container using the 'background' color from the theme ScreenMain(viewModel = viewModel) -// Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { -// WelcomeView(viewModel) -// } } } @@ -61,170 +36,3 @@ class MainActivity : ComponentActivity() { } } } - -@Composable -fun WelcomeView(viewModel: LoginViewModel) { - val hasAuthToken: Boolean by viewModel.hasAuthTokenLiveData.observeAsState(false) - - if (hasAuthToken) { - LoggedInView(viewModel) - } else { - LoginView(viewModel) - } -} - -@Composable -fun LoginView(viewModel: LoginViewModel) { - val isGoogleAuthAvailable: Boolean = GoogleApiAvailability - .getInstance() - .isGooglePlayServicesAvailable(LocalContext.current) == 0 - - Column( - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .background(MaterialTheme.colorScheme.background) - ) { - if (isGoogleAuthAvailable) { - GoogleAuthButton(viewModel) - } - EmailLoginView(viewModel) - } -} - -@Composable -fun LoggedInView(viewModel: LoginViewModel) { - Column( - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .background(MaterialTheme.colorScheme.background) - .fillMaxSize() - ) { - Text("You have a valid auth token. Nice. Go save something in Chrome!") - - Button(onClick = { - viewModel.logout() - }) { - Text(text = "Logout") - } - } -} - -@SuppressLint("CoroutineCreationDuringComposition") -@Composable -fun EmailLoginView(viewModel: LoginViewModel) { - 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() } - ) { - 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() - } - } - - SnackbarHost(hostState = snackBarHostState) - } - } -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun LoginFields( - email: String, - password: String, - onEmailChange: (String) -> Unit, - onPasswordChange: (String) -> Unit, - onLoginClick: () -> Unit -) { - val context = LocalContext.current - val focusManager = LocalFocusManager.current - - Column( - modifier = Modifier - .fillMaxWidth() - .height(300.dp), - verticalArrangement = Arrangement.spacedBy(25.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Text("Never miss a great read") - - OutlinedTextField( - value = email, - placeholder = { Text(text = "user@email.com") }, - label = { Text(text = "email") }, - onValueChange = onEmailChange, - keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }) - ) - - OutlinedTextField( - value = password, - placeholder = { Text(text = "password") }, - label = { Text(text = "password") }, - onValueChange = onPasswordChange, - visualTransformation = PasswordVisualTransformation(), - keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }) - ) - - Button(onClick = { - if (email.isNotBlank() && password.isNotBlank()) { - onLoginClick() - focusManager.clearFocus() - } else { - Toast.makeText( - context, - "Please enter an email address and password.", - Toast.LENGTH_SHORT - ).show() - } - }) { - Text(text = "Login") - } - } -} - -//@Preview( -// uiMode = Configuration.UI_MODE_NIGHT_YES, -// showBackground = true, -// name = "Dark Mode" -//) -//@Preview(showBackground = true) -//@Composable -//fun DefaultPreview() { -// OmnivoreTheme { -// LoginView() -// } -//} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt index c6ca342c8..338a099e9 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt @@ -1,6 +1,8 @@ package app.omnivore.omnivore sealed class Routes(val route: String) { - object Splash : Routes("Splash") + object Root : Routes("Root") + object Home : Routes("Home") + object Welcome : Routes("Welcome") object EmailLogin : Routes("EmailLogin") } 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 ef4c30c78..5b8f00d3e 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 @@ -1,19 +1,27 @@ package app.omnivore.omnivore.ui.auth +import android.annotation.SuppressLint +import android.widget.Toast import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.navigationBarsPadding -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable 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.text.input.ImeAction +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController -import app.omnivore.omnivore.EmailLoginView +import kotlinx.coroutines.launch @Composable -fun EmailLoginPage(viewModel: LoginViewModel, navController: NavHostController) { +fun EmailLoginViewContainer(viewModel: LoginViewModel, navController: NavHostController) { Column( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, @@ -25,3 +33,108 @@ fun EmailLoginPage(viewModel: LoginViewModel, navController: NavHostController) EmailLoginView(viewModel) } } + +@SuppressLint("CoroutineCreationDuringComposition") +@Composable +fun EmailLoginView(viewModel: LoginViewModel) { + 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() } + ) { + 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() + } + } + + SnackbarHost(hostState = snackBarHostState) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun LoginFields( + email: String, + password: String, + onEmailChange: (String) -> Unit, + onPasswordChange: (String) -> Unit, + onLoginClick: () -> Unit +) { + val context = LocalContext.current + val focusManager = LocalFocusManager.current + + Column( + modifier = Modifier + .fillMaxWidth() + .height(300.dp), + verticalArrangement = Arrangement.spacedBy(25.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text("Never miss a great read") + + OutlinedTextField( + value = email, + placeholder = { Text(text = "user@email.com") }, + label = { Text(text = "email") }, + onValueChange = onEmailChange, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }) + ) + + OutlinedTextField( + value = password, + placeholder = { Text(text = "password") }, + label = { Text(text = "password") }, + onValueChange = onPasswordChange, + visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }) + ) + + Button(onClick = { + if (email.isNotBlank() && password.isNotBlank()) { + onLoginClick() + focusManager.clearFocus() + } else { + Toast.makeText( + context, + "Please enter an email address and password.", + Toast.LENGTH_SHORT + ).show() + } + }) { + Text(text = "Login") + } + } +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/SplashPage.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/WelcomeScreen.kt similarity index 68% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/SplashPage.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/WelcomeScreen.kt index cb275fc52..a072d9669 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/SplashPage.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/WelcomeScreen.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.text.ClickableText import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember @@ -21,27 +22,30 @@ import app.omnivore.omnivore.Routes import com.google.android.gms.common.GoogleApiAvailability @Composable -fun SplashPage(viewModel: LoginViewModel, navController: NavHostController) { +fun WelcomeScreen(viewModel: LoginViewModel, navController: NavHostController) { val isGoogleAuthAvailable: Boolean = GoogleApiAvailability .getInstance() .isGooglePlayServicesAvailable(LocalContext.current) == 0 - Column( - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .background(MaterialTheme.colorScheme.background) - .fillMaxSize() - .navigationBarsPadding() - ) { - Text("Never miss a great read") - MoreInfoButton() + Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { + Column( + verticalArrangement = Arrangement.Center, - if (isGoogleAuthAvailable) { - GoogleAuthButton(viewModel) + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .background(MaterialTheme.colorScheme.background) + .fillMaxSize() + .navigationBarsPadding() + ) { + Text("Never miss a great read") + MoreInfoButton() + + if (isGoogleAuthAvailable) { + GoogleAuthButton(viewModel) + } + + ContinueWithEmailButton(navController) } - - ContinueWithEmailButton(navController) } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt new file mode 100644 index 000000000..7aa3772f4 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt @@ -0,0 +1,33 @@ +package app.omnivore.omnivore.ui.home + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.navigation.NavHostController +import app.omnivore.omnivore.ui.auth.LoginViewModel + +@Composable +fun HomeView(viewModel: LoginViewModel, navController: NavHostController) { + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .background(MaterialTheme.colorScheme.background) + .fillMaxSize() + ) { + Text("You have a valid auth token. Nice. Go save something in Chrome!") + + Button(onClick = { + viewModel.logout() + }) { + Text(text = "Logout") + } + } +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/main/ScreenMain.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/main/ScreenMain.kt index cef82c262..a59b6b93d 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/main/ScreenMain.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/main/ScreenMain.kt @@ -1,24 +1,45 @@ package app.omnivore.omnivore.ui.main import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import app.omnivore.omnivore.Routes -import app.omnivore.omnivore.ui.auth.EmailLoginPage -import app.omnivore.omnivore.ui.auth.SplashPage +import app.omnivore.omnivore.ui.auth.EmailLoginViewContainer import app.omnivore.omnivore.ui.auth.LoginViewModel +import app.omnivore.omnivore.ui.auth.WelcomeScreen +import app.omnivore.omnivore.ui.home.HomeView @Composable -fun ScreenMain(viewModel: LoginViewModel){ +fun ScreenMain(viewModel: LoginViewModel) { val navController = rememberNavController() - NavHost(navController = navController, startDestination = Routes.Splash.route) { - composable(Routes.Splash.route) { - SplashPage(viewModel = viewModel, navController = navController) + NavHost(navController = navController, startDestination = Routes.Root.route) { + composable(Routes.Root.route) { + RootView(viewModel = viewModel, navController = navController) + } + composable(Routes.Welcome.route) { + WelcomeScreen(viewModel = viewModel, navController = navController) + } + composable(Routes.Home.route) { + HomeView(viewModel = viewModel, navController = navController) } composable(Routes.EmailLogin.route) { - EmailLoginPage(viewModel = viewModel, navController = navController) + EmailLoginViewContainer(viewModel = viewModel, navController = navController) } } } + +@Composable +fun RootView(viewModel: LoginViewModel, navController: NavHostController) { + val hasAuthToken: Boolean by viewModel.hasAuthTokenLiveData.observeAsState(false) + + if (hasAuthToken) { + HomeView(viewModel = viewModel, navController = navController) + } else { + WelcomeScreen(viewModel = viewModel, navController = navController) + } +} From 3887a91186e94bec68feab58f674b2665f6a2bc1 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 22 Aug 2022 11:43:29 -0700 Subject: [PATCH 03/10] set background color on welcome screen --- android/Omnivore/app/build.gradle | 1 + .../omnivore/ui/auth/WelcomeScreen.kt | 20 +++++++++++++------ .../_background.colorset/Contents.json | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/android/Omnivore/app/build.gradle b/android/Omnivore/app/build.gradle index 86c1239ca..cb1022569 100644 --- a/android/Omnivore/app/build.gradle +++ b/android/Omnivore/app/build.gradle @@ -128,6 +128,7 @@ dependencies { implementation 'androidx.compose.material3:material3-window-size-class:1.0.0-alpha16' implementation 'com.google.android.gms:play-services-auth:20.2.0' + implementation "com.google.accompanist:accompanist-systemuicontroller:0.25.1" } apollo { 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 a072d9669..38eb6fc9f 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 @@ -8,13 +8,12 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.text.ClickableText -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.material3.Text +import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.remember 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.text.AnnotatedString import androidx.navigation.NavHostController @@ -23,17 +22,26 @@ import com.google.android.gms.common.GoogleApiAvailability @Composable fun WelcomeScreen(viewModel: LoginViewModel, navController: NavHostController) { +// val systemUiController = rememberSystemUiController() +// systemUiController.isSystemBarsVisible = false + + Surface(modifier = Modifier.fillMaxSize(), color = Color(0xFFFBEAA8 )) { + WelcomeScreenContent(viewModel = viewModel, navController = navController) + } +} + +@Composable +fun WelcomeScreenContent(viewModel: LoginViewModel, navController: NavHostController) { val isGoogleAuthAvailable: Boolean = GoogleApiAvailability .getInstance() .isGooglePlayServicesAvailable(LocalContext.current) == 0 - Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { Column( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier - .background(MaterialTheme.colorScheme.background) + .background(Color(0xFFFBEAA8 )) .fillMaxSize() .navigationBarsPadding() ) { @@ -46,7 +54,7 @@ fun WelcomeScreen(viewModel: LoginViewModel, navController: NavHostController) { ContinueWithEmailButton(navController) } - } + } @Composable diff --git a/apple/OmnivoreKit/Sources/Views/Colors/Colors.xcassets/_background.colorset/Contents.json b/apple/OmnivoreKit/Sources/Views/Colors/Colors.xcassets/_background.colorset/Contents.json index eddecb30f..24677965e 100644 --- a/apple/OmnivoreKit/Sources/Views/Colors/Colors.xcassets/_background.colorset/Contents.json +++ b/apple/OmnivoreKit/Sources/Views/Colors/Colors.xcassets/_background.colorset/Contents.json @@ -6,7 +6,7 @@ "components" : { "alpha" : "1.000", "blue" : "0xA8", - "green" : "0xEB", + "green" : "0xEA", "red" : "0xFB" } }, From 66a5c21b962105c9bd29370d80226632a90fd43e Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 22 Aug 2022 14:04:12 -0700 Subject: [PATCH 04/10] WIP: add omnivore image name logo and partially layout welcome screen --- .../omnivore/ui/auth/WelcomeScreen.kt | 58 ++++++++++++++----- .../app/src/main/res/values/strings.xml | 1 + 2 files changed, 45 insertions(+), 14 deletions(-) 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 38eb6fc9f..59ecfcf02 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 @@ -2,21 +2,25 @@ package app.omnivore.omnivore.ui.auth import android.content.Intent import android.net.Uri +import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.* import androidx.compose.foundation.text.ClickableText +import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.onFocusEvent import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController +import app.omnivore.omnivore.R import app.omnivore.omnivore.Routes import com.google.android.gms.common.GoogleApiAvailability @@ -30,6 +34,7 @@ fun WelcomeScreen(viewModel: LoginViewModel, navController: NavHostController) { } } +@OptIn(ExperimentalMaterialApi::class) @Composable fun WelcomeScreenContent(viewModel: LoginViewModel, navController: NavHostController) { val isGoogleAuthAvailable: Boolean = GoogleApiAvailability @@ -37,24 +42,48 @@ fun WelcomeScreenContent(viewModel: LoginViewModel, navController: NavHostContro .isGooglePlayServicesAvailable(LocalContext.current) == 0 Column( - verticalArrangement = Arrangement.Center, - - horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.SpaceAround, + horizontalAlignment = Alignment.Start, modifier = Modifier - .background(Color(0xFFFBEAA8 )) + .background(Color(0xFFFBEAA8)) .fillMaxSize() .navigationBarsPadding() + .padding(horizontal = 16.dp) ) { - Text("Never miss a great read") + Spacer(modifier = Modifier.height(50.dp)) + Image( + painter = painterResource(id = R.drawable.ic_omnivore_name_logo), + contentDescription = "Omnivore Icon with Name" + ) + Spacer(modifier = Modifier.height(50.dp)) + Text(stringResource(id = R.string.welcome_title)) MoreInfoButton() - if (isGoogleAuthAvailable) { - GoogleAuthButton(viewModel) + Spacer(modifier = Modifier.height(50.dp)) + + Row( + horizontalArrangement = Arrangement.Center + ) { + Spacer(modifier = Modifier.weight(1.0F)) + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + if (isGoogleAuthAvailable) { + GoogleAuthButton(viewModel) + } + + AppleSignInButton(painterResource(id = R.drawable.ic_logo_google)) { + // Fill in later... + } + + ContinueWithEmailButton(navController) + } + Spacer(modifier = Modifier.weight(1.0F)) } - ContinueWithEmailButton(navController) + Spacer(modifier = Modifier.weight(1.0F)) } - } @Composable @@ -66,7 +95,8 @@ fun MoreInfoButton() { text = AnnotatedString("Learn More ->"), onClick = { context.startActivity(intent) - } + }, + modifier = Modifier.padding(vertical = 6.dp) ) } diff --git a/android/Omnivore/app/src/main/res/values/strings.xml b/android/Omnivore/app/src/main/res/values/strings.xml index 2f4570ea1..cf0a10906 100644 --- a/android/Omnivore/app/src/main/res/values/strings.xml +++ b/android/Omnivore/app/src/main/res/values/strings.xml @@ -1,4 +1,5 @@ Omnivore 590528454690-mpmbvcb4c3ifmnojmrultt37eo8f64at.apps.googleusercontent.com + Everything you read.\nSafe, organized, and\neasy to share. From 028af7d699f6528bbae981d55c50a36086c97aef Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 22 Aug 2022 18:43:03 -0700 Subject: [PATCH 05/10] add apple login logo to button --- .../omnivore/omnivore/ui/auth/GoogleAuth.kt | 2 +- ...gnInButton.kt => LoadingButtonWithIcon.kt} | 12 +++---- .../omnivore/ui/auth/WelcomeScreen.kt | 10 +++--- .../src/main/res/drawable/ic_logo_apple.xml | 9 +++++ .../res/drawable/ic_omnivore_name_logo.xml | 35 +++++++++++++++++++ 5 files changed, 56 insertions(+), 12 deletions(-) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/{GoogleSignInButton.kt => LoadingButtonWithIcon.kt} (86%) create mode 100644 android/Omnivore/app/src/main/res/drawable/ic_logo_apple.xml create mode 100644 android/Omnivore/app/src/main/res/drawable/ic_omnivore_name_logo.xml diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleAuth.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleAuth.kt index cd27ceb50..853787007 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleAuth.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleAuth.kt @@ -39,7 +39,7 @@ fun GoogleAuthButton(viewModel: LoginViewModel) { } } - GoogleSignInButton( + LoadingButtonWithIcon( text = "Continue with Google", loadingText = "Signing in...", isLoading = viewModel.isLoading, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleSignInButton.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoadingButtonWithIcon.kt similarity index 86% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleSignInButton.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoadingButtonWithIcon.kt index 0a55344eb..a40a773cd 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/GoogleSignInButton.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoadingButtonWithIcon.kt @@ -3,8 +3,7 @@ package app.omnivore.omnivore.ui.auth import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* -import androidx.compose.material.* -import androidx.compose.material.Surface +import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -14,17 +13,16 @@ import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.unit.dp -@ExperimentalMaterialApi @Composable -fun GoogleSignInButton( +fun LoadingButtonWithIcon( text: String, - loadingText: String = "Signing in...", + loadingText: String, icon: Painter, isLoading: Boolean = false, shape: Shape = Shapes().medium, borderColor: Color = Color.LightGray, - backgroundColor: Color = MaterialTheme.colors.surface, - progressIndicatorColor: Color = MaterialTheme.colors.primary, + backgroundColor: Color = MaterialTheme.colorScheme.surface, + progressIndicatorColor: Color = MaterialTheme.colorScheme.primary, onClick: () -> Unit ) { Surface( 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 59ecfcf02..ab81ae451 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 @@ -12,7 +12,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.onFocusEvent import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource @@ -73,9 +72,12 @@ fun WelcomeScreenContent(viewModel: LoginViewModel, navController: NavHostContro GoogleAuthButton(viewModel) } - AppleSignInButton(painterResource(id = R.drawable.ic_logo_google)) { - // Fill in later... - } + LoadingButtonWithIcon( + text = "Continue with Apple", + loadingText = "Signing in...", + icon = painterResource(id = R.drawable.ic_logo_apple), + onClick = {} + ) ContinueWithEmailButton(navController) } diff --git a/android/Omnivore/app/src/main/res/drawable/ic_logo_apple.xml b/android/Omnivore/app/src/main/res/drawable/ic_logo_apple.xml new file mode 100644 index 000000000..84a25baf6 --- /dev/null +++ b/android/Omnivore/app/src/main/res/drawable/ic_logo_apple.xml @@ -0,0 +1,9 @@ + + + diff --git a/android/Omnivore/app/src/main/res/drawable/ic_omnivore_name_logo.xml b/android/Omnivore/app/src/main/res/drawable/ic_omnivore_name_logo.xml new file mode 100644 index 000000000..3129b743c --- /dev/null +++ b/android/Omnivore/app/src/main/res/drawable/ic_omnivore_name_logo.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + From e58058a4f4f87cd3a468185191e4802b8fa31a15 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 22 Aug 2022 19:55:22 -0700 Subject: [PATCH 06/10] add vertical padding to login buttons --- .../app/omnivore/omnivore/ui/auth/LoadingButtonWithIcon.kt | 3 ++- .../main/java/app/omnivore/omnivore/ui/auth/WelcomeScreen.kt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoadingButtonWithIcon.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoadingButtonWithIcon.kt index a40a773cd..03e273231 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoadingButtonWithIcon.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoadingButtonWithIcon.kt @@ -23,10 +23,11 @@ fun LoadingButtonWithIcon( borderColor: Color = Color.LightGray, backgroundColor: Color = MaterialTheme.colorScheme.surface, progressIndicatorColor: Color = MaterialTheme.colorScheme.primary, + modifier: Modifier = Modifier, onClick: () -> Unit ) { Surface( - modifier = Modifier.clickable( + modifier = modifier.clickable( enabled = !isLoading, onClick = onClick ), 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 ab81ae451..fd5b0683d 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 @@ -76,6 +76,7 @@ fun WelcomeScreenContent(viewModel: LoginViewModel, navController: NavHostContro text = "Continue with Apple", loadingText = "Signing in...", icon = painterResource(id = R.drawable.ic_logo_apple), + modifier = Modifier.padding(vertical = 6.dp), onClick = {} ) From 9e14b49c074d5b1bd2717d2396a1940f10d57d30 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 23 Aug 2022 08:00:18 -0700 Subject: [PATCH 07/10] apply font styles to welcome screen text --- .../omnivore/ui/auth/WelcomeScreen.kt | 6 ++- .../app/omnivore/omnivore/ui/theme/Theme.kt | 2 +- .../app/omnivore/omnivore/ui/theme/Type.kt | 47 +++++++++---------- 3 files changed, 28 insertions(+), 27 deletions(-) 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 fd5b0683d..59452cabd 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 @@ -55,7 +55,10 @@ fun WelcomeScreenContent(viewModel: LoginViewModel, navController: NavHostContro contentDescription = "Omnivore Icon with Name" ) Spacer(modifier = Modifier.height(50.dp)) - Text(stringResource(id = R.string.welcome_title)) + Text( + text = stringResource(id = R.string.welcome_title), + style = MaterialTheme.typography.headlineLarge + ) MoreInfoButton() Spacer(modifier = Modifier.height(50.dp)) @@ -96,6 +99,7 @@ fun MoreInfoButton() { ClickableText( text = AnnotatedString("Learn More ->"), + style = MaterialTheme.typography.titleLarge, onClick = { context.startActivity(intent) }, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/theme/Theme.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/theme/Theme.kt index f55b9dea7..38c6bc295 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/theme/Theme.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/theme/Theme.kt @@ -82,7 +82,7 @@ fun OmnivoreTheme( MaterialTheme( colorScheme = colorScheme, -// typography = Typography, + typography = Typography, // shapes = Shapes, content = content ) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/theme/Type.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/theme/Type.kt index 5a70fbaec..86df5fe88 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/theme/Type.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/theme/Type.kt @@ -1,28 +1,25 @@ package app.omnivore.omnivore.ui.theme -import androidx.compose.material.Typography -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.sp +import androidx.compose.material3.Typography + +val Typography = Typography() + +// ex: https://github.com/android/compose-samples/blob/main/Jetchat/app/src/main/java/com/example/compose/jetchat/theme/Typography.kt +//val Typography = Typography( +//displayLarge: TextStyle = TypographyTokens.DisplayLarge, +//displayMedium: TextStyle = TypographyTokens.DisplayMedium, +//displaySmall: TextStyle = TypographyTokens.DisplaySmall, +//headlineLarge: TextStyle = TypographyTokens.HeadlineLarge, +//headlineMedium: TextStyle = TypographyTokens.HeadlineMedium, +//headlineSmall: TextStyle = TypographyTokens.HeadlineSmall, +//titleLarge: TextStyle = TypographyTokens.TitleLarge, +//titleMedium: TextStyle = TypographyTokens.TitleMedium, +//titleSmall: TextStyle = TypographyTokens.TitleSmall, +//bodyLarge: TextStyle = TypographyTokens.BodyLarge, +//bodyMedium: TextStyle = TypographyTokens.BodyMedium, +//bodySmall: TextStyle = TypographyTokens.BodySmall, +//labelLarge: TextStyle = TypographyTokens.LabelLarge, +//labelMedium: TextStyle = TypographyTokens.LabelMedium, +//labelSmall: TextStyle = TypographyTokens.LabelSmall +//) -// Set of Material typography styles to start with -val Typography = Typography( - body1 = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 16.sp - ) - /* Other default text styles to override - button = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.W500, - fontSize = 14.sp - ), - caption = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 12.sp - ) - */ -) From 9fb4ae35cfeb3024383c5273f0c6bceba4786c62 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 23 Aug 2022 11:50:20 -0700 Subject: [PATCH 08/10] use local state to track email/authProvider signin --- .../app/omnivore/omnivore/MainActivity.kt | 4 +- .../main/java/app/omnivore/omnivore/Routes.kt | 1 - .../omnivore/omnivore/ui/auth/EmailLogin.kt | 35 +++--- .../omnivore/ui/auth/LoginViewModel.kt | 5 + .../omnivore/ui/auth/WelcomeScreen.kt | 115 +++++++++++------- .../app/omnivore/omnivore/ui/home/HomeView.kt | 2 +- .../omnivore/omnivore/ui/main/ScreenMain.kt | 45 ------- .../app/omnivore/omnivore/ui/root/RootView.kt | 19 +++ .../app/src/main/res/values/themes.xml | 3 +- 9 files changed, 118 insertions(+), 111 deletions(-) delete mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/main/ScreenMain.kt create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt index 5ddc0927d..eed5b92be 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt @@ -10,7 +10,7 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import app.omnivore.omnivore.ui.auth.LoginViewModel -import app.omnivore.omnivore.ui.main.ScreenMain +import app.omnivore.omnivore.ui.root.RootView import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -22,7 +22,7 @@ class MainActivity : ComponentActivity() { setContent { OmnivoreTheme { - ScreenMain(viewModel = viewModel) + RootView(viewModel = viewModel) } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt index 338a099e9..47f70b2b3 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt @@ -4,5 +4,4 @@ sealed class Routes(val route: String) { object Root : Routes("Root") object Home : Routes("Home") object Welcome : Routes("Welcome") - object EmailLogin : Routes("EmailLogin") } 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 5b8f00d3e..574106aa2 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 @@ -5,6 +5,7 @@ import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.ClickableText import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.* @@ -14,29 +15,30 @@ 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.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 kotlinx.coroutines.launch -@Composable -fun EmailLoginViewContainer(viewModel: LoginViewModel, navController: NavHostController) { - Column( - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .background(MaterialTheme.colorScheme.background) - .fillMaxSize() - .navigationBarsPadding() - ) { - EmailLoginView(viewModel) - } -} +//@Composable +//fun EmailLoginViewContainer(viewModel: LoginViewModel, navController: NavHostController) { +// Column( +// verticalArrangement = Arrangement.Center, +// horizontalAlignment = Alignment.CenterHorizontally, +// modifier = Modifier +// .background(MaterialTheme.colorScheme.background) +// .fillMaxSize() +// .navigationBarsPadding() +// ) { +// EmailLoginView(viewModel) +// } +//} @SuppressLint("CoroutineCreationDuringComposition") @Composable -fun EmailLoginView(viewModel: LoginViewModel) { +fun EmailLoginView(viewModel: LoginViewModel, onAuthProviderButtonTap: () -> Unit) { var email by rememberSaveable { mutableStateOf("") } var password by rememberSaveable { mutableStateOf("") } val focusManager = LocalFocusManager.current @@ -79,6 +81,11 @@ fun EmailLoginView(viewModel: LoginViewModel) { SnackbarHost(hostState = snackBarHostState) } + + ClickableText( + text = AnnotatedString("Continue with Google/Apple ->"), + onClick = { onAuthProviderButtonTap() } + ) } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt index 202e38eda..b9186ed13 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt @@ -15,6 +15,11 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import javax.inject.Inject +enum class RegistrationState { + AuthProviderButtons, + EmailSignIn +} + @HiltViewModel class LoginViewModel @Inject constructor( private val datastoreRepo: DatastoreRepository 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 59452cabd..85a2a955b 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 @@ -8,8 +8,8 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.text.ClickableText import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material3.* -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -24,21 +24,22 @@ import app.omnivore.omnivore.Routes import com.google.android.gms.common.GoogleApiAvailability @Composable -fun WelcomeScreen(viewModel: LoginViewModel, navController: NavHostController) { +fun WelcomeScreen(viewModel: LoginViewModel) { // val systemUiController = rememberSystemUiController() // systemUiController.isSystemBarsVisible = false Surface(modifier = Modifier.fillMaxSize(), color = Color(0xFFFBEAA8 )) { - WelcomeScreenContent(viewModel = viewModel, navController = navController) + WelcomeScreenContent(viewModel = viewModel) } } -@OptIn(ExperimentalMaterialApi::class) @Composable -fun WelcomeScreenContent(viewModel: LoginViewModel, navController: NavHostController) { - val isGoogleAuthAvailable: Boolean = GoogleApiAvailability - .getInstance() - .isGooglePlayServicesAvailable(LocalContext.current) == 0 +fun WelcomeScreenContent(viewModel: LoginViewModel) { + var registrationState by rememberSaveable { mutableStateOf(RegistrationState.AuthProviderButtons) } + + val onRegistrationStateChange = { state: RegistrationState -> + registrationState = state + } Column( verticalArrangement = Arrangement.SpaceAround, @@ -55,43 +56,74 @@ fun WelcomeScreenContent(viewModel: LoginViewModel, navController: NavHostContro contentDescription = "Omnivore Icon with Name" ) 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)) - - Row( - horizontalArrangement = Arrangement.Center - ) { - Spacer(modifier = Modifier.weight(1.0F)) - Column( - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { - if (isGoogleAuthAvailable) { - GoogleAuthButton(viewModel) - } - - LoadingButtonWithIcon( - text = "Continue with Apple", - loadingText = "Signing in...", - icon = painterResource(id = R.drawable.ic_logo_apple), - modifier = Modifier.padding(vertical = 6.dp), - onClick = {} + when(registrationState) { + RegistrationState.EmailSignIn -> { + EmailLoginView( + viewModel = viewModel, + onAuthProviderButtonTap = { + onRegistrationStateChange(RegistrationState.AuthProviderButtons) + } + ) + } + RegistrationState.AuthProviderButtons -> { + AuthProviderView( + viewModel = viewModel, + onEmailButtonTap = { onRegistrationStateChange(RegistrationState.EmailSignIn) } ) - - ContinueWithEmailButton(navController) } - Spacer(modifier = Modifier.weight(1.0F)) } Spacer(modifier = Modifier.weight(1.0F)) } } +@Composable +fun AuthProviderView( + viewModel: LoginViewModel, + onEmailButtonTap: () -> Unit +) { + val isGoogleAuthAvailable: Boolean = GoogleApiAvailability + .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 + ) { + Spacer(modifier = Modifier.weight(1.0F)) + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + if (isGoogleAuthAvailable) { + GoogleAuthButton(viewModel) + } + + LoadingButtonWithIcon( + text = "Continue with Apple", + loadingText = "Signing in...", + icon = painterResource(id = R.drawable.ic_logo_apple), + modifier = Modifier.padding(vertical = 6.dp), + onClick = {} + ) + + ClickableText( + text = AnnotatedString("Continue with Email ->"), + onClick = { onEmailButtonTap() } + ) + } + Spacer(modifier = Modifier.weight(1.0F)) + } +} + @Composable fun MoreInfoButton() { val context = LocalContext.current @@ -107,12 +139,3 @@ fun MoreInfoButton() { ) } -@Composable -fun ContinueWithEmailButton(navController: NavHostController) { - ClickableText( - text = AnnotatedString("Continue with Email ->"), - onClick = { - navController.navigate(Routes.EmailLogin.route) - } - ) -} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt index 7aa3772f4..1015fad71 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt @@ -14,7 +14,7 @@ import androidx.navigation.NavHostController import app.omnivore.omnivore.ui.auth.LoginViewModel @Composable -fun HomeView(viewModel: LoginViewModel, navController: NavHostController) { +fun HomeView(viewModel: LoginViewModel) { Column( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/main/ScreenMain.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/main/ScreenMain.kt deleted file mode 100644 index a59b6b93d..000000000 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/main/ScreenMain.kt +++ /dev/null @@ -1,45 +0,0 @@ -package app.omnivore.omnivore.ui.main - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState -import androidx.navigation.NavHostController -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.rememberNavController -import app.omnivore.omnivore.Routes -import app.omnivore.omnivore.ui.auth.EmailLoginViewContainer -import app.omnivore.omnivore.ui.auth.LoginViewModel -import app.omnivore.omnivore.ui.auth.WelcomeScreen -import app.omnivore.omnivore.ui.home.HomeView - -@Composable -fun ScreenMain(viewModel: LoginViewModel) { - val navController = rememberNavController() - - NavHost(navController = navController, startDestination = Routes.Root.route) { - composable(Routes.Root.route) { - RootView(viewModel = viewModel, navController = navController) - } - composable(Routes.Welcome.route) { - WelcomeScreen(viewModel = viewModel, navController = navController) - } - composable(Routes.Home.route) { - HomeView(viewModel = viewModel, navController = navController) - } - composable(Routes.EmailLogin.route) { - EmailLoginViewContainer(viewModel = viewModel, navController = navController) - } - } -} - -@Composable -fun RootView(viewModel: LoginViewModel, navController: NavHostController) { - val hasAuthToken: Boolean by viewModel.hasAuthTokenLiveData.observeAsState(false) - - if (hasAuthToken) { - HomeView(viewModel = viewModel, navController = navController) - } else { - WelcomeScreen(viewModel = viewModel, navController = navController) - } -} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt new file mode 100644 index 000000000..9bdd36a04 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt @@ -0,0 +1,19 @@ +package app.omnivore.omnivore.ui.root + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import app.omnivore.omnivore.ui.auth.LoginViewModel +import app.omnivore.omnivore.ui.auth.WelcomeScreen +import app.omnivore.omnivore.ui.home.HomeView + +@Composable +fun RootView(viewModel: LoginViewModel) { + val hasAuthToken: Boolean by viewModel.hasAuthTokenLiveData.observeAsState(false) + + if (hasAuthToken) { + HomeView(viewModel = viewModel) + } else { + WelcomeScreen(viewModel = viewModel) + } +} diff --git a/android/Omnivore/app/src/main/res/values/themes.xml b/android/Omnivore/app/src/main/res/values/themes.xml index f5b5ca333..fa82596de 100644 --- a/android/Omnivore/app/src/main/res/values/themes.xml +++ b/android/Omnivore/app/src/main/res/values/themes.xml @@ -1,8 +1,7 @@ -