From 66c49d8d74e2f399360d8038f3eda85c00c8593d Mon Sep 17 00:00:00 2001 From: Jarmin Weng Date: Thu, 16 Apr 2026 00:18:49 -0400 Subject: [PATCH] Connected Firebase console to Google login button and constructed connection from Onboarding to HomeScreen based on login email --- app/build.gradle.kts | 6 +++ .../com/cornellappdev/chimes/GlobalState.kt | 9 ++++ .../chimes/ui/screens/HomeScreen.kt | 3 +- .../chimes/ui/screens/Onboarding.kt | 45 ++++++++++++++++++- gradle/libs.versions.toml | 7 +++ 5 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/cornellappdev/chimes/GlobalState.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 623c2b8..23eeafd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -2,6 +2,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.compose) alias(libs.plugins.jetbrains.kotlin.serialization) + alias(libs.plugins.google.services) } android { @@ -59,4 +60,9 @@ dependencies { implementation(libs.androidx.lifecycle.viewmodel.navigation3) implementation(libs.androidx.material3.adaptive.navigation3) implementation(libs.kotlinx.serialization.core) + + // Firebase + implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.auth) + implementation(libs.play.services.auth) } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/chimes/GlobalState.kt b/app/src/main/java/com/cornellappdev/chimes/GlobalState.kt new file mode 100644 index 0000000..aa0e56b --- /dev/null +++ b/app/src/main/java/com/cornellappdev/chimes/GlobalState.kt @@ -0,0 +1,9 @@ +package com.cornellappdev.chimes + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue + +object GlobalState { + var userName by mutableStateOf("Ithacan") +} diff --git a/app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt b/app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt index 9b721fa..2ee2963 100644 --- a/app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt @@ -23,6 +23,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.cornellappdev.chimes.GlobalState import com.cornellappdev.chimes.R import com.cornellappdev.chimes.ui.components.HeaderButton @@ -45,7 +46,7 @@ fun HomeScreen () { horizontalArrangement = Arrangement.spacedBy(40.dp) ) { Text( - text = "Hi, Arielle ☀\uFE0F", + text = "Hi, ${GlobalState.userName.split(" ").firstOrNull() ?: ""} ☀️", color = Color(0xFF4F4E4E), modifier = Modifier.fillMaxHeight(), fontWeight = FontWeight.SemiBold, diff --git a/app/src/main/java/com/cornellappdev/chimes/ui/screens/Onboarding.kt b/app/src/main/java/com/cornellappdev/chimes/ui/screens/Onboarding.kt index 673fe43..33fab78 100644 --- a/app/src/main/java/com/cornellappdev/chimes/ui/screens/Onboarding.kt +++ b/app/src/main/java/com/cornellappdev/chimes/ui/screens/Onboarding.kt @@ -1,6 +1,9 @@ package com.cornellappdev.chimes.ui.screens import android.annotation.SuppressLint +import android.widget.Toast +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.LinearEasing @@ -29,13 +32,21 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.TransformOrigin import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.cornellappdev.chimes.GlobalState import com.cornellappdev.chimes.R +import com.google.android.gms.auth.api.signin.GoogleSignIn +import com.google.android.gms.auth.api.signin.GoogleSignInOptions +import com.google.android.gms.common.api.ApiException +import com.google.firebase.Firebase +import com.google.firebase.auth.GoogleAuthProvider +import com.google.firebase.auth.auth import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -47,6 +58,9 @@ private val VeryLightGray = Color(0xFFBCB2B2) fun Onboarding( onLoginClick: () -> Unit = {} ) { + val context = LocalContext.current + val auth = remember { Firebase.auth } + val bgAlpha = remember { Animatable(1f) } val whiteAlpha = remember { Animatable(0f) } val logoAlpha = remember { Animatable(0f) } @@ -85,6 +99,26 @@ fun Onboarding( hourHandRotation = 0f } + val googleSignInLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.StartActivityForResult() + ) { result -> + val task = GoogleSignIn.getSignedInAccountFromIntent(result.data) + try { + val account = task.getResult(ApiException::class.java)!! + val credential = GoogleAuthProvider.getCredential(account.idToken, null) + auth.signInWithCredential(credential).addOnCompleteListener { + if (it.isSuccessful) { + GlobalState.userName = it.result.user?.displayName ?: "" + onLoginClick() + } else { + Toast.makeText(context, "Firebase Authentication failed: ${it.exception?.message}", Toast.LENGTH_SHORT).show() + } + } + } catch (e: ApiException) { + Toast.makeText(context, "Google Sign-In failed: ${e.message}", Toast.LENGTH_SHORT).show() + } + } + LaunchedEffect(Unit) { delay(300) @@ -172,7 +206,14 @@ fun Onboarding( text = "Log-in with Google", iconRes = R.drawable.ic_google_g, contentDescription = "Google logo", - onClick = onLoginClick + onClick = { + val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestIdToken(context.getString(R.string.default_web_client_id)) + .requestEmail() + .build() + val client = GoogleSignIn.getClient(context, gso) + googleSignInLauncher.launch(client.signInIntent) + } ) Spacer(modifier = Modifier.height(15.dp)) @@ -303,7 +344,7 @@ private fun ClockLogo( translationX = (0.5f - pivotFraction) * size.width translationY = (0.5f - pivotFraction) * size.height - + rotationZ = hourHandRotation transformOrigin = TransformOrigin(pivotFraction, pivotFraction) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0600b4f..36af08f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,6 +13,9 @@ nav3Core = "1.0.1" lifecycleViewmodelNav3 = "2.11.0-alpha01" kotlinxSerializationCore = "1.9.0" material3AdaptiveNav3 = "1.3.0-alpha09" +firebaseBom = "34.12.0" +googleServices = "4.4.4" +playServicesAuth = "21.5.1" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -35,8 +38,12 @@ androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", vers androidx-lifecycle-viewmodel-navigation3 = { module = "androidx.lifecycle:lifecycle-viewmodel-navigation3", version.ref = "lifecycleViewmodelNav3" } kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinxSerializationCore" } androidx-material3-adaptive-navigation3 = { group = "androidx.compose.material3.adaptive", name = "adaptive-navigation3", version.ref = "material3AdaptiveNav3" } +firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebaseBom" } +firebase-auth = { group = "com.google.firebase", name = "firebase-auth" } +play-services-auth = { group = "com.google.android.gms", name = "play-services-auth", version.ref = "playServicesAuth" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin"} +google-services = { id = "com.google.gms.google-services", version.ref = "googleServices" }