From 1f15392b0502eb3a4b270d0b4cfd1d575ed7fbe0 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Sun, 19 Mar 2023 15:35:51 -0700 Subject: [PATCH] add logout dialog and static terms/privacy page embeds --- .../main/java/app/omnivore/omnivore/Routes.kt | 3 + .../app/omnivore/omnivore/ui/root/RootView.kt | 13 ++++ .../omnivore/ui/settings/LogoutDialog.kt | 40 ++++++++++ .../omnivore/ui/settings/PolicyWebView.kt | 73 +++++++++++++++++++ .../omnivore/ui/settings/SettingsContent.kt | 56 ++++---------- 5 files changed, 142 insertions(+), 43 deletions(-) create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/LogoutDialog.kt create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/PolicyWebView.kt 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 a1e5ece80..0ab373cc9 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,7 @@ package app.omnivore.omnivore sealed class Routes(val route: String) { object Library : Routes("Library") object Settings: Routes("Settings") + object Documentation: Routes("Documentation") + object PrivacyPolicy: Routes("PrivacyPolicy") + object TermsAndConditions: Routes("TermsAndConditions") } 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 c1aaecf48..93dfe469e 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 @@ -18,6 +18,7 @@ import app.omnivore.omnivore.ui.auth.LoginViewModel import app.omnivore.omnivore.ui.auth.WelcomeScreen import app.omnivore.omnivore.ui.library.LibraryView import app.omnivore.omnivore.ui.library.LibraryViewModel +import app.omnivore.omnivore.ui.settings.PolicyWebView import com.google.accompanist.systemuicontroller.rememberSystemUiController @Composable @@ -78,5 +79,17 @@ fun PrimaryNavigator( composable(Routes.Settings.route) { SettingsView(loginViewModel = loginViewModel, navController = navController) } + + composable(Routes.Documentation.route) { + PolicyWebView(navController = navController, url = "https://docs.omnivore.app") + } + + composable(Routes.PrivacyPolicy.route) { + PolicyWebView(navController = navController, url = "https://omnivore.app/app/privacy") + } + + composable(Routes.TermsAndConditions.route) { + PolicyWebView(navController = navController, url = "https://omnivore.app/app/terms") + } } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/LogoutDialog.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/LogoutDialog.kt new file mode 100644 index 000000000..7cb634467 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/LogoutDialog.kt @@ -0,0 +1,40 @@ +package app.omnivore.omnivore.ui.settings + +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import com.google.android.gms.auth.api.signin.GoogleSignIn +import com.google.android.gms.auth.api.signin.GoogleSignInOptions + +@Composable +fun LogoutDialog(onClose: (Boolean) -> Unit) { + val context = LocalContext.current + + AlertDialog( + onDismissRequest = { onClose(false) }, + title = { Text(text = "Logout") }, + text = { + Text("Are you sure you want to logout?") + }, + confirmButton = { + Button(onClick = { + // Sign out google users + val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .build() + + val googleSignIn = GoogleSignIn.getClient(context, signInOptions) + googleSignIn.signOut() + onClose(true) + }) { + Text("Confirm") + } + }, + dismissButton = { + Button(onClick = { onClose(false) }) { + Text("Cancel") + } + } + ) +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/PolicyWebView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/PolicyWebView.kt new file mode 100644 index 000000000..f51e01b40 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/PolicyWebView.kt @@ -0,0 +1,73 @@ +package app.omnivore.omnivore.ui.settings + +import android.annotation.SuppressLint +import android.view.ViewGroup +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Box +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Home +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.viewinterop.AndroidView +import androidx.navigation.NavHostController +import app.omnivore.omnivore.Routes + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter", "SetJavaScriptEnabled") +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun PolicyWebView(navController: NavHostController, url: String) { + Scaffold( + topBar = { + TopAppBar( + title = { androidx.compose.material3.Text("Settings") }, + actions = { + IconButton(onClick = { navController.navigate(Routes.Settings.route) }) { + Icon( + imageVector = Icons.Default.Home, + contentDescription = null + ) + } + }, colors = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.surfaceVariant + ) + ) + } + ) { + val isDarkMode = isSystemInDarkTheme() + + Box { + AndroidView(factory = { + WebView(it).apply { + if (isDarkMode) { + setBackgroundColor(Color.Transparent.hashCode()) + } + + layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + + settings.javaScriptEnabled = true + settings.allowContentAccess = true + settings.allowFileAccess = true + settings.domStorageEnabled = true + + alpha = 0.0f + + webViewClient = object : WebViewClient() { + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + view?.animate()?.alpha(1.0f)?.duration = 200 + } + } + + loadUrl(url) + } + }, update = {} + ) + } + } +} 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 index ab2f05b02..1ad965582 100644 --- 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 @@ -19,6 +19,7 @@ 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.settings.LogoutDialog import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.auth.api.signin.GoogleSignInOptions import io.intercom.android.sdk.Intercom @@ -49,6 +50,7 @@ fun SettingsView( ) { paddingValues -> SettingsViewContent( loginViewModel = loginViewModel, + navController = navController, modifier = Modifier .padding( top = paddingValues.calculateTopPadding(), @@ -59,7 +61,7 @@ fun SettingsView( } @Composable -fun SettingsViewContent(loginViewModel: LoginViewModel, modifier: Modifier) { +fun SettingsViewContent(loginViewModel: LoginViewModel, navController: NavHostController, modifier: Modifier) { val showLogoutDialog = remember { mutableStateOf(false) } Box( @@ -82,24 +84,24 @@ fun SettingsViewContent(loginViewModel: LoginViewModel, modifier: Modifier) { SettingRow(text = "Emails") { Log.d("settings", "emails button tapped") } RowDivider() SettingRow(text = "Subscriptions") { Log.d("settings", "subscriptions button tapped") } - RowDivider() - SettingRow(text = "Clubs") { Log.d("settings", "clubs button tapped") } +// RowDivider() +// SettingRow(text = "Clubs") { Log.d("settings", "clubs button tapped") } SectionSpacer() - SettingRow(text = "Push Notifications") { Log.d("settings", "pn button tapped") } - RowDivider() - SettingRow(text = "Text to Speech") { Log.d("settings", "tts button tapped") } +// SettingRow(text = "Push Notifications") { Log.d("settings", "pn button tapped") } +// RowDivider() +// SettingRow(text = "Text to Speech") { Log.d("settings", "tts button tapped") } +// +// SectionSpacer() - SectionSpacer() - - SettingRow(text = "Documentation") { Log.d("settings", "docs button tapped") } + SettingRow(text = "Documentation") { navController.navigate(Routes.Documentation.route) } RowDivider() SettingRow(text = "Feedback") { Intercom.client().present(space = IntercomSpace.Messages) } RowDivider() - SettingRow(text = "Privacy Policy") { Log.d("settings", "privacy button tapped") } + SettingRow(text = "Privacy Policy") { navController.navigate(Routes.PrivacyPolicy.route) } RowDivider() - SettingRow(text = "Terms and Conditions") { Log.d("settings", "t&c button tapped") } + SettingRow(text = "Terms and Conditions") { navController.navigate(Routes.TermsAndConditions.route) } SectionSpacer() @@ -120,38 +122,6 @@ fun SettingsViewContent(loginViewModel: LoginViewModel, modifier: Modifier) { } } - -@Composable -fun LogoutDialog(onClose: (Boolean) -> Unit) { - val context = LocalContext.current - - AlertDialog( - onDismissRequest = { onClose(false) }, - title = { Text(text = "Logout") }, - text = { - Text("Are you sure you want to logout?") - }, - confirmButton = { - Button(onClick = { - // Sign out google users - val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) - .build() - - val googleSignIn = GoogleSignIn.getClient(context, signInOptions) - googleSignIn.signOut() - onClose(true) - }) { - Text("Confirm") - } - }, - dismissButton = { - Button(onClick = { onClose(false) }) { - Text("Cancel") - } - } - ) -} - @Composable private fun RowDivider() { Divider(