diff --git a/android/Omnivore/app/build.gradle b/android/Omnivore/app/build.gradle index c23dcee14..106ef9db4 100644 --- a/android/Omnivore/app/build.gradle +++ b/android/Omnivore/app/build.gradle @@ -121,6 +121,8 @@ dependencies { implementation 'androidx.compose.material3:material3:1.0.0-alpha16' implementation 'androidx.compose.material3:material3-window-size-class:1.0.0-alpha16' + + implementation 'com.google.android.gms:play-services-auth:20.2.0' } apollo { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/LoginViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/LoginViewModel.kt index 8a7726991..653f7e2ab 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/LoginViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/LoginViewModel.kt @@ -1,9 +1,14 @@ package app.omnivore.omnivore +import android.content.ContentValues +import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.* +import com.google.android.gms.auth.api.signin.GoogleSignInAccount +import com.google.android.gms.common.api.ApiException +import com.google.android.gms.tasks.Task import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch @@ -65,4 +70,11 @@ class LoginViewModel @Inject constructor( fun resetErrorMessage() { errorMessage = null } + + fun handleGoogleAuthTask(task: Task) { + val googleIdToken = task?.getResult(ApiException::class.java).idToken + Log.d(ContentValues.TAG, "Google Result?: $googleIdToken") + // TODO: submit id token to backend + // If token is missing then set the error message + } } 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 93beca3e0..3723d293a 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,11 +1,16 @@ 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 @@ -27,6 +32,13 @@ 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 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 @@ -41,7 +53,7 @@ class MainActivity : ComponentActivity() { OmnivoreTheme { // A surface container using the 'background' color from the theme Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { - PrimaryView(viewModel) + WelcomeView(viewModel) } } } @@ -58,7 +70,7 @@ class MainActivity : ComponentActivity() { } @Composable -fun PrimaryView(viewModel: LoginViewModel) { +fun WelcomeView(viewModel: LoginViewModel) { val hasAuthToken: Boolean by viewModel.hasAuthTokenLiveData.observeAsState(false) if (hasAuthToken) { @@ -68,6 +80,26 @@ fun PrimaryView(viewModel: LoginViewModel) { } } +@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) + .fillMaxSize() + ) { + if (isGoogleAuthAvailable) { + GoogleAuthButton(viewModel) + } + EmailLoginView(viewModel) + } +} + @Composable fun LoggedInView(viewModel: LoginViewModel) { Column( @@ -89,7 +121,7 @@ fun LoggedInView(viewModel: LoginViewModel) { @SuppressLint("CoroutineCreationDuringComposition") @Composable -fun LoginView(viewModel: LoginViewModel) { +fun EmailLoginView(viewModel: LoginViewModel) { var email by rememberSaveable { mutableStateOf("") } var password by rememberSaveable { mutableStateOf("") } val focusManager = LocalFocusManager.current diff --git a/android/Omnivore/app/src/main/res/values/strings.xml b/android/Omnivore/app/src/main/res/values/strings.xml index e537d2ef1..90a5ab700 100644 --- a/android/Omnivore/app/src/main/res/values/strings.xml +++ b/android/Omnivore/app/src/main/res/values/strings.xml @@ -1,3 +1,4 @@ Omnivore - \ No newline at end of file + 590528454690-ovh9ku5r3fojgr1pp5kgaimr43o96btb.apps.googleusercontent.com +