From 4af03846e0de578dbb9d5903c8a9fec4f60a280e Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Wed, 24 Aug 2022 13:28:26 -0700 Subject: [PATCH] use silnt auth for google --- .../omnivore/omnivore/ui/auth/GoogleAuth.kt | 27 +++++++++++++++---- .../omnivore/ui/auth/LoginViewModel.kt | 11 ++++++-- .../app/src/main/res/values/strings.xml | 1 + 3 files changed, 32 insertions(+), 7 deletions(-) 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 b6a76a5e1..23bfaab9a 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 @@ -1,10 +1,11 @@ package app.omnivore.omnivore.ui.auth import android.app.Activity +import android.content.ContentValues +import android.util.Log import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource @@ -13,6 +14,8 @@ 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 +import com.google.android.gms.common.api.ApiException +import com.google.android.gms.tasks.OnCompleteListener import com.google.android.gms.tasks.Task @Composable @@ -20,10 +23,8 @@ fun GoogleAuthButton(viewModel: LoginViewModel) { val context = LocalContext.current val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) - .requestEmail() .requestIdToken(stringResource(R.string.gcp_id)) - .requestId() - .requestProfile() +// .requestServerAuthCode(stringResource(R.string.gcp_id), true) .build() val startForResult = @@ -39,6 +40,8 @@ fun GoogleAuthButton(viewModel: LoginViewModel) { } } + + LoadingButtonWithIcon( text = "Continue with Google", loadingText = "Signing in...", @@ -46,7 +49,21 @@ fun GoogleAuthButton(viewModel: LoginViewModel) { icon = painterResource(id = R.drawable.ic_logo_google), onClick = { val googleSignIn = GoogleSignIn.getClient(context, signInOptions) - startForResult.launch(googleSignIn.signInIntent) + val silentSignInTask = googleSignIn.silentSignIn() + Log.d(ContentValues.TAG, "silent auth success?: ${silentSignInTask.isSuccessful}") + val result = silentSignInTask.getResult(ApiException::class.java) + Log.d(ContentValues.TAG, "silent id token?: ${result.idToken}") + + + + if (silentSignInTask.isSuccessful) { + silentSignInTask.addOnCompleteListener(OnCompleteListener { task -> + viewModel.handleGoogleAuthTask(task) + }) + } else { +// googleSignIn.signOut() // TODO: Should use this on logout instead + startForResult.launch(googleSignIn.signInIntent) + } } ) } 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 779fe3b4a..77e3b4533 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 @@ -7,14 +7,17 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.* import app.omnivore.omnivore.* +import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.auth.api.signin.GoogleSignInAccount import com.google.android.gms.common.api.ApiException +import com.google.android.gms.tasks.OnCompleteListener import com.google.android.gms.tasks.Task import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import javax.inject.Inject + enum class RegistrationState { AuthProviderButtons, EmailSignIn @@ -82,8 +85,12 @@ class LoginViewModel @Inject constructor( } fun handleGoogleAuthTask(task: Task) { - val googleIdToken = task?.getResult(ApiException::class.java).idToken - Log.d(ContentValues.TAG, "Google Result?: $googleIdToken") + val result = task?.getResult(ApiException::class.java) + Log.d(ContentValues.TAG, "server auth code?: ${result.serverAuthCode}") + Log.d(ContentValues.TAG, "is Expired?: ${result.isExpired}") + Log.d(ContentValues.TAG, "granted Scopes?: ${result.grantedScopes}") + val googleIdToken = result.idToken + Log.d(ContentValues.TAG, "Google id token?: $googleIdToken") // TODO: submit id token to backend // If token is missing then set the error message diff --git a/android/Omnivore/app/src/main/res/values/strings.xml b/android/Omnivore/app/src/main/res/values/strings.xml index 73ef5f423..366c15319 100644 --- a/android/Omnivore/app/src/main/res/values/strings.xml +++ b/android/Omnivore/app/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ Omnivore 590528454690-mpmbvcb4c3ifmnojmrultt37eo8f64at.apps.googleusercontent.com + Never miss a great read Learn More Save articles and read them later in our distraction-free reader.