add a settings view

This commit is contained in:
Satindar Dhillon 2022-08-31 13:36:17 -07:00
parent fb5b77a522
commit 06390bd479
5 changed files with 93 additions and 52 deletions

View file

@ -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'

View file

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

View file

@ -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<LinkedItem> 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 = {

View file

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

View file

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