From 06390bd4799d7347a7691f9f847ea9cf0e13abc7 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Wed, 31 Aug 2022 13:36:17 -0700 Subject: [PATCH] add a settings view --- android/Omnivore/app/build.gradle | 6 -- .../main/java/app/omnivore/omnivore/Routes.kt | 1 + .../app/omnivore/omnivore/ui/home/HomeView.kt | 59 ++++----------- .../app/omnivore/omnivore/ui/root/RootView.kt | 6 +- .../omnivore/ui/settings/SettingsContent.kt | 73 +++++++++++++++++++ 5 files changed, 93 insertions(+), 52 deletions(-) create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/SettingsContent.kt diff --git a/android/Omnivore/app/build.gradle b/android/Omnivore/app/build.gradle index c86595512..b5757af1b 100644 --- a/android/Omnivore/app/build.gradle +++ b/android/Omnivore/app/build.gradle @@ -139,12 +139,6 @@ dependencies { implementation "androidx.security:security-crypto:1.0.0" implementation "androidx.datastore:datastore-preferences:1.0.0" - - -// Activity KTX for viewModels() - // TODO: remove this since compose-activity imports ktx? -// implementation "androidx.activity:activity-ktx:1.3.1" - //Dagger - Hilt implementation 'com.google.dagger:hilt-android:2.42' kapt 'com.google.dagger:hilt-compiler:2.42' 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 4355c954e..36140cb11 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 @@ -3,4 +3,5 @@ package app.omnivore.omnivore sealed class Routes(val route: String) { object Home : Routes("Home") object WebReader : Routes("WebReader") + object Settings: Routes("Settings") } 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 5e5d78f0b..ed09e0f3e 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 @@ -7,7 +7,6 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.TopAppBar import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Menu @@ -15,27 +14,18 @@ import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.mutableStateOf -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.unit.dp import androidx.compose.ui.viewinterop.AndroidView -import androidx.compose.ui.window.Dialog import androidx.navigation.NavHostController import app.omnivore.omnivore.Routes -import app.omnivore.omnivore.ui.auth.LoginViewModel -import com.google.android.gms.auth.api.signin.GoogleSignIn -import com.google.android.gms.auth.api.signin.GoogleSignInOptions @OptIn(ExperimentalMaterial3Api::class) @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable fun HomeView( - loginViewModel: LoginViewModel, homeViewModel: HomeViewModel, navController: NavHostController ) { @@ -45,7 +35,7 @@ fun HomeView( title = { Text("Home") }, backgroundColor = MaterialTheme.colorScheme.surfaceVariant, actions = { - IconButton(onClick = { }) { + IconButton(onClick = { navController.navigate(Routes.Settings.route) }) { Icon( imageVector = Icons.Default.Menu, contentDescription = null @@ -54,16 +44,24 @@ fun HomeView( } ) } - ) { - HomeViewContent(loginViewModel, homeViewModel, navController) + ) { paddingValues -> + HomeViewContent( + homeViewModel, + navController, + modifier = Modifier + .padding( + top = paddingValues.calculateTopPadding(), + bottom = paddingValues.calculateBottomPadding() + ) + ) } } @Composable fun HomeViewContent( - loginViewModel: LoginViewModel, homeViewModel: HomeViewModel, - navController: NavHostController + navController: NavHostController, + modifier: Modifier ) { val linkedItems: List by homeViewModel.itemsLiveData.observeAsState(listOf()) @@ -73,21 +71,11 @@ fun HomeViewContent( LazyColumn( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier + modifier = modifier .background(MaterialTheme.colorScheme.background) .fillMaxSize() .padding(horizontal = 6.dp) ) { - - item { - Row( - horizontalArrangement = Arrangement.End - ) { - Spacer(modifier = Modifier.weight(1.0F)) - LogoutButton { loginViewModel.logout() } - } - } - items(linkedItems) { item -> LinkedItemCard( item = item, @@ -99,30 +87,11 @@ fun HomeViewContent( } } -@Composable -fun LogoutButton(actionHandler: () -> Unit) { - val context = LocalContext.current - - Button(onClick = { - // Sign out google users - val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) - .build() - - val googleSignIn = GoogleSignIn.getClient(context, signInOptions) - googleSignIn.signOut() - - actionHandler() - }) { - Text(text = "Logout") - } -} - @SuppressLint("SetJavaScriptEnabled") @Composable fun ArticleWebView(slug: String, authCookieString: String) { WebView.setWebContentsDebuggingEnabled(true) -// val authCookieString = "auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiIwODFkZThlOC01ODU0LTExZWMtODY4ZS03ZjU0ZjhiMzY0NGEiLCJpYXQiOjE2NjE4OTA1NjB9.zDE6SOGgRKKV7QuZUIsxEzb_M7o2pyTwshI_Lc_C8Co; Expires=Wed, 30 Aug 2023 20:16:00 GMT; HttpOnly; secure;" val url = "https://demo.omnivore.app/app/me/$slug" AndroidView(factory = { 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 index c7618b2c6..956485e54 100644 --- 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 @@ -1,5 +1,6 @@ package app.omnivore.omnivore.ui.root +import SettingsView import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState @@ -32,7 +33,6 @@ fun PrimaryNavigator(loginViewModel: LoginViewModel, homeViewModel: HomeViewMode NavHost(navController = navController, startDestination = Routes.Home.route) { composable(Routes.Home.route) { HomeView( - loginViewModel = loginViewModel, // TODO: remove loginViewModel from here homeViewModel = homeViewModel, navController = navController ) @@ -44,5 +44,9 @@ fun PrimaryNavigator(loginViewModel: LoginViewModel, homeViewModel: HomeViewMode authCookieString = loginViewModel.getAuthCookieString() ?: "" ) } + + composable(Routes.Settings.route) { + SettingsView(loginViewModel = loginViewModel, navController = navController) + } } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/SettingsContent.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/SettingsContent.kt new file mode 100644 index 000000000..64d0b4bf8 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/SettingsContent.kt @@ -0,0 +1,73 @@ +import android.annotation.SuppressLint +import androidx.compose.foundation.layout.* +import androidx.compose.material.TopAppBar +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Home +import androidx.compose.material.icons.filled.Menu +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController +import app.omnivore.omnivore.Routes +import app.omnivore.omnivore.ui.auth.LoginViewModel +import app.omnivore.omnivore.ui.home.HomeViewContent +import app.omnivore.omnivore.ui.home.HomeViewModel +import com.google.android.gms.auth.api.signin.GoogleSignIn +import com.google.android.gms.auth.api.signin.GoogleSignInOptions + +@OptIn(ExperimentalMaterial3Api::class) +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@Composable +fun SettingsView( + loginViewModel: LoginViewModel, + navController: NavHostController +) { + Scaffold( + topBar = { + TopAppBar( + title = { Text("Settings") }, + backgroundColor = MaterialTheme.colorScheme.surfaceVariant, + actions = { + IconButton(onClick = { navController.navigate(Routes.Home.route) }) { + Icon( + imageVector = Icons.Default.Home, + contentDescription = null + ) + } + } + ) + } + ) { + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxSize() + .navigationBarsPadding() + .padding(horizontal = 16.dp) + ) { + LogoutButton { loginViewModel.logout() } + } + } +} + +@Composable +fun LogoutButton(actionHandler: () -> Unit) { + val context = LocalContext.current + + Button(onClick = { + // Sign out google users + val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .build() + + val googleSignIn = GoogleSignIn.getClient(context, signInOptions) + googleSignIn.signOut() + + actionHandler() + }) { + Text(text = "Logout") + } +}