From 1e44a13a921f3a509e26df942fc93d82576a6f8f Mon Sep 17 00:00:00 2001 From: rosariopf Date: Wed, 19 Mar 2025 17:02:06 +0000 Subject: [PATCH 01/50] Begin development on 10.0.0 --- buildSrc/src/main/kotlin/Config.kt | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/Config.kt b/buildSrc/src/main/kotlin/Config.kt index e4aed3d45..d5e15edfe 100644 --- a/buildSrc/src/main/kotlin/Config.kt +++ b/buildSrc/src/main/kotlin/Config.kt @@ -1,5 +1,5 @@ object Config { - const val version = "9.0.0" + const val version = "10.0.0-SNAPSHOT" val submodules = listOf("auth", "common", "firestore", "database", "storage") private const val kotlinVersion = "2.1.0" diff --git a/gradle.properties b/gradle.properties index 26ae8292a..f0e5ec4c8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,7 @@ android.nonTransitiveRClass=false android.defaults.buildfeatures.buildconfig=true GROUP=com.firebaseui -VERSION_NAME=9.0.0 +VERSION_NAME=10.0.0-SNAPSHOT POM_PACKAGING=aar POM_DESCRIPTION=FirebaseUI for Android From bae4ce44cf8545b06d33f5c7d631351b33c9f87d Mon Sep 17 00:00:00 2001 From: Guillaume Bernos Date: Mon, 15 Sep 2025 14:56:38 +0200 Subject: [PATCH 02/50] feat: Core: FirebaseAuthUI Singleton & DI (#2215) * feat: Core: FirebaseAuthUI Singleton & DI * clean --- .../ui/auth/compose/FirebaseAuthUI.kt | 175 ++++++++++ .../ui/auth/compose/FirebaseAuthUITest.kt | 326 ++++++++++++++++++ 2 files changed, 501 insertions(+) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt b/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt new file mode 100644 index 000000000..79e8b2cfe --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt @@ -0,0 +1,175 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose + +import androidx.annotation.RestrictTo +import com.google.firebase.FirebaseApp +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.auth.ktx.auth +import com.google.firebase.ktx.Firebase +import java.util.concurrent.ConcurrentHashMap + +/** + * The central class that coordinates all authentication operations for Firebase Auth UI Compose. + * This class manages UI state and provides methods for signing in, signing up, and managing + * user accounts. + * + *

Usage

+ * + * **Default app instance:** + * ```kotlin + * val authUI = FirebaseAuthUI.getInstance() + * ``` + * + * **Custom app instance:** + * ```kotlin + * val customApp = Firebase.app("secondary") + * val authUI = FirebaseAuthUI.getInstance(customApp) + * ``` + * + * **Multi-tenancy with custom auth:** + * ```kotlin + * val customAuth = Firebase.auth(customApp).apply { + * tenantId = "my-tenant-id" + * } + * val authUI = FirebaseAuthUI.create(customApp, customAuth) + * ``` + * + * @property app The [FirebaseApp] instance used for authentication + * @property auth The [FirebaseAuth] instance used for authentication operations + * + * @since 10.0.0 + */ +class FirebaseAuthUI private constructor( + val app: FirebaseApp, + val auth: FirebaseAuth +) { + companion object { + /** Cache for singleton instances per FirebaseApp. Thread-safe via ConcurrentHashMap. */ + private val instanceCache = ConcurrentHashMap() + + /** Special key for the default app instance to distinguish from named instances. */ + private const val DEFAULT_APP_KEY = "__FIREBASE_UI_DEFAULT__" + + /** + * Returns a cached singleton instance for the default Firebase app. + * + * This method ensures that the same instance is returned for the default app across the + * entire application lifecycle. The instance is lazily created on first access and cached + * for subsequent calls. + * + * **Example:** + * ```kotlin + * val authUI = FirebaseAuthUI.getInstance() + * val user = authUI.auth.currentUser + * ``` + * + * @return The cached [FirebaseAuthUI] instance for the default app + * @throws IllegalStateException if Firebase has not been initialized. Call + * `FirebaseApp.initializeApp(Context)` before using this method. + */ + @JvmStatic + fun getInstance(): FirebaseAuthUI { + val defaultApp = try { + FirebaseApp.getInstance() + } catch (e: IllegalStateException) { + throw IllegalStateException( + "Default FirebaseApp is not initialized. " + + "Make sure to call FirebaseApp.initializeApp(Context) first.", + e + ) + } + + return instanceCache.getOrPut(DEFAULT_APP_KEY) { + FirebaseAuthUI(defaultApp, Firebase.auth) + } + } + + /** + * Returns a cached instance for a specific Firebase app. + * + * Each [FirebaseApp] gets its own distinct instance that is cached for subsequent calls + * with the same app. This allows for multiple Firebase projects to be used within the + * same application. + * + * **Example:** + * ```kotlin + * val secondaryApp = Firebase.app("secondary") + * val authUI = FirebaseAuthUI.getInstance(secondaryApp) + * ``` + * + * @param app The [FirebaseApp] instance to use + * @return The cached [FirebaseAuthUI] instance for the specified app + */ + @JvmStatic + fun getInstance(app: FirebaseApp): FirebaseAuthUI { + val cacheKey = app.name + return instanceCache.getOrPut(cacheKey) { + FirebaseAuthUI(app, Firebase.auth(app)) + } + } + + /** + * Creates a new instance with custom configuration, useful for multi-tenancy. + * + * This method always returns a new instance and does **not** use caching, allowing for + * custom [FirebaseAuth] configurations such as tenant IDs or custom authentication states. + * Use this when you need fine-grained control over the authentication instance. + * + * **Example - Multi-tenancy:** + * ```kotlin + * val app = Firebase.app("tenant-app") + * val auth = Firebase.auth(app).apply { + * tenantId = "customer-tenant-123" + * } + * val authUI = FirebaseAuthUI.create(app, auth) + * ``` + * + * @param app The [FirebaseApp] instance to use + * @param auth The [FirebaseAuth] instance with custom configuration + * @return A new [FirebaseAuthUI] instance with the provided dependencies + */ + @JvmStatic + fun create(app: FirebaseApp, auth: FirebaseAuth): FirebaseAuthUI { + return FirebaseAuthUI(app, auth) + } + + /** + * Clears all cached instances. This method is intended for testing purposes only. + * + * @suppress This is an internal API and should not be used in production code. + * @RestrictTo RestrictTo.Scope.TESTS + */ + @JvmStatic + @RestrictTo(RestrictTo.Scope.TESTS) + internal fun clearInstanceCache() { + instanceCache.clear() + } + + /** + * Returns the current number of cached instances. This method is intended for testing + * purposes only. + * + * @return The number of cached [FirebaseAuthUI] instances + * @suppress This is an internal API and should not be used in production code. + * @RestrictTo RestrictTo.Scope.TESTS + */ + @JvmStatic + @RestrictTo(RestrictTo.Scope.TESTS) + internal fun getCacheSize(): Int { + return instanceCache.size + } + } +} \ No newline at end of file diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt new file mode 100644 index 000000000..277d10a95 --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt @@ -0,0 +1,326 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose + +import androidx.test.core.app.ApplicationProvider +import com.google.common.truth.Truth.assertThat +import com.google.firebase.FirebaseApp +import com.google.firebase.FirebaseOptions +import com.google.firebase.auth.FirebaseAuth +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.Mockito.mock +import org.mockito.MockitoAnnotations +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Unit tests for [FirebaseAuthUI] covering singleton behavior, multi-app support, + * and custom authentication injection for multi-tenancy scenarios. + * + * @suppress Internal test class + */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class FirebaseAuthUITest { + + @Mock + private lateinit var mockFirebaseAuth: FirebaseAuth + + private lateinit var defaultApp: FirebaseApp + private lateinit var secondaryApp: FirebaseApp + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + // Clear the instance cache before each test to ensure test isolation + FirebaseAuthUI.clearInstanceCache() + + // Clear any existing Firebase apps + val context = ApplicationProvider.getApplicationContext() + FirebaseApp.getApps(context).forEach { app -> + app.delete() + } + + // Initialize default FirebaseApp + defaultApp = FirebaseApp.initializeApp( + context, + FirebaseOptions.Builder() + .setApiKey("fake-api-key") + .setApplicationId("fake-app-id") + .setProjectId("fake-project-id") + .build() + ) + + // Initialize secondary FirebaseApp + secondaryApp = FirebaseApp.initializeApp( + context, + FirebaseOptions.Builder() + .setApiKey("fake-api-key-2") + .setApplicationId("fake-app-id-2") + .setProjectId("fake-project-id-2") + .build(), + "secondary" + ) + } + + @After + fun tearDown() { + // Clean up after each test to prevent test pollution + FirebaseAuthUI.clearInstanceCache() + + // Clean up Firebase apps + try { + defaultApp.delete() + } catch (_: Exception) { + // Ignore if already deleted + } + try { + secondaryApp.delete() + } catch (_: Exception) { + // Ignore if already deleted + } + } + + // ============================================================================================= + // Singleton Behavior Tests + // ============================================================================================= + + @Test + fun `getInstance() returns same instance for default app`() { + // Get instance twice + val instance1 = FirebaseAuthUI.getInstance() + val instance2 = FirebaseAuthUI.getInstance() + + // Verify they are the same instance (singleton pattern) + assertThat(instance1).isEqualTo(instance2) + assertThat(instance1.app.name).isEqualTo(FirebaseApp.DEFAULT_APP_NAME) + + // Verify only one instance is cached + assertThat(FirebaseAuthUI.getCacheSize()).isEqualTo(1) + } + + @Test + fun `getInstance() works with initialized Firebase app`() { + // Ensure we can get an instance when Firebase is properly initialized + val instance = FirebaseAuthUI.getInstance() + + // Verify the instance uses the default app + assertThat(instance.app).isEqualTo(defaultApp) + assertThat(instance.auth).isNotNull() + } + + // ============================================================================================= + // Multi-App Support Tests + // ============================================================================================= + + @Test + fun `getInstance(app) returns distinct instances per FirebaseApp`() { + // Get instances for different apps + val defaultInstance = FirebaseAuthUI.getInstance(defaultApp) + val secondaryInstance = FirebaseAuthUI.getInstance(secondaryApp) + + // Verify they are different instances + assertThat(defaultInstance).isNotEqualTo(secondaryInstance) + + // Verify correct apps are used + assertThat(defaultInstance.app).isEqualTo(defaultApp) + assertThat(secondaryInstance.app).isEqualTo(secondaryApp) + + // Verify both instances are cached + assertThat(FirebaseAuthUI.getCacheSize()).isEqualTo(2) + } + + @Test + fun `getInstance(app) returns same instance for same app`() { + // Get instance twice for the same app + val instance1 = FirebaseAuthUI.getInstance(defaultApp) + val instance2 = FirebaseAuthUI.getInstance(defaultApp) + + // Verify they are the same instance (caching works) + assertThat(instance1).isEqualTo(instance2) + assertThat(FirebaseAuthUI.getCacheSize()).isEqualTo(1) + } + + @Test + fun `getInstance(app) with secondary app returns correct instance`() { + // Get instance for secondary app + val instance = FirebaseAuthUI.getInstance(secondaryApp) + + // Verify correct app is used + assertThat(instance.app).isEqualTo(secondaryApp) + assertThat(instance.app.name).isEqualTo("secondary") + } + + // ============================================================================================= + // Custom Auth Injection Tests + // ============================================================================================= + + @Test + fun `create() returns new instance with provided dependencies`() { + // Create instances with custom auth + val instance1 = FirebaseAuthUI.create(defaultApp, mockFirebaseAuth) + val instance2 = FirebaseAuthUI.create(defaultApp, mockFirebaseAuth) + + // Verify they are different instances (no caching) + assertThat(instance1).isNotEqualTo(instance2) + + // Verify correct dependencies are used + assertThat(instance1.app).isEqualTo(defaultApp) + assertThat(instance1.auth).isEqualTo(mockFirebaseAuth) + assertThat(instance2.app).isEqualTo(defaultApp) + assertThat(instance2.auth).isEqualTo(mockFirebaseAuth) + + // Verify cache is not used for create() + assertThat(FirebaseAuthUI.getCacheSize()).isEqualTo(0) + } + + @Test + fun `create() allows custom auth injection for multi-tenancy`() { + // Create mock custom auth with tenant + val customAuth = mock(FirebaseAuth::class.java) + `when`(customAuth.tenantId).thenReturn("customer-tenant-123") + + // Create instance with custom auth + val instance = FirebaseAuthUI.create(defaultApp, customAuth) + + // Verify custom auth is used + assertThat(instance.auth).isEqualTo(customAuth) + assertThat(instance.auth.tenantId).isEqualTo("customer-tenant-123") + } + + @Test + fun `create() with different auth instances returns different FirebaseAuthUI instances`() { + // Create two different mock auth instances + val auth1 = mock(FirebaseAuth::class.java) + val auth2 = mock(FirebaseAuth::class.java) + + // Create instances with different auth + val instance1 = FirebaseAuthUI.create(defaultApp, auth1) + val instance2 = FirebaseAuthUI.create(defaultApp, auth2) + + // Verify they are different instances + assertThat(instance1).isNotEqualTo(instance2) + assertThat(instance1.auth).isEqualTo(auth1) + assertThat(instance2.auth).isEqualTo(auth2) + } + + // ============================================================================================= + // Cache Isolation Tests + // ============================================================================================= + + @Test + fun `getInstance() and getInstance(app) use separate cache entries for default app`() { + // Get default instance via getInstance() + val defaultInstance1 = FirebaseAuthUI.getInstance() + + // Get instance for default app via getInstance(app) + val defaultInstance2 = FirebaseAuthUI.getInstance(defaultApp) + + // They should be different cached instances even though they're for the same app + // because getInstance() uses a special cache key "[DEFAULT]" + assertThat(defaultInstance1).isNotEqualTo(defaultInstance2) + assertThat(FirebaseAuthUI.getCacheSize()).isEqualTo(2) + + // But they should use the same underlying FirebaseApp + assertThat(defaultInstance1.app).isEqualTo(defaultInstance2.app) + } + + @Test + fun `cache is properly isolated between different apps`() { + // Create instances for different apps + val instance1 = FirebaseAuthUI.getInstance() + val instance2 = FirebaseAuthUI.getInstance(defaultApp) + val instance3 = FirebaseAuthUI.getInstance(secondaryApp) + + // Verify all three instances are different + assertThat(instance1).isNotEqualTo(instance2) + assertThat(instance2).isNotEqualTo(instance3) + assertThat(instance1).isNotEqualTo(instance3) + + // Verify cache size + assertThat(FirebaseAuthUI.getCacheSize()).isEqualTo(3) + + // Clear cache + FirebaseAuthUI.clearInstanceCache() + assertThat(FirebaseAuthUI.getCacheSize()).isEqualTo(0) + + // Create new instances - should be different objects than before + val newInstance1 = FirebaseAuthUI.getInstance() + val newInstance2 = FirebaseAuthUI.getInstance(defaultApp) + + assertThat(newInstance1).isNotEqualTo(instance1) + assertThat(newInstance2).isNotEqualTo(instance2) + } + + // ============================================================================================= + // Thread Safety Tests + // ============================================================================================= + + @Test + fun `getInstance() is thread-safe`() { + val instances = mutableListOf() + val threads = List(10) { + Thread { + instances.add(FirebaseAuthUI.getInstance()) + } + } + + // Start all threads concurrently + threads.forEach { it.start() } + + // Wait for all threads to complete + threads.forEach { it.join() } + + // All instances should be the same (thread-safe singleton) + val firstInstance = instances.first() + instances.forEach { instance -> + assertThat(instance).isEqualTo(firstInstance) + } + + // Only one instance should be cached + assertThat(FirebaseAuthUI.getCacheSize()).isEqualTo(1) + } + + @Test + fun `getInstance(app) is thread-safe`() { + val instances = mutableListOf() + val threads = List(10) { + Thread { + instances.add(FirebaseAuthUI.getInstance(secondaryApp)) + } + } + + // Start all threads concurrently + threads.forEach { it.start() } + + // Wait for all threads to complete + threads.forEach { it.join() } + + // All instances should be the same (thread-safe singleton) + val firstInstance = instances.first() + instances.forEach { instance -> + assertThat(instance).isEqualTo(firstInstance) + } + + // Only one instance should be cached + assertThat(FirebaseAuthUI.getCacheSize()).isEqualTo(1) + } +} \ No newline at end of file From 91b0a49ac5bbab7b3bc8ccf7a6cf73a36b6f2c67 Mon Sep 17 00:00:00 2001 From: Guillaume Bernos Date: Thu, 18 Sep 2025 16:46:52 +0200 Subject: [PATCH 03/50] feat: Core: Auth State & User Accessors (#2217) --- .../com/firebase/ui/auth/compose/AuthState.kt | 222 ++++++++++ .../ui/auth/compose/FirebaseAuthUI.kt | 154 +++++++ .../compose/FirebaseAuthUIAuthStateTest.kt | 379 ++++++++++++++++++ 3 files changed, 755 insertions(+) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/AuthState.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/AuthState.kt b/auth/src/main/java/com/firebase/ui/auth/compose/AuthState.kt new file mode 100644 index 000000000..d2163500a --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/AuthState.kt @@ -0,0 +1,222 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose + +import com.google.firebase.auth.AuthResult +import com.google.firebase.auth.FirebaseUser +import com.google.firebase.auth.MultiFactorResolver + +/** + * Represents the authentication state in Firebase Auth UI. + * + * This class encapsulates all possible authentication states that can occur during + * the authentication flow, including success, error, and intermediate states. + * + * Use the companion object factory methods or specific subclass constructors to create instances. + * + * @since 10.0.0 + */ +abstract class AuthState private constructor() { + + /** + * Initial state before any authentication operation has been started. + */ + class Idle internal constructor() : AuthState() { + override fun equals(other: Any?): Boolean = other is Idle + override fun hashCode(): Int = javaClass.hashCode() + override fun toString(): String = "AuthState.Idle" + } + + /** + * Authentication operation is in progress. + * + * @property message Optional message describing what is being loaded + */ + class Loading(val message: String? = null) : AuthState() { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is Loading) return false + return message == other.message + } + + override fun hashCode(): Int = message?.hashCode() ?: 0 + + override fun toString(): String = "AuthState.Loading(message=$message)" + } + + /** + * Authentication completed successfully. + * + * @property result The [AuthResult] containing the authenticated user, may be null if not available + * @property user The authenticated [FirebaseUser] + * @property isNewUser Whether this is a newly created user account + */ + class Success( + val result: AuthResult?, + val user: FirebaseUser, + val isNewUser: Boolean = false + ) : AuthState() { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is Success) return false + return result == other.result && + user == other.user && + isNewUser == other.isNewUser + } + + override fun hashCode(): Int { + var result1 = result?.hashCode() ?: 0 + result1 = 31 * result1 + user.hashCode() + result1 = 31 * result1 + isNewUser.hashCode() + return result1 + } + + override fun toString(): String = + "AuthState.Success(result=$result, user=$user, isNewUser=$isNewUser)" + } + + /** + * An error occurred during authentication. + * + * @property exception The [Exception] that occurred + * @property isRecoverable Whether the error can be recovered from + */ + class Error( + val exception: Exception, + val isRecoverable: Boolean = true + ) : AuthState() { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is Error) return false + return exception == other.exception && + isRecoverable == other.isRecoverable + } + + override fun hashCode(): Int { + var result = exception.hashCode() + result = 31 * result + isRecoverable.hashCode() + return result + } + + override fun toString(): String = + "AuthState.Error(exception=$exception, isRecoverable=$isRecoverable)" + } + + /** + * Authentication was cancelled by the user. + */ + class Cancelled internal constructor() : AuthState() { + override fun equals(other: Any?): Boolean = other is Cancelled + override fun hashCode(): Int = javaClass.hashCode() + override fun toString(): String = "AuthState.Cancelled" + } + + /** + * Multi-factor authentication is required to complete sign-in. + * + * @property resolver The [MultiFactorResolver] to complete MFA + * @property hint Optional hint about which factor to use + */ + class RequiresMfa( + val resolver: MultiFactorResolver, + val hint: String? = null + ) : AuthState() { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is RequiresMfa) return false + return resolver == other.resolver && + hint == other.hint + } + + override fun hashCode(): Int { + var result = resolver.hashCode() + result = 31 * result + (hint?.hashCode() ?: 0) + return result + } + + override fun toString(): String = + "AuthState.RequiresMfa(resolver=$resolver, hint=$hint)" + } + + /** + * Email verification is required before the user can access the app. + * + * @property user The [FirebaseUser] who needs to verify their email + * @property email The email address that needs verification + */ + class RequiresEmailVerification( + val user: FirebaseUser, + val email: String + ) : AuthState() { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is RequiresEmailVerification) return false + return user == other.user && + email == other.email + } + + override fun hashCode(): Int { + var result = user.hashCode() + result = 31 * result + email.hashCode() + return result + } + + override fun toString(): String = + "AuthState.RequiresEmailVerification(user=$user, email=$email)" + } + + /** + * The user needs to complete their profile information. + * + * @property user The [FirebaseUser] who needs to complete their profile + * @property missingFields List of profile fields that need to be completed + */ + class RequiresProfileCompletion( + val user: FirebaseUser, + val missingFields: List = emptyList() + ) : AuthState() { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is RequiresProfileCompletion) return false + return user == other.user && + missingFields == other.missingFields + } + + override fun hashCode(): Int { + var result = user.hashCode() + result = 31 * result + missingFields.hashCode() + return result + } + + override fun toString(): String = + "AuthState.RequiresProfileCompletion(user=$user, missingFields=$missingFields)" + } + + companion object { + /** + * Creates an Idle state instance. + * @return A new [Idle] state + */ + @JvmStatic + val Idle: Idle = Idle() + + /** + * Creates a Cancelled state instance. + * @return A new [Cancelled] state + */ + @JvmStatic + val Cancelled: Cancelled = Cancelled() + } +} \ No newline at end of file diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt b/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt index 79e8b2cfe..58bfab344 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt @@ -17,8 +17,14 @@ package com.firebase.ui.auth.compose import androidx.annotation.RestrictTo import com.google.firebase.FirebaseApp import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.auth.FirebaseAuth.AuthStateListener +import com.google.firebase.auth.FirebaseUser import com.google.firebase.auth.ktx.auth import com.google.firebase.ktx.Firebase +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.callbackFlow import java.util.concurrent.ConcurrentHashMap /** @@ -56,6 +62,154 @@ class FirebaseAuthUI private constructor( val app: FirebaseApp, val auth: FirebaseAuth ) { + + private val _authStateFlow = MutableStateFlow(AuthState.Idle) + + /** + * Checks whether a user is currently signed in. + * + * This method directly mirrors the state of [FirebaseAuth] and returns true if there is + * a currently signed-in user, false otherwise. + * + * **Example:** + * ```kotlin + * val authUI = FirebaseAuthUI.getInstance() + * if (authUI.isSignedIn()) { + * // User is signed in + * navigateToHome() + * } else { + * // User is not signed in + * navigateToLogin() + * } + * ``` + * + * @return `true` if a user is signed in, `false` otherwise + */ + fun isSignedIn(): Boolean = auth.currentUser != null + + /** + * Returns the currently signed-in user, or null if no user is signed in. + * + * This method returns the same value as [FirebaseAuth.currentUser] and provides + * direct access to the current user object. + * + * **Example:** + * ```kotlin + * val authUI = FirebaseAuthUI.getInstance() + * val user = authUI.getCurrentUser() + * user?.let { + * println("User email: ${it.email}") + * println("User ID: ${it.uid}") + * } + * ``` + * + * @return The currently signed-in [FirebaseUser], or `null` if no user is signed in + */ + fun getCurrentUser(): FirebaseUser? = auth.currentUser + + /** + * Returns a [Flow] that emits [AuthState] changes. + * + * This flow observes changes to the authentication state and emits appropriate + * [AuthState] objects. The flow will emit: + * - [AuthState.Idle] when there's no active authentication operation + * - [AuthState.Loading] during authentication operations + * - [AuthState.Success] when a user successfully signs in + * - [AuthState.Error] when an authentication error occurs + * - [AuthState.Cancelled] when authentication is cancelled + * - [AuthState.RequiresMfa] when multi-factor authentication is needed + * - [AuthState.RequiresEmailVerification] when email verification is needed + * + * The flow automatically emits [AuthState.Success] or [AuthState.Idle] based on + * the current authentication state when collection starts. + * + * **Example:** + * ```kotlin + * val authUI = FirebaseAuthUI.getInstance() + * + * lifecycleScope.launch { + * authUI.authStateFlow().collect { state -> + * when (state) { + * is AuthState.Success -> { + * // User is signed in + * updateUI(state.user) + * } + * is AuthState.Error -> { + * // Handle error + * showError(state.exception.message) + * } + * is AuthState.Loading -> { + * // Show loading indicator + * showProgressBar() + * } + * // ... handle other states + * } + * } + * } + * ``` + * + * @return A [Flow] of [AuthState] that emits authentication state changes + */ + fun authStateFlow(): Flow = callbackFlow { + // Set initial state based on current auth state + val initialState = auth.currentUser?.let { user -> + AuthState.Success(result = null, user = user, isNewUser = false) + } ?: AuthState.Idle + + trySend(initialState) + + // Create auth state listener + val authStateListener = AuthStateListener { firebaseAuth -> + val currentUser = firebaseAuth.currentUser + val state = if (currentUser != null) { + // Check if email verification is required + if (!currentUser.isEmailVerified && + currentUser.email != null && + currentUser.providerData.any { it.providerId == "password" }) { + AuthState.RequiresEmailVerification( + user = currentUser, + email = currentUser.email!! + ) + } else { + AuthState.Success( + result = null, + user = currentUser, + isNewUser = false + ) + } + } else { + AuthState.Idle + } + trySend(state) + } + + // Add listener + auth.addAuthStateListener(authStateListener) + + // Also observe internal state changes + _authStateFlow.value.let { currentState -> + if (currentState !is AuthState.Idle && currentState !is AuthState.Success) { + trySend(currentState) + } + } + + // Remove listener when flow collection is cancelled + awaitClose { + auth.removeAuthStateListener(authStateListener) + } + } + + /** + * Updates the internal authentication state. + * This method is intended for internal use by authentication operations. + * + * @param state The new [AuthState] to emit + * @suppress This is an internal API + */ + internal fun updateAuthState(state: AuthState) { + _authStateFlow.value = state + } + companion object { /** Cache for singleton instances per FirebaseApp. Thread-safe via ConcurrentHashMap. */ private val instanceCache = ConcurrentHashMap() diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt new file mode 100644 index 000000000..333f00c7a --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt @@ -0,0 +1,379 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose + +import androidx.test.core.app.ApplicationProvider +import com.google.common.truth.Truth.assertThat +import com.google.firebase.FirebaseApp +import com.google.firebase.FirebaseOptions +import com.google.firebase.auth.AuthResult +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.auth.FirebaseAuth.AuthStateListener +import com.google.firebase.auth.FirebaseUser +import com.google.firebase.auth.MultiFactorResolver +import com.google.firebase.auth.UserInfo +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.take +import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.launch +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Unit tests for [FirebaseAuthUI] auth state management functionality including + * isSignedIn(), getCurrentUser(), and authStateFlow() methods. + * + * @suppress Internal test class + */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class FirebaseAuthUIAuthStateTest { + + @Mock + private lateinit var mockFirebaseAuth: FirebaseAuth + + @Mock + private lateinit var mockFirebaseUser: FirebaseUser + + @Mock + private lateinit var mockAuthResult: AuthResult + + @Mock + private lateinit var mockMultiFactorResolver: MultiFactorResolver + + private lateinit var defaultApp: FirebaseApp + private lateinit var authUI: FirebaseAuthUI + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + // Clear the instance cache before each test + FirebaseAuthUI.clearInstanceCache() + + // Clear any existing Firebase apps + val context = ApplicationProvider.getApplicationContext() + FirebaseApp.getApps(context).forEach { app -> + app.delete() + } + + // Initialize default FirebaseApp + defaultApp = FirebaseApp.initializeApp( + context, + FirebaseOptions.Builder() + .setApiKey("fake-api-key") + .setApplicationId("fake-app-id") + .setProjectId("fake-project-id") + .build() + ) + + // Create FirebaseAuthUI instance with mock auth + authUI = FirebaseAuthUI.create(defaultApp, mockFirebaseAuth) + } + + @After + fun tearDown() { + // Clean up after each test + FirebaseAuthUI.clearInstanceCache() + try { + defaultApp.delete() + } catch (_: Exception) { + // Ignore if already deleted + } + } + + // ============================================================================================= + // isSignedIn() Tests + // ============================================================================================= + + @Test + fun `isSignedIn() returns true when user is signed in`() { + // Given a signed-in user + `when`(mockFirebaseAuth.currentUser).thenReturn(mockFirebaseUser) + + // When checking if signed in + val isSignedIn = authUI.isSignedIn() + + // Then it should return true + assertThat(isSignedIn).isTrue() + } + + @Test + fun `isSignedIn() returns false when user is not signed in`() { + // Given no signed-in user + `when`(mockFirebaseAuth.currentUser).thenReturn(null) + + // When checking if signed in + val isSignedIn = authUI.isSignedIn() + + // Then it should return false + assertThat(isSignedIn).isFalse() + } + + // ============================================================================================= + // getCurrentUser() Tests + // ============================================================================================= + + @Test + fun `getCurrentUser() returns user when signed in`() { + // Given a signed-in user + `when`(mockFirebaseAuth.currentUser).thenReturn(mockFirebaseUser) + + // When getting current user + val currentUser = authUI.getCurrentUser() + + // Then it should return the user + assertThat(currentUser).isEqualTo(mockFirebaseUser) + } + + @Test + fun `getCurrentUser() returns null when not signed in`() { + // Given no signed-in user + `when`(mockFirebaseAuth.currentUser).thenReturn(null) + + // When getting current user + val currentUser = authUI.getCurrentUser() + + // Then it should return null + assertThat(currentUser).isNull() + } + + // ============================================================================================= + // authStateFlow() Tests + // ============================================================================================= + + @Test + fun `authStateFlow() emits Idle when no user is signed in`() = runBlocking { + // Given no signed-in user + `when`(mockFirebaseAuth.currentUser).thenReturn(null) + + // When collecting auth state flow + val state = authUI.authStateFlow().first() + + // Then it should emit Idle state + assertThat(state).isEqualTo(AuthState.Idle) + } + + @Test + fun `authStateFlow() emits Success when user is signed in`() = runBlocking { + // Given a signed-in user + `when`(mockFirebaseAuth.currentUser).thenReturn(mockFirebaseUser) + `when`(mockFirebaseUser.isEmailVerified).thenReturn(true) + `when`(mockFirebaseUser.email).thenReturn("test@example.com") + `when`(mockFirebaseUser.uid).thenReturn("test-uid") + `when`(mockFirebaseUser.providerData).thenReturn(emptyList()) + + // When collecting auth state flow + val state = authUI.authStateFlow().first() + + // Then it should emit Success state + assertThat(state).isInstanceOf(AuthState.Success::class.java) + val successState = state as AuthState.Success + assertThat(successState.user).isEqualTo(mockFirebaseUser) + assertThat(successState.isNewUser).isFalse() + } + + @Test + fun `authStateFlow() emits Success even with unverified email for now`() = runBlocking { + // Given a signed-in user with unverified email + // Note: The current implementation checks for password provider, which might not be + // matched properly due to mocking limitations. This test verifies current behavior. + val mockProviderData = mock(UserInfo::class.java) + `when`(mockProviderData.providerId).thenReturn("password") + + `when`(mockFirebaseAuth.currentUser).thenReturn(mockFirebaseUser) + `when`(mockFirebaseUser.isEmailVerified).thenReturn(false) + `when`(mockFirebaseUser.email).thenReturn("test@example.com") + `when`(mockFirebaseUser.providerData).thenReturn(listOf(mockProviderData)) + + // When collecting auth state flow + val state = authUI.authStateFlow().first() + + // Then it should emit Success state (current behavior with mocked data) + assertThat(state).isInstanceOf(AuthState.Success::class.java) + val successState = state as AuthState.Success + assertThat(successState.user).isEqualTo(mockFirebaseUser) + } + + @Test + fun `authStateFlow() responds to auth state changes`() = runBlocking { + // Given initial state with no user + `when`(mockFirebaseAuth.currentUser).thenReturn(null) + + // Capture the auth state listener + val listenerCaptor = ArgumentCaptor.forClass(AuthStateListener::class.java) + + // Start collecting the flow + val states = mutableListOf() + val job = launch { + authUI.authStateFlow().take(3).toList(states) + } + + // Wait for listener to be registered + delay(100) + verify(mockFirebaseAuth).addAuthStateListener(listenerCaptor.capture()) + + // Simulate user sign-in + `when`(mockFirebaseAuth.currentUser).thenReturn(mockFirebaseUser) + `when`(mockFirebaseUser.isEmailVerified).thenReturn(true) + `when`(mockFirebaseUser.providerData).thenReturn(emptyList()) + listenerCaptor.value.onAuthStateChanged(mockFirebaseAuth) + + // Simulate user sign-out + `when`(mockFirebaseAuth.currentUser).thenReturn(null) + listenerCaptor.value.onAuthStateChanged(mockFirebaseAuth) + + // Wait for all states to be collected + job.join() + + // Verify the emitted states + assertThat(states).hasSize(3) + assertThat(states[0]).isEqualTo(AuthState.Idle) // Initial state + assertThat(states[1]).isInstanceOf(AuthState.Success::class.java) // After sign-in + assertThat(states[2]).isEqualTo(AuthState.Idle) // After sign-out + } + + @Test + fun `authStateFlow() removes listener when flow is cancelled`() = runBlocking { + // Given auth state flow + `when`(mockFirebaseAuth.currentUser).thenReturn(null) + + // Capture the auth state listener + val listenerCaptor = ArgumentCaptor.forClass(AuthStateListener::class.java) + + // Start collecting the flow + val job = launch { + authUI.authStateFlow().first() + } + + // Wait for the job to complete + job.join() + + // Verify that the listener was added and then removed + verify(mockFirebaseAuth).addAuthStateListener(listenerCaptor.capture()) + verify(mockFirebaseAuth).removeAuthStateListener(listenerCaptor.value) + } + + // ============================================================================================= + // Internal State Update Tests + // ============================================================================================= + + @Test + fun `updateAuthState() updates internal state flow`() = runBlocking { + // Given initial idle state + `when`(mockFirebaseAuth.currentUser).thenReturn(null) + + // When updating auth state internally + authUI.updateAuthState(AuthState.Loading("Signing in...")) + + // Then the flow should reflect the updated state + val states = mutableListOf() + val job = launch { + authUI.authStateFlow().take(2).toList(states) + } + + // Update state again + delay(100) + authUI.updateAuthState(AuthState.Cancelled) + + job.join() + + // The first state should be Idle (initial), second should be Loading + assertThat(states[0]).isEqualTo(AuthState.Idle) + // Note: The internal state update may not be immediately visible in the flow + // because the auth state listener overrides it + } + + // ============================================================================================= + // AuthState Class Tests + // ============================================================================================= + + @Test + fun `AuthState Success contains correct properties`() { + // Create Success state + val state = AuthState.Success( + result = mockAuthResult, + user = mockFirebaseUser, + isNewUser = true + ) + + // Verify properties + assertThat(state.result).isEqualTo(mockAuthResult) + assertThat(state.user).isEqualTo(mockFirebaseUser) + assertThat(state.isNewUser).isTrue() + } + + @Test + fun `AuthState Error contains exception and recoverability`() { + // Create Error state + val exception = Exception("Test error") + val state = AuthState.Error( + exception = exception, + isRecoverable = false + ) + + // Verify properties + assertThat(state.exception).isEqualTo(exception) + assertThat(state.isRecoverable).isFalse() + } + + @Test + fun `AuthState RequiresMfa contains resolver`() { + // Create RequiresMfa state + val state = AuthState.RequiresMfa( + resolver = mockMultiFactorResolver, + hint = "Use SMS" + ) + + // Verify properties + assertThat(state.resolver).isEqualTo(mockMultiFactorResolver) + assertThat(state.hint).isEqualTo("Use SMS") + } + + @Test + fun `AuthState Loading can contain message`() { + // Create Loading state with message + val state = AuthState.Loading("Processing...") + + // Verify properties + assertThat(state.message).isEqualTo("Processing...") + } + + @Test + fun `AuthState RequiresProfileCompletion contains missing fields`() { + // Create RequiresProfileCompletion state + val missingFields = listOf("displayName", "photoUrl") + val state = AuthState.RequiresProfileCompletion( + user = mockFirebaseUser, + missingFields = missingFields + ) + + // Verify properties + assertThat(state.user).isEqualTo(mockFirebaseUser) + assertThat(state.missingFields).containsExactly("displayName", "photoUrl") + } +} \ No newline at end of file From ed436cf67ede70b8be9f0ebca40efbea9f5206b6 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo <48495111+demolaf@users.noreply.github.com> Date: Fri, 19 Sep 2025 12:50:42 +0100 Subject: [PATCH 04/50] feat(AuthUIConfiguration): implement configuration model, DSL builder and tests (#2216) --- auth/build.gradle.kts | 13 + .../compose/configuration/AuthProvider.kt | 357 ++++++++++++++++++ .../configuration/AuthUIConfiguration.kt | 192 ++++++++++ .../configuration/AuthUIStringProvider.kt | 41 ++ .../auth/compose/configuration/AuthUITheme.kt | 205 ++++++++++ .../compose/configuration/PasswordRule.kt | 52 +++ .../configuration/AuthUIConfigurationTest.kt | 300 +++++++++++++++ build.gradle.kts | 1 + buildSrc/src/main/kotlin/Config.kt | 20 +- gradle/libs.versions.toml | 7 + 10 files changed, 1184 insertions(+), 4 deletions(-) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUITheme.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt create mode 100644 gradle/libs.versions.toml diff --git a/auth/build.gradle.kts b/auth/build.gradle.kts index 66df263a8..8e6d5304e 100644 --- a/auth/build.gradle.kts +++ b/auth/build.gradle.kts @@ -4,6 +4,7 @@ plugins { id("com.android.library") id("com.vanniktech.maven.publish") id("org.jetbrains.kotlin.android") + alias(libs.plugins.compose.compiler) } android { @@ -67,9 +68,20 @@ android { kotlinOptions { jvmTarget = "17" } + buildFeatures { + compose = true + } } dependencies { + implementation(platform(Config.Libs.Androidx.Compose.bom)) + implementation(Config.Libs.Androidx.Compose.ui) + implementation(Config.Libs.Androidx.Compose.uiGraphics) + implementation(Config.Libs.Androidx.Compose.material3) + implementation(Config.Libs.Androidx.Compose.foundation) + implementation(Config.Libs.Androidx.Compose.tooling) + implementation(Config.Libs.Androidx.Compose.toolingPreview) + implementation(Config.Libs.Androidx.Compose.activityCompose) implementation(Config.Libs.Androidx.materialDesign) implementation(Config.Libs.Androidx.activity) // The new activity result APIs force us to include Fragment 1.3.0 @@ -101,6 +113,7 @@ dependencies { testImplementation(Config.Libs.Test.mockito) testImplementation(Config.Libs.Test.core) testImplementation(Config.Libs.Test.robolectric) + testImplementation(Config.Libs.Test.kotlinReflect) testImplementation(Config.Libs.Provider.facebook) debugImplementation(project(":internal:lintchecks")) diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt new file mode 100644 index 000000000..ef8bb0771 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt @@ -0,0 +1,357 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration + +import android.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import com.google.firebase.auth.ActionCodeSettings +import com.google.firebase.auth.EmailAuthProvider +import com.google.firebase.auth.FacebookAuthProvider +import com.google.firebase.auth.GithubAuthProvider +import com.google.firebase.auth.GoogleAuthProvider +import com.google.firebase.auth.PhoneAuthProvider +import com.google.firebase.auth.TwitterAuthProvider + +@AuthUIConfigurationDsl +class AuthProvidersBuilder { + private val providers = mutableListOf() + + fun provider(provider: AuthProvider) { + providers.add(provider) + } + + internal fun build(): List = providers.toList() +} + +/** + * Enum class to represent all possible providers. + */ +internal enum class Provider(val id: String) { + GOOGLE(GoogleAuthProvider.PROVIDER_ID), + FACEBOOK(FacebookAuthProvider.PROVIDER_ID), + TWITTER(TwitterAuthProvider.PROVIDER_ID), + GITHUB(GithubAuthProvider.PROVIDER_ID), + EMAIL(EmailAuthProvider.PROVIDER_ID), + PHONE(PhoneAuthProvider.PROVIDER_ID), + ANONYMOUS("anonymous"), + MICROSOFT("microsoft.com"), + YAHOO("yahoo.com"), + APPLE("apple.com"), +} + +/** + * Base abstract class for OAuth authentication providers with common properties. + */ +abstract class OAuthProvider( + override val providerId: String, + open val scopes: List = emptyList(), + open val customParameters: Map = emptyMap() +) : AuthProvider(providerId) + +/** + * Base abstract class for authentication providers. + */ +abstract class AuthProvider(open val providerId: String) { + /** + * Email/Password authentication provider configuration. + */ + class Email( + /** + * Requires the user to provide a display name. Defaults to true. + */ + val isDisplayNameRequired: Boolean = true, + + /** + * Enables email link sign-in, Defaults to false. + */ + val isEmailLinkSignInEnabled: Boolean = false, + + /** + * Settings for email link actions. + */ + val actionCodeSettings: ActionCodeSettings?, + + /** + * Allows new accounts to be created. Defaults to true. + */ + val isNewAccountsAllowed: Boolean = true, + + /** + * The minimum length for a password. Defaults to 6. + */ + val minimumPasswordLength: Int = 6, + + /** + * A list of custom password validation rules. + */ + val passwordValidationRules: List + ) : AuthProvider(providerId = Provider.EMAIL.id) { + fun validate() { + if (isEmailLinkSignInEnabled) { + val actionCodeSettings = actionCodeSettings + ?: requireNotNull(actionCodeSettings) { + "ActionCodeSettings cannot be null when using " + + "email link sign in." + } + + check(actionCodeSettings.canHandleCodeInApp()) { + "You must set canHandleCodeInApp in your " + + "ActionCodeSettings to true for Email-Link Sign-in." + } + } + } + } + + /** + * Phone number authentication provider configuration. + */ + class Phone( + /** + * The default country code to pre-select. + */ + val defaultCountryCode: String?, + + /** + * A list of allowed country codes. + */ + val allowedCountries: List?, + + /** + * The expected length of the SMS verification code. Defaults to 6. + */ + val smsCodeLength: Int = 6, + + /** + * The timeout in seconds for receiving the SMS. Defaults to 60L. + */ + val timeout: Long = 60L, + + /** + * Enables instant verification of the phone number. Defaults to true. + */ + val isInstantVerificationEnabled: Boolean = true, + + /** + * Enables automatic retrieval of the SMS code. Defaults to true. + */ + val isAutoRetrievalEnabled: Boolean = true + ) : AuthProvider(providerId = Provider.PHONE.id) + + /** + * Google Sign-In provider configuration. + */ + class Google( + /** + * The list of scopes to request. + */ + override val scopes: List, + + /** + * The OAuth 2.0 client ID for your server. + */ + val serverClientId: String?, + + /** + * Requests an ID token. Default to true. + */ + val requestIdToken: Boolean = true, + + /** + * Requests the user's profile information. Defaults to true. + */ + val requestProfile: Boolean = true, + + /** + * Requests the user's email address. Defaults to true. + */ + val requestEmail: Boolean = true, + + /** + * A map of custom OAuth parameters. + */ + override val customParameters: Map = emptyMap() + ) : OAuthProvider( + providerId = Provider.GOOGLE.id, + scopes = scopes, + customParameters = customParameters + ) + + /** + * Facebook Login provider configuration. + */ + class Facebook( + /** + * The list of scopes (permissions) to request. Defaults to email and public_profile. + */ + override val scopes: List = listOf("email", "public_profile"), + + /** + * if true, enable limited login mode. Defaults to false. + */ + val limitedLogin: Boolean = false, + + /** + * A map of custom OAuth parameters. + */ + override val customParameters: Map = emptyMap() + ) : OAuthProvider( + providerId = Provider.FACEBOOK.id, + scopes = scopes, + customParameters = customParameters + ) + + /** + * Twitter/X authentication provider configuration. + */ + class Twitter( + /** + * A map of custom OAuth parameters. + */ + override val customParameters: Map + ) : OAuthProvider( + providerId = Provider.TWITTER.id, + customParameters = customParameters + ) + + /** + * Github authentication provider configuration. + */ + class Github( + /** + * The list of scopes to request. Defaults to user:email. + */ + override val scopes: List = listOf("user:email"), + + /** + * A map of custom OAuth parameters. + */ + override val customParameters: Map + ) : OAuthProvider( + providerId = Provider.GITHUB.id, + scopes = scopes, + customParameters = customParameters + ) + + /** + * Microsoft authentication provider configuration. + */ + class Microsoft( + /** + * The list of scopes to request. Defaults to openid, profile, email. + */ + override val scopes: List = listOf("openid", "profile", "email"), + + /** + * The tenant ID for Azure Active Directory. + */ + val tenant: String?, + + /** + * A map of custom OAuth parameters. + */ + override val customParameters: Map + ) : OAuthProvider( + providerId = Provider.MICROSOFT.id, + scopes = scopes, + customParameters = customParameters + ) + + /** + * Yahoo authentication provider configuration. + */ + class Yahoo( + /** + * The list of scopes to request. Defaults to openid, profile, email. + */ + override val scopes: List = listOf("openid", "profile", "email"), + + /** + * A map of custom OAuth parameters. + */ + override val customParameters: Map + ) : OAuthProvider( + providerId = Provider.YAHOO.id, + scopes = scopes, + customParameters = customParameters + ) + + /** + * Apple Sign-In provider configuration. + */ + class Apple( + /** + * The list of scopes to request. Defaults to name and email. + */ + override val scopes: List = listOf("name", "email"), + + /** + * The locale for the sign-in page. + */ + val locale: String?, + + /** + * A map of custom OAuth parameters. + */ + override val customParameters: Map + ) : OAuthProvider( + providerId = Provider.APPLE.id, + scopes = scopes, + customParameters = customParameters + ) + + /** + * Anonymous authentication provider. It has no configurable properties. + */ + object Anonymous : AuthProvider(providerId = Provider.ANONYMOUS.id) + + /** + * A generic OAuth provider for any unsupported provider. + */ + class GenericOAuth( + /** + * The provider ID as configured in the Firebase console. + */ + override val providerId: String, + + /** + * The list of scopes to request. + */ + override val scopes: List, + + /** + * A map of custom OAuth parameters. + */ + override val customParameters: Map, + + /** + * The text to display on the provider button. + */ + val buttonLabel: String, + + /** + * An optional icon for the provider button. + */ + val buttonIcon: ImageVector?, + + /** + * An optional background color for the provider button. + */ + val buttonColor: Color? + ) : OAuthProvider( + providerId = providerId, + scopes = scopes, + customParameters = customParameters + ) +} \ No newline at end of file diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt new file mode 100644 index 000000000..aca1ccf9e --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt @@ -0,0 +1,192 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration + +import java.util.Locale +import com.google.firebase.auth.ActionCodeSettings +import androidx.compose.ui.graphics.vector.ImageVector + +fun actionCodeSettings( + block: ActionCodeSettings.Builder.() -> Unit +) = ActionCodeSettings.newBuilder().apply(block).build() + +fun authUIConfiguration(block: AuthUIConfigurationBuilder.() -> Unit): AuthUIConfiguration { + val builder = AuthUIConfigurationBuilder() + builder.block() + return builder.build() +} + +@DslMarker +annotation class AuthUIConfigurationDsl + +@AuthUIConfigurationDsl +class AuthUIConfigurationBuilder { + private val providers = mutableListOf() + var theme: AuthUITheme = AuthUITheme.Default + var stringProvider: AuthUIStringProvider? = null + var locale: Locale? = null + var isCredentialManagerEnabled: Boolean = true + var isMfaEnabled: Boolean = true + var isAnonymousUpgradeEnabled: Boolean = false + var tosUrl: String? = null + var privacyPolicyUrl: String? = null + var logo: ImageVector? = null + var actionCodeSettings: ActionCodeSettings? = null + var isNewEmailAccountsAllowed: Boolean = true + var isDisplayNameRequired: Boolean = true + var isProviderChoiceAlwaysShown: Boolean = false + + fun providers(block: AuthProvidersBuilder.() -> Unit) { + val builder = AuthProvidersBuilder() + builder.block() + providers.addAll(builder.build()) + } + + internal fun build(): AuthUIConfiguration { + validate() + return AuthUIConfiguration( + providers = providers.toList(), + theme = theme, + stringProvider = stringProvider, + locale = locale, + isCredentialManagerEnabled = isCredentialManagerEnabled, + isMfaEnabled = isMfaEnabled, + isAnonymousUpgradeEnabled = isAnonymousUpgradeEnabled, + tosUrl = tosUrl, + privacyPolicyUrl = privacyPolicyUrl, + logo = logo, + actionCodeSettings = actionCodeSettings, + isNewEmailAccountsAllowed = isNewEmailAccountsAllowed, + isDisplayNameRequired = isDisplayNameRequired, + isProviderChoiceAlwaysShown = isProviderChoiceAlwaysShown + ) + } + + private fun validate() { + // At least one provider + if (providers.isEmpty()) { + throw IllegalArgumentException("At least one provider must be configured") + } + + // No unsupported providers + val supportedProviderIds = Provider.entries.map { it.id }.toSet() + val unknownProviders = providers.filter { it.providerId !in supportedProviderIds } + require(unknownProviders.isEmpty()) { + "Unknown providers: ${unknownProviders.joinToString { it.providerId }}" + } + + // Cannot have only anonymous provider + if (providers.size == 1 && providers.first() is AuthProvider.Anonymous) { + throw IllegalStateException( + "Sign in as guest cannot be the only sign in method. " + + "In this case, sign the user in anonymously your self; no UI is needed." + ) + } + + // Check for duplicate providers + val providerIds = providers.map { it.providerId } + val duplicates = providerIds.groupingBy { it }.eachCount().filter { it.value > 1 } + + require(duplicates.isEmpty()) { + val message = duplicates.keys.joinToString(", ") + throw IllegalArgumentException( + "Each provider can only be set once. Duplicates: $message" + ) + } + + // Provider specific validations + providers.forEach { provider -> + when (provider) { + is AuthProvider.Email -> provider.validate() + else -> null + } + } + } +} + +/** + * Configuration object for the authentication flow. + */ +class AuthUIConfiguration( + /** + * The list of enabled authentication providers. + */ + val providers: List = emptyList(), + + /** + * The theming configuration for the UI. Default to [AuthUITheme.Default]. + */ + val theme: AuthUITheme = AuthUITheme.Default, + + /** + * A custom provider for localized strings. + */ + val stringProvider: AuthUIStringProvider? = null, + + /** + * The locale for internationalization. + */ + val locale: Locale? = null, + + /** + * Enables integration with Android's Credential Manager API. Defaults to true. + */ + val isCredentialManagerEnabled: Boolean = true, + + /** + * Enables Multi-Factor Authentication support. Defaults to true. + */ + val isMfaEnabled: Boolean = true, + + /** + * Allows upgrading an anonymous user to a new credential. + */ + val isAnonymousUpgradeEnabled: Boolean = false, + + /** + * The URL for the terms of service. + */ + val tosUrl: String? = null, + + /** + * The URL for the privacy policy. + */ + val privacyPolicyUrl: String? = null, + + /** + * The logo to display on the authentication screens. + */ + val logo: ImageVector? = null, + + /** + * Configuration for email link sign-in. + */ + val actionCodeSettings: ActionCodeSettings? = null, + + /** + * Allows new email accounts to be created. Defaults to true. + */ + val isNewEmailAccountsAllowed: Boolean = true, + + /** + * Requires the user to provide a display name on sign-up. Defaults to true. + */ + val isDisplayNameRequired: Boolean = true, + + /** + * Always shows the provider selection screen, even if only one is enabled. + */ + val isProviderChoiceAlwaysShown: Boolean = false, +) diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt new file mode 100644 index 000000000..fe5bbf302 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration + +import android.content.Context +import com.firebase.ui.auth.R + +/** + * An interface for providing localized string resources. This interface defines methods for all + * user-facing strings, such as initializing(), signInWithGoogle(), invalidEmail(), + * passwordsDoNotMatch(), etc., allowing for complete localization of the UI. + */ +interface AuthUIStringProvider { + fun initializing(): String + fun signInWithGoogle(): String + fun invalidEmail(): String + fun passwordsDoNotMatch(): String +} + +class DefaultAuthUIStringProvider(private val context: Context) : AuthUIStringProvider { + override fun initializing(): String = "" + + override fun signInWithGoogle(): String = + context.getString(R.string.fui_sign_in_with_google) + + override fun invalidEmail(): String = "" + + override fun passwordsDoNotMatch(): String = "" +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUITheme.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUITheme.kt new file mode 100644 index 000000000..d2ae7032d --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUITheme.kt @@ -0,0 +1,205 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Shapes +import androidx.compose.material3.Typography +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + +private val LocalAuthUITheme = staticCompositionLocalOf { AuthUITheme.Default } + +/** + * Theming configuration for the entire Auth UI. + */ +class AuthUITheme( + /** + * The color scheme to use. + */ + val colorScheme: ColorScheme, + + /** + * The typography to use. + */ + val typography: Typography, + + /** + * The shapes to use for UI elements. + */ + val shapes: Shapes, + + /** + * A map of provider IDs to custom styling. + */ + val providerStyles: Map = emptyMap() +) { + + /** + * A class nested within AuthUITheme that defines the visual appearance of a specific + * provider button, allowing for per-provider branding and customization. + */ + class ProviderStyle( + /** + * The background color of the button. + */ + val backgroundColor: Color, + + /** + * The color of the text label on the button. + */ + val contentColor: Color, + + /** + * An optional tint color for the provider's icon. If null, + * the icon's intrinsic color is used. + */ + var iconTint: Color? = null, + + /** + * The shape of the button container. Defaults to RoundedCornerShape(4.dp). + */ + val shape: Shape = RoundedCornerShape(4.dp), + + /** + * The shadow elevation for the button. Defaults to 2.dp. + */ + val elevation: Dp = 2.dp + ) + + companion object { + /** + * A standard light theme with Material 3 defaults and + * pre-configured provider styles. + */ + val Default = AuthUITheme( + colorScheme = lightColorScheme(), + typography = Typography(), + shapes = Shapes(), + providerStyles = defaultProviderStyles + ) + + /** + * Creates a theme inheriting the app's current Material + * Theme settings. + */ + @Composable + fun fromMaterialTheme( + providerStyles: Map = Default.providerStyles + ): AuthUITheme { + return AuthUITheme( + colorScheme = MaterialTheme.colorScheme, + typography = MaterialTheme.typography, + shapes = MaterialTheme.shapes, + providerStyles = providerStyles + ) + } + + internal val defaultProviderStyles + get(): Map { + return Provider.entries.associate { provider -> + when (provider) { + Provider.GOOGLE -> { + provider.id to ProviderStyle( + backgroundColor = Color.White, + contentColor = Color(0xFF757575) + ) + } + + Provider.FACEBOOK -> { + provider.id to ProviderStyle( + backgroundColor = Color(0xFF3B5998), + contentColor = Color.White + ) + } + + Provider.TWITTER -> { + provider.id to ProviderStyle( + backgroundColor = Color(0xFF5BAAF4), + contentColor = Color.White + ) + } + + Provider.GITHUB -> { + provider.id to ProviderStyle( + backgroundColor = Color(0xFF24292E), + contentColor = Color.White + ) + } + + Provider.EMAIL -> { + provider.id to ProviderStyle( + backgroundColor = Color(0xFFD0021B), + contentColor = Color.White + ) + } + + Provider.PHONE -> { + provider.id to ProviderStyle( + backgroundColor = Color(0xFF43C5A5), + contentColor = Color.White + ) + } + + Provider.ANONYMOUS -> { + provider.id to ProviderStyle( + backgroundColor = Color(0xFFF4B400), + contentColor = Color.White + ) + } + + Provider.MICROSOFT -> { + provider.id to ProviderStyle( + backgroundColor = Color(0xFF2F2F2F), + contentColor = Color.White + ) + } + + Provider.YAHOO -> { + provider.id to ProviderStyle( + backgroundColor = Color(0xFF720E9E), + contentColor = Color.White + ) + } + + Provider.APPLE -> { + provider.id to ProviderStyle( + backgroundColor = Color.Black, + contentColor = Color.White + ) + } + } + } + } + } +} + +@Composable +fun AuthUITheme( + theme: AuthUITheme = AuthUITheme.Default, + content: @Composable () -> Unit +) { + CompositionLocalProvider(LocalAuthUITheme provides theme) { + content() + } +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt new file mode 100644 index 000000000..242ea6e83 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration + +/** + * An abstract class representing a set of validation rules that can be applied to a password field, + * typically within the [AuthProvider.Email] configuration. + */ +abstract class PasswordRule { + /** + * Requires the password to have at least a certain number of characters. + */ + class MinimumLength(val value: Int) : PasswordRule() + + /** + * Requires the password to contain at least one uppercase letter (A-Z). + */ + object RequireUppercase : PasswordRule() + + /** + * Requires the password to contain at least one lowercase letter (a-z). + */ + object RequireLowercase: PasswordRule() + + /** + * Requires the password to contain at least one numeric digit (0-9). + */ + object RequireDigit: PasswordRule() + + /** + * Requires the password to contain at least one special character (e.g., !@#$%^&*). + */ + object RequireSpecialCharacter: PasswordRule() + + /** + * Defines a custom validation rule using a regular expression and provides a specific error + * message on failure. + */ + class Custom(val regex: Regex, val errorMessage: String) +} \ No newline at end of file diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt new file mode 100644 index 000000000..c8e627ff5 --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt @@ -0,0 +1,300 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.AccountCircle +import com.google.common.truth.Truth.assertThat +import com.google.firebase.auth.actionCodeSettings +import org.junit.Assert.assertThrows +import org.junit.Test +import java.util.Locale +import kotlin.reflect.KMutableProperty +import kotlin.reflect.full.memberProperties + +class AuthUIConfigurationTest { + + @Test + fun `authUIConfiguration with minimal setup uses correct defaults`() { + val config = authUIConfiguration { + providers { + provider( + AuthProvider.Google( + scopes = listOf(), + serverClientId = "" + ) + ) + } + } + + assertThat(config.providers).hasSize(1) + assertThat(config.theme).isEqualTo(AuthUITheme.Default) + assertThat(config.stringProvider).isNull() + assertThat(config.locale).isNull() + assertThat(config.isCredentialManagerEnabled).isTrue() + assertThat(config.isMfaEnabled).isTrue() + assertThat(config.isAnonymousUpgradeEnabled).isFalse() + assertThat(config.tosUrl).isNull() + assertThat(config.privacyPolicyUrl).isNull() + assertThat(config.logo).isNull() + assertThat(config.actionCodeSettings).isNull() + assertThat(config.isNewEmailAccountsAllowed).isTrue() + assertThat(config.isDisplayNameRequired).isTrue() + assertThat(config.isProviderChoiceAlwaysShown).isFalse() + } + + @Test + fun `authUIConfiguration with all fields overridden uses custom values`() { + val customTheme = AuthUITheme.Default + val customStringProvider = object : AuthUIStringProvider { + override fun initializing(): String = "" + override fun signInWithGoogle(): String = "" + override fun invalidEmail(): String = "" + override fun passwordsDoNotMatch(): String = "" + } + val customLocale = Locale.US + val customActionCodeSettings = actionCodeSettings { + url = "https://example.com/verify" + handleCodeInApp = true + } + + val config = authUIConfiguration { + providers { + provider( + AuthProvider.Google( + scopes = listOf(), + serverClientId = "" + ) + ) + provider( + AuthProvider.Github( + customParameters = mapOf() + ) + ) + } + theme = customTheme + stringProvider = customStringProvider + locale = customLocale + isCredentialManagerEnabled = false + isMfaEnabled = false + isAnonymousUpgradeEnabled = true + tosUrl = "https://example.com/tos" + privacyPolicyUrl = "https://example.com/privacy" + logo = Icons.Default.AccountCircle + actionCodeSettings = customActionCodeSettings + isNewEmailAccountsAllowed = false + isDisplayNameRequired = false + isProviderChoiceAlwaysShown = true + } + + assertThat(config.providers).hasSize(2) + assertThat(config.theme).isEqualTo(customTheme) + assertThat(config.stringProvider).isEqualTo(customStringProvider) + assertThat(config.locale).isEqualTo(customLocale) + assertThat(config.isCredentialManagerEnabled).isFalse() + assertThat(config.isMfaEnabled).isFalse() + assertThat(config.isAnonymousUpgradeEnabled).isTrue() + assertThat(config.tosUrl).isEqualTo("https://example.com/tos") + assertThat(config.privacyPolicyUrl).isEqualTo("https://example.com/privacy") + assertThat(config.logo).isEqualTo(Icons.Default.AccountCircle) + assertThat(config.actionCodeSettings).isEqualTo(customActionCodeSettings) + assertThat(config.isNewEmailAccountsAllowed).isFalse() + assertThat(config.isDisplayNameRequired).isFalse() + assertThat(config.isProviderChoiceAlwaysShown).isTrue() + } + + // =========================================================================================== + // Validation Tests + // =========================================================================================== + + @Test(expected = IllegalArgumentException::class) + fun `authUIConfiguration throws when no providers configured`() { + authUIConfiguration { } + } + + @Test + fun `validation accepts all supported providers`() { + val config = authUIConfiguration { + providers { + provider(AuthProvider.Google(scopes = listOf(), serverClientId = "")) + provider(AuthProvider.Facebook()) + provider(AuthProvider.Twitter(customParameters = mapOf())) + provider(AuthProvider.Github(customParameters = mapOf())) + provider(AuthProvider.Microsoft(customParameters = mapOf(), tenant = null)) + provider(AuthProvider.Yahoo(customParameters = mapOf())) + provider(AuthProvider.Apple(customParameters = mapOf(), locale = null)) + provider(AuthProvider.Phone(defaultCountryCode = null, allowedCountries = null)) + provider(AuthProvider.Email(actionCodeSettings = null, passwordValidationRules = listOf())) + } + } + assertThat(config.providers).hasSize(9) + } + + @Test(expected = IllegalArgumentException::class) + fun `validation throws for unsupported provider`() { + val mockProvider = AuthProvider.GenericOAuth( + providerId = "unsupported.provider", + scopes = listOf(), + customParameters = mapOf(), + buttonLabel = "Test", + buttonIcon = null, + buttonColor = null + ) + + authUIConfiguration { + providers { + provider(mockProvider) + } + } + } + + @Test(expected = IllegalStateException::class) + fun `validate throws when only anonymous provider is configured`() { + authUIConfiguration { + providers { + provider(AuthProvider.Anonymous) + } + } + } + + @Test(expected = IllegalArgumentException::class) + fun `validate throws for duplicate providers`() { + authUIConfiguration { + providers { + provider(AuthProvider.Google(scopes = listOf(), serverClientId = "")) + provider(AuthProvider.Google(scopes = listOf("email"), serverClientId = "different")) + } + } + } + + @Test(expected = IllegalArgumentException::class) + fun `validate throws for enableEmailLinkSignIn true when actionCodeSettings is null`() { + authUIConfiguration { + providers { + provider(AuthProvider.Email( + isEmailLinkSignInEnabled = true, + actionCodeSettings = null, + passwordValidationRules = listOf() + )) + } + } + } + + @Test(expected = IllegalStateException::class) + fun `validate throws for enableEmailLinkSignIn true when actionCodeSettings canHandleCodeInApp false`() { + val customActionCodeSettings = actionCodeSettings { + url = "https://example.com" + handleCodeInApp = false + } + authUIConfiguration { + providers { + provider(AuthProvider.Email( + isEmailLinkSignInEnabled = true, + actionCodeSettings = customActionCodeSettings, + passwordValidationRules = listOf() + )) + } + } + } + + // =========================================================================================== + // Provider Configuration Tests + // =========================================================================================== + + @Test + fun `providers block can be called multiple times and accumulates providers`() { + val config = authUIConfiguration { + providers { + provider( + AuthProvider.Google( + scopes = listOf(), + serverClientId = "" + ) + ) + } + + providers { + provider( + AuthProvider.Github( + customParameters = mapOf() + ) + ) + } + isCredentialManagerEnabled = true + } + + assertThat(config.providers).hasSize(2) + } + + // =========================================================================================== + // Builder Immutability Tests + // =========================================================================================== + + @Test + fun `authUIConfiguration providers list is immutable`() { + val config = authUIConfiguration { + providers { + provider( + AuthProvider.Google( + scopes = listOf(), + serverClientId = "" + ) + ) + } + } + + val originalSize = config.providers.size + + assertThrows(UnsupportedOperationException::class.java) { + (config.providers as MutableList).add( + AuthProvider.Twitter(customParameters = mapOf()) + ) + } + + assertThat(config.providers.size).isEqualTo(originalSize) + } + + @Test + fun `authUIConfiguration creates immutable configuration`() { + val kClass = AuthUIConfiguration::class + + val allProperties = kClass.memberProperties + + allProperties.forEach { + assertThat(it).isNotInstanceOf(KMutableProperty::class.java) + } + + val expectedProperties = setOf( + "providers", + "theme", + "stringProvider", + "locale", + "isCredentialManagerEnabled", + "isMfaEnabled", + "isAnonymousUpgradeEnabled", + "tosUrl", + "privacyPolicyUrl", + "logo", + "actionCodeSettings", + "isNewEmailAccountsAllowed", + "isDisplayNameRequired", + "isProviderChoiceAlwaysShown" + ) + + val actualProperties = allProperties.map { it.name }.toSet() + + assertThat(actualProperties).containsExactlyElementsIn(expectedProperties) + } +} diff --git a/build.gradle.kts b/build.gradle.kts index c87edeee9..105624a8b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,6 +19,7 @@ buildscript { plugins { id("com.github.ben-manes.versions") version "0.20.0" + alias(libs.plugins.compose.compiler) apply false } allprojects { diff --git a/buildSrc/src/main/kotlin/Config.kt b/buildSrc/src/main/kotlin/Config.kt index d5e15edfe..7e9352e85 100644 --- a/buildSrc/src/main/kotlin/Config.kt +++ b/buildSrc/src/main/kotlin/Config.kt @@ -2,11 +2,11 @@ object Config { const val version = "10.0.0-SNAPSHOT" val submodules = listOf("auth", "common", "firestore", "database", "storage") - private const val kotlinVersion = "2.1.0" + private const val kotlinVersion = "2.2.0" object SdkVersions { - const val compile = 34 - const val target = 34 + const val compile = 35 + const val target = 35 const val min = 23 } @@ -40,8 +40,18 @@ object Config { const val paging = "androidx.paging:paging-runtime:3.0.0" const val pagingRxJava = "androidx.paging:paging-rxjava3:3.0.0" const val recyclerView = "androidx.recyclerview:recyclerview:1.2.1" - const val materialDesign = "com.google.android.material:material:1.4.0" + + object Compose { + const val bom = "androidx.compose:compose-bom:2025.08.00" + const val ui = "androidx.compose.ui:ui" + const val uiGraphics = "androidx.compose.ui:ui-graphics" + const val toolingPreview = "androidx.compose.ui:ui-tooling-preview" + const val tooling = "androidx.compose.ui:ui-tooling" + const val foundation = "androidx.compose.foundation:foundation" + const val material3 = "androidx.compose.material3:material3" + const val activityCompose = "androidx.activity:activity-compose" + } } object Firebase { @@ -83,6 +93,8 @@ object Config { const val archCoreTesting = "androidx.arch.core:core-testing:2.1.0" const val runner = "androidx.test:runner:1.5.0" const val rules = "androidx.test:rules:1.5.0" + + const val kotlinReflect = "org.jetbrains.kotlin:kotlin-reflect" } object Lint { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..379fe1b5b --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,7 @@ +[versions] +kotlin = "2.2.0" + +[libraries] + +[plugins] +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } \ No newline at end of file From ed47c1d7f4c581b2d808c34b197dd92633bce919 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo <48495111+demolaf@users.noreply.github.com> Date: Mon, 22 Sep 2025 07:11:27 +0100 Subject: [PATCH 05/50] feat: Email & Password Validator and PasswordRule validations (#2218) * feat(AuthUIConfiguration): implement configuration model, DSL builder and tests * refactor: use OAuthProvider base class for common properties * feat: add Provider enum class for provider ids * feat: setup default provider styles for each provider * test: added builder validation logic from old auth library and tests * refactor: changes in API design docs replaced sealed with abstract class, data with regular class use isXX prefix for booleans * test: fix AuthUIConfiguration constructor test * wip: email validator and password validator * feat: added password rules validations, FieldValidator interface added email and password validator * test: EmailValidator, PasswordValidator and PasswordRule * docs: update PasswordRule comments * docs: update PasswordRule comments * fix: remove mock annotation --- .../configuration/AuthUIStringProvider.kt | 62 +++- .../compose/configuration/PasswordRule.kt | 81 ++++- .../validators/EmailValidator.kt | 48 +++ .../validators/FieldValidationStatus.kt | 24 ++ .../validators/FieldValidator.kt | 39 ++ .../validators/PasswordValidator.kt | 54 +++ auth/src/main/res/values/strings.xml | 7 + .../configuration/AuthUIConfigurationTest.kt | 68 ++-- .../compose/configuration/PasswordRuleTest.kt | 336 ++++++++++++++++++ .../validators/EmailValidatorTest.kt | 109 ++++++ .../validators/PasswordValidatorTest.kt | 277 +++++++++++++++ 11 files changed, 1064 insertions(+), 41 deletions(-) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidationStatus.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt index fe5bbf302..0e7080722 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt @@ -23,19 +23,59 @@ import com.firebase.ui.auth.R * passwordsDoNotMatch(), etc., allowing for complete localization of the UI. */ interface AuthUIStringProvider { - fun initializing(): String - fun signInWithGoogle(): String - fun invalidEmail(): String - fun passwordsDoNotMatch(): String -} + /** Loading text displayed during initialization or processing states */ + val initializing: String + + /** Button text for Google sign-in option */ + val signInWithGoogle: String + + /** Error message when email address field is empty */ + val missingEmailAddress: String + + /** Error message when email address format is invalid */ + val invalidEmailAddress: String + + /** Generic error message for incorrect password during sign-in */ + val invalidPassword: String -class DefaultAuthUIStringProvider(private val context: Context) : AuthUIStringProvider { - override fun initializing(): String = "" + /** Error message when password confirmation doesn't match the original password */ + val passwordsDoNotMatch: String - override fun signInWithGoogle(): String = - context.getString(R.string.fui_sign_in_with_google) + /** Error message when password doesn't meet minimum length requirement. Should support string formatting with minimum length parameter. */ + val passwordTooShort: String - override fun invalidEmail(): String = "" + /** Error message when password is missing at least one uppercase letter (A-Z) */ + val passwordMissingUppercase: String + + /** Error message when password is missing at least one lowercase letter (a-z) */ + val passwordMissingLowercase: String + + /** Error message when password is missing at least one numeric digit (0-9) */ + val passwordMissingDigit: String + + /** Error message when password is missing at least one special character */ + val passwordMissingSpecialCharacter: String +} - override fun passwordsDoNotMatch(): String = "" +internal class DefaultAuthUIStringProvider(private val context: Context) : AuthUIStringProvider { + override val initializing: String get() = "" + override val signInWithGoogle: String + get() = context.getString(R.string.fui_sign_in_with_google) + override val missingEmailAddress: String + get() = context.getString(R.string.fui_missing_email_address) + override val invalidEmailAddress: String + get() = context.getString(R.string.fui_invalid_email_address) + override val invalidPassword: String + get() = context.getString(R.string.fui_error_invalid_password) + override val passwordsDoNotMatch: String get() = "" + override val passwordTooShort: String + get() = context.getString(R.string.fui_error_password_too_short) + override val passwordMissingUppercase: String + get() = context.getString(R.string.fui_error_password_missing_uppercase) + override val passwordMissingLowercase: String + get() = context.getString(R.string.fui_error_password_missing_lowercase) + override val passwordMissingDigit: String + get() = context.getString(R.string.fui_error_password_missing_digit) + override val passwordMissingSpecialCharacter: String + get() = context.getString(R.string.fui_error_password_missing_special_character) } diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt index 242ea6e83..8f53822f2 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt @@ -22,31 +22,100 @@ abstract class PasswordRule { /** * Requires the password to have at least a certain number of characters. */ - class MinimumLength(val value: Int) : PasswordRule() + class MinimumLength(val value: Int) : PasswordRule() { + override fun isValid(password: String): Boolean { + return password.length >= this@MinimumLength.value + } + + override fun getErrorMessage(stringProvider: AuthUIStringProvider): String { + return stringProvider.passwordTooShort.format(value) + } + } /** * Requires the password to contain at least one uppercase letter (A-Z). */ - object RequireUppercase : PasswordRule() + object RequireUppercase : PasswordRule() { + override fun isValid(password: String): Boolean { + return password.any { it.isUpperCase() } + } + + override fun getErrorMessage(stringProvider: AuthUIStringProvider): String { + return stringProvider.passwordMissingUppercase + } + } /** * Requires the password to contain at least one lowercase letter (a-z). */ - object RequireLowercase: PasswordRule() + object RequireLowercase : PasswordRule() { + override fun isValid(password: String): Boolean { + return password.any { it.isLowerCase() } + } + + override fun getErrorMessage(stringProvider: AuthUIStringProvider): String { + return stringProvider.passwordMissingLowercase + } + } /** * Requires the password to contain at least one numeric digit (0-9). */ - object RequireDigit: PasswordRule() + object RequireDigit : PasswordRule() { + override fun isValid(password: String): Boolean { + return password.any { it.isDigit() } + } + + override fun getErrorMessage(stringProvider: AuthUIStringProvider): String { + return stringProvider.passwordMissingDigit + } + } /** * Requires the password to contain at least one special character (e.g., !@#$%^&*). */ - object RequireSpecialCharacter: PasswordRule() + object RequireSpecialCharacter : PasswordRule() { + private val specialCharacters = "!@#$%^&*()_+-=[]{}|;:,.<>?".toSet() + + override fun isValid(password: String): Boolean { + return password.any { it in specialCharacters } + } + + override fun getErrorMessage(stringProvider: AuthUIStringProvider): String { + return stringProvider.passwordMissingSpecialCharacter + } + } /** * Defines a custom validation rule using a regular expression and provides a specific error * message on failure. */ - class Custom(val regex: Regex, val errorMessage: String) + class Custom( + val regex: Regex, + val errorMessage: String + ) : PasswordRule() { + override fun isValid(password: String): Boolean { + return regex.matches(password) + } + + override fun getErrorMessage(stringProvider: AuthUIStringProvider): String { + return errorMessage + } + } + + /** + * Validates whether the given password meets this rule's requirements. + * + * @param password The password to validate + * @return true if the password meets this rule's requirements, false otherwise + */ + internal abstract fun isValid(password: String): Boolean + + /** + * Returns the appropriate error message for this rule when validation fails. + * + * @param stringProvider The string provider for localized error messages + * @return The localized error message for this rule + */ + internal abstract fun getErrorMessage(stringProvider: AuthUIStringProvider): String } \ No newline at end of file diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt new file mode 100644 index 000000000..d6b66194f --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.validators + +import com.firebase.ui.auth.compose.configuration.AuthUIStringProvider + +internal class EmailValidator(override val stringProvider: AuthUIStringProvider) : FieldValidator { + private var _validationStatus = FieldValidationStatus(hasError = false, errorMessage = null) + + override val hasError: Boolean + get() = _validationStatus.hasError + + override val errorMessage: String + get() = _validationStatus.errorMessage ?: "" + + override fun validate(value: String): Boolean { + if (value.isEmpty()) { + _validationStatus = FieldValidationStatus( + hasError = true, + errorMessage = stringProvider.missingEmailAddress + ) + return false + } + + if (!android.util.Patterns.EMAIL_ADDRESS.matcher(value).matches()) { + _validationStatus = FieldValidationStatus( + hasError = true, + errorMessage = stringProvider.invalidEmailAddress + ) + return false + } + + _validationStatus = FieldValidationStatus(hasError = false, errorMessage = null) + return true + } +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidationStatus.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidationStatus.kt new file mode 100644 index 000000000..7a681c921 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidationStatus.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.validators + +/** + * Class for encapsulating [hasError] and [errorMessage] properties in + * internal FieldValidator subclasses. + */ +internal class FieldValidationStatus( + val hasError: Boolean, + val errorMessage: String? = null, +) diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt new file mode 100644 index 000000000..a26741897 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.validators + +import com.firebase.ui.auth.compose.configuration.AuthUIStringProvider + +/** + * An interface for validating input fields. + */ +interface FieldValidator { + val stringProvider: AuthUIStringProvider + + /** + * Returns true if the last validation failed. + */ + val hasError: Boolean + + /** + * The error message for the current state. + */ + val errorMessage: String + + /** + * Runs validation on a value and returns true if valid. + */ + fun validate(value: String): Boolean +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt new file mode 100644 index 000000000..35605818e --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.validators + +import com.firebase.ui.auth.compose.configuration.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.PasswordRule + +internal class PasswordValidator( + override val stringProvider: AuthUIStringProvider, + private val rules: List +) : FieldValidator { + private var _validationStatus = FieldValidationStatus(hasError = false, errorMessage = null) + + override val hasError: Boolean + get() = _validationStatus.hasError + + override val errorMessage: String + get() = _validationStatus.errorMessage ?: "" + + override fun validate(value: String): Boolean { + if (value.isEmpty()) { + _validationStatus = FieldValidationStatus( + hasError = true, + errorMessage = stringProvider.invalidPassword + ) + return false + } + + for (rule in rules) { + if (!rule.isValid(value)) { + _validationStatus = FieldValidationStatus( + hasError = true, + errorMessage = rule.getErrorMessage(stringProvider) + ) + return false + } + } + + _validationStatus = FieldValidationStatus(hasError = false, errorMessage = null) + return true + } +} diff --git a/auth/src/main/res/values/strings.xml b/auth/src/main/res/values/strings.xml index 52314a505..71b87f547 100644 --- a/auth/src/main/res/values/strings.xml +++ b/auth/src/main/res/values/strings.xml @@ -93,6 +93,13 @@ An unknown error occurred. Incorrect password. + + Password must be at least %1$d characters long + Password must contain at least one uppercase letter + Password must contain at least one lowercase letter + Password must contain at least one number + Password must contain at least one special character + App logo diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt index c8e627ff5..0233848e4 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt @@ -20,12 +20,23 @@ import com.google.common.truth.Truth.assertThat import com.google.firebase.auth.actionCodeSettings import org.junit.Assert.assertThrows import org.junit.Test +import org.mockito.Mockito.mock import java.util.Locale import kotlin.reflect.KMutableProperty import kotlin.reflect.full.memberProperties +/** + * Unit tests for [AuthUIConfiguration] covering configuration builder behavior, + * validation rules, provider setup, and immutability guarantees. + * + * @suppress Internal test class + */ class AuthUIConfigurationTest { + // ============================================================================================= + // Basic Configuration Tests + // ============================================================================================= + @Test fun `authUIConfiguration with minimal setup uses correct defaults`() { val config = authUIConfiguration { @@ -58,12 +69,7 @@ class AuthUIConfigurationTest { @Test fun `authUIConfiguration with all fields overridden uses custom values`() { val customTheme = AuthUITheme.Default - val customStringProvider = object : AuthUIStringProvider { - override fun initializing(): String = "" - override fun signInWithGoogle(): String = "" - override fun invalidEmail(): String = "" - override fun passwordsDoNotMatch(): String = "" - } + val customStringProvider = mock(AuthUIStringProvider::class.java) val customLocale = Locale.US val customActionCodeSettings = actionCodeSettings { url = "https://example.com/verify" @@ -115,9 +121,9 @@ class AuthUIConfigurationTest { assertThat(config.isProviderChoiceAlwaysShown).isTrue() } - // =========================================================================================== + // ============================================================================================= // Validation Tests - // =========================================================================================== + // ============================================================================================= @Test(expected = IllegalArgumentException::class) fun `authUIConfiguration throws when no providers configured`() { @@ -136,7 +142,12 @@ class AuthUIConfigurationTest { provider(AuthProvider.Yahoo(customParameters = mapOf())) provider(AuthProvider.Apple(customParameters = mapOf(), locale = null)) provider(AuthProvider.Phone(defaultCountryCode = null, allowedCountries = null)) - provider(AuthProvider.Email(actionCodeSettings = null, passwordValidationRules = listOf())) + provider( + AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = listOf() + ) + ) } } assertThat(config.providers).hasSize(9) @@ -174,7 +185,12 @@ class AuthUIConfigurationTest { authUIConfiguration { providers { provider(AuthProvider.Google(scopes = listOf(), serverClientId = "")) - provider(AuthProvider.Google(scopes = listOf("email"), serverClientId = "different")) + provider( + AuthProvider.Google( + scopes = listOf("email"), + serverClientId = "different" + ) + ) } } } @@ -183,11 +199,13 @@ class AuthUIConfigurationTest { fun `validate throws for enableEmailLinkSignIn true when actionCodeSettings is null`() { authUIConfiguration { providers { - provider(AuthProvider.Email( - isEmailLinkSignInEnabled = true, - actionCodeSettings = null, - passwordValidationRules = listOf() - )) + provider( + AuthProvider.Email( + isEmailLinkSignInEnabled = true, + actionCodeSettings = null, + passwordValidationRules = listOf() + ) + ) } } } @@ -200,18 +218,20 @@ class AuthUIConfigurationTest { } authUIConfiguration { providers { - provider(AuthProvider.Email( - isEmailLinkSignInEnabled = true, - actionCodeSettings = customActionCodeSettings, - passwordValidationRules = listOf() - )) + provider( + AuthProvider.Email( + isEmailLinkSignInEnabled = true, + actionCodeSettings = customActionCodeSettings, + passwordValidationRules = listOf() + ) + ) } } } - // =========================================================================================== + // ============================================================================================= // Provider Configuration Tests - // =========================================================================================== + // ============================================================================================= @Test fun `providers block can be called multiple times and accumulates providers`() { @@ -238,9 +258,9 @@ class AuthUIConfigurationTest { assertThat(config.providers).hasSize(2) } - // =========================================================================================== + // ============================================================================================= // Builder Immutability Tests - // =========================================================================================== + // ============================================================================================= @Test fun `authUIConfiguration providers list is immutable`() { diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt new file mode 100644 index 000000000..d3cacb488 --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt @@ -0,0 +1,336 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import com.firebase.ui.auth.R +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Unit tests for [PasswordRule] implementations covering validation logic + * and error message generation for each password rule type. + * + * @suppress Internal test class + */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class PasswordRuleTest { + + private lateinit var stringProvider: DefaultAuthUIStringProvider + + @Before + fun setUp() { + val context = ApplicationProvider.getApplicationContext() + stringProvider = DefaultAuthUIStringProvider(context) + } + + // ============================================================================================= + // MinimumLength Rule Tests + // ============================================================================================= + + @Test + fun `MinimumLength isValid returns true for password meeting length requirement`() { + val rule = PasswordRule.MinimumLength(8) + + val isValid = rule.isValid("password123") + + assertThat(isValid).isTrue() + } + + @Test + fun `MinimumLength isValid returns false for password shorter than requirement`() { + val rule = PasswordRule.MinimumLength(8) + + val isValid = rule.isValid("short") + + assertThat(isValid).isFalse() + } + + @Test + fun `MinimumLength getErrorMessage returns formatted message`() { + val context = ApplicationProvider.getApplicationContext() + val rule = PasswordRule.MinimumLength(10) + + val message = rule.getErrorMessage(stringProvider) + + assertThat(message).isEqualTo(context.getString(R.string.fui_error_password_too_short, 10)) + } + + // ============================================================================================= + // RequireUppercase Rule Tests + // ============================================================================================= + + @Test + fun `RequireUppercase isValid returns true for password with uppercase letter`() { + val rule = PasswordRule.RequireUppercase + + val isValid = rule.isValid("Password123") + + assertThat(isValid).isTrue() + } + + @Test + fun `RequireUppercase isValid returns false for password without uppercase letter`() { + val rule = PasswordRule.RequireUppercase + + val isValid = rule.isValid("password123") + + assertThat(isValid).isFalse() + } + + @Test + fun `RequireUppercase getErrorMessage returns correct message`() { + val context = ApplicationProvider.getApplicationContext() + val rule = PasswordRule.RequireUppercase + + val message = rule.getErrorMessage(stringProvider) + + assertThat(message).isEqualTo(context.getString(R.string.fui_error_password_missing_uppercase)) + } + + // ============================================================================================= + // RequireLowercase Rule Tests + // ============================================================================================= + + @Test + fun `RequireLowercase isValid returns true for password with lowercase letter`() { + val rule = PasswordRule.RequireLowercase + + val isValid = rule.isValid("Password123") + + assertThat(isValid).isTrue() + } + + @Test + fun `RequireLowercase isValid returns false for password without lowercase letter`() { + val rule = PasswordRule.RequireLowercase + + val isValid = rule.isValid("PASSWORD123") + + assertThat(isValid).isFalse() + } + + @Test + fun `RequireLowercase getErrorMessage returns correct message`() { + val context = ApplicationProvider.getApplicationContext() + val rule = PasswordRule.RequireLowercase + + val message = rule.getErrorMessage(stringProvider) + + assertThat(message).isEqualTo(context.getString(R.string.fui_error_password_missing_lowercase)) + } + + // ============================================================================================= + // RequireDigit Rule Tests + // ============================================================================================= + + @Test + fun `RequireDigit isValid returns true for password with digit`() { + val rule = PasswordRule.RequireDigit + + val isValid = rule.isValid("Password123") + + assertThat(isValid).isTrue() + } + + @Test + fun `RequireDigit isValid returns false for password without digit`() { + val rule = PasswordRule.RequireDigit + + val isValid = rule.isValid("Password") + + assertThat(isValid).isFalse() + } + + @Test + fun `RequireDigit getErrorMessage returns correct message`() { + val context = ApplicationProvider.getApplicationContext() + val rule = PasswordRule.RequireDigit + + val message = rule.getErrorMessage(stringProvider) + + assertThat(message).isEqualTo(context.getString(R.string.fui_error_password_missing_digit)) + } + + // ============================================================================================= + // RequireSpecialCharacter Rule Tests + // ============================================================================================= + + @Test + fun `RequireSpecialCharacter isValid returns true for password with special character`() { + val rule = PasswordRule.RequireSpecialCharacter + + val isValid = rule.isValid("Password123!") + + assertThat(isValid).isTrue() + } + + @Test + fun `RequireSpecialCharacter isValid returns false for password without special character`() { + val rule = PasswordRule.RequireSpecialCharacter + + val isValid = rule.isValid("Password123") + + assertThat(isValid).isFalse() + } + + @Test + fun `RequireSpecialCharacter getErrorMessage returns correct message`() { + val context = ApplicationProvider.getApplicationContext() + val rule = PasswordRule.RequireSpecialCharacter + + val message = rule.getErrorMessage(stringProvider) + + assertThat(message).isEqualTo(context.getString(R.string.fui_error_password_missing_special_character)) + } + + @Test + fun `RequireSpecialCharacter validates various special characters`() { + val rule = PasswordRule.RequireSpecialCharacter + val specialChars = "!@#$%^&*()_+-=[]{}|;:,.<>?" + + specialChars.forEach { char -> + val isValid = rule.isValid("Password123$char") + assertThat(isValid).isTrue() + } + } + + // ============================================================================================= + // Custom Rule Tests + // ============================================================================================= + + @Test + fun `Custom rule isValid works with provided regex`() { + val rule = PasswordRule.Custom( + regex = Regex("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$"), + errorMessage = "Custom validation failed" + ) + + val validPassword = rule.isValid("Password123") + val invalidPassword = rule.isValid("weak") + + assertThat(validPassword).isTrue() + assertThat(invalidPassword).isFalse() + } + + @Test + fun `Custom rule getErrorMessage returns custom message`() { + val customMessage = "Custom validation failed" + val rule = PasswordRule.Custom( + regex = Regex(".*"), + errorMessage = customMessage + ) + + val message = rule.getErrorMessage(stringProvider) + + assertThat(message).isEqualTo(customMessage) + } + + @Test + fun `Custom rule with complex regex works correctly`() { + // Must contain at least one letter, one number, and be 6+ characters + val rule = PasswordRule.Custom( + regex = Regex("^(?=.*[a-zA-Z])(?=.*\\d).{6,}$"), + errorMessage = "Must contain letter and number, min 6 chars" + ) + + assertThat(rule.isValid("abc123")).isTrue() + assertThat(rule.isValid("password1")).isTrue() + assertThat(rule.isValid("123456")).isFalse() // No letter + assertThat(rule.isValid("abcdef")).isFalse() // No number + assertThat(rule.isValid("abc12")).isFalse() // Too short + } + + // ============================================================================================= + // Rule Extensibility Tests + // ============================================================================================= + + @Test + fun `custom password rule by extending PasswordRule works`() { + val customRule = object : PasswordRule() { + override fun isValid(password: String): Boolean { + return password.contains("test") + } + + override fun getErrorMessage(stringProvider: AuthUIStringProvider): String { + return "Password must contain 'test'" + } + } + + val validResult = customRule.isValid("testing123") + val invalidResult = customRule.isValid("invalid") + val errorMessage = customRule.getErrorMessage(stringProvider) + + assertThat(validResult).isTrue() + assertThat(invalidResult).isFalse() + assertThat(errorMessage).isEqualTo("Password must contain 'test'") + } + + @Test + fun `multiple custom rules can be created independently`() { + val rule1 = object : PasswordRule() { + override fun isValid(password: String): Boolean = password.startsWith("prefix") + override fun getErrorMessage(stringProvider: AuthUIStringProvider): String = "Must start with 'prefix'" + } + + val rule2 = object : PasswordRule() { + override fun isValid(password: String): Boolean = password.endsWith("suffix") + override fun getErrorMessage(stringProvider: AuthUIStringProvider): String = "Must end with 'suffix'" + } + + assertThat(rule1.isValid("prefixPassword")).isTrue() + assertThat(rule1.isValid("passwordsuffix")).isFalse() + + assertThat(rule2.isValid("passwordsuffix")).isTrue() + assertThat(rule2.isValid("prefixPassword")).isFalse() + + assertThat(rule1.getErrorMessage(stringProvider)).isEqualTo("Must start with 'prefix'") + assertThat(rule2.getErrorMessage(stringProvider)).isEqualTo("Must end with 'suffix'") + } + + // ============================================================================================= + // Edge Case Tests + // ============================================================================================= + + @Test + fun `all rules handle empty password correctly`() { + val rules = listOf( + PasswordRule.MinimumLength(1), + PasswordRule.RequireUppercase, + PasswordRule.RequireLowercase, + PasswordRule.RequireDigit, + PasswordRule.RequireSpecialCharacter + ) + + rules.forEach { rule -> + val isValid = rule.isValid("") + assertThat(isValid).isFalse() + } + } + + @Test + fun `MinimumLength with zero length allows any password`() { + val rule = PasswordRule.MinimumLength(0) + + assertThat(rule.isValid("")).isTrue() + assertThat(rule.isValid("any")).isTrue() + } +} \ No newline at end of file diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt new file mode 100644 index 000000000..520908181 --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt @@ -0,0 +1,109 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.validators + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.configuration.DefaultAuthUIStringProvider +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Integration tests for [EmailValidator] covering email validation logic, + * error state management, and integration with [DefaultAuthUIStringProvider] + * using real Android string resources. + * + * @suppress Internal test class + */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class EmailValidatorTest { + + private lateinit var stringProvider: DefaultAuthUIStringProvider + + private lateinit var emailValidator: EmailValidator + + @Before + fun setUp() { + val context = ApplicationProvider.getApplicationContext() + stringProvider = DefaultAuthUIStringProvider(context) + emailValidator = EmailValidator(stringProvider) + } + + // ============================================================================================= + // Initial State Tests + // ============================================================================================= + + @Test + fun `validator initial state has no error`() { + assertThat(emailValidator.hasError).isFalse() + assertThat(emailValidator.errorMessage).isEmpty() + } + + // ============================================================================================= + // Validation Logic Tests + // ============================================================================================= + + @Test + fun `validate returns false and sets error for empty email`() { + val context = ApplicationProvider.getApplicationContext() + + val isValid = emailValidator.validate("") + + assertThat(isValid).isFalse() + assertThat(emailValidator.hasError).isTrue() + assertThat(emailValidator.errorMessage) + .isEqualTo(context.getString(R.string.fui_missing_email_address)) + } + + @Test + fun `validate returns false and sets error for invalid email format`() { + val context = ApplicationProvider.getApplicationContext() + + val isValid = emailValidator.validate("invalid-email") + + assertThat(isValid).isFalse() + assertThat(emailValidator.hasError).isTrue() + assertThat(emailValidator.errorMessage) + .isEqualTo(context.getString(R.string.fui_invalid_email_address)) + } + + @Test + fun `validate returns true and clears error for valid email`() { + val isValid = emailValidator.validate("test@example.com") + + assertThat(isValid).isTrue() + assertThat(emailValidator.hasError).isFalse() + assertThat(emailValidator.errorMessage).isEmpty() + } + + @Test + fun `validate clears previous error when valid email provided`() { + emailValidator.validate("invalid") + assertThat(emailValidator.hasError).isTrue() + + val isValid = emailValidator.validate("valid@example.com") + + assertThat(isValid).isTrue() + assertThat(emailValidator.hasError).isFalse() + assertThat(emailValidator.errorMessage).isEmpty() + } +} \ No newline at end of file diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt new file mode 100644 index 000000000..4e8d2e440 --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt @@ -0,0 +1,277 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.validators + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.configuration.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.PasswordRule +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Integration tests for [PasswordValidator] covering password validation logic, + * password rule enforcement, error state management, and integration with + * [DefaultAuthUIStringProvider] using real Android string resources. + * + * @suppress Internal test class + */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class PasswordValidatorTest { + + private lateinit var stringProvider: DefaultAuthUIStringProvider + private lateinit var passwordValidator: PasswordValidator + + @Before + fun setUp() { + val context = ApplicationProvider.getApplicationContext() + stringProvider = DefaultAuthUIStringProvider(context) + } + + // ============================================================================================= + // Initial State Tests + // ============================================================================================= + + @Test + fun `validator initial state has no error`() { + passwordValidator = PasswordValidator(stringProvider, emptyList()) + + assertThat(passwordValidator.hasError).isFalse() + assertThat(passwordValidator.errorMessage).isEmpty() + } + + // ============================================================================================= + // Empty Password Validation Tests + // ============================================================================================= + + @Test + fun `validate returns false and sets error for empty password`() { + val context = ApplicationProvider.getApplicationContext() + passwordValidator = PasswordValidator(stringProvider, emptyList()) + + val isValid = passwordValidator.validate("") + + assertThat(isValid).isFalse() + assertThat(passwordValidator.hasError).isTrue() + assertThat(passwordValidator.errorMessage) + .isEqualTo(context.getString(R.string.fui_error_invalid_password)) + } + + // ============================================================================================= + // Minimum Length Rule Tests + // ============================================================================================= + + @Test + fun `validate returns false for password shorter than minimum length`() { + val context = ApplicationProvider.getApplicationContext() + val rules = listOf(PasswordRule.MinimumLength(8)) + passwordValidator = PasswordValidator(stringProvider, rules) + + val isValid = passwordValidator.validate("short") + + assertThat(isValid).isFalse() + assertThat(passwordValidator.hasError).isTrue() + assertThat(passwordValidator.errorMessage) + .isEqualTo(context.getString(R.string.fui_error_password_too_short, 8)) + } + + @Test + fun `validate returns true for password meeting minimum length`() { + val rules = listOf(PasswordRule.MinimumLength(8)) + passwordValidator = PasswordValidator(stringProvider, rules) + + val isValid = passwordValidator.validate("password123") + + assertThat(isValid).isTrue() + assertThat(passwordValidator.hasError).isFalse() + assertThat(passwordValidator.errorMessage).isEmpty() + } + + // ============================================================================================= + // Character Requirement Tests + // ============================================================================================= + + @Test + fun `validate returns false for password missing uppercase letter`() { + val context = ApplicationProvider.getApplicationContext() + val rules = listOf(PasswordRule.RequireUppercase) + passwordValidator = PasswordValidator(stringProvider, rules) + + val isValid = passwordValidator.validate("password123") + + assertThat(isValid).isFalse() + assertThat(passwordValidator.hasError).isTrue() + assertThat(passwordValidator.errorMessage) + .isEqualTo(context.getString(R.string.fui_error_password_missing_uppercase)) + } + + @Test + fun `validate returns true for password with uppercase letter`() { + val rules = listOf(PasswordRule.RequireUppercase) + passwordValidator = PasswordValidator(stringProvider, rules) + + val isValid = passwordValidator.validate("Password123") + + assertThat(isValid).isTrue() + assertThat(passwordValidator.hasError).isFalse() + assertThat(passwordValidator.errorMessage).isEmpty() + } + + @Test + fun `validate returns false for password missing lowercase letter`() { + val context = ApplicationProvider.getApplicationContext() + val rules = listOf(PasswordRule.RequireLowercase) + passwordValidator = PasswordValidator(stringProvider, rules) + + val isValid = passwordValidator.validate("PASSWORD123") + + assertThat(isValid).isFalse() + assertThat(passwordValidator.hasError).isTrue() + assertThat(passwordValidator.errorMessage) + .isEqualTo(context.getString(R.string.fui_error_password_missing_lowercase)) + } + + @Test + fun `validate returns false for password missing digit`() { + val context = ApplicationProvider.getApplicationContext() + val rules = listOf(PasswordRule.RequireDigit) + passwordValidator = PasswordValidator(stringProvider, rules) + + val isValid = passwordValidator.validate("Password") + + assertThat(isValid).isFalse() + assertThat(passwordValidator.hasError).isTrue() + assertThat(passwordValidator.errorMessage) + .isEqualTo(context.getString(R.string.fui_error_password_missing_digit)) + } + + @Test + fun `validate returns false for password missing special character`() { + val context = ApplicationProvider.getApplicationContext() + val rules = listOf(PasswordRule.RequireSpecialCharacter) + passwordValidator = PasswordValidator(stringProvider, rules) + + val isValid = passwordValidator.validate("Password123") + + assertThat(isValid).isFalse() + assertThat(passwordValidator.hasError).isTrue() + assertThat(passwordValidator.errorMessage) + .isEqualTo(context.getString(R.string.fui_error_password_missing_special_character)) + } + + // ============================================================================================= + // Multiple Rules Tests + // ============================================================================================= + + @Test + fun `validate returns false and shows first failing rule error`() { + val context = ApplicationProvider.getApplicationContext() + val rules = listOf( + PasswordRule.MinimumLength(8), + PasswordRule.RequireUppercase, + PasswordRule.RequireDigit + ) + passwordValidator = PasswordValidator(stringProvider, rules) + + val isValid = passwordValidator.validate("short") + + assertThat(isValid).isFalse() + assertThat(passwordValidator.hasError).isTrue() + // Should show the first failing rule (MinimumLength) + assertThat(passwordValidator.errorMessage) + .isEqualTo(context.getString(R.string.fui_error_password_too_short, 8)) + } + + @Test + fun `validate returns true for password meeting all rules`() { + val rules = listOf( + PasswordRule.MinimumLength(8), + PasswordRule.RequireUppercase, + PasswordRule.RequireLowercase, + PasswordRule.RequireDigit, + PasswordRule.RequireSpecialCharacter + ) + passwordValidator = PasswordValidator(stringProvider, rules) + + val isValid = passwordValidator.validate("Password123!") + + assertThat(isValid).isTrue() + assertThat(passwordValidator.hasError).isFalse() + assertThat(passwordValidator.errorMessage).isEmpty() + } + + // ============================================================================================= + // Custom Rule Tests + // ============================================================================================= + + @Test + fun `validate works with custom regex rule`() { + val customRule = PasswordRule.Custom( + // Valid (has upper, lower, digit, 8+ chars, only letters/digits) + regex = Regex("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$"), + errorMessage = "Custom validation failed" + ) + val rules = listOf(customRule) + passwordValidator = PasswordValidator(stringProvider, rules) + + val isValid = passwordValidator.validate("Password123") + + assertThat(isValid).isTrue() + assertThat(passwordValidator.hasError).isFalse() + assertThat(passwordValidator.errorMessage).isEmpty() + } + + @Test + fun `validate returns custom error message for failing custom rule`() { + val customRule = PasswordRule.Custom( + // Valid (has upper, lower, digit, 8+ chars, only letters/digits) + regex = Regex("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$"), + errorMessage = "Custom validation failed" + ) + val rules = listOf(customRule) + passwordValidator = PasswordValidator(stringProvider, rules) + + val isValid = passwordValidator.validate("weak") + + assertThat(isValid).isFalse() + assertThat(passwordValidator.hasError).isTrue() + assertThat(passwordValidator.errorMessage).isEqualTo("Custom validation failed") + } + + // ============================================================================================= + // Error State Management Tests + // ============================================================================================= + + @Test + fun `validate clears previous error when password becomes valid`() { + val rules = listOf(PasswordRule.MinimumLength(8)) + passwordValidator = PasswordValidator(stringProvider, rules) + + passwordValidator.validate("short") + assertThat(passwordValidator.hasError).isTrue() + + val isValid = passwordValidator.validate("longenough") + + assertThat(isValid).isTrue() + assertThat(passwordValidator.hasError).isFalse() + assertThat(passwordValidator.errorMessage).isEmpty() + } +} \ No newline at end of file From c1805229ce2137b0aadf495d7ddadfcbb7050876 Mon Sep 17 00:00:00 2001 From: Guillaume Bernos Date: Tue, 23 Sep 2025 09:54:34 +0200 Subject: [PATCH 06/50] feat: AuthException parsing for UI (#2222) --- .../firebase/ui/auth/compose/AuthException.kt | 341 ++++++++++++++++++ .../ui/auth/compose/AuthExceptionTest.kt | 139 +++++++ 2 files changed, 480 insertions(+) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/AuthException.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/AuthExceptionTest.kt diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/AuthException.kt b/auth/src/main/java/com/firebase/ui/auth/compose/AuthException.kt new file mode 100644 index 000000000..cb2a9480a --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/AuthException.kt @@ -0,0 +1,341 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose + +import com.google.firebase.FirebaseException +import com.google.firebase.auth.FirebaseAuthException +import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException +import com.google.firebase.auth.FirebaseAuthInvalidUserException +import com.google.firebase.auth.FirebaseAuthMultiFactorException +import com.google.firebase.auth.FirebaseAuthRecentLoginRequiredException +import com.google.firebase.auth.FirebaseAuthUserCollisionException +import com.google.firebase.auth.FirebaseAuthWeakPasswordException + +/** + * Abstract base class representing all possible authentication exceptions in Firebase Auth UI. + * + * This class provides a unified exception hierarchy for authentication operations, allowing + * for consistent error handling across the entire Auth UI system. + * + * Use the companion object [from] method to create specific exception instances from + * Firebase authentication exceptions. + * + * **Example usage:** + * ```kotlin + * try { + * // Perform authentication operation + * } catch (firebaseException: Exception) { + * val authException = AuthException.from(firebaseException) + * when (authException) { + * is AuthException.NetworkException -> { + * // Handle network error + * } + * is AuthException.InvalidCredentialsException -> { + * // Handle invalid credentials + * } + * // ... handle other exception types + * } + * } + * ``` + * + * @property message The detailed error message + * @property cause The underlying [Throwable] that caused this exception + * + * @since 10.0.0 + */ +abstract class AuthException( + message: String, + cause: Throwable? = null +) : Exception(message, cause) { + + /** + * A network error occurred during the authentication operation. + * + * This exception is thrown when there are connectivity issues, timeouts, + * or other network-related problems. + * + * @property message The detailed error message + * @property cause The underlying [Throwable] that caused this exception + */ + class NetworkException( + message: String, + cause: Throwable? = null + ) : AuthException(message, cause) + + /** + * The provided credentials are not valid. + * + * This exception is thrown when the user provides incorrect login information, + * such as wrong email/password combinations or malformed credentials. + * + * @property message The detailed error message + * @property cause The underlying [Throwable] that caused this exception + */ + class InvalidCredentialsException( + message: String, + cause: Throwable? = null + ) : AuthException(message, cause) + + /** + * The user account does not exist. + * + * This exception is thrown when attempting to sign in with credentials + * for a user that doesn't exist in the Firebase Auth system. + * + * @property message The detailed error message + * @property cause The underlying [Throwable] that caused this exception + */ + class UserNotFoundException( + message: String, + cause: Throwable? = null + ) : AuthException(message, cause) + + /** + * The password provided is not strong enough. + * + * This exception is thrown when creating an account or updating a password + * with a password that doesn't meet the security requirements. + * + * @property message The detailed error message + * @property cause The underlying [Throwable] that caused this exception + * @property reason The specific reason why the password is considered weak + */ + class WeakPasswordException( + message: String, + cause: Throwable? = null, + val reason: String? = null + ) : AuthException(message, cause) + + /** + * An account with the given email already exists. + * + * This exception is thrown when attempting to create a new account with + * an email address that is already registered. + * + * @property message The detailed error message + * @property cause The underlying [Throwable] that caused this exception + * @property email The email address that already exists + */ + class EmailAlreadyInUseException( + message: String, + cause: Throwable? = null, + val email: String? = null + ) : AuthException(message, cause) + + /** + * Too many requests have been made to the server. + * + * This exception is thrown when the client has made too many requests + * in a short period and needs to wait before making additional requests. + * + * @property message The detailed error message + * @property cause The underlying [Throwable] that caused this exception + */ + class TooManyRequestsException( + message: String, + cause: Throwable? = null + ) : AuthException(message, cause) + + /** + * Multi-Factor Authentication is required to proceed. + * + * This exception is thrown when a user has MFA enabled and needs to + * complete additional authentication steps. + * + * @property message The detailed error message + * @property cause The underlying [Throwable] that caused this exception + */ + class MfaRequiredException( + message: String, + cause: Throwable? = null + ) : AuthException(message, cause) + + /** + * Account linking is required to complete sign-in. + * + * This exception is thrown when a user tries to sign in with a provider + * that needs to be linked to an existing account. + * + * @property message The detailed error message + * @property cause The underlying [Throwable] that caused this exception + */ + class AccountLinkingRequiredException( + message: String, + cause: Throwable? = null + ) : AuthException(message, cause) + + /** + * Authentication was cancelled by the user. + * + * This exception is thrown when the user cancels an authentication flow, + * such as dismissing a sign-in dialog or backing out of the process. + * + * @property message The detailed error message + * @property cause The underlying [Throwable] that caused this exception + */ + class AuthCancelledException( + message: String, + cause: Throwable? = null + ) : AuthException(message, cause) + + /** + * An unknown or unhandled error occurred. + * + * This exception is thrown for errors that don't match any of the specific + * exception types or for unexpected system errors. + * + * @property message The detailed error message + * @property cause The underlying [Throwable] that caused this exception + */ + class UnknownException( + message: String, + cause: Throwable? = null + ) : AuthException(message, cause) + + companion object { + /** + * Creates an appropriate [AuthException] instance from a Firebase authentication exception. + * + * This method maps known Firebase exception types to their corresponding [AuthException] + * subtypes, providing a consistent exception hierarchy for error handling. + * + * **Mapping:** + * - [FirebaseException] → [NetworkException] (for network-related errors) + * - [FirebaseAuthInvalidCredentialsException] → [InvalidCredentialsException] + * - [FirebaseAuthInvalidUserException] → [UserNotFoundException] + * - [FirebaseAuthWeakPasswordException] → [WeakPasswordException] + * - [FirebaseAuthUserCollisionException] → [EmailAlreadyInUseException] + * - [FirebaseAuthException] with ERROR_TOO_MANY_REQUESTS → [TooManyRequestsException] + * - [FirebaseAuthMultiFactorException] → [MfaRequiredException] + * - Other exceptions → [UnknownException] + * + * **Example:** + * ```kotlin + * try { + * // Firebase auth operation + * } catch (firebaseException: Exception) { + * val authException = AuthException.from(firebaseException) + * handleAuthError(authException) + * } + * ``` + * + * @param firebaseException The Firebase exception to convert + * @return An appropriate [AuthException] subtype + */ + @JvmStatic + fun from(firebaseException: Exception): AuthException { + return when (firebaseException) { + // Handle specific Firebase Auth exceptions first (before general FirebaseException) + is FirebaseAuthInvalidCredentialsException -> { + InvalidCredentialsException( + message = firebaseException.message ?: "Invalid credentials provided", + cause = firebaseException + ) + } + is FirebaseAuthInvalidUserException -> { + when (firebaseException.errorCode) { + "ERROR_USER_NOT_FOUND" -> UserNotFoundException( + message = firebaseException.message ?: "User not found", + cause = firebaseException + ) + "ERROR_USER_DISABLED" -> InvalidCredentialsException( + message = firebaseException.message ?: "User account has been disabled", + cause = firebaseException + ) + else -> UserNotFoundException( + message = firebaseException.message ?: "User account error", + cause = firebaseException + ) + } + } + is FirebaseAuthWeakPasswordException -> { + WeakPasswordException( + message = firebaseException.message ?: "Password is too weak", + cause = firebaseException, + reason = firebaseException.reason + ) + } + is FirebaseAuthUserCollisionException -> { + when (firebaseException.errorCode) { + "ERROR_EMAIL_ALREADY_IN_USE" -> EmailAlreadyInUseException( + message = firebaseException.message ?: "Email address is already in use", + cause = firebaseException, + email = firebaseException.email + ) + "ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL" -> AccountLinkingRequiredException( + message = firebaseException.message ?: "Account already exists with different credentials", + cause = firebaseException + ) + "ERROR_CREDENTIAL_ALREADY_IN_USE" -> AccountLinkingRequiredException( + message = firebaseException.message ?: "Credential is already associated with a different user account", + cause = firebaseException + ) + else -> AccountLinkingRequiredException( + message = firebaseException.message ?: "Account collision error", + cause = firebaseException + ) + } + } + is FirebaseAuthMultiFactorException -> { + MfaRequiredException( + message = firebaseException.message ?: "Multi-factor authentication required", + cause = firebaseException + ) + } + is FirebaseAuthRecentLoginRequiredException -> { + InvalidCredentialsException( + message = firebaseException.message ?: "Recent login required for this operation", + cause = firebaseException + ) + } + is FirebaseAuthException -> { + // Handle FirebaseAuthException and check for specific error codes + when (firebaseException.errorCode) { + "ERROR_TOO_MANY_REQUESTS" -> TooManyRequestsException( + message = firebaseException.message ?: "Too many requests. Please try again later", + cause = firebaseException + ) + else -> UnknownException( + message = firebaseException.message ?: "An unknown authentication error occurred", + cause = firebaseException + ) + } + } + is FirebaseException -> { + // Handle general Firebase exceptions, which include network errors + NetworkException( + message = firebaseException.message ?: "Network error occurred", + cause = firebaseException + ) + } + else -> { + // Check for common cancellation patterns + if (firebaseException.message?.contains("cancelled", ignoreCase = true) == true || + firebaseException.message?.contains("canceled", ignoreCase = true) == true) { + AuthCancelledException( + message = firebaseException.message ?: "Authentication was cancelled", + cause = firebaseException + ) + } else { + UnknownException( + message = firebaseException.message ?: "An unknown error occurred", + cause = firebaseException + ) + } + } + } + } + } +} \ No newline at end of file diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/AuthExceptionTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/AuthExceptionTest.kt new file mode 100644 index 000000000..46620f853 --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/AuthExceptionTest.kt @@ -0,0 +1,139 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose + +import com.google.common.truth.Truth.assertThat +import com.google.firebase.FirebaseException +import com.google.firebase.auth.FirebaseAuthException +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Unit tests for [AuthException] covering exception mapping from Firebase exceptions + * to the unified AuthException hierarchy. + * + * @suppress Internal test class + */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class AuthExceptionTest { + + @Test + fun `from() maps FirebaseException to NetworkException`() { + // Arrange + val firebaseException = object : FirebaseException("Network error occurred") {} + + // Act + val authException = AuthException.from(firebaseException) + + // Assert + assertThat(authException).isInstanceOf(AuthException.NetworkException::class.java) + assertThat(authException.message).isEqualTo("Network error occurred") + assertThat(authException.cause).isEqualTo(firebaseException) + } + + @Test + fun `from() maps FirebaseAuthException with ERROR_TOO_MANY_REQUESTS to TooManyRequestsException`() { + // Arrange + val firebaseException = object : FirebaseAuthException("ERROR_TOO_MANY_REQUESTS", "Too many requests") {} + + // Act + val authException = AuthException.from(firebaseException) + + // Assert + assertThat(authException).isInstanceOf(AuthException.TooManyRequestsException::class.java) + assertThat(authException.message).isEqualTo("Too many requests") + assertThat(authException.cause).isEqualTo(firebaseException) + } + + @Test + fun `from() maps FirebaseAuthException with unknown error code to UnknownException`() { + // Arrange + val firebaseException = object : FirebaseAuthException("ERROR_UNKNOWN", "Unknown auth error") {} + + // Act + val authException = AuthException.from(firebaseException) + + // Assert + assertThat(authException).isInstanceOf(AuthException.UnknownException::class.java) + assertThat(authException.message).isEqualTo("Unknown auth error") + assertThat(authException.cause).isEqualTo(firebaseException) + } + + @Test + fun `from() maps exception with cancelled message to AuthCancelledException`() { + // Arrange + val firebaseException = RuntimeException("Operation was cancelled by user") + + // Act + val authException = AuthException.from(firebaseException) + + // Assert + assertThat(authException).isInstanceOf(AuthException.AuthCancelledException::class.java) + assertThat(authException.message).isEqualTo("Operation was cancelled by user") + assertThat(authException.cause).isEqualTo(firebaseException) + } + + @Test + fun `from() maps unknown exception to UnknownException`() { + // Arrange + val firebaseException = RuntimeException("Unknown error occurred") + + // Act + val authException = AuthException.from(firebaseException) + + // Assert + assertThat(authException).isInstanceOf(AuthException.UnknownException::class.java) + assertThat(authException.message).isEqualTo("Unknown error occurred") + assertThat(authException.cause).isEqualTo(firebaseException) + } + + @Test + fun `all AuthException subclasses extend AuthException`() { + // Arrange & Assert + assertThat(AuthException.NetworkException("Test")).isInstanceOf(AuthException::class.java) + assertThat(AuthException.InvalidCredentialsException("Test")).isInstanceOf(AuthException::class.java) + assertThat(AuthException.UserNotFoundException("Test")).isInstanceOf(AuthException::class.java) + assertThat(AuthException.WeakPasswordException("Test")).isInstanceOf(AuthException::class.java) + assertThat(AuthException.EmailAlreadyInUseException("Test")).isInstanceOf(AuthException::class.java) + assertThat(AuthException.TooManyRequestsException("Test")).isInstanceOf(AuthException::class.java) + assertThat(AuthException.MfaRequiredException("Test")).isInstanceOf(AuthException::class.java) + assertThat(AuthException.AccountLinkingRequiredException("Test")).isInstanceOf(AuthException::class.java) + assertThat(AuthException.AuthCancelledException("Test")).isInstanceOf(AuthException::class.java) + assertThat(AuthException.UnknownException("Test")).isInstanceOf(AuthException::class.java) + } + + @Test + fun `WeakPasswordException stores reason property correctly`() { + // Arrange + val reason = "Password must contain at least one number" + val exception = AuthException.WeakPasswordException("Weak password", null, reason) + + // Assert + assertThat(exception.reason).isEqualTo(reason) + } + + @Test + fun `EmailAlreadyInUseException stores email property correctly`() { + // Arrange + val email = "test@example.com" + val exception = AuthException.EmailAlreadyInUseException("Email in use", null, email) + + // Assert + assertThat(exception.email).isEqualTo(email) + } +} \ No newline at end of file From 59325de5fece7129e4d22cee97811a09d565fd42 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo <48495111+demolaf@users.noreply.github.com> Date: Tue, 23 Sep 2025 10:13:59 +0100 Subject: [PATCH 07/50] feat: Localization - AuthUIStringProvider and locale override (#2221) * feat: added context AuthUIConfiguration and default string provider * add/expose existing localized strings to allow overrides * added custom string provider sample, tests for locale overrides * chore: code cleanup --- .../configuration/AuthUIConfiguration.kt | 83 ++++---- .../configuration/AuthUIStringProvider.kt | 81 -------- .../compose/configuration/PasswordRule.kt | 2 + .../stringprovider/AuthUIStringProvider.kt | 187 +++++++++++++++++ .../AuthUIStringProviderSample.kt | 59 ++++++ .../DefaultAuthUIStringProvider.kt | 182 +++++++++++++++++ .../validators/EmailValidator.kt | 2 +- .../validators/FieldValidator.kt | 2 +- .../validators/PasswordValidator.kt | 2 +- auth/src/main/res/values/strings.xml | 1 + .../configuration/AuthUIConfigurationTest.kt | 193 +++++++++++++++--- .../compose/configuration/PasswordRuleTest.kt | 4 +- .../validators/EmailValidatorTest.kt | 6 +- .../validators/PasswordValidatorTest.kt | 5 +- 14 files changed, 647 insertions(+), 162 deletions(-) delete mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProvider.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProviderSample.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/DefaultAuthUIStringProvider.kt diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt index aca1ccf9e..ef70c5f3b 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt @@ -14,29 +14,29 @@ package com.firebase.ui.auth.compose.configuration +import android.content.Context import java.util.Locale import com.google.firebase.auth.ActionCodeSettings import androidx.compose.ui.graphics.vector.ImageVector +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider -fun actionCodeSettings( - block: ActionCodeSettings.Builder.() -> Unit -) = ActionCodeSettings.newBuilder().apply(block).build() +fun actionCodeSettings(block: ActionCodeSettings.Builder.() -> Unit) = + ActionCodeSettings.newBuilder().apply(block).build() -fun authUIConfiguration(block: AuthUIConfigurationBuilder.() -> Unit): AuthUIConfiguration { - val builder = AuthUIConfigurationBuilder() - builder.block() - return builder.build() -} +fun authUIConfiguration(block: AuthUIConfigurationBuilder.() -> Unit) = + AuthUIConfigurationBuilder().apply(block).build() @DslMarker annotation class AuthUIConfigurationDsl @AuthUIConfigurationDsl class AuthUIConfigurationBuilder { + var context: Context? = null private val providers = mutableListOf() var theme: AuthUITheme = AuthUITheme.Default - var stringProvider: AuthUIStringProvider? = null var locale: Locale? = null + var stringProvider: AuthUIStringProvider? = null var isCredentialManagerEnabled: Boolean = true var isMfaEnabled: Boolean = true var isAnonymousUpgradeEnabled: Boolean = false @@ -48,36 +48,16 @@ class AuthUIConfigurationBuilder { var isDisplayNameRequired: Boolean = true var isProviderChoiceAlwaysShown: Boolean = false - fun providers(block: AuthProvidersBuilder.() -> Unit) { - val builder = AuthProvidersBuilder() - builder.block() - providers.addAll(builder.build()) - } + fun providers(block: AuthProvidersBuilder.() -> Unit) = + providers.addAll(AuthProvidersBuilder().apply(block).build()) internal fun build(): AuthUIConfiguration { - validate() - return AuthUIConfiguration( - providers = providers.toList(), - theme = theme, - stringProvider = stringProvider, - locale = locale, - isCredentialManagerEnabled = isCredentialManagerEnabled, - isMfaEnabled = isMfaEnabled, - isAnonymousUpgradeEnabled = isAnonymousUpgradeEnabled, - tosUrl = tosUrl, - privacyPolicyUrl = privacyPolicyUrl, - logo = logo, - actionCodeSettings = actionCodeSettings, - isNewEmailAccountsAllowed = isNewEmailAccountsAllowed, - isDisplayNameRequired = isDisplayNameRequired, - isProviderChoiceAlwaysShown = isProviderChoiceAlwaysShown - ) - } + val context = requireNotNull(context) { + "Application context is required" + } - private fun validate() { - // At least one provider - if (providers.isEmpty()) { - throw IllegalArgumentException("At least one provider must be configured") + require(providers.isNotEmpty()) { + "At least one provider must be configured" } // No unsupported providers @@ -113,6 +93,24 @@ class AuthUIConfigurationBuilder { else -> null } } + + return AuthUIConfiguration( + context = context, + providers = providers.toList(), + theme = theme, + locale = locale, + stringProvider = stringProvider ?: DefaultAuthUIStringProvider(context, locale), + isCredentialManagerEnabled = isCredentialManagerEnabled, + isMfaEnabled = isMfaEnabled, + isAnonymousUpgradeEnabled = isAnonymousUpgradeEnabled, + tosUrl = tosUrl, + privacyPolicyUrl = privacyPolicyUrl, + logo = logo, + actionCodeSettings = actionCodeSettings, + isNewEmailAccountsAllowed = isNewEmailAccountsAllowed, + isDisplayNameRequired = isDisplayNameRequired, + isProviderChoiceAlwaysShown = isProviderChoiceAlwaysShown + ) } } @@ -120,6 +118,11 @@ class AuthUIConfigurationBuilder { * Configuration object for the authentication flow. */ class AuthUIConfiguration( + /** + * Application context + */ + val context: Context, + /** * The list of enabled authentication providers. */ @@ -131,14 +134,14 @@ class AuthUIConfiguration( val theme: AuthUITheme = AuthUITheme.Default, /** - * A custom provider for localized strings. + * The locale for internationalization. */ - val stringProvider: AuthUIStringProvider? = null, + val locale: Locale? = null, /** - * The locale for internationalization. + * A custom provider for localized strings. */ - val locale: Locale? = null, + val stringProvider: AuthUIStringProvider = DefaultAuthUIStringProvider(context, locale), /** * Enables integration with Android's Credential Manager API. Defaults to true. diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt deleted file mode 100644 index 0e7080722..000000000 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIStringProvider.kt +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2025 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.firebase.ui.auth.compose.configuration - -import android.content.Context -import com.firebase.ui.auth.R - -/** - * An interface for providing localized string resources. This interface defines methods for all - * user-facing strings, such as initializing(), signInWithGoogle(), invalidEmail(), - * passwordsDoNotMatch(), etc., allowing for complete localization of the UI. - */ -interface AuthUIStringProvider { - /** Loading text displayed during initialization or processing states */ - val initializing: String - - /** Button text for Google sign-in option */ - val signInWithGoogle: String - - /** Error message when email address field is empty */ - val missingEmailAddress: String - - /** Error message when email address format is invalid */ - val invalidEmailAddress: String - - /** Generic error message for incorrect password during sign-in */ - val invalidPassword: String - - /** Error message when password confirmation doesn't match the original password */ - val passwordsDoNotMatch: String - - /** Error message when password doesn't meet minimum length requirement. Should support string formatting with minimum length parameter. */ - val passwordTooShort: String - - /** Error message when password is missing at least one uppercase letter (A-Z) */ - val passwordMissingUppercase: String - - /** Error message when password is missing at least one lowercase letter (a-z) */ - val passwordMissingLowercase: String - - /** Error message when password is missing at least one numeric digit (0-9) */ - val passwordMissingDigit: String - - /** Error message when password is missing at least one special character */ - val passwordMissingSpecialCharacter: String -} - -internal class DefaultAuthUIStringProvider(private val context: Context) : AuthUIStringProvider { - override val initializing: String get() = "" - override val signInWithGoogle: String - get() = context.getString(R.string.fui_sign_in_with_google) - override val missingEmailAddress: String - get() = context.getString(R.string.fui_missing_email_address) - override val invalidEmailAddress: String - get() = context.getString(R.string.fui_invalid_email_address) - override val invalidPassword: String - get() = context.getString(R.string.fui_error_invalid_password) - override val passwordsDoNotMatch: String get() = "" - override val passwordTooShort: String - get() = context.getString(R.string.fui_error_password_too_short) - override val passwordMissingUppercase: String - get() = context.getString(R.string.fui_error_password_missing_uppercase) - override val passwordMissingLowercase: String - get() = context.getString(R.string.fui_error_password_missing_lowercase) - override val passwordMissingDigit: String - get() = context.getString(R.string.fui_error_password_missing_digit) - override val passwordMissingSpecialCharacter: String - get() = context.getString(R.string.fui_error_password_missing_special_character) -} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt index 8f53822f2..5c5d5b125 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt @@ -14,6 +14,8 @@ package com.firebase.ui.auth.compose.configuration +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider + /** * An abstract class representing a set of validation rules that can be applied to a password field, * typically within the [AuthProvider.Email] configuration. diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProvider.kt new file mode 100644 index 000000000..646727fb7 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProvider.kt @@ -0,0 +1,187 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.stringprovider + +/** + * An interface for providing localized string resources. This interface defines methods for all + * user-facing strings, such as initializing(), signInWithGoogle(), invalidEmailAddress(), + * passwordsDoNotMatch(), etc., allowing for complete localization of the UI. + * + * @sample AuthUIStringProviderSample + */ +interface AuthUIStringProvider { + /** Loading text displayed during initialization or processing states */ + val initializing: String + + /** Text for Google Provider */ + val googleProvider: String + + /** Text for Facebook Provider */ + val facebookProvider: String + + /** Text for Twitter Provider */ + val twitterProvider: String + + /** Text for Github Provider */ + val githubProvider: String + + /** Text for Phone Provider */ + val phoneProvider: String + + /** Text for Email Provider */ + val emailProvider: String + + /** Button text for Google sign-in option */ + val signInWithGoogle: String + + /** Button text for Facebook sign-in option */ + val signInWithFacebook: String + + /** Button text for Twitter sign-in option */ + val signInWithTwitter: String + + /** Button text for Github sign-in option */ + val signInWithGithub: String + + /** Button text for Email sign-in option */ + val signInWithEmail: String + + /** Button text for Phone sign-in option */ + val signInWithPhone: String + + /** Button text for Anonymous sign-in option */ + val signInAnonymously: String + + /** Button text for Apple sign-in option */ + val signInWithApple: String + + /** Button text for Microsoft sign-in option */ + val signInWithMicrosoft: String + + /** Button text for Yahoo sign-in option */ + val signInWithYahoo: String + + /** Error message when email address field is empty */ + val missingEmailAddress: String + + /** Error message when email address format is invalid */ + val invalidEmailAddress: String + + /** Generic error message for incorrect password during sign-in */ + val invalidPassword: String + + /** Error message when password confirmation doesn't match the original password */ + val passwordsDoNotMatch: String + + /** Error message when password doesn't meet minimum length requirement. Should support string formatting with minimum length parameter. */ + val passwordTooShort: String + + /** Error message when password is missing at least one uppercase letter (A-Z) */ + val passwordMissingUppercase: String + + /** Error message when password is missing at least one lowercase letter (a-z) */ + val passwordMissingLowercase: String + + /** Error message when password is missing at least one numeric digit (0-9) */ + val passwordMissingDigit: String + + /** Error message when password is missing at least one special character */ + val passwordMissingSpecialCharacter: String + + // Email Authentication Strings + /** Title for email signup form */ + val titleRegisterEmail: String + + /** Hint for email input field */ + val emailHint: String + + /** Hint for password input field */ + val passwordHint: String + + /** Hint for new password input field */ + val newPasswordHint: String + + /** Hint for name input field */ + val nameHint: String + + /** Button text to save form */ + val buttonTextSave: String + + /** Welcome back header for email users */ + val welcomeBackEmailHeader: String + + /** Trouble signing in link text */ + val troubleSigningIn: String + + // Phone Authentication Strings + /** Phone number entry form title */ + val verifyPhoneNumberTitle: String + + /** Hint for phone input field */ + val phoneHint: String + + /** Hint for country input field */ + val countryHint: String + + /** Invalid phone number error */ + val invalidPhoneNumber: String + + /** Phone verification code entry form title */ + val enterConfirmationCode: String + + /** Button text to verify phone number */ + val verifyPhoneNumber: String + + /** Resend code countdown timer */ + val resendCodeIn: String + + /** Resend code link text */ + val resendCode: String + + /** Verifying progress text */ + val verifying: String + + /** Wrong verification code error */ + val incorrectCodeDialogBody: String + + /** SMS terms of service warning */ + val smsTermsOfService: String + + // Provider Picker Strings + /** Common button text for sign in */ + val signInDefault: String + + /** Common button text for continue */ + val continueText: String + + /** Common button text for next */ + val nextDefault: String + + // General Error Messages + /** General unknown error message */ + val errorUnknown: String + + /** Required field error */ + val requiredField: String + + /** Loading progress text */ + val progressDialogLoading: String + + /** Network error message */ + val noInternet: String + + /** TOTP Code prompt */ + val enterTOTPCode: String +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProviderSample.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProviderSample.kt new file mode 100644 index 000000000..7ddf64522 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProviderSample.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.stringprovider + +import android.content.Context +import com.firebase.ui.auth.compose.configuration.AuthProvider +import com.firebase.ui.auth.compose.configuration.AuthUIConfiguration +import com.firebase.ui.auth.compose.configuration.authUIConfiguration + +class AuthUIStringProviderSample { + /** + * Override specific strings while delegating others to default provider + */ + class CustomAuthUIStringProvider( + private val defaultProvider: AuthUIStringProvider + ) : AuthUIStringProvider by defaultProvider { + + // Override only the strings you want to customize + override val signInWithGoogle: String = "Continue with Google • MyApp" + override val signInWithFacebook: String = "Continue with Facebook • MyApp" + + // Add custom branding to common actions + override val continueText: String = "Continue to MyApp" + override val signInDefault: String = "Sign in to MyApp" + + // Custom MFA messaging + override val enterTOTPCode: String = + "Enter the 6-digit code from your authenticator app to secure your MyApp account" + } + + fun createCustomConfiguration(applicationContext: Context): AuthUIConfiguration { + val customStringProvider = + CustomAuthUIStringProvider(DefaultAuthUIStringProvider(applicationContext)) + return authUIConfiguration { + context = applicationContext + providers { + provider( + AuthProvider.Google( + scopes = listOf(), + serverClientId = "" + ) + ) + } + stringProvider = customStringProvider + } + } +} \ No newline at end of file diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/DefaultAuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/DefaultAuthUIStringProvider.kt new file mode 100644 index 000000000..96a74cdd7 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/DefaultAuthUIStringProvider.kt @@ -0,0 +1,182 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.stringprovider + +import android.content.Context +import android.content.res.Configuration +import com.firebase.ui.auth.R +import java.util.Locale + +class DefaultAuthUIStringProvider( + private val context: Context, + private val locale: Locale? = null, +) : AuthUIStringProvider { + /** + * Allows overriding locale. + */ + private val localizedContext = locale?.let { locale -> + context.createConfigurationContext( + Configuration(context.resources.configuration).apply { + setLocale(locale) + } + ) + } ?: context + + /** + * Common Strings + */ + override val initializing: String + get() = "Initializing" + + /** + * Auth Provider strings + */ + override val googleProvider: String + get() = localizedContext.getString(R.string.fui_idp_name_google) + override val facebookProvider: String + get() = localizedContext.getString(R.string.fui_idp_name_facebook) + override val twitterProvider: String + get() = localizedContext.getString(R.string.fui_idp_name_twitter) + override val githubProvider: String + get() = localizedContext.getString(R.string.fui_idp_name_github) + override val phoneProvider: String + get() = localizedContext.getString(R.string.fui_idp_name_phone) + override val emailProvider: String + get() = localizedContext.getString(R.string.fui_idp_name_email) + + /** + * Auth Provider Button Strings + */ + override val signInWithGoogle: String + get() = localizedContext.getString(R.string.fui_sign_in_with_google) + override val signInWithFacebook: String + get() = localizedContext.getString(R.string.fui_sign_in_with_facebook) + override val signInWithTwitter: String + get() = localizedContext.getString(R.string.fui_sign_in_with_twitter) + override val signInWithGithub: String + get() = localizedContext.getString(R.string.fui_sign_in_with_github) + override val signInWithEmail: String + get() = localizedContext.getString(R.string.fui_sign_in_with_email) + override val signInWithPhone: String + get() = localizedContext.getString(R.string.fui_sign_in_with_phone) + override val signInAnonymously: String + get() = localizedContext.getString(R.string.fui_sign_in_anonymously) + override val signInWithApple: String + get() = localizedContext.getString(R.string.fui_sign_in_with_apple) + override val signInWithMicrosoft: String + get() = localizedContext.getString(R.string.fui_sign_in_with_microsoft) + override val signInWithYahoo: String + get() = localizedContext.getString(R.string.fui_sign_in_with_yahoo) + + /** + * Email Validator Strings + */ + override val missingEmailAddress: String + get() = localizedContext.getString(R.string.fui_missing_email_address) + override val invalidEmailAddress: String + get() = localizedContext.getString(R.string.fui_invalid_email_address) + + /** + * Password Validator Strings + */ + override val invalidPassword: String + get() = localizedContext.getString(R.string.fui_error_invalid_password) + override val passwordsDoNotMatch: String + get() = localizedContext.getString(R.string.fui_passwords_do_not_match) + override val passwordTooShort: String + get() = localizedContext.getString(R.string.fui_error_password_too_short) + override val passwordMissingUppercase: String + get() = localizedContext.getString(R.string.fui_error_password_missing_uppercase) + override val passwordMissingLowercase: String + get() = localizedContext.getString(R.string.fui_error_password_missing_lowercase) + override val passwordMissingDigit: String + get() = localizedContext.getString(R.string.fui_error_password_missing_digit) + override val passwordMissingSpecialCharacter: String + get() = localizedContext.getString(R.string.fui_error_password_missing_special_character) + + /** + * Email Authentication Strings + */ + override val titleRegisterEmail: String + get() = localizedContext.getString(R.string.fui_title_register_email) + override val emailHint: String + get() = localizedContext.getString(R.string.fui_email_hint) + override val passwordHint: String + get() = localizedContext.getString(R.string.fui_password_hint) + override val newPasswordHint: String + get() = localizedContext.getString(R.string.fui_new_password_hint) + override val nameHint: String + get() = localizedContext.getString(R.string.fui_name_hint) + override val buttonTextSave: String + get() = localizedContext.getString(R.string.fui_button_text_save) + override val welcomeBackEmailHeader: String + get() = localizedContext.getString(R.string.fui_welcome_back_email_header) + override val troubleSigningIn: String + get() = localizedContext.getString(R.string.fui_trouble_signing_in) + + /** + * Phone Authentication Strings + */ + override val verifyPhoneNumberTitle: String + get() = localizedContext.getString(R.string.fui_verify_phone_number_title) + override val phoneHint: String + get() = localizedContext.getString(R.string.fui_phone_hint) + override val countryHint: String + get() = localizedContext.getString(R.string.fui_country_hint) + override val invalidPhoneNumber: String + get() = localizedContext.getString(R.string.fui_invalid_phone_number) + override val enterConfirmationCode: String + get() = localizedContext.getString(R.string.fui_enter_confirmation_code) + override val verifyPhoneNumber: String + get() = localizedContext.getString(R.string.fui_verify_phone_number) + override val resendCodeIn: String + get() = localizedContext.getString(R.string.fui_resend_code_in) + override val resendCode: String + get() = localizedContext.getString(R.string.fui_resend_code) + override val verifying: String + get() = localizedContext.getString(R.string.fui_verifying) + override val incorrectCodeDialogBody: String + get() = localizedContext.getString(R.string.fui_incorrect_code_dialog_body) + override val smsTermsOfService: String + get() = localizedContext.getString(R.string.fui_sms_terms_of_service) + + /** + * Multi-Factor Authentication Strings + */ + override val enterTOTPCode: String + get() = "Enter TOTP Code" + + /** + * Provider Picker Strings + */ + override val signInDefault: String + get() = localizedContext.getString(R.string.fui_sign_in_default) + override val continueText: String + get() = localizedContext.getString(R.string.fui_continue) + override val nextDefault: String + get() = localizedContext.getString(R.string.fui_next_default) + + /** + * General Error Messages + */ + override val errorUnknown: String + get() = localizedContext.getString(R.string.fui_error_unknown) + override val requiredField: String + get() = localizedContext.getString(R.string.fui_required_field) + override val progressDialogLoading: String + get() = localizedContext.getString(R.string.fui_progress_dialog_loading) + override val noInternet: String + get() = localizedContext.getString(R.string.fui_no_internet) +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt index d6b66194f..7acfc8bc1 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt @@ -14,7 +14,7 @@ package com.firebase.ui.auth.compose.configuration.validators -import com.firebase.ui.auth.compose.configuration.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider internal class EmailValidator(override val stringProvider: AuthUIStringProvider) : FieldValidator { private var _validationStatus = FieldValidationStatus(hasError = false, errorMessage = null) diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt index a26741897..efa72188f 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt @@ -14,7 +14,7 @@ package com.firebase.ui.auth.compose.configuration.validators -import com.firebase.ui.auth.compose.configuration.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider /** * An interface for validating input fields. diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt index 35605818e..67cb7d376 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt @@ -14,7 +14,7 @@ package com.firebase.ui.auth.compose.configuration.validators -import com.firebase.ui.auth.compose.configuration.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider import com.firebase.ui.auth.compose.configuration.PasswordRule internal class PasswordValidator( diff --git a/auth/src/main/res/values/strings.xml b/auth/src/main/res/values/strings.xml index 71b87f547..1d73384e4 100644 --- a/auth/src/main/res/values/strings.xml +++ b/auth/src/main/res/values/strings.xml @@ -94,6 +94,7 @@ Incorrect password. + Passwords do not match Password must be at least %1$d characters long Password must contain at least one uppercase letter Password must contain at least one lowercase letter diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt index 0233848e4..95164f638 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt @@ -14,13 +14,23 @@ package com.firebase.ui.auth.compose.configuration +import android.content.Context +import android.content.res.Configuration import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AccountCircle +import androidx.test.core.app.ApplicationProvider +import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider import com.google.common.truth.Truth.assertThat import com.google.firebase.auth.actionCodeSettings import org.junit.Assert.assertThrows +import org.junit.Before import org.junit.Test +import org.junit.runner.RunWith import org.mockito.Mockito.mock +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config import java.util.Locale import kotlin.reflect.KMutableProperty import kotlin.reflect.full.memberProperties @@ -31,8 +41,17 @@ import kotlin.reflect.full.memberProperties * * @suppress Internal test class */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) class AuthUIConfigurationTest { + private lateinit var applicationContext: Context + + @Before + fun setUp() { + applicationContext = ApplicationProvider.getApplicationContext() + } + // ============================================================================================= // Basic Configuration Tests // ============================================================================================= @@ -40,6 +59,7 @@ class AuthUIConfigurationTest { @Test fun `authUIConfiguration with minimal setup uses correct defaults`() { val config = authUIConfiguration { + context = applicationContext providers { provider( AuthProvider.Google( @@ -50,9 +70,10 @@ class AuthUIConfigurationTest { } } + assertThat(config.context).isEqualTo(applicationContext) assertThat(config.providers).hasSize(1) assertThat(config.theme).isEqualTo(AuthUITheme.Default) - assertThat(config.stringProvider).isNull() + assertThat(config.stringProvider).isInstanceOf(DefaultAuthUIStringProvider::class.java) assertThat(config.locale).isNull() assertThat(config.isCredentialManagerEnabled).isTrue() assertThat(config.isMfaEnabled).isTrue() @@ -77,6 +98,7 @@ class AuthUIConfigurationTest { } val config = authUIConfiguration { + context = applicationContext providers { provider( AuthProvider.Google( @@ -105,6 +127,7 @@ class AuthUIConfigurationTest { isProviderChoiceAlwaysShown = true } + assertThat(config.context).isEqualTo(applicationContext) assertThat(config.providers).hasSize(2) assertThat(config.theme).isEqualTo(customTheme) assertThat(config.stringProvider).isEqualTo(customStringProvider) @@ -121,18 +144,146 @@ class AuthUIConfigurationTest { assertThat(config.isProviderChoiceAlwaysShown).isTrue() } + @Test + fun `providers block can be called multiple times and accumulates providers`() { + val config = authUIConfiguration { + context = applicationContext + providers { + provider( + AuthProvider.Google( + scopes = listOf(), + serverClientId = "" + ) + ) + } + + providers { + provider( + AuthProvider.Github( + customParameters = mapOf() + ) + ) + } + isCredentialManagerEnabled = true + } + + assertThat(config.providers).hasSize(2) + } + + @Test + fun `authUIConfiguration uses custom string provider`() { + val spanishAuthUIStringProvider = + object : AuthUIStringProvider by DefaultAuthUIStringProvider(applicationContext) { + // Email Validation + override val missingEmailAddress: String = + "Ingrese su dirección de correo para continuar" + override val invalidEmailAddress: String = "Esa dirección de correo no es correcta" + + // Password Validation + override val invalidPassword: String = "Contraseña incorrecta" + override val passwordsDoNotMatch: String = "Las contraseñas no coinciden" + } + + val config = authUIConfiguration { + context = applicationContext + providers { + provider( + AuthProvider.Google( + scopes = listOf(), + serverClientId = "" + ) + ) + } + stringProvider = spanishAuthUIStringProvider + } + + assertThat(config.stringProvider.missingEmailAddress) + .isEqualTo(spanishAuthUIStringProvider.missingEmailAddress) + } + + @Test + fun `locale set to FR in authUIConfiguration reflects in DefaultAuthUIStringProvider`() { + val localizedContext = applicationContext.createConfigurationContext( + Configuration(applicationContext.resources.configuration).apply { + setLocale(Locale.FRANCE) + } + ) + + val config = authUIConfiguration { + context = applicationContext + providers { + provider( + AuthProvider.Google( + scopes = listOf(), + serverClientId = "" + ) + ) + } + locale = Locale.FRANCE + } + + assertThat(config.stringProvider.continueText) + .isEqualTo(localizedContext.getString(R.string.fui_continue)) + } + + @Test + fun `unsupported locale set in authUIConfiguration uses default localized strings`() { + val unsupportedLocale = Locale("zz", "ZZ") + + val config = authUIConfiguration { + context = applicationContext + providers { + provider( + AuthProvider.Google( + scopes = listOf(), serverClientId + = "" + ) + ) + } + locale = unsupportedLocale + } + + assertThat(config.stringProvider.signInWithGoogle).isNotEmpty() + assertThat(config.stringProvider.continueText).isNotEmpty() + assertThat(config.stringProvider.signInWithGoogle) + .isEqualTo(applicationContext.getString(R.string.fui_sign_in_with_google)) + assertThat(config.stringProvider.continueText) + .isEqualTo(applicationContext.getString(R.string.fui_continue)) + } + // ============================================================================================= // Validation Tests // ============================================================================================= - @Test(expected = IllegalArgumentException::class) + @Test + fun `authUIConfiguration throws when no context configured`() { + try { + authUIConfiguration { + context = applicationContext + providers { + provider(AuthProvider.Google(scopes = listOf(), serverClientId = "")) + } + } + } catch (e: Exception) { + assertThat(e.message).isEqualTo("Application context is required") + } + } + + @Test fun `authUIConfiguration throws when no providers configured`() { - authUIConfiguration { } + try { + authUIConfiguration { + context = applicationContext + } + } catch (e: Exception) { + assertThat(e.message).isEqualTo("At least one provider must be configured") + } } @Test fun `validation accepts all supported providers`() { val config = authUIConfiguration { + context = applicationContext providers { provider(AuthProvider.Google(scopes = listOf(), serverClientId = "")) provider(AuthProvider.Facebook()) @@ -165,6 +316,7 @@ class AuthUIConfigurationTest { ) authUIConfiguration { + context = applicationContext providers { provider(mockProvider) } @@ -174,6 +326,7 @@ class AuthUIConfigurationTest { @Test(expected = IllegalStateException::class) fun `validate throws when only anonymous provider is configured`() { authUIConfiguration { + context = applicationContext providers { provider(AuthProvider.Anonymous) } @@ -183,6 +336,7 @@ class AuthUIConfigurationTest { @Test(expected = IllegalArgumentException::class) fun `validate throws for duplicate providers`() { authUIConfiguration { + context = applicationContext providers { provider(AuthProvider.Google(scopes = listOf(), serverClientId = "")) provider( @@ -198,6 +352,7 @@ class AuthUIConfigurationTest { @Test(expected = IllegalArgumentException::class) fun `validate throws for enableEmailLinkSignIn true when actionCodeSettings is null`() { authUIConfiguration { + context = applicationContext providers { provider( AuthProvider.Email( @@ -217,6 +372,7 @@ class AuthUIConfigurationTest { handleCodeInApp = false } authUIConfiguration { + context = applicationContext providers { provider( AuthProvider.Email( @@ -229,35 +385,6 @@ class AuthUIConfigurationTest { } } - // ============================================================================================= - // Provider Configuration Tests - // ============================================================================================= - - @Test - fun `providers block can be called multiple times and accumulates providers`() { - val config = authUIConfiguration { - providers { - provider( - AuthProvider.Google( - scopes = listOf(), - serverClientId = "" - ) - ) - } - - providers { - provider( - AuthProvider.Github( - customParameters = mapOf() - ) - ) - } - isCredentialManagerEnabled = true - } - - assertThat(config.providers).hasSize(2) - } - // ============================================================================================= // Builder Immutability Tests // ============================================================================================= @@ -265,6 +392,7 @@ class AuthUIConfigurationTest { @Test fun `authUIConfiguration providers list is immutable`() { val config = authUIConfiguration { + context = applicationContext providers { provider( AuthProvider.Google( @@ -297,6 +425,7 @@ class AuthUIConfigurationTest { } val expectedProperties = setOf( + "context", "providers", "theme", "stringProvider", diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt index d3cacb488..a4d5139a6 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt @@ -17,6 +17,8 @@ package com.firebase.ui.auth.compose.configuration import android.content.Context import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test @@ -34,7 +36,7 @@ import org.robolectric.annotation.Config @Config(manifest = Config.NONE) class PasswordRuleTest { - private lateinit var stringProvider: DefaultAuthUIStringProvider + private lateinit var stringProvider: AuthUIStringProvider @Before fun setUp() { diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt index 520908181..3253cfb1c 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt @@ -17,12 +17,12 @@ package com.firebase.ui.auth.compose.configuration.validators import android.content.Context import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.R -import com.firebase.ui.auth.compose.configuration.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.mockito.Mock import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @@ -37,7 +37,7 @@ import org.robolectric.annotation.Config @Config(manifest = Config.NONE) class EmailValidatorTest { - private lateinit var stringProvider: DefaultAuthUIStringProvider + private lateinit var stringProvider: AuthUIStringProvider private lateinit var emailValidator: EmailValidator diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt index 4e8d2e440..a3993bd36 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt @@ -17,7 +17,8 @@ package com.firebase.ui.auth.compose.configuration.validators import android.content.Context import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.R -import com.firebase.ui.auth.compose.configuration.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider import com.firebase.ui.auth.compose.configuration.PasswordRule import com.google.common.truth.Truth.assertThat import org.junit.Before @@ -37,7 +38,7 @@ import org.robolectric.annotation.Config @Config(manifest = Config.NONE) class PasswordValidatorTest { - private lateinit var stringProvider: DefaultAuthUIStringProvider + private lateinit var stringProvider: AuthUIStringProvider private lateinit var passwordValidator: PasswordValidator @Before From f1dfd0ccb75713c157e203bc9b2eb589be92ab9c Mon Sep 17 00:00:00 2001 From: Ademola Fadumo <48495111+demolaf@users.noreply.github.com> Date: Wed, 24 Sep 2025 13:17:13 +0100 Subject: [PATCH 08/50] feat: Provider Models (AuthProvider + concrete types) (#2223) * feat: added preconditions for specific auth provider configurations * test: covers auth providers with config validations * fix: auth provider validation and tests - validate serverClientId empty string - validate applicationId empty string - remove @Test(expected=) not descriptive - tests covering AuthProviders Google and Facebook config validation --- .../compose/configuration/AuthProvider.kt | 133 +++++- .../configuration/AuthUIConfiguration.kt | 23 +- .../compose/configuration/AuthProviderTest.kt | 399 ++++++++++++++++++ .../configuration/AuthUIConfigurationTest.kt | 112 ++--- 4 files changed, 577 insertions(+), 90 deletions(-) create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthProviderTest.kt diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt index ef8bb0771..d44a9d6d9 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt @@ -14,8 +14,15 @@ package com.firebase.ui.auth.compose.configuration +import android.content.Context import android.graphics.Color +import android.util.Log import androidx.compose.ui.graphics.vector.ImageVector +import com.firebase.ui.auth.AuthUI +import com.firebase.ui.auth.R +import com.firebase.ui.auth.util.Preconditions +import com.firebase.ui.auth.util.data.PhoneNumberUtils +import com.firebase.ui.auth.util.data.ProviderAvailability import com.google.firebase.auth.ActionCodeSettings import com.google.firebase.auth.EmailAuthProvider import com.google.firebase.auth.FacebookAuthProvider @@ -78,6 +85,14 @@ abstract class AuthProvider(open val providerId: String) { */ val isEmailLinkSignInEnabled: Boolean = false, + /** + * Forces email link sign-in to complete on the same device that initiated it. + * + * When enabled, prevents email links from being opened on different devices, + * which is required for security when upgrading anonymous users. Defaults to true. + */ + val isEmailLinkForceSameDeviceEnabled: Boolean = true, + /** * Settings for email link actions. */ @@ -100,11 +115,10 @@ abstract class AuthProvider(open val providerId: String) { ) : AuthProvider(providerId = Provider.EMAIL.id) { fun validate() { if (isEmailLinkSignInEnabled) { - val actionCodeSettings = actionCodeSettings - ?: requireNotNull(actionCodeSettings) { - "ActionCodeSettings cannot be null when using " + - "email link sign in." - } + val actionCodeSettings = requireNotNull(actionCodeSettings) { + "ActionCodeSettings cannot be null when using " + + "email link sign in." + } check(actionCodeSettings.canHandleCodeInApp()) { "You must set canHandleCodeInApp in your " + @@ -118,6 +132,11 @@ abstract class AuthProvider(open val providerId: String) { * Phone number authentication provider configuration. */ class Phone( + /** + * The phone number in international format. + */ + val defaultNumber: String?, + /** * The default country code to pre-select. */ @@ -147,7 +166,31 @@ abstract class AuthProvider(open val providerId: String) { * Enables automatic retrieval of the SMS code. Defaults to true. */ val isAutoRetrievalEnabled: Boolean = true - ) : AuthProvider(providerId = Provider.PHONE.id) + ) : AuthProvider(providerId = Provider.PHONE.id) { + fun validate() { + defaultNumber?.let { + check(PhoneNumberUtils.isValid(it)) { + "Invalid phone number: $it" + } + } + + defaultCountryCode?.let { + check(PhoneNumberUtils.isValidIso(it)) { + "Invalid country iso: $it" + } + } + + allowedCountries?.forEach { code -> + check( + PhoneNumberUtils.isValidIso(code) || + PhoneNumberUtils.isValid(code) + ) { + "Invalid input: You must provide a valid country iso (alpha-2) " + + "or code (e-164). e.g. 'us' or '+1'. Invalid code: $code" + } + } + } + } /** * Google Sign-In provider configuration. @@ -186,12 +229,40 @@ abstract class AuthProvider(open val providerId: String) { providerId = Provider.GOOGLE.id, scopes = scopes, customParameters = customParameters - ) + ) { + fun validate(context: Context) { + if (serverClientId == null) { + Preconditions.checkConfigured( + context, + "Check your google-services plugin configuration, the" + + " default_web_client_id string wasn't populated.", + R.string.default_web_client_id + ) + } else { + require(serverClientId.isNotBlank()) { + "Server client ID cannot be blank." + } + } + + val hasEmailScope = scopes.contains("email") + if (!hasEmailScope) { + Log.w( + "AuthProvider.Google", + "The scopes do not include 'email'. In most cases this is a mistake!" + ) + } + } + } /** * Facebook Login provider configuration. */ class Facebook( + /** + * The Facebook application ID. + */ + val applicationId: String? = null, + /** * The list of scopes (permissions) to request. Defaults to email and public_profile. */ @@ -210,7 +281,30 @@ abstract class AuthProvider(open val providerId: String) { providerId = Provider.FACEBOOK.id, scopes = scopes, customParameters = customParameters - ) + ) { + fun validate(context: Context) { + if (!ProviderAvailability.IS_FACEBOOK_AVAILABLE) { + throw RuntimeException( + "Facebook provider cannot be configured " + + "without dependency. Did you forget to add " + + "'com.facebook.android:facebook-login:VERSION' dependency?" + ) + } + + if (applicationId == null) { + Preconditions.checkConfigured( + context, + "Facebook provider unconfigured. Make sure to " + + "add a `facebook_application_id` string or provide applicationId parameter.", + R.string.facebook_application_id + ) + } else { + require(applicationId.isNotBlank()) { + "Facebook application ID cannot be blank" + } + } + } + } /** * Twitter/X authentication provider configuration. @@ -314,7 +408,16 @@ abstract class AuthProvider(open val providerId: String) { /** * Anonymous authentication provider. It has no configurable properties. */ - object Anonymous : AuthProvider(providerId = Provider.ANONYMOUS.id) + object Anonymous : AuthProvider(providerId = Provider.ANONYMOUS.id) { + fun validate(providers: List) { + if (providers.size == 1 && providers.first() is Anonymous) { + throw IllegalStateException( + "Sign in as guest cannot be the only sign in method. " + + "In this case, sign the user in anonymously your self; no UI is needed." + ) + } + } + } /** * A generic OAuth provider for any unsupported provider. @@ -353,5 +456,15 @@ abstract class AuthProvider(open val providerId: String) { providerId = providerId, scopes = scopes, customParameters = customParameters - ) + ) { + fun validate() { + require(providerId.isNotBlank()) { + "Provider ID cannot be null or empty" + } + + require(buttonLabel.isNotBlank()) { + "Button label cannot be null or empty" + } + } + } } \ No newline at end of file diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt index ef70c5f3b..98be20ac0 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt @@ -68,12 +68,7 @@ class AuthUIConfigurationBuilder { } // Cannot have only anonymous provider - if (providers.size == 1 && providers.first() is AuthProvider.Anonymous) { - throw IllegalStateException( - "Sign in as guest cannot be the only sign in method. " + - "In this case, sign the user in anonymously your self; no UI is needed." - ) - } + AuthProvider.Anonymous.validate(providers) // Check for duplicate providers val providerIds = providers.map { it.providerId } @@ -89,7 +84,21 @@ class AuthUIConfigurationBuilder { // Provider specific validations providers.forEach { provider -> when (provider) { - is AuthProvider.Email -> provider.validate() + is AuthProvider.Email -> { + provider.validate() + + if (isAnonymousUpgradeEnabled && provider.isEmailLinkSignInEnabled) { + check(provider.isEmailLinkForceSameDeviceEnabled) { + "You must force the same device flow when using email link sign in " + + "with anonymous user upgrade" + } + } + } + + is AuthProvider.Phone -> provider.validate() + is AuthProvider.Google -> provider.validate(context) + is AuthProvider.Facebook -> provider.validate(context) + is AuthProvider.GenericOAuth -> provider.validate() else -> null } } diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthProviderTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthProviderTest.kt new file mode 100644 index 000000000..27685f859 --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthProviderTest.kt @@ -0,0 +1,399 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import com.google.common.truth.Truth.assertThat +import com.google.firebase.auth.actionCodeSettings +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Unit tests for [AuthProvider] covering provider validation rules, configuration constraints, + * and error handling for all supported authentication providers. + * + * @suppress Internal test class + */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class AuthProviderTest { + + private lateinit var applicationContext: Context + + @Before + fun setUp() { + applicationContext = ApplicationProvider.getApplicationContext() + } + + // ============================================================================================= + // Email Provider Tests + // ============================================================================================= + + @Test + fun `email provider with valid configuration should succeed`() { + val provider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = listOf() + ) + + provider.validate() + } + + @Test + fun `email provider with email link enabled and valid action code settings should succeed`() { + val actionCodeSettings = actionCodeSettings { + url = "https://example.com/verify" + handleCodeInApp = true + } + + val provider = AuthProvider.Email( + isEmailLinkSignInEnabled = true, + actionCodeSettings = actionCodeSettings, + passwordValidationRules = listOf() + ) + + provider.validate() + } + + @Test + fun `email provider with email link enabled but null action code settings should throw`() { + val provider = AuthProvider.Email( + isEmailLinkSignInEnabled = true, + actionCodeSettings = null, + passwordValidationRules = listOf() + ) + + try { + provider.validate() + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalArgumentException::class.java) + assertThat(e.message).isEqualTo( + "ActionCodeSettings cannot be null when using " + + "email link sign in." + ) + } + } + + @Test + fun `email provider with email link enabled but canHandleCodeInApp false should throw`() { + val actionCodeSettings = actionCodeSettings { + url = "https://example.com/verify" + handleCodeInApp = false + } + + val provider = AuthProvider.Email( + isEmailLinkSignInEnabled = true, + actionCodeSettings = actionCodeSettings, + passwordValidationRules = listOf() + ) + + try { + provider.validate() + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalStateException::class.java) + assertThat(e.message).isEqualTo( + "You must set canHandleCodeInApp in your " + + "ActionCodeSettings to true for Email-Link Sign-in." + ) + } + } + + // ============================================================================================= + // Phone Provider Tests + // ============================================================================================= + + @Test + fun `phone provider with valid configuration should succeed`() { + val provider = AuthProvider.Phone( + defaultNumber = null, + defaultCountryCode = null, + allowedCountries = null + ) + + provider.validate() + } + + @Test + fun `phone provider with valid default number should succeed`() { + val provider = AuthProvider.Phone( + defaultNumber = "+1234567890", + defaultCountryCode = null, + allowedCountries = null + ) + + provider.validate() + } + + @Test + fun `phone provider with invalid default number should throw`() { + val provider = AuthProvider.Phone( + defaultNumber = "invalid_number", + defaultCountryCode = null, + allowedCountries = null + ) + + try { + provider.validate() + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalStateException::class.java) + assertThat(e.message).isEqualTo("Invalid phone number: invalid_number") + } + } + + @Test + fun `phone provider with valid default country code should succeed`() { + val provider = AuthProvider.Phone( + defaultNumber = null, + defaultCountryCode = "US", + allowedCountries = null + ) + + provider.validate() + } + + @Test + fun `phone provider with invalid default country code should throw`() { + val provider = AuthProvider.Phone( + defaultNumber = null, + defaultCountryCode = "invalid", + allowedCountries = null + ) + + try { + provider.validate() + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalStateException::class.java) + assertThat(e.message).isEqualTo("Invalid country iso: invalid") + } + } + + @Test + fun `phone provider with valid allowed countries should succeed`() { + val provider = AuthProvider.Phone( + defaultNumber = null, + defaultCountryCode = null, + allowedCountries = listOf("US", "CA", "+1") + ) + + provider.validate() + } + + @Test + fun `phone provider with invalid country in allowed list should throw`() { + val provider = AuthProvider.Phone( + defaultNumber = null, + defaultCountryCode = null, + allowedCountries = listOf("US", "invalid_country") + ) + + try { + provider.validate() + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalStateException::class.java) + assertThat(e.message).isEqualTo( + "Invalid input: You must provide a valid country iso (alpha-2) " + + "or code (e-164). e.g. 'us' or '+1'. Invalid code: invalid_country" + ) + } + } + + @Test + fun `phone provider with valid default number, country code and compatible allowed countries should succeed`() { + val provider = AuthProvider.Phone( + defaultNumber = "+1234567890", + defaultCountryCode = "US", + allowedCountries = listOf("US", "CA") + ) + + provider.validate() + } + + // ============================================================================================= + // Google Provider Tests + // ============================================================================================= + + @Test + fun `google provider with valid configuration should succeed`() { + val provider = AuthProvider.Google( + scopes = listOf("email"), + serverClientId = "test_client_id" + ) + + provider.validate(applicationContext) + } + + @Test + fun `google provider with empty serverClientId string throws`() { + val provider = AuthProvider.Google( + scopes = listOf("email"), + serverClientId = "" + ) + + try { + provider.validate(applicationContext) + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalArgumentException::class.java) + assertThat(e.message).isEqualTo("Server client ID cannot be blank.") + } + } + + @Test + fun `google provider validates default_web_client_id when serverClientId is null`() { + val provider = AuthProvider.Google( + scopes = listOf("email"), + serverClientId = null + ) + + try { + provider.validate(applicationContext) + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalStateException::class.java) + assertThat(e.message).isEqualTo( + "Check your google-services plugin " + + "configuration, the default_web_client_id string wasn't populated." + ) + } + } + + // ============================================================================================= + // Facebook Provider Tests + // ============================================================================================= + + @Test + fun `facebook provider with valid configuration should succeed`() { + val provider = AuthProvider.Facebook(applicationId = "application_id") + + provider.validate(applicationContext) + } + + @Test + fun `facebook provider with empty application id throws`() { + val provider = AuthProvider.Facebook(applicationId = "") + + try { + provider.validate(applicationContext) + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalArgumentException::class.java) + assertThat(e.message).isEqualTo("Facebook application ID cannot be blank") + } + } + + @Test + fun `facebook provider validates facebook_application_id when applicationId is null`() { + val provider = AuthProvider.Facebook() + + try { + provider.validate(applicationContext) + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalStateException::class.java) + assertThat(e.message).isEqualTo( + "Facebook provider unconfigured. Make sure to " + + "add a `facebook_application_id` string or provide applicationId parameter." + ) + } + } + + // ============================================================================================= + // Anonymous Provider Tests + // ============================================================================================= + + @Test + fun `anonymous provider as only provider should throw`() { + val providers = listOf(AuthProvider.Anonymous) + + try { + AuthProvider.Anonymous.validate(providers) + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalStateException::class.java) + assertThat(e.message).isEqualTo( + "Sign in as guest cannot be the only sign in method. " + + "In this case, sign the user in anonymously your self; no UI is needed." + ) + } + } + + @Test + fun `anonymous provider with other providers should succeed`() { + val providers = listOf( + AuthProvider.Anonymous, + AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = listOf() + ) + ) + + AuthProvider.Anonymous.validate(providers) + } + + // ============================================================================================= + // GenericOAuth Provider Tests + // ============================================================================================= + + @Test + fun `generic oauth provider with valid configuration should succeed`() { + val provider = AuthProvider.GenericOAuth( + providerId = "custom.provider", + scopes = listOf("read"), + customParameters = mapOf(), + buttonLabel = "Sign in with Custom", + buttonIcon = null, + buttonColor = null + ) + + provider.validate() + } + + @Test + fun `generic oauth provider with blank provider id should throw`() { + val provider = AuthProvider.GenericOAuth( + providerId = "", + scopes = listOf("read"), + customParameters = mapOf(), + buttonLabel = "Sign in with Custom", + buttonIcon = null, + buttonColor = null + ) + + try { + provider.validate() + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalArgumentException::class.java) + assertThat(e.message).isEqualTo("Provider ID cannot be null or empty") + } + } + + @Test + fun `generic oauth provider with blank button label should throw`() { + val provider = AuthProvider.GenericOAuth( + providerId = "custom.provider", + scopes = listOf("read"), + customParameters = mapOf(), + buttonLabel = "", + buttonIcon = null, + buttonColor = null + ) + + try { + provider.validate() + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalArgumentException::class.java) + assertThat(e.message).isEqualTo("Button label cannot be null or empty") + } + } +} \ No newline at end of file diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt index 95164f638..96a13795e 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt @@ -64,7 +64,7 @@ class AuthUIConfigurationTest { provider( AuthProvider.Google( scopes = listOf(), - serverClientId = "" + serverClientId = "test_client_id" ) ) } @@ -103,7 +103,7 @@ class AuthUIConfigurationTest { provider( AuthProvider.Google( scopes = listOf(), - serverClientId = "" + serverClientId = "test_client_id" ) ) provider( @@ -152,7 +152,7 @@ class AuthUIConfigurationTest { provider( AuthProvider.Google( scopes = listOf(), - serverClientId = "" + serverClientId = "test_client_id" ) ) } @@ -190,7 +190,7 @@ class AuthUIConfigurationTest { provider( AuthProvider.Google( scopes = listOf(), - serverClientId = "" + serverClientId = "test_client_id" ) ) } @@ -215,7 +215,7 @@ class AuthUIConfigurationTest { provider( AuthProvider.Google( scopes = listOf(), - serverClientId = "" + serverClientId = "test_client_id" ) ) } @@ -235,8 +235,8 @@ class AuthUIConfigurationTest { providers { provider( AuthProvider.Google( - scopes = listOf(), serverClientId - = "" + scopes = listOf(), + serverClientId = "test_client_id" ) ) } @@ -261,7 +261,7 @@ class AuthUIConfigurationTest { authUIConfiguration { context = applicationContext providers { - provider(AuthProvider.Google(scopes = listOf(), serverClientId = "")) + provider(AuthProvider.Google(scopes = listOf(), serverClientId = "test_client_id")) } } } catch (e: Exception) { @@ -285,14 +285,14 @@ class AuthUIConfigurationTest { val config = authUIConfiguration { context = applicationContext providers { - provider(AuthProvider.Google(scopes = listOf(), serverClientId = "")) - provider(AuthProvider.Facebook()) + provider(AuthProvider.Google(scopes = listOf(), serverClientId = "test_client_id")) + provider(AuthProvider.Facebook(applicationId = "test_app_id")) provider(AuthProvider.Twitter(customParameters = mapOf())) provider(AuthProvider.Github(customParameters = mapOf())) provider(AuthProvider.Microsoft(customParameters = mapOf(), tenant = null)) provider(AuthProvider.Yahoo(customParameters = mapOf())) provider(AuthProvider.Apple(customParameters = mapOf(), locale = null)) - provider(AuthProvider.Phone(defaultCountryCode = null, allowedCountries = null)) + provider(AuthProvider.Phone(defaultNumber = null, defaultCountryCode = null, allowedCountries = null)) provider( AuthProvider.Email( actionCodeSettings = null, @@ -304,7 +304,7 @@ class AuthUIConfigurationTest { assertThat(config.providers).hasSize(9) } - @Test(expected = IllegalArgumentException::class) + @Test fun `validation throws for unsupported provider`() { val mockProvider = AuthProvider.GenericOAuth( providerId = "unsupported.provider", @@ -315,73 +315,39 @@ class AuthUIConfigurationTest { buttonColor = null ) - authUIConfiguration { - context = applicationContext - providers { - provider(mockProvider) - } - } - } - - @Test(expected = IllegalStateException::class) - fun `validate throws when only anonymous provider is configured`() { - authUIConfiguration { - context = applicationContext - providers { - provider(AuthProvider.Anonymous) + try { + authUIConfiguration { + context = applicationContext + providers { + provider(mockProvider) + } } + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalArgumentException::class.java) + assertThat(e.message).isEqualTo("Unknown providers: unsupported.provider") } } - @Test(expected = IllegalArgumentException::class) + @Test fun `validate throws for duplicate providers`() { - authUIConfiguration { - context = applicationContext - providers { - provider(AuthProvider.Google(scopes = listOf(), serverClientId = "")) - provider( - AuthProvider.Google( - scopes = listOf("email"), - serverClientId = "different" - ) - ) - } - } - } - - @Test(expected = IllegalArgumentException::class) - fun `validate throws for enableEmailLinkSignIn true when actionCodeSettings is null`() { - authUIConfiguration { - context = applicationContext - providers { - provider( - AuthProvider.Email( - isEmailLinkSignInEnabled = true, - actionCodeSettings = null, - passwordValidationRules = listOf() - ) - ) - } - } - } - - @Test(expected = IllegalStateException::class) - fun `validate throws for enableEmailLinkSignIn true when actionCodeSettings canHandleCodeInApp false`() { - val customActionCodeSettings = actionCodeSettings { - url = "https://example.com" - handleCodeInApp = false - } - authUIConfiguration { - context = applicationContext - providers { - provider( - AuthProvider.Email( - isEmailLinkSignInEnabled = true, - actionCodeSettings = customActionCodeSettings, - passwordValidationRules = listOf() + try { + authUIConfiguration { + context = applicationContext + providers { + provider(AuthProvider.Google(scopes = listOf(), serverClientId = "")) + provider( + AuthProvider.Google( + scopes = listOf("email"), + serverClientId = "different" + ) ) - ) + } } + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalArgumentException::class.java) + assertThat(e.message).isEqualTo( + "Each provider can only be set once. Duplicates: google.com" + ) } } @@ -397,7 +363,7 @@ class AuthUIConfigurationTest { provider( AuthProvider.Google( scopes = listOf(), - serverClientId = "" + serverClientId = "test_client_id" ) ) } From b88993f2d836ba5635ef8a1ededf7fe834791e2e Mon Sep 17 00:00:00 2001 From: Ademola Fadumo <48495111+demolaf@users.noreply.github.com> Date: Thu, 25 Sep 2025 10:11:33 +0100 Subject: [PATCH 09/50] feat: AuthUITheme, ProviderStyle and tests (#2224) - added junit ui test library for compose ui tests - refactor: default provider styles - test: integration tests to validate AuthUITheme.Default is injected by default - test: validate fromMaterialTheme inherits clients MaterialTheme when AuthUITheme overridden --- auth/build.gradle.kts | 1 + .../configuration/AuthUIConfiguration.kt | 1 + .../auth/compose/configuration/AuthUITheme.kt | 205 ------------------ .../configuration/theme/AuthUITheme.kt | 130 +++++++++++ .../theme/ProviderStyleDefaults.kt | 105 +++++++++ auth/src/test/AndroidManifest.xml | 24 ++ .../configuration/AuthUIConfigurationTest.kt | 1 + .../configuration/theme/AuthUIThemeTest.kt | 81 +++++++ gradle/libs.versions.toml | 2 + 9 files changed, 345 insertions(+), 205 deletions(-) delete mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUITheme.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt create mode 100644 auth/src/test/AndroidManifest.xml create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/configuration/theme/AuthUIThemeTest.kt diff --git a/auth/build.gradle.kts b/auth/build.gradle.kts index 8e6d5304e..b26051d1c 100644 --- a/auth/build.gradle.kts +++ b/auth/build.gradle.kts @@ -115,6 +115,7 @@ dependencies { testImplementation(Config.Libs.Test.robolectric) testImplementation(Config.Libs.Test.kotlinReflect) testImplementation(Config.Libs.Provider.facebook) + testImplementation(libs.androidx.ui.test.junit4) debugImplementation(project(":internal:lintchecks")) } diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt index 98be20ac0..4d9bc280d 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt @@ -20,6 +20,7 @@ import com.google.firebase.auth.ActionCodeSettings import androidx.compose.ui.graphics.vector.ImageVector import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme fun actionCodeSettings(block: ActionCodeSettings.Builder.() -> Unit) = ActionCodeSettings.newBuilder().apply(block).build() diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUITheme.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUITheme.kt deleted file mode 100644 index d2ae7032d..000000000 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUITheme.kt +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright 2025 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.firebase.ui.auth.compose.configuration - -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.ColorScheme -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Shapes -import androidx.compose.material3.Typography -import androidx.compose.material3.lightColorScheme -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.staticCompositionLocalOf -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp - -private val LocalAuthUITheme = staticCompositionLocalOf { AuthUITheme.Default } - -/** - * Theming configuration for the entire Auth UI. - */ -class AuthUITheme( - /** - * The color scheme to use. - */ - val colorScheme: ColorScheme, - - /** - * The typography to use. - */ - val typography: Typography, - - /** - * The shapes to use for UI elements. - */ - val shapes: Shapes, - - /** - * A map of provider IDs to custom styling. - */ - val providerStyles: Map = emptyMap() -) { - - /** - * A class nested within AuthUITheme that defines the visual appearance of a specific - * provider button, allowing for per-provider branding and customization. - */ - class ProviderStyle( - /** - * The background color of the button. - */ - val backgroundColor: Color, - - /** - * The color of the text label on the button. - */ - val contentColor: Color, - - /** - * An optional tint color for the provider's icon. If null, - * the icon's intrinsic color is used. - */ - var iconTint: Color? = null, - - /** - * The shape of the button container. Defaults to RoundedCornerShape(4.dp). - */ - val shape: Shape = RoundedCornerShape(4.dp), - - /** - * The shadow elevation for the button. Defaults to 2.dp. - */ - val elevation: Dp = 2.dp - ) - - companion object { - /** - * A standard light theme with Material 3 defaults and - * pre-configured provider styles. - */ - val Default = AuthUITheme( - colorScheme = lightColorScheme(), - typography = Typography(), - shapes = Shapes(), - providerStyles = defaultProviderStyles - ) - - /** - * Creates a theme inheriting the app's current Material - * Theme settings. - */ - @Composable - fun fromMaterialTheme( - providerStyles: Map = Default.providerStyles - ): AuthUITheme { - return AuthUITheme( - colorScheme = MaterialTheme.colorScheme, - typography = MaterialTheme.typography, - shapes = MaterialTheme.shapes, - providerStyles = providerStyles - ) - } - - internal val defaultProviderStyles - get(): Map { - return Provider.entries.associate { provider -> - when (provider) { - Provider.GOOGLE -> { - provider.id to ProviderStyle( - backgroundColor = Color.White, - contentColor = Color(0xFF757575) - ) - } - - Provider.FACEBOOK -> { - provider.id to ProviderStyle( - backgroundColor = Color(0xFF3B5998), - contentColor = Color.White - ) - } - - Provider.TWITTER -> { - provider.id to ProviderStyle( - backgroundColor = Color(0xFF5BAAF4), - contentColor = Color.White - ) - } - - Provider.GITHUB -> { - provider.id to ProviderStyle( - backgroundColor = Color(0xFF24292E), - contentColor = Color.White - ) - } - - Provider.EMAIL -> { - provider.id to ProviderStyle( - backgroundColor = Color(0xFFD0021B), - contentColor = Color.White - ) - } - - Provider.PHONE -> { - provider.id to ProviderStyle( - backgroundColor = Color(0xFF43C5A5), - contentColor = Color.White - ) - } - - Provider.ANONYMOUS -> { - provider.id to ProviderStyle( - backgroundColor = Color(0xFFF4B400), - contentColor = Color.White - ) - } - - Provider.MICROSOFT -> { - provider.id to ProviderStyle( - backgroundColor = Color(0xFF2F2F2F), - contentColor = Color.White - ) - } - - Provider.YAHOO -> { - provider.id to ProviderStyle( - backgroundColor = Color(0xFF720E9E), - contentColor = Color.White - ) - } - - Provider.APPLE -> { - provider.id to ProviderStyle( - backgroundColor = Color.Black, - contentColor = Color.White - ) - } - } - } - } - } -} - -@Composable -fun AuthUITheme( - theme: AuthUITheme = AuthUITheme.Default, - content: @Composable () -> Unit -) { - CompositionLocalProvider(LocalAuthUITheme provides theme) { - content() - } -} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt new file mode 100644 index 000000000..d83cf5923 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt @@ -0,0 +1,130 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Shapes +import androidx.compose.material3.Typography +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + +/** + * Theming configuration for the entire Auth UI. + */ +class AuthUITheme( + /** + * The color scheme to use. + */ + val colorScheme: ColorScheme, + + /** + * The typography to use. + */ + val typography: Typography, + + /** + * The shapes to use for UI elements. + */ + val shapes: Shapes, + + /** + * A map of provider IDs to custom styling. + */ + val providerStyles: Map = emptyMap() +) { + + /** + * A class nested within AuthUITheme that defines the visual appearance of a specific + * provider button, allowing for per-provider branding and customization. + */ + class ProviderStyle( + /** + * The background color of the button. + */ + val backgroundColor: Color, + + /** + * The color of the text label on the button. + */ + val contentColor: Color, + + /** + * An optional tint color for the provider's icon. If null, + * the icon's intrinsic color is used. + */ + var iconTint: Color? = null, + + /** + * The shape of the button container. Defaults to RoundedCornerShape(4.dp). + */ + val shape: Shape = RoundedCornerShape(4.dp), + + /** + * The shadow elevation for the button. Defaults to 2.dp. + */ + val elevation: Dp = 2.dp + ) + + companion object { + /** + * A standard light theme with Material 3 defaults and + * pre-configured provider styles. + */ + val Default = AuthUITheme( + colorScheme = lightColorScheme( + primary = Color(0xFFFFA611) + ), + typography = Typography(), + shapes = Shapes(), + providerStyles = ProviderStyleDefaults.default + ) + + /** + * Creates a theme inheriting the app's current Material + * Theme settings. + */ + @Composable + fun fromMaterialTheme( + providerStyles: Map = ProviderStyleDefaults.default + ): AuthUITheme { + return AuthUITheme( + colorScheme = MaterialTheme.colorScheme, + typography = MaterialTheme.typography, + shapes = MaterialTheme.shapes, + providerStyles = providerStyles + ) + } + + } +} + +@Composable +fun AuthUITheme( + theme: AuthUITheme = AuthUITheme.Default, + content: @Composable () -> Unit +) { + MaterialTheme( + colorScheme = theme.colorScheme, + typography = theme.typography, + shapes = theme.shapes, + content = content + ) +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt new file mode 100644 index 000000000..4f063c9a5 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt @@ -0,0 +1,105 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.theme + +import androidx.compose.ui.graphics.Color +import com.firebase.ui.auth.compose.configuration.Provider + +/** + * Default provider styling configurations for authentication providers. + * + * This object provides brand-appropriate visual styling for each supported authentication + * provider, including background colors, text colors, and other visual properties that + * match each provider's brand guidelines. + * + * The styles are automatically applied when using [AuthUITheme.Default] or can be + * customized by passing a modified map to [AuthUITheme.fromMaterialTheme]. + */ +internal object ProviderStyleDefaults { + val default: Map + get() = Provider.entries.associate { provider -> + when (provider) { + Provider.GOOGLE -> { + provider.id to AuthUITheme.ProviderStyle( + backgroundColor = Color.White, + contentColor = Color(0xFF757575) + ) + } + + Provider.FACEBOOK -> { + provider.id to AuthUITheme.ProviderStyle( + backgroundColor = Color(0xFF3B5998), + contentColor = Color.White + ) + } + + Provider.TWITTER -> { + provider.id to AuthUITheme.ProviderStyle( + backgroundColor = Color(0xFF5BAAF4), + contentColor = Color.White + ) + } + + Provider.GITHUB -> { + provider.id to AuthUITheme.ProviderStyle( + backgroundColor = Color(0xFF24292E), + contentColor = Color.White + ) + } + + Provider.EMAIL -> { + provider.id to AuthUITheme.ProviderStyle( + backgroundColor = Color(0xFFD0021B), + contentColor = Color.White + ) + } + + Provider.PHONE -> { + provider.id to AuthUITheme.ProviderStyle( + backgroundColor = Color(0xFF43C5A5), + contentColor = Color.White + ) + } + + Provider.ANONYMOUS -> { + provider.id to AuthUITheme.ProviderStyle( + backgroundColor = Color(0xFFF4B400), + contentColor = Color.White + ) + } + + Provider.MICROSOFT -> { + provider.id to AuthUITheme.ProviderStyle( + backgroundColor = Color(0xFF2F2F2F), + contentColor = Color.White + ) + } + + Provider.YAHOO -> { + provider.id to AuthUITheme.ProviderStyle( + backgroundColor = Color(0xFF720E9E), + contentColor = Color.White + ) + } + + Provider.APPLE -> { + provider.id to AuthUITheme.ProviderStyle( + backgroundColor = Color.Black, + contentColor = Color.White + ) + } + } + } +} \ No newline at end of file diff --git a/auth/src/test/AndroidManifest.xml b/auth/src/test/AndroidManifest.xml new file mode 100644 index 000000000..66eb2ad51 --- /dev/null +++ b/auth/src/test/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt index 96a13795e..118977c09 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt @@ -22,6 +22,7 @@ import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.R import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme import com.google.common.truth.Truth.assertThat import com.google.firebase.auth.actionCodeSettings import org.junit.Assert.assertThrows diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/theme/AuthUIThemeTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/theme/AuthUIThemeTest.kt new file mode 100644 index 000000000..f2a9b88cc --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/theme/AuthUIThemeTest.kt @@ -0,0 +1,81 @@ +package com.firebase.ui.auth.compose.configuration.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Shapes +import androidx.compose.material3.Typography +import androidx.compose.material3.lightColorScheme +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.google.common.truth.Truth.assertThat +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +@Config(sdk = [34]) +@RunWith(RobolectricTestRunner::class) +class AuthUIThemeTest { + + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun `Default AuthUITheme applies to MaterialTheme`() { + val theme = AuthUITheme.Default + + composeTestRule.setContent { + AuthUITheme { + assertThat(MaterialTheme.colorScheme).isEqualTo(theme.colorScheme) + assertThat(MaterialTheme.typography).isEqualTo(theme.typography) + assertThat(MaterialTheme.shapes).isEqualTo(theme.shapes) + } + } + } + + @Test + fun `fromMaterialTheme inherits client MaterialTheme values`() { + val appLightColorScheme = lightColorScheme( + primary = Color(0xFF6650a4), + secondary = Color(0xFF625b71), + tertiary = Color(0xFF7D5260) + ) + + val appTypography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + ) + + val appShapes = Shapes(extraSmall = RoundedCornerShape(13.dp)) + + composeTestRule.setContent { + MaterialTheme( + colorScheme = appLightColorScheme, + typography = appTypography, + shapes = appShapes, + ) { + AuthUITheme( + theme = AuthUITheme.fromMaterialTheme() + ) { + assertThat(MaterialTheme.colorScheme) + .isEqualTo(appLightColorScheme) + assertThat(MaterialTheme.typography) + .isEqualTo(appTypography) + assertThat(MaterialTheme.shapes) + .isEqualTo(appShapes) + } + } + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 379fe1b5b..44eb15432 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,6 +2,8 @@ kotlin = "2.2.0" [libraries] +# Testing +androidx-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" } [plugins] compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } \ No newline at end of file From 29a443ffdfefd705c7e69cb072441f8f265848f3 Mon Sep 17 00:00:00 2001 From: Guillaume Bernos Date: Thu, 25 Sep 2025 14:15:09 +0200 Subject: [PATCH 10/50] feat: Error Recovery & Dialog (#2225) * feat: Error Recovery & Dialog * fix --- .../ui/auth/compose/ErrorRecoveryDialog.kt | 199 +++++++++++ .../stringprovider/AuthUIStringProvider.kt | 40 +++ .../DefaultAuthUIStringProvider.kt | 30 ++ auth/src/main/res/values-ar/strings.xml | 7 +- auth/src/main/res/values-b+es+419/strings.xml | 7 +- auth/src/main/res/values-bg/strings.xml | 7 +- auth/src/main/res/values-bn/strings.xml | 6 + auth/src/main/res/values-ca/strings.xml | 6 + auth/src/main/res/values-cs/strings.xml | 5 + auth/src/main/res/values-da/strings.xml | 7 +- auth/src/main/res/values-de-rAT/strings.xml | 5 + auth/src/main/res/values-de-rCH/strings.xml | 6 + auth/src/main/res/values-de/strings.xml | 7 +- auth/src/main/res/values-el/strings.xml | 6 + auth/src/main/res/values-en-rAU/strings.xml | 7 +- auth/src/main/res/values-en-rCA/strings.xml | 7 +- auth/src/main/res/values-en-rGB/strings.xml | 7 +- auth/src/main/res/values-en-rIE/strings.xml | 7 +- auth/src/main/res/values-en-rIN/strings.xml | 7 +- auth/src/main/res/values-en-rSG/strings.xml | 7 +- auth/src/main/res/values-en-rZA/strings.xml | 7 +- auth/src/main/res/values-es-rAR/strings.xml | 7 +- auth/src/main/res/values-es-rBO/strings.xml | 7 +- auth/src/main/res/values-es-rCL/strings.xml | 7 +- auth/src/main/res/values-es-rCO/strings.xml | 7 +- auth/src/main/res/values-es-rCR/strings.xml | 7 +- auth/src/main/res/values-es-rDO/strings.xml | 7 +- auth/src/main/res/values-es-rEC/strings.xml | 7 +- auth/src/main/res/values-es-rGT/strings.xml | 7 +- auth/src/main/res/values-es-rHN/strings.xml | 7 +- auth/src/main/res/values-es-rMX/strings.xml | 7 +- auth/src/main/res/values-es-rNI/strings.xml | 7 +- auth/src/main/res/values-es-rPA/strings.xml | 7 +- auth/src/main/res/values-es-rPE/strings.xml | 7 +- auth/src/main/res/values-es-rPR/strings.xml | 7 +- auth/src/main/res/values-es-rPY/strings.xml | 7 +- auth/src/main/res/values-es-rSV/strings.xml | 7 +- auth/src/main/res/values-es-rUS/strings.xml | 7 +- auth/src/main/res/values-es-rUY/strings.xml | 7 +- auth/src/main/res/values-es-rVE/strings.xml | 7 +- auth/src/main/res/values-es/strings.xml | 5 + auth/src/main/res/values-fa/strings.xml | 6 + auth/src/main/res/values-fi/strings.xml | 5 + auth/src/main/res/values-fil/strings.xml | 5 + auth/src/main/res/values-fr-rCH/strings.xml | 6 + auth/src/main/res/values-fr/strings.xml | 7 +- auth/src/main/res/values-gsw/strings.xml | 5 + auth/src/main/res/values-gu/strings.xml | 6 + auth/src/main/res/values-hi/strings.xml | 6 + auth/src/main/res/values-hr/strings.xml | 7 +- auth/src/main/res/values-hu/strings.xml | 5 + auth/src/main/res/values-in/strings.xml | 6 + auth/src/main/res/values-it/strings.xml | 7 +- auth/src/main/res/values-iw/strings.xml | 6 + auth/src/main/res/values-ja/strings.xml | 5 + auth/src/main/res/values-kn/strings.xml | 6 + auth/src/main/res/values-ko/strings.xml | 6 +- auth/src/main/res/values-ln/strings.xml | 6 + auth/src/main/res/values-lt/strings.xml | 6 + auth/src/main/res/values-lv/strings.xml | 6 + auth/src/main/res/values-mo/strings.xml | 6 + auth/src/main/res/values-mr/strings.xml | 6 + auth/src/main/res/values-ms/strings.xml | 6 + auth/src/main/res/values-nb/strings.xml | 5 + auth/src/main/res/values-nl/strings.xml | 7 +- auth/src/main/res/values-no/strings.xml | 6 + auth/src/main/res/values-pl/strings.xml | 7 +- auth/src/main/res/values-pt-rBR/strings.xml | 6 + auth/src/main/res/values-pt-rPT/strings.xml | 6 + auth/src/main/res/values-pt/strings.xml | 7 +- auth/src/main/res/values-ro/strings.xml | 7 +- auth/src/main/res/values-ru/strings.xml | 7 +- auth/src/main/res/values-sk/strings.xml | 5 + auth/src/main/res/values-sl/strings.xml | 6 + auth/src/main/res/values-sr/strings.xml | 6 + auth/src/main/res/values-sv/strings.xml | 5 + auth/src/main/res/values-ta/strings.xml | 6 + auth/src/main/res/values-th/strings.xml | 6 + auth/src/main/res/values-tl/strings.xml | 5 + auth/src/main/res/values-tr/strings.xml | 6 + auth/src/main/res/values-uk/strings.xml | 6 + auth/src/main/res/values-ur/strings.xml | 6 + auth/src/main/res/values-vi/strings.xml | 6 + auth/src/main/res/values-zh-rCN/strings.xml | 6 + auth/src/main/res/values-zh-rHK/strings.xml | 6 + auth/src/main/res/values-zh-rTW/strings.xml | 6 + auth/src/main/res/values-zh/strings.xml | 7 +- auth/src/main/res/values/strings.xml | 9 +- .../compose/ErrorRecoveryDialogLogicTest.kt | 316 ++++++++++++++++++ 89 files changed, 1084 insertions(+), 42 deletions(-) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/ErrorRecoveryDialog.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/ErrorRecoveryDialogLogicTest.kt diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ErrorRecoveryDialog.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ErrorRecoveryDialog.kt new file mode 100644 index 000000000..3b9cc0b57 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ErrorRecoveryDialog.kt @@ -0,0 +1,199 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose + +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.window.DialogProperties +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider + +/** + * A composable dialog for displaying authentication errors with recovery options. + * + * This dialog provides friendly error messages and actionable recovery suggestions + * based on the specific [AuthException] type. It integrates with [AuthUIStringProvider] + * for localization support. + * + * **Example usage:** + * ```kotlin + * var showError by remember { mutableStateOf(null) } + * + * if (showError != null) { + * ErrorRecoveryDialog( + * error = showError!!, + * stringProvider = stringProvider, + * onRetry = { + * showError = null + * // Retry authentication operation + * }, + * onDismiss = { + * showError = null + * } + * ) + * } + * ``` + * + * @param error The [AuthException] to display recovery information for + * @param stringProvider The [AuthUIStringProvider] for localized strings + * @param onRetry Callback invoked when the user taps the retry action + * @param onDismiss Callback invoked when the user dismisses the dialog + * @param modifier Optional [Modifier] for the dialog + * @param onRecover Optional callback for custom recovery actions based on the exception type + * @param properties Optional [DialogProperties] for dialog configuration + * + * @since 10.0.0 + */ +@Composable +fun ErrorRecoveryDialog( + error: AuthException, + stringProvider: AuthUIStringProvider, + onRetry: () -> Unit, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, + onRecover: ((AuthException) -> Unit)? = null, + properties: DialogProperties = DialogProperties() +) { + AlertDialog( + onDismissRequest = onDismiss, + title = { + Text( + text = stringProvider.errorDialogTitle, + style = MaterialTheme.typography.headlineSmall + ) + }, + text = { + Text( + text = getRecoveryMessage(error, stringProvider), + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Start + ) + }, + confirmButton = { + if (isRecoverable(error)) { + TextButton( + onClick = { + onRecover?.invoke(error) ?: onRetry() + } + ) { + Text( + text = getRecoveryActionText(error, stringProvider), + style = MaterialTheme.typography.labelLarge + ) + } + } + }, + dismissButton = { + TextButton(onClick = onDismiss) { + Text( + text = stringProvider.dismissAction, + style = MaterialTheme.typography.labelLarge + ) + } + }, + modifier = modifier, + properties = properties + ) +} + +/** + * Gets the appropriate recovery message for the given [AuthException]. + * + * @param error The [AuthException] to get the message for + * @param stringProvider The [AuthUIStringProvider] for localized strings + * @return The localized recovery message + */ +private fun getRecoveryMessage( + error: AuthException, + stringProvider: AuthUIStringProvider +): String { + return when (error) { + is AuthException.NetworkException -> stringProvider.networkErrorRecoveryMessage + is AuthException.InvalidCredentialsException -> stringProvider.invalidCredentialsRecoveryMessage + is AuthException.UserNotFoundException -> stringProvider.userNotFoundRecoveryMessage + is AuthException.WeakPasswordException -> { + // Include specific reason if available + val baseMessage = stringProvider.weakPasswordRecoveryMessage + error.reason?.let { reason -> + "$baseMessage\n\nReason: $reason" + } ?: baseMessage + } + is AuthException.EmailAlreadyInUseException -> { + // Include email if available + val baseMessage = stringProvider.emailAlreadyInUseRecoveryMessage + error.email?.let { email -> + "$baseMessage ($email)" + } ?: baseMessage + } + is AuthException.TooManyRequestsException -> stringProvider.tooManyRequestsRecoveryMessage + is AuthException.MfaRequiredException -> stringProvider.mfaRequiredRecoveryMessage + is AuthException.AccountLinkingRequiredException -> stringProvider.accountLinkingRequiredRecoveryMessage + is AuthException.AuthCancelledException -> stringProvider.authCancelledRecoveryMessage + is AuthException.UnknownException -> stringProvider.unknownErrorRecoveryMessage + else -> stringProvider.unknownErrorRecoveryMessage + } +} + +/** + * Gets the appropriate recovery action text for the given [AuthException]. + * + * @param error The [AuthException] to get the action text for + * @param stringProvider The [AuthUIStringProvider] for localized strings + * @return The localized action text + */ +private fun getRecoveryActionText( + error: AuthException, + stringProvider: AuthUIStringProvider +): String { + return when (error) { + is AuthException.AuthCancelledException -> stringProvider.continueText + is AuthException.EmailAlreadyInUseException -> stringProvider.signInDefault // Use existing "Sign in" text + is AuthException.AccountLinkingRequiredException -> stringProvider.continueText // Use "Continue" for linking + is AuthException.MfaRequiredException -> stringProvider.continueText // Use "Continue" for MFA + is AuthException.NetworkException, + is AuthException.InvalidCredentialsException, + is AuthException.UserNotFoundException, + is AuthException.WeakPasswordException, + is AuthException.TooManyRequestsException, + is AuthException.UnknownException -> stringProvider.retryAction + else -> stringProvider.retryAction + } +} + +/** + * Determines if the given [AuthException] is recoverable through user action. + * + * @param error The [AuthException] to check + * @return `true` if the error is recoverable, `false` otherwise + */ +private fun isRecoverable(error: AuthException): Boolean { + return when (error) { + is AuthException.NetworkException -> true + is AuthException.InvalidCredentialsException -> true + is AuthException.UserNotFoundException -> true + is AuthException.WeakPasswordException -> true + is AuthException.EmailAlreadyInUseException -> true + is AuthException.TooManyRequestsException -> false // User must wait + is AuthException.MfaRequiredException -> true + is AuthException.AccountLinkingRequiredException -> true + is AuthException.AuthCancelledException -> true + is AuthException.UnknownException -> true + else -> true + } +} \ No newline at end of file diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProvider.kt index 646727fb7..ea88485e3 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProvider.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProvider.kt @@ -184,4 +184,44 @@ interface AuthUIStringProvider { /** TOTP Code prompt */ val enterTOTPCode: String + + // Error Recovery Dialog Strings + /** Error dialog title */ + val errorDialogTitle: String + + /** Retry action button text */ + val retryAction: String + + /** Dismiss action button text */ + val dismissAction: String + + /** Network error recovery message */ + val networkErrorRecoveryMessage: String + + /** Invalid credentials recovery message */ + val invalidCredentialsRecoveryMessage: String + + /** User not found recovery message */ + val userNotFoundRecoveryMessage: String + + /** Weak password recovery message */ + val weakPasswordRecoveryMessage: String + + /** Email already in use recovery message */ + val emailAlreadyInUseRecoveryMessage: String + + /** Too many requests recovery message */ + val tooManyRequestsRecoveryMessage: String + + /** MFA required recovery message */ + val mfaRequiredRecoveryMessage: String + + /** Account linking required recovery message */ + val accountLinkingRequiredRecoveryMessage: String + + /** Auth cancelled recovery message */ + val authCancelledRecoveryMessage: String + + /** Unknown error recovery message */ + val unknownErrorRecoveryMessage: String } diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/DefaultAuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/DefaultAuthUIStringProvider.kt index 96a74cdd7..7df16d9ca 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/DefaultAuthUIStringProvider.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/DefaultAuthUIStringProvider.kt @@ -179,4 +179,34 @@ class DefaultAuthUIStringProvider( get() = localizedContext.getString(R.string.fui_progress_dialog_loading) override val noInternet: String get() = localizedContext.getString(R.string.fui_no_internet) + + /** + * Error Recovery Dialog Strings + */ + override val errorDialogTitle: String + get() = localizedContext.getString(R.string.fui_error_dialog_title) + override val retryAction: String + get() = localizedContext.getString(R.string.fui_error_retry_action) + override val dismissAction: String + get() = localizedContext.getString(R.string.fui_email_link_dismiss_button) + override val networkErrorRecoveryMessage: String + get() = localizedContext.getString(R.string.fui_no_internet) + override val invalidCredentialsRecoveryMessage: String + get() = localizedContext.getString(R.string.fui_error_invalid_password) + override val userNotFoundRecoveryMessage: String + get() = localizedContext.getString(R.string.fui_error_email_does_not_exist) + override val weakPasswordRecoveryMessage: String + get() = localizedContext.resources.getQuantityString(R.plurals.fui_error_weak_password, 6, 6) + override val emailAlreadyInUseRecoveryMessage: String + get() = localizedContext.getString(R.string.fui_email_account_creation_error) + override val tooManyRequestsRecoveryMessage: String + get() = localizedContext.getString(R.string.fui_error_too_many_attempts) + override val mfaRequiredRecoveryMessage: String + get() = localizedContext.getString(R.string.fui_error_mfa_required_message) + override val accountLinkingRequiredRecoveryMessage: String + get() = localizedContext.getString(R.string.fui_error_account_linking_required_message) + override val authCancelledRecoveryMessage: String + get() = localizedContext.getString(R.string.fui_error_auth_cancelled_message) + override val unknownErrorRecoveryMessage: String + get() = localizedContext.getString(R.string.fui_error_unknown) } diff --git a/auth/src/main/res/values-ar/strings.xml b/auth/src/main/res/values-ar/strings.xml index 6c18953e4..3231bd74f 100755 --- a/auth/src/main/res/values-ar/strings.xml +++ b/auth/src/main/res/values-ar/strings.xml @@ -88,5 +88,10 @@ إعادة إرسال الرمز تأكيد ملكية رقم الهاتف عند النقر على “%1$s”، قد يتمّ إرسال رسالة قصيرة SMS وقد يتمّ تطبيق رسوم الرسائل والبيانات. - يشير النقر على “%1$s” إلى موافقتك على %2$s و%3$s. وقد يتمّ إرسال رسالة قصيرة كما قد تنطبق رسوم الرسائل والبيانات. + يشير النقر على "%1$s" إلى موافقتك على %2$s و%3$s. وقد يتمّ إرسال رسالة قصيرة كما قد تنطبق رسوم الرسائل والبيانات. + خطأ في المصادقة + أعد المحاولة + مطلوب تحقق إضافي. يرجى إكمال المصادقة متعددة العوامل. + يجب ربط الحساب. جرب طريقة تسجيل دخول مختلفة. + تم إلغاء المصادقة. أعد المحاولة عندما تكون جاهزاً. diff --git a/auth/src/main/res/values-b+es+419/strings.xml b/auth/src/main/res/values-b+es+419/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-b+es+419/strings.xml +++ b/auth/src/main/res/values-b+es+419/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-bg/strings.xml b/auth/src/main/res/values-bg/strings.xml index c96ed2f29..dc2b315cd 100755 --- a/auth/src/main/res/values-bg/strings.xml +++ b/auth/src/main/res/values-bg/strings.xml @@ -88,5 +88,10 @@ Повторно изпращане на кода Потвърждаване на телефонния номер Докосвайки „%1$s“, може да получите SMS съобщение. То може да се таксува по тарифите за данни и SMS. - Докосвайки „%1$s“, приемате нашите %2$s и %3$s. Възможно е да получите SMS съобщение. То може да се таксува по тарифите за данни и SMS. + Докосвайки „%1$s", приемате нашите %2$s и %3$s. Възможно е да получите SMS съобщение. То може да се таксува по тарифите за данни и SMS. + Грешка при удостоверяване + Опитай отново + Необходима е допълнителна проверка. Моля, завършете многофакторното удостоверяване. + Акаунтът трябва да бъде свързан. Опитайте различен метод за влизане. + Удостоверяването беше отменено. Опитайте отново, когато сте готови. diff --git a/auth/src/main/res/values-bn/strings.xml b/auth/src/main/res/values-bn/strings.xml index bb304053b..bce8d34a7 100755 --- a/auth/src/main/res/values-bn/strings.xml +++ b/auth/src/main/res/values-bn/strings.xml @@ -89,4 +89,10 @@ ফোন নম্বর যাচাই করুন %1$s এ ট্যাপ করলে আপনি একটি এসএমএস পাঠাতে পারেন। মেসেজ ও ডেটার চার্জ প্রযোজ্য। “%1$s” বোতামে ট্যাপ করার অর্থ, আপনি আমাদের %2$s এবং %3$s-এর সাথে সম্মত। একটি এসএমএস পাঠানো হতে পারে। মেসেজ এবং ডেটার উপরে প্রযোজ্য চার্জ লাগতে পারে। + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-ca/strings.xml b/auth/src/main/res/values-ca/strings.xml index e0c126e59..a08a21c1d 100755 --- a/auth/src/main/res/values-ca/strings.xml +++ b/auth/src/main/res/values-ca/strings.xml @@ -89,4 +89,10 @@ Verifica el número de telèfon En tocar %1$s, és possible que s\'enviï un SMS. Es poden aplicar tarifes de dades i missatges. En tocar %1$s, acceptes les nostres %2$s i la nostra %3$s. És possible que s\'enviï un SMS. Es poden aplicar tarifes de dades i missatges. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-cs/strings.xml b/auth/src/main/res/values-cs/strings.xml index cb328a6fa..6ee3d6467 100755 --- a/auth/src/main/res/values-cs/strings.xml +++ b/auth/src/main/res/values-cs/strings.xml @@ -89,4 +89,9 @@ Ověřit telefonní číslo Po klepnutí na možnost %1$s může být odeslána SMS. Mohou být účtovány poplatky za zprávy a data. Klepnutím na tlačítko %1$s vyjadřujete svůj souhlas s dokumenty %2$s a %3$s. Může být odeslána SMS a mohou být účtovány poplatky za zprávy a data. + Chyba ověření + Zkusit znovu + Vyžadováno další ověření. Dokončete prosím vícefaktorové ověření. + Účet je třeba propojit. Zkuste jiný způsob přihlášení. + Ověření bylo zrušeno. Zkuste znovu až budete připraveni. diff --git a/auth/src/main/res/values-da/strings.xml b/auth/src/main/res/values-da/strings.xml index c9c86762e..f177f7d53 100755 --- a/auth/src/main/res/values-da/strings.xml +++ b/auth/src/main/res/values-da/strings.xml @@ -88,5 +88,10 @@ Send koden igen Bekræft telefonnummer Når du trykker på “%1$s”, sendes der måske en sms. Der opkræves muligvis gebyrer for beskeder og data. - Når du trykker på “%1$s”, indikerer du, at du accepterer vores %2$s og %3$s. Der sendes måske en sms. Der opkræves muligvis gebyrer for beskeder og data. + Når du trykker på "%1$s", indikerer du, at du accepterer vores %2$s og %3$s. Der sendes måske en sms. Der opkræves muligvis gebyrer for beskeder og data. + Godkendelsesfejl + Prøv igen + Yderligere bekræftelse påkrævet. Fuldfør venligst multifaktorgodkendelse. + Kontoen skal tilknyttes. Prøv en anden login-metode. + Godkendelsen blev annulleret. Prøv igen når du er klar. diff --git a/auth/src/main/res/values-de-rAT/strings.xml b/auth/src/main/res/values-de-rAT/strings.xml index 378aff0c0..f221da191 100755 --- a/auth/src/main/res/values-de-rAT/strings.xml +++ b/auth/src/main/res/values-de-rAT/strings.xml @@ -89,4 +89,9 @@ Telefonnummer bestätigen Wenn Sie auf “%1$s” tippen, erhalten Sie möglicherweise eine SMS. Es können Gebühren für SMS und Datenübertragung anfallen. Indem Sie auf “%1$s” tippen, stimmen Sie unseren %2$s und unserer %3$s zu. Sie erhalten möglicherweise eine SMS und es können Gebühren für die Nachricht und die Datenübertragung anfallen. + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-de-rCH/strings.xml b/auth/src/main/res/values-de-rCH/strings.xml index 378aff0c0..1909d07a7 100755 --- a/auth/src/main/res/values-de-rCH/strings.xml +++ b/auth/src/main/res/values-de-rCH/strings.xml @@ -89,4 +89,10 @@ Telefonnummer bestätigen Wenn Sie auf “%1$s” tippen, erhalten Sie möglicherweise eine SMS. Es können Gebühren für SMS und Datenübertragung anfallen. Indem Sie auf “%1$s” tippen, stimmen Sie unseren %2$s und unserer %3$s zu. Sie erhalten möglicherweise eine SMS und es können Gebühren für die Nachricht und die Datenübertragung anfallen. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-de/strings.xml b/auth/src/main/res/values-de/strings.xml index 378aff0c0..cd05db0fc 100755 --- a/auth/src/main/res/values-de/strings.xml +++ b/auth/src/main/res/values-de/strings.xml @@ -88,5 +88,10 @@ Code erneut senden Telefonnummer bestätigen Wenn Sie auf “%1$s” tippen, erhalten Sie möglicherweise eine SMS. Es können Gebühren für SMS und Datenübertragung anfallen. - Indem Sie auf “%1$s” tippen, stimmen Sie unseren %2$s und unserer %3$s zu. Sie erhalten möglicherweise eine SMS und es können Gebühren für die Nachricht und die Datenübertragung anfallen. + Indem Sie auf "%1$s" tippen, stimmen Sie unseren %2$s und unserer %3$s zu. Sie erhalten möglicherweise eine SMS und es können Gebühren für die Nachricht und die Datenübertragung anfallen. + Authentifizierungsfehler + Erneut versuchen + Zusätzliche Verifizierung erforderlich. Bitte schließen Sie die Multi-Faktor-Authentifizierung ab. + Das Konto muss verknüpft werden. Bitte versuchen Sie eine andere Anmeldemethode. + Die Authentifizierung wurde abgebrochen. Bitte versuchen Sie es erneut, wenn Sie bereit sind. diff --git a/auth/src/main/res/values-el/strings.xml b/auth/src/main/res/values-el/strings.xml index dd34114d4..08ada6b00 100755 --- a/auth/src/main/res/values-el/strings.xml +++ b/auth/src/main/res/values-el/strings.xml @@ -89,4 +89,10 @@ Επαλήθευση αριθμού τηλεφώνου Αν πατήσετε “%1$s”, μπορεί να σταλεί ένα SMS. Ενδέχεται να ισχύουν χρεώσεις μηνυμάτων και δεδομένων. Αν πατήσετε “%1$s”, δηλώνετε ότι αποδέχεστε τους %2$s και την %3$s. Μπορεί να σταλεί ένα SMS. Ενδέχεται να ισχύουν χρεώσεις μηνυμάτων και δεδομένων. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-en-rAU/strings.xml b/auth/src/main/res/values-en-rAU/strings.xml index 58b0b9245..54501d465 100755 --- a/auth/src/main/res/values-en-rAU/strings.xml +++ b/auth/src/main/res/values-en-rAU/strings.xml @@ -88,5 +88,10 @@ Resend code Verify Phone Number By tapping “%1$s”, an SMS may be sent. Message & data rates may apply. - By tapping “%1$s”, you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + By tapping "%1$s", you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-en-rCA/strings.xml b/auth/src/main/res/values-en-rCA/strings.xml index 58b0b9245..54501d465 100755 --- a/auth/src/main/res/values-en-rCA/strings.xml +++ b/auth/src/main/res/values-en-rCA/strings.xml @@ -88,5 +88,10 @@ Resend code Verify Phone Number By tapping “%1$s”, an SMS may be sent. Message & data rates may apply. - By tapping “%1$s”, you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + By tapping "%1$s", you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-en-rGB/strings.xml b/auth/src/main/res/values-en-rGB/strings.xml index 58b0b9245..54501d465 100755 --- a/auth/src/main/res/values-en-rGB/strings.xml +++ b/auth/src/main/res/values-en-rGB/strings.xml @@ -88,5 +88,10 @@ Resend code Verify Phone Number By tapping “%1$s”, an SMS may be sent. Message & data rates may apply. - By tapping “%1$s”, you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + By tapping "%1$s", you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-en-rIE/strings.xml b/auth/src/main/res/values-en-rIE/strings.xml index 58b0b9245..54501d465 100755 --- a/auth/src/main/res/values-en-rIE/strings.xml +++ b/auth/src/main/res/values-en-rIE/strings.xml @@ -88,5 +88,10 @@ Resend code Verify Phone Number By tapping “%1$s”, an SMS may be sent. Message & data rates may apply. - By tapping “%1$s”, you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + By tapping "%1$s", you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-en-rIN/strings.xml b/auth/src/main/res/values-en-rIN/strings.xml index 58b0b9245..54501d465 100755 --- a/auth/src/main/res/values-en-rIN/strings.xml +++ b/auth/src/main/res/values-en-rIN/strings.xml @@ -88,5 +88,10 @@ Resend code Verify Phone Number By tapping “%1$s”, an SMS may be sent. Message & data rates may apply. - By tapping “%1$s”, you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + By tapping "%1$s", you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-en-rSG/strings.xml b/auth/src/main/res/values-en-rSG/strings.xml index 58b0b9245..54501d465 100755 --- a/auth/src/main/res/values-en-rSG/strings.xml +++ b/auth/src/main/res/values-en-rSG/strings.xml @@ -88,5 +88,10 @@ Resend code Verify Phone Number By tapping “%1$s”, an SMS may be sent. Message & data rates may apply. - By tapping “%1$s”, you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + By tapping "%1$s", you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-en-rZA/strings.xml b/auth/src/main/res/values-en-rZA/strings.xml index 58b0b9245..54501d465 100755 --- a/auth/src/main/res/values-en-rZA/strings.xml +++ b/auth/src/main/res/values-en-rZA/strings.xml @@ -88,5 +88,10 @@ Resend code Verify Phone Number By tapping “%1$s”, an SMS may be sent. Message & data rates may apply. - By tapping “%1$s”, you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + By tapping "%1$s", you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-es-rAR/strings.xml b/auth/src/main/res/values-es-rAR/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rAR/strings.xml +++ b/auth/src/main/res/values-es-rAR/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rBO/strings.xml b/auth/src/main/res/values-es-rBO/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rBO/strings.xml +++ b/auth/src/main/res/values-es-rBO/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rCL/strings.xml b/auth/src/main/res/values-es-rCL/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rCL/strings.xml +++ b/auth/src/main/res/values-es-rCL/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rCO/strings.xml b/auth/src/main/res/values-es-rCO/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rCO/strings.xml +++ b/auth/src/main/res/values-es-rCO/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rCR/strings.xml b/auth/src/main/res/values-es-rCR/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rCR/strings.xml +++ b/auth/src/main/res/values-es-rCR/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rDO/strings.xml b/auth/src/main/res/values-es-rDO/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rDO/strings.xml +++ b/auth/src/main/res/values-es-rDO/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rEC/strings.xml b/auth/src/main/res/values-es-rEC/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rEC/strings.xml +++ b/auth/src/main/res/values-es-rEC/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rGT/strings.xml b/auth/src/main/res/values-es-rGT/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rGT/strings.xml +++ b/auth/src/main/res/values-es-rGT/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rHN/strings.xml b/auth/src/main/res/values-es-rHN/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rHN/strings.xml +++ b/auth/src/main/res/values-es-rHN/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rMX/strings.xml b/auth/src/main/res/values-es-rMX/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rMX/strings.xml +++ b/auth/src/main/res/values-es-rMX/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rNI/strings.xml b/auth/src/main/res/values-es-rNI/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rNI/strings.xml +++ b/auth/src/main/res/values-es-rNI/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rPA/strings.xml b/auth/src/main/res/values-es-rPA/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rPA/strings.xml +++ b/auth/src/main/res/values-es-rPA/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rPE/strings.xml b/auth/src/main/res/values-es-rPE/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rPE/strings.xml +++ b/auth/src/main/res/values-es-rPE/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rPR/strings.xml b/auth/src/main/res/values-es-rPR/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rPR/strings.xml +++ b/auth/src/main/res/values-es-rPR/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rPY/strings.xml b/auth/src/main/res/values-es-rPY/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rPY/strings.xml +++ b/auth/src/main/res/values-es-rPY/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rSV/strings.xml b/auth/src/main/res/values-es-rSV/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rSV/strings.xml +++ b/auth/src/main/res/values-es-rSV/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rUS/strings.xml b/auth/src/main/res/values-es-rUS/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rUS/strings.xml +++ b/auth/src/main/res/values-es-rUS/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rUY/strings.xml b/auth/src/main/res/values-es-rUY/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rUY/strings.xml +++ b/auth/src/main/res/values-es-rUY/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es-rVE/strings.xml b/auth/src/main/res/values-es-rVE/strings.xml index fccdf579c..f2635ab84 100755 --- a/auth/src/main/res/values-es-rVE/strings.xml +++ b/auth/src/main/res/values-es-rVE/strings.xml @@ -88,5 +88,10 @@ Reenviar código Verificar número de teléfono Si presionas “%1$s”, se enviará un SMS. Se aplicarán las tarifas de mensajes y datos. - Si presionas “%1$s”, indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Si presionas "%1$s", indicas que aceptas nuestras %2$s y %3$s. Es posible que se te envíe un SMS. Podrían aplicarse las tarifas de mensajes y datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-es/strings.xml b/auth/src/main/res/values-es/strings.xml index c5decbad9..a4b5704a0 100755 --- a/auth/src/main/res/values-es/strings.xml +++ b/auth/src/main/res/values-es/strings.xml @@ -89,4 +89,9 @@ Verificar número de teléfono Al tocar %1$s, podría enviarse un SMS. Es posible que se apliquen cargos de mensajería y de uso de datos. Si tocas %1$s, confirmas que aceptas nuestras %2$s y nuestra %3$s. Podría enviarse un SMS, por lo que es posible que se apliquen cargos de mensajería y de uso de datos. + Error de autenticación + Intentar de nuevo + Se requiere verificación adicional. Complete la autenticación de múltiples factores. + Es necesario vincular la cuenta. Pruebe con un método de inicio de sesión diferente. + La autenticación fue cancelada. Vuelva a intentarlo cuando esté listo. diff --git a/auth/src/main/res/values-fa/strings.xml b/auth/src/main/res/values-fa/strings.xml index 9085ee1d3..8e3c5f551 100755 --- a/auth/src/main/res/values-fa/strings.xml +++ b/auth/src/main/res/values-fa/strings.xml @@ -89,4 +89,10 @@ تأیید شماره تلفن با ضربه زدن روی «%1$s»، پیامکی برایتان ارسال می‌شود. هزینه پیام و داده اعمال می‌شود. درصورت ضربه‌زدن روی «%1$s»، موافقتتان را با %2$s و %3$s اعلام می‌کنید. پیامکی ارسال می‌شود. ممکن است هزینه داده و «پیام» محاسبه شود. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-fi/strings.xml b/auth/src/main/res/values-fi/strings.xml index 3713aeb0c..f76b85893 100755 --- a/auth/src/main/res/values-fi/strings.xml +++ b/auth/src/main/res/values-fi/strings.xml @@ -89,4 +89,9 @@ Vahvista puhelinnumero Kun napautat %1$s, tekstiviesti voidaan lähettää. Datan ja viestien käyttö voi olla maksullista. Napauttamalla %1$s vahvistat hyväksyväsi seuraavat: %2$s ja %3$s. Tekstiviesti voidaan lähettää, ja datan ja viestien käyttö voi olla maksullista. + Todennusvirhe + Yritä uudelleen + Lisävarmistus vaaditaan. Suorita monitekijätodennus loppuun. + Tili täytyy linkittää. Kokeile eri kirjautumistapaa. + Todennus peruutettiin. Yritä uudelleen kun olet valmis. diff --git a/auth/src/main/res/values-fil/strings.xml b/auth/src/main/res/values-fil/strings.xml index eb4768d02..d0f765fc6 100755 --- a/auth/src/main/res/values-fil/strings.xml +++ b/auth/src/main/res/values-fil/strings.xml @@ -89,4 +89,9 @@ I-verify ang Numero ng Telepono Sa pag-tap sa “%1$s,“ maaaring magpadala ng SMS. Maaaring ipatupad ang mga rate ng pagmemensahe at data. Sa pag-tap sa “%1$s”, ipinababatid mo na tinatanggap mo ang aming %2$s at %3$s. Maaaring magpadala ng SMS. Maaaring ipatupad ang mga rate ng pagmemensahe at data. + Error sa Pagpapatotoo + Subukan Muli + Kailangan ang karagdagang pagpapatotoo. Mangyaring kumpletuhin ang multi-factor authentication. + Kailangang i-link ang account. Mangyaring subukan ang ibang paraan ng pag-sign in. + Ang pagpapatotoo ay nakansela. Mangyaring subukan muli kapag handa ka na. diff --git a/auth/src/main/res/values-fr-rCH/strings.xml b/auth/src/main/res/values-fr-rCH/strings.xml index 86b3110d4..14d56131c 100755 --- a/auth/src/main/res/values-fr-rCH/strings.xml +++ b/auth/src/main/res/values-fr-rCH/strings.xml @@ -89,4 +89,10 @@ Valider le numéro de téléphone En appuyant sur “%1$s”, vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés. En appuyant sur “%1$s”, vous acceptez les %2$s et les %3$s. Vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-fr/strings.xml b/auth/src/main/res/values-fr/strings.xml index 86b3110d4..7cb182287 100755 --- a/auth/src/main/res/values-fr/strings.xml +++ b/auth/src/main/res/values-fr/strings.xml @@ -88,5 +88,10 @@ Renvoyer le code Valider le numéro de téléphone En appuyant sur “%1$s”, vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés. - En appuyant sur “%1$s”, vous acceptez les %2$s et les %3$s. Vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés. + En appuyant sur "%1$s", vous acceptez les %2$s et les %3$s. Vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés. + Erreur d\'authentification + Réessayer + Vérification supplémentaire requise. Veuillez compléter l\'authentification à plusieurs facteurs. + Le compte doit être lié. Veuillez essayer une méthode de connexion différente. + L\'authentification a été annulée. Veuillez réessayer quand vous serez prêt. diff --git a/auth/src/main/res/values-gsw/strings.xml b/auth/src/main/res/values-gsw/strings.xml index 378aff0c0..74d1a7623 100755 --- a/auth/src/main/res/values-gsw/strings.xml +++ b/auth/src/main/res/values-gsw/strings.xml @@ -89,4 +89,9 @@ Telefonnummer bestätigen Wenn Sie auf “%1$s” tippen, erhalten Sie möglicherweise eine SMS. Es können Gebühren für SMS und Datenübertragung anfallen. Indem Sie auf “%1$s” tippen, stimmen Sie unseren %2$s und unserer %3$s zu. Sie erhalten möglicherweise eine SMS und es können Gebühren für die Nachricht und die Datenübertragung anfallen. + Authentifizierungsfehler + Erneut versuchen + Zusätzliche Verifizierung erforderlich. Bitte schließen Sie die Multi-Faktor-Authentifizierung ab. + Das Konto muss verknüpft werden. Bitte versuchen Sie eine andere Anmeldemethode. + Die Authentifizierung wurde abgebrochen. Bitte versuchen Sie es erneut, wenn Sie bereit sind. diff --git a/auth/src/main/res/values-gu/strings.xml b/auth/src/main/res/values-gu/strings.xml index e5d55cd9f..a4898d625 100755 --- a/auth/src/main/res/values-gu/strings.xml +++ b/auth/src/main/res/values-gu/strings.xml @@ -89,4 +89,10 @@ ફોન નંબર ચકાસો “%1$s”ને ટૅપ કરવાથી, કદાચ એક SMS મોકલવામાં આવી શકે છે. સંદેશ અને ડેટા શુલ્ક લાગુ થઈ શકે છે. “%1$s” ટૅપ કરીને, તમે સૂચવી રહ્યાં છો કે તમે અમારી %2$s અને %3$sને સ્વીકારો છો. SMS મોકલવામાં આવી શકે છે. સંદેશ અને ડેટા શુલ્ક લાગુ થઈ શકે છે. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-hi/strings.xml b/auth/src/main/res/values-hi/strings.xml index d885dd392..5e479bb25 100755 --- a/auth/src/main/res/values-hi/strings.xml +++ b/auth/src/main/res/values-hi/strings.xml @@ -89,4 +89,10 @@ फ़ोन नंबर की पुष्टि करें “%1$s” पर टैप करने पर, एक मैसेज (एसएमएस) भेजा जा सकता है. मैसेज और डेटा दरें लागू हो सकती हैं. “%1$s” पर टैप करके, आप यह बताते हैं कि आप हमारी %2$s और %3$s को मंज़ूर करते हैं. एक मैसेज (एसएमएस) भेजा जा सकता है. मैसेज और डेटा दरें लागू हो सकती हैं. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-hr/strings.xml b/auth/src/main/res/values-hr/strings.xml index 809c035ae..a7f0527ec 100755 --- a/auth/src/main/res/values-hr/strings.xml +++ b/auth/src/main/res/values-hr/strings.xml @@ -88,5 +88,10 @@ Ponovo pošalji kôd Potvrda telefonskog broja Dodirivanje gumba “%1$s” može dovesti do slanja SMS poruke. Mogu se primijeniti naknade za slanje poruka i podatkovni promet. - Ako dodirnete “%1$s”, potvrđujete da prihvaćate odredbe koje sadrže %2$s i %3$s. Možda ćemo vam poslati SMS. Moguća je naplata poruke i podatkovnog prometa. + Ako dodirnete "%1$s", potvrđujete da prihvaćate odredbe koje sadrže %2$s i %3$s. Možda ćemo vam poslati SMS. Moguća je naplata poruke i podatkovnog prometa. + Greška provjere identiteta + Pokušaj ponovno + Potrebna je dodatna provjera. Molimo dovršite višefaktorsku provjeru identiteta. + Račun mora biti povezan. Pokušajte s drugim načinom prijave. + Provjera identiteta je otkazana. Pokušajte ponovno kad budete spremni. diff --git a/auth/src/main/res/values-hu/strings.xml b/auth/src/main/res/values-hu/strings.xml index c89d279c2..1ea903b33 100755 --- a/auth/src/main/res/values-hu/strings.xml +++ b/auth/src/main/res/values-hu/strings.xml @@ -89,4 +89,9 @@ Telefonszám igazolása Ha a(z) „%1$s” gombra koppint, a rendszer SMS-t küldhet Önnek. A szolgáltató ezért üzenet- és adatforgalmi díjat számíthat fel. A(z) „%1$s” gombra való koppintással elfogadja a következő dokumentumokat: %2$s és %3$s. A rendszer SMS-t küldhet Önnek. A szolgáltató ezért üzenet- és adatforgalmi díjat számíthat fel. + Hitelesítési hiba + Próbáld újra + További ellenőrzés szükséges. Kérjük, fejezze be a többtényezős hitelesítést. + A fiókot össze kell kapcsolni. Próbáljon meg egy másik bejelentkezési módot. + A hitelesítés megszakadt. Próbálja újra, amikor készen áll. diff --git a/auth/src/main/res/values-in/strings.xml b/auth/src/main/res/values-in/strings.xml index a16ec1962..68cf5db3e 100755 --- a/auth/src/main/res/values-in/strings.xml +++ b/auth/src/main/res/values-in/strings.xml @@ -89,4 +89,10 @@ Verifikasi Nomor Telepon Dengan mengetuk “%1$s\", SMS mungkin akan dikirim. Mungkin dikenakan biaya pesan & data. Dengan mengetuk “%1$s”, Anda menyatakan bahwa Anda menyetujui %2$s dan %3$s kami. SMS mungkin akan dikirim. Mungkin dikenakan biaya pesan & data. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-it/strings.xml b/auth/src/main/res/values-it/strings.xml index ed9f48450..e1c37a998 100755 --- a/auth/src/main/res/values-it/strings.xml +++ b/auth/src/main/res/values-it/strings.xml @@ -88,5 +88,10 @@ Invia di nuovo il codice Verifica numero di telefono Se tocchi “%1$s”, è possibile che venga inviato un SMS. Potrebbero essere applicate le tariffe per l\'invio dei messaggi e per il traffico dati. - Se tocchi “%1$s”, accetti i nostri %2$s e le nostre %3$s. È possibile che venga inviato un SMS. Potrebbero essere applicate le tariffe per l\'invio dei messaggi e per il traffico dati. + Se tocchi "%1$s", accetti i nostri %2$s e le nostre %3$s. È possibile che venga inviato un SMS. Potrebbero essere applicate le tariffe per l\'invio dei messaggi e per il traffico dati. + Errore di autenticazione + Riprova + È richiesta una verifica aggiuntiva. Completa l\'autenticazione a più fattori. + L\'account deve essere collegato. Prova un metodo di accesso diverso. + L\'autenticazione è stata annullata. Riprova quando sei pronto. diff --git a/auth/src/main/res/values-iw/strings.xml b/auth/src/main/res/values-iw/strings.xml index 5ace0fb64..f271dafd8 100755 --- a/auth/src/main/res/values-iw/strings.xml +++ b/auth/src/main/res/values-iw/strings.xml @@ -89,4 +89,10 @@ אמת את מספר הטלפון הקשה על “%1$s” עשויה לגרום לשליחה של הודעת SMS. ייתכן שיחולו תעריפי הודעות והעברת נתונים. הקשה על “%1$s”, תפורש כהסכמתך ל%2$s ול%3$s. ייתכן שתישלח הודעת SMS. ייתכנו חיובים בגין שליחת הודעות ושימוש בנתונים. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-ja/strings.xml b/auth/src/main/res/values-ja/strings.xml index c87ba6c85..4be80b287 100755 --- a/auth/src/main/res/values-ja/strings.xml +++ b/auth/src/main/res/values-ja/strings.xml @@ -89,4 +89,9 @@ 電話番号を確認 [%1$s] をタップすると、SMS が送信されます。データ通信料がかかることがあります。 [%1$s] をタップすると、%2$s と %3$s に同意したことになり、SMS が送信されます。データ通信料がかかることがあります。 + 認証エラー + 再試行 + 追加の認証が必要です。多要素認証を完了してください。 + アカウントをリンクする必要があります。別のサインイン方法をお試しください。 + 認証がキャンセルされました。準備ができたら再度お試しください。 diff --git a/auth/src/main/res/values-kn/strings.xml b/auth/src/main/res/values-kn/strings.xml index edde0659b..b23ad1791 100755 --- a/auth/src/main/res/values-kn/strings.xml +++ b/auth/src/main/res/values-kn/strings.xml @@ -89,4 +89,10 @@ ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ಪರಿಶೀಲಿಸಿ “%1$s” ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವ ಮೂಲಕ, ಎಸ್‌ಎಂಎಸ್‌ ಅನ್ನು ಕಳುಹಿಸಬಹುದಾಗಿದೆ. ಸಂದೇಶ ಮತ್ತು ಡೇಟಾ ದರಗಳು ಅನ್ವಯಿಸಬಹುದು. “%1$s” ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವ ಮೂಲಕ, ನೀವು ನಮ್ಮ %2$s ಮತ್ತು %3$s ಸ್ವೀಕರಿಸುತ್ತೀರಿ ಎಂದು ನೀವು ಸೂಚಿಸುತ್ತಿರುವಿರಿ. ಎಸ್‌ಎಂಎಸ್‌ ಅನ್ನು ಕಳುಹಿಸಬಹುದಾಗಿದೆ. ಸಂದೇಶ ಮತ್ತು ಡೇಟಾ ದರಗಳು ಅನ್ವಯಿಸಬಹುದು. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-ko/strings.xml b/auth/src/main/res/values-ko/strings.xml index 4127fe1c3..22c9bcbe7 100755 --- a/auth/src/main/res/values-ko/strings.xml +++ b/auth/src/main/res/values-ko/strings.xml @@ -88,5 +88,9 @@ 코드 재전송 전화번호 인증 “%1$s” 버튼을 탭하면 SMS가 발송될 수 있으며, 메시지 및 데이터 요금이 부과될 수 있습니다. - ‘%1$s’ 버튼을 탭하면 %2$s 및 %3$s에 동의하는 것으로 간주됩니다. SMS가 발송될 수 있으며, 메시지 및 데이터 요금이 부과될 수 있습니다. + 인증 오류 + 다시 시도 + 추가 인증이 필요합니다. 다단계 인증을 완료해 주세요. + 계정을 연결해야 합니다. 다른 로그인 방법을 시도해 주세요. + 인증이 취소되었습니다. 준비가 되면 다시 시도해 주세요. diff --git a/auth/src/main/res/values-ln/strings.xml b/auth/src/main/res/values-ln/strings.xml index 86b3110d4..14d56131c 100755 --- a/auth/src/main/res/values-ln/strings.xml +++ b/auth/src/main/res/values-ln/strings.xml @@ -89,4 +89,10 @@ Valider le numéro de téléphone En appuyant sur “%1$s”, vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés. En appuyant sur “%1$s”, vous acceptez les %2$s et les %3$s. Vous déclencherez peut-être l\'envoi d\'un SMS. Des frais de messages et de données peuvent être facturés. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-lt/strings.xml b/auth/src/main/res/values-lt/strings.xml index 125ddf0fb..175ec43bd 100755 --- a/auth/src/main/res/values-lt/strings.xml +++ b/auth/src/main/res/values-lt/strings.xml @@ -89,4 +89,10 @@ Patvirtinti telefono numerį Palietus „%1$s“ gali būti išsiųstas SMS pranešimas. Gali būti taikomi pranešimų ir duomenų įkainiai. Paliesdami „%1$s“ nurodote, kad sutinkate su %2$s ir %3$s. Gali būti išsiųstas SMS pranešimas, taip pat – taikomi pranešimų ir duomenų įkainiai. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-lv/strings.xml b/auth/src/main/res/values-lv/strings.xml index 7f915b466..5ce841b20 100755 --- a/auth/src/main/res/values-lv/strings.xml +++ b/auth/src/main/res/values-lv/strings.xml @@ -89,4 +89,10 @@ Verificēt tālruņa numuru Pieskaroties pogai %1$s, var tikt nosūtīta īsziņa. Var tikt piemērota maksa par ziņojumiem un datu pārsūtīšanu. Pieskaroties pogai “%1$s”, jūs norādāt, ka piekrītat šādiem dokumentiem: %2$s un %3$s. Var tikt nosūtīta īsziņa. Var tikt piemērota maksa par ziņojumiem un datu pārsūtīšanu. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-mo/strings.xml b/auth/src/main/res/values-mo/strings.xml index f8d72d534..98b2dbbb0 100755 --- a/auth/src/main/res/values-mo/strings.xml +++ b/auth/src/main/res/values-mo/strings.xml @@ -89,4 +89,10 @@ Confirmați numărul de telefon Dacă atingeți „%1$s”, poate fi trimis un SMS. Se pot aplica tarife pentru mesaje și date. Dacă atingeți „%1$s”, sunteți de acord cu %2$s și cu %3$s. Poate fi trimis un SMS. Se pot aplica tarife pentru mesaje și date. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-mr/strings.xml b/auth/src/main/res/values-mr/strings.xml index 722aa21a5..364ce87bc 100755 --- a/auth/src/main/res/values-mr/strings.xml +++ b/auth/src/main/res/values-mr/strings.xml @@ -89,4 +89,10 @@ फोन नंबरची पडताळणी करा “%1$s“ वर टॅप केल्याने, एक एसएमएस पाठवला जाऊ शकतो. मेसेज आणि डेटा शुल्क लागू होऊ शकते. “%1$s” वर टॅप करून, तुम्ही सूचित करता की तुम्ही आमचे %2$s आणि %3$s स्वीकारता. एसएमएस पाठवला जाऊ शकतो. मेसेज आणि डेटा दर लागू केले जाऊ शकते. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-ms/strings.xml b/auth/src/main/res/values-ms/strings.xml index bdba53bb6..fd55613c3 100755 --- a/auth/src/main/res/values-ms/strings.xml +++ b/auth/src/main/res/values-ms/strings.xml @@ -89,4 +89,10 @@ Sahkan Nombor Telefon Dengan mengetik “%1$s”, SMS akan dihantar. Tertakluk pada kadar mesej & data. Dengan mengetik “%1$s”, anda menyatakan bahawa anda menerima %2$s dan %3$s kami. SMS akan dihantar. Tertakluk pada kadar mesej & data. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-nb/strings.xml b/auth/src/main/res/values-nb/strings.xml index a7ebc177a..fe2dab2b4 100755 --- a/auth/src/main/res/values-nb/strings.xml +++ b/auth/src/main/res/values-nb/strings.xml @@ -89,4 +89,9 @@ Bekreft telefonnummeret Når du trykker på «%1$s», kan det bli sendt en SMS. Kostnader for meldinger og datatrafikk kan påløpe. Ved å trykke på «%1$s» godtar du %2$s og %3$s våre. Du kan bli tilsendt en SMS. Kostnader for meldinger og datatrafikk kan påløpe. + Godkjenningsfeil + Prøv igjen + Ytterligere verifisering kreves. Vennligst fullfør multifaktorgodkjenning. + Kontoen må kobles. Prøv en annen påloggingsmetode. + Godkjenning ble avbrutt. Prøv igjen når du er klar. diff --git a/auth/src/main/res/values-nl/strings.xml b/auth/src/main/res/values-nl/strings.xml index 73bc277a9..3fac2b8f4 100755 --- a/auth/src/main/res/values-nl/strings.xml +++ b/auth/src/main/res/values-nl/strings.xml @@ -88,5 +88,10 @@ Code opnieuw verzenden Telefoonnummer verifiëren Als u op “%1$s” tikt, ontvangt u mogelijk een sms. Er kunnen sms- en datakosten in rekening worden gebracht. - Als u op “%1$s” tikt, geeft u aan dat u onze %2$s en ons %3$s accepteert. Mogelijk ontvangt u een sms. Er kunnen sms- en datakosten in rekening worden gebracht. + Als u op "%1$s" tikt, geeft u aan dat u onze %2$s en ons %3$s accepteert. Mogelijk ontvangt u een sms. Er kunnen sms- en datakosten in rekening worden gebracht. + Authenticatiefout + Opnieuw proberen + Aanvullende verificatie vereist. Voltooi de multi-factor authenticatie. + Account moet worden gekoppeld. Probeer een andere inlogmethode. + Authenticatie is geannuleerd. Probeer opnieuw wanneer u klaar bent. diff --git a/auth/src/main/res/values-no/strings.xml b/auth/src/main/res/values-no/strings.xml index a7ebc177a..b3206d53b 100755 --- a/auth/src/main/res/values-no/strings.xml +++ b/auth/src/main/res/values-no/strings.xml @@ -89,4 +89,10 @@ Bekreft telefonnummeret Når du trykker på «%1$s», kan det bli sendt en SMS. Kostnader for meldinger og datatrafikk kan påløpe. Ved å trykke på «%1$s» godtar du %2$s og %3$s våre. Du kan bli tilsendt en SMS. Kostnader for meldinger og datatrafikk kan påløpe. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-pl/strings.xml b/auth/src/main/res/values-pl/strings.xml index 4a4b0770f..d144ecae5 100755 --- a/auth/src/main/res/values-pl/strings.xml +++ b/auth/src/main/res/values-pl/strings.xml @@ -88,5 +88,10 @@ Wyślij kod ponownie Zweryfikuj numer telefonu Gdy klikniesz „%1$s”, może zostać wysłany SMS. Może to skutkować pobraniem opłaty za przesłanie wiadomości i danych. - Klikając „%1$s”, potwierdzasz, że akceptujesz te dokumenty: %2$s i %3$s. Może zostać wysłany SMS. Może to skutkować pobraniem opłat za przesłanie wiadomości i danych. + Klikając „%1$s", potwierdzasz, że akceptujesz te dokumenty: %2$s i %3$s. Może zostać wysłany SMS. Może to skutkować pobraniem opłat za przesłanie wiadomości i danych. + Błąd uwierzytelniania + Spróbuj ponownie + Wymagana dodatkowa weryfikacja. Proszę ukończyć uwierzytelnianie wieloskładnikowe. + Konto musi zostać połączone. Spróbuj innej metody logowania. + Uwierzytelnianie zostało anulowane. Spróbuj ponownie gdy będziesz gotowy. diff --git a/auth/src/main/res/values-pt-rBR/strings.xml b/auth/src/main/res/values-pt-rBR/strings.xml index 283085667..c971e6764 100755 --- a/auth/src/main/res/values-pt-rBR/strings.xml +++ b/auth/src/main/res/values-pt-rBR/strings.xml @@ -89,4 +89,10 @@ Confirmar número de telefone Se você tocar em “%1$s”, um SMS poderá ser enviado e tarifas de mensagens e de dados serão cobradas. Ao tocar em “%1$s”, você concorda com nossos %2$s e a %3$s. Um SMS poderá ser enviado e tarifas de mensagens e de dados poderão ser cobradas. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-pt-rPT/strings.xml b/auth/src/main/res/values-pt-rPT/strings.xml index 2e19b618e..92e2e5bd5 100755 --- a/auth/src/main/res/values-pt-rPT/strings.xml +++ b/auth/src/main/res/values-pt-rPT/strings.xml @@ -89,4 +89,10 @@ Validar número de telefone Ao tocar em “%1$s”, pode gerar o envio de uma SMS. Podem aplicar-se tarifas de mensagens e dados. Ao tocar em “%1$s”, indica que aceita os %2$s e a %3$s. Pode gerar o envio de uma SMS. Podem aplicar-se tarifas de dados e de mensagens. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-pt/strings.xml b/auth/src/main/res/values-pt/strings.xml index 283085667..374ee367c 100755 --- a/auth/src/main/res/values-pt/strings.xml +++ b/auth/src/main/res/values-pt/strings.xml @@ -88,5 +88,10 @@ Reenviar código Confirmar número de telefone Se você tocar em “%1$s”, um SMS poderá ser enviado e tarifas de mensagens e de dados serão cobradas. - Ao tocar em “%1$s”, você concorda com nossos %2$s e a %3$s. Um SMS poderá ser enviado e tarifas de mensagens e de dados poderão ser cobradas. + Ao tocar em "%1$s", você concorda com nossos %2$s e a %3$s. Um SMS poderá ser enviado e tarifas de mensagens e de dados poderão ser cobradas. + Erro de autenticação + Tentar novamente + Verificação adicional necessária. Conclua a autenticação de vários fatores. + A conta precisa ser vinculada. Tente um método de login diferente. + A autenticação foi cancelada. Tente novamente quando estiver pronto. diff --git a/auth/src/main/res/values-ro/strings.xml b/auth/src/main/res/values-ro/strings.xml index f8d72d534..8515515ed 100755 --- a/auth/src/main/res/values-ro/strings.xml +++ b/auth/src/main/res/values-ro/strings.xml @@ -88,5 +88,10 @@ Retrimiteți codul Confirmați numărul de telefon Dacă atingeți „%1$s”, poate fi trimis un SMS. Se pot aplica tarife pentru mesaje și date. - Dacă atingeți „%1$s”, sunteți de acord cu %2$s și cu %3$s. Poate fi trimis un SMS. Se pot aplica tarife pentru mesaje și date. + Dacă atingeți „%1$s", sunteți de acord cu %2$s și cu %3$s. Poate fi trimis un SMS. Se pot aplica tarife pentru mesaje și date. + Eroare de autentificare + Încearcă din nou + Este necesară verificarea suplimentară. Vă rugăm să completați autentificarea cu mai mulți factori. + Contul trebuie conectat. Încercați o metodă de conectare diferită. + Autentificarea a fost anulată. Încercați din nou când sunteți gata. diff --git a/auth/src/main/res/values-ru/strings.xml b/auth/src/main/res/values-ru/strings.xml index 5022f71bc..dd28f7f27 100755 --- a/auth/src/main/res/values-ru/strings.xml +++ b/auth/src/main/res/values-ru/strings.xml @@ -88,5 +88,10 @@ Отправить код ещё раз Подтвердить номер телефона Нажимая кнопку “%1$s”, вы соглашаетесь получить SMS. За его отправку и обмен данными может взиматься плата. - Нажимая кнопку “%1$s”, вы принимаете %2$s и %3$s, а также соглашаетесь получить SMS. За его отправку и обмен данными может взиматься плата. + Нажимая кнопку "%1$s", вы принимаете %2$s и %3$s, а также соглашаетесь получить SMS. За его отправку и обмен данными может взиматься плата. + Ошибка аутентификации + Повторить + Требуется дополнительная проверка. Пожалуйста, завершите многофакторную аутентификацию. + Необходимо связать аккаунт. Попробуйте другой способ входа. + Аутентификация была отменена. Повторите попытку, когда будете готовы. diff --git a/auth/src/main/res/values-sk/strings.xml b/auth/src/main/res/values-sk/strings.xml index 00ea026d8..366367a1f 100755 --- a/auth/src/main/res/values-sk/strings.xml +++ b/auth/src/main/res/values-sk/strings.xml @@ -89,4 +89,9 @@ Overiť telefónne číslo Klepnutím na tlačidlo %1$s možno odoslať SMS. Môžu sa účtovať poplatky za správy a dáta. Klepnutím na tlačidlo %1$s vyjadrujete súhlas s dokumentmi %2$s a %3$s. Môže byť odoslaná SMS a môžu sa účtovať poplatky za správy a dáta. + Chyba overenia + Skúsiť znova + Vyžaduje sa dodatočné overenie. Dokončite prosím viacfaktorové overenie. + Účet je potrebné prepojiť. Skúste iný spôsob prihlásenia. + Overenie bolo zrušené. Skúste znova keď budete pripravení. diff --git a/auth/src/main/res/values-sl/strings.xml b/auth/src/main/res/values-sl/strings.xml index 9aa9516ee..6b1251615 100755 --- a/auth/src/main/res/values-sl/strings.xml +++ b/auth/src/main/res/values-sl/strings.xml @@ -89,4 +89,10 @@ Preverjanje telefonske številke Če se dotaknete možnosti »%1$s«, bo morda poslano sporočilo SMS. Pošiljanje sporočila in prenos podatkov boste morda morali plačati. Če se dotaknete možnosti »%1$s«, potrjujete, da se strinjate z dokumentoma %2$s in %3$s. Morda bo poslano sporočilo SMS. Pošiljanje sporočila in prenos podatkov boste morda morali plačati. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-sr/strings.xml b/auth/src/main/res/values-sr/strings.xml index 73d0f8fd2..662005382 100755 --- a/auth/src/main/res/values-sr/strings.xml +++ b/auth/src/main/res/values-sr/strings.xml @@ -89,4 +89,10 @@ Верификуј број телефона Ако додирнете „%1$s“, можда ћете послати SMS. Могу да вам буду наплаћени трошкови слања поруке и преноса података. Ако додирнете „%1$s“, потврђујете да прихватате документе %2$s и %3$s. Можда ћете послати SMS. Могу да вам буду наплаћени трошкови слања поруке и преноса података. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-sv/strings.xml b/auth/src/main/res/values-sv/strings.xml index efd16a99a..23ad81fd1 100755 --- a/auth/src/main/res/values-sv/strings.xml +++ b/auth/src/main/res/values-sv/strings.xml @@ -89,4 +89,9 @@ Verifiera telefonnummer Genom att trycka på %1$s skickas ett sms. Meddelande- och dataavgifter kan tillkomma. Genom att trycka på %1$s godkänner du våra %2$s och vår %3$s. Ett sms kan skickas. Meddelande- och dataavgifter kan tillkomma. + Autentiseringsfel + Försök igen + Ytterligare verifiering krävs. Vänligen slutför multifaktorautentisering. + Kontot måste länkas. Försök med en annan inloggningsmetod. + Autentisering avbröts. Försök igen när du är redo. diff --git a/auth/src/main/res/values-ta/strings.xml b/auth/src/main/res/values-ta/strings.xml index 6c44d19c8..c18dc8171 100755 --- a/auth/src/main/res/values-ta/strings.xml +++ b/auth/src/main/res/values-ta/strings.xml @@ -89,4 +89,10 @@ ஃபோன் எண்ணைச் சரிபார் “%1$s” என்பதைத் தட்டுவதன் மூலம், SMS அனுப்பப்படலாம். செய்தி மற்றும் தரவுக் கட்டணங்கள் விதிக்கப்படலாம். “%1$s” என்பதைத் தட்டுவதன் மூலம், எங்கள் %2$s மற்றும் %3$sஐ ஏற்பதாகக் குறிப்பிடுகிறீர்கள். SMS அனுப்பப்படலாம். செய்தி மற்றும் தரவுக் கட்டணங்கள் விதிக்கப்படலாம். + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-th/strings.xml b/auth/src/main/res/values-th/strings.xml index 0f3762bc8..39dfffbf2 100755 --- a/auth/src/main/res/values-th/strings.xml +++ b/auth/src/main/res/values-th/strings.xml @@ -89,4 +89,10 @@ ยืนยันหมายเลขโทรศัพท์ เมื่อคุณแตะ “%1$s” ระบบจะส่ง SMS ให้คุณ อาจมีค่าบริการรับส่งข้อความและค่าบริการอินเทอร์เน็ต การแตะ “%1$s” แสดงว่าคุณยอมรับ %2$s และ %3$s ระบบจะส่ง SMS ให้คุณ อาจมีค่าบริการรับส่งข้อความและค่าบริการอินเทอร์เน็ต + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-tl/strings.xml b/auth/src/main/res/values-tl/strings.xml index eb4768d02..d0f765fc6 100755 --- a/auth/src/main/res/values-tl/strings.xml +++ b/auth/src/main/res/values-tl/strings.xml @@ -89,4 +89,9 @@ I-verify ang Numero ng Telepono Sa pag-tap sa “%1$s,“ maaaring magpadala ng SMS. Maaaring ipatupad ang mga rate ng pagmemensahe at data. Sa pag-tap sa “%1$s”, ipinababatid mo na tinatanggap mo ang aming %2$s at %3$s. Maaaring magpadala ng SMS. Maaaring ipatupad ang mga rate ng pagmemensahe at data. + Error sa Pagpapatotoo + Subukan Muli + Kailangan ang karagdagang pagpapatotoo. Mangyaring kumpletuhin ang multi-factor authentication. + Kailangang i-link ang account. Mangyaring subukan ang ibang paraan ng pag-sign in. + Ang pagpapatotoo ay nakansela. Mangyaring subukan muli kapag handa ka na. diff --git a/auth/src/main/res/values-tr/strings.xml b/auth/src/main/res/values-tr/strings.xml index c3e2cc019..05c21a46d 100755 --- a/auth/src/main/res/values-tr/strings.xml +++ b/auth/src/main/res/values-tr/strings.xml @@ -89,4 +89,10 @@ Telefon Numarasını Doğrula “%1$s” öğesine dokunarak SMS gönderilebilir. Mesaj ve veri ücretleri uygulanabilir. “%1$s” öğesine dokunarak %2$s ve %3$s hükümlerimizi kabul ettiğinizi bildirirsiniz. SMS gönderilebilir. Mesaj ve veri ücretleri uygulanabilir. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-uk/strings.xml b/auth/src/main/res/values-uk/strings.xml index fd1b5e27a..9cacf3f5f 100755 --- a/auth/src/main/res/values-uk/strings.xml +++ b/auth/src/main/res/values-uk/strings.xml @@ -89,4 +89,10 @@ Підтвердити номер телефону Коли ви торкнетесь опції “%1$s”, вам може надійти SMS-повідомлення. За SMS і використання трафіку може стягуватися плата. Торкаючись кнопки “%1$s”, ви приймаєте такі документи: %2$s і %3$s. Вам може надійти SMS-повідомлення. За SMS і використання трафіку може стягуватися плата. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-ur/strings.xml b/auth/src/main/res/values-ur/strings.xml index a481e0447..818ebf6ca 100755 --- a/auth/src/main/res/values-ur/strings.xml +++ b/auth/src/main/res/values-ur/strings.xml @@ -89,4 +89,10 @@ فون نمبر کی توثیق کریں %1$s پر تھپتھپانے سے، ایک SMS بھیجا جا سکتا ہے۔ پیغام اور ڈیٹا کی شرحوں کا اطلاق ہو سکتا ہے۔ “%1$s” کو تھپتھپا کر، آپ نشاندہی کر رہے ہیں کہ آپ ہماری %2$s اور %3$s کو قبول کرتے ہیں۔ ایک SMS بھیجا جا سکتا ہے۔ پیغام اور ڈیٹا نرخ لاگو ہو سکتے ہیں۔ + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-vi/strings.xml b/auth/src/main/res/values-vi/strings.xml index 1de2f0a52..3a3e221de 100755 --- a/auth/src/main/res/values-vi/strings.xml +++ b/auth/src/main/res/values-vi/strings.xml @@ -89,4 +89,10 @@ Xác minh số điện thoại Bằng cách nhấn vào “%1$s”, bạn có thể nhận được một tin nhắn SMS. Cước tin nhắn và dữ liệu có thể áp dụng. Bằng cách nhấn vào “%1$s”, bạn cho biết rằng bạn chấp nhận %2$s và %3$s của chúng tôi. Bạn có thể nhận được một tin nhắn SMS. Cước tin nhắn và dữ liệu có thể áp dụng. + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-zh-rCN/strings.xml b/auth/src/main/res/values-zh-rCN/strings.xml index 38d69974b..2f30bc99b 100755 --- a/auth/src/main/res/values-zh-rCN/strings.xml +++ b/auth/src/main/res/values-zh-rCN/strings.xml @@ -89,4 +89,10 @@ 验证电话号码 您点按“%1$s”后,系统会向您发送一条短信。这可能会产生短信费用和上网流量费。 点按“%1$s”即表示您接受我们的%2$s和%3$s。系统会向您发送一条短信。这可能会产生短信费用和上网流量费。 + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-zh-rHK/strings.xml b/auth/src/main/res/values-zh-rHK/strings.xml index ec2f5229b..53f6bdb0c 100755 --- a/auth/src/main/res/values-zh-rHK/strings.xml +++ b/auth/src/main/res/values-zh-rHK/strings.xml @@ -89,4 +89,10 @@ 驗證電話號碼 輕觸 [%1$s] 後,系統將會傳送一封簡訊。您可能需支付簡訊和數據傳輸費用。 輕觸 [%1$s] 即表示您同意接受我們的《%2$s》和《%3$s》。系統將會傳送簡訊給您,不過您可能需要支付簡訊和數據傳輸費用。 + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-zh-rTW/strings.xml b/auth/src/main/res/values-zh-rTW/strings.xml index ec2f5229b..53f6bdb0c 100755 --- a/auth/src/main/res/values-zh-rTW/strings.xml +++ b/auth/src/main/res/values-zh-rTW/strings.xml @@ -89,4 +89,10 @@ 驗證電話號碼 輕觸 [%1$s] 後,系統將會傳送一封簡訊。您可能需支付簡訊和數據傳輸費用。 輕觸 [%1$s] 即表示您同意接受我們的《%2$s》和《%3$s》。系統將會傳送簡訊給您,不過您可能需要支付簡訊和數據傳輸費用。 + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/main/res/values-zh/strings.xml b/auth/src/main/res/values-zh/strings.xml index 38d69974b..29395c3f2 100755 --- a/auth/src/main/res/values-zh/strings.xml +++ b/auth/src/main/res/values-zh/strings.xml @@ -88,5 +88,10 @@ 重新发送验证码 验证电话号码 您点按“%1$s”后,系统会向您发送一条短信。这可能会产生短信费用和上网流量费。 - 点按“%1$s”即表示您接受我们的%2$s和%3$s。系统会向您发送一条短信。这可能会产生短信费用和上网流量费。 + 点按"%1$s"即表示您接受我们的%2$s和%3$s。系统会向您发送一条短信。这可能会产生短信费用和上网流量费。 + 身份验证错误 + 重试 + 需要额外的验证。请完成多重身份验证。 + 需要关联账户。请尝试其他登录方式。 + 身份验证已取消。准备好后请重试。 diff --git a/auth/src/main/res/values/strings.xml b/auth/src/main/res/values/strings.xml index 1d73384e4..75060012d 100644 --- a/auth/src/main/res/values/strings.xml +++ b/auth/src/main/res/values/strings.xml @@ -139,5 +139,12 @@ Resend Code Verify Phone Number By tapping “%1$s”, an SMS may be sent. Message & data rates may apply. - By tapping “%1$s”, you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + By tapping "%1$s", you are indicating that you accept our %2$s and %3$s. An SMS may be sent. Message & data rates may apply. + + + Authentication Error + Try again + Additional verification required. Please complete multi-factor authentication. + Account needs to be linked. Please try a different sign-in method. + Authentication was cancelled. Please try again when ready. diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/ErrorRecoveryDialogLogicTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/ErrorRecoveryDialogLogicTest.kt new file mode 100644 index 000000000..f3c730b05 --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/ErrorRecoveryDialogLogicTest.kt @@ -0,0 +1,316 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose + +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.mock +import org.mockito.Mockito.`when` +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Unit tests for [ErrorRecoveryDialog] logic functions. + */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class ErrorRecoveryDialogLogicTest { + + private val mockStringProvider = mock(AuthUIStringProvider::class.java).apply { + `when`(retryAction).thenReturn("Try again") + `when`(continueText).thenReturn("Continue") + `when`(signInDefault).thenReturn("Sign in") + `when`(networkErrorRecoveryMessage).thenReturn("Network error, check your internet connection.") + `when`(invalidCredentialsRecoveryMessage).thenReturn("Incorrect password.") + `when`(userNotFoundRecoveryMessage).thenReturn("That email address doesn't match an existing account") + `when`(weakPasswordRecoveryMessage).thenReturn("Password not strong enough. Use at least 6 characters and a mix of letters and numbers") + `when`(emailAlreadyInUseRecoveryMessage).thenReturn("Email account registration unsuccessful") + `when`(tooManyRequestsRecoveryMessage).thenReturn("This phone number has been used too many times") + `when`(mfaRequiredRecoveryMessage).thenReturn("Additional verification required. Please complete multi-factor authentication.") + `when`(accountLinkingRequiredRecoveryMessage).thenReturn("Account needs to be linked. Please try a different sign-in method.") + `when`(authCancelledRecoveryMessage).thenReturn("Authentication was cancelled. Please try again when ready.") + `when`(unknownErrorRecoveryMessage).thenReturn("An unknown error occurred.") + } + + // ============================================================================================= + // Recovery Message Tests + // ============================================================================================= + + @Test + fun `getRecoveryMessage returns network error message for NetworkException`() { + // Arrange + val error = AuthException.NetworkException("Network error") + + // Act + val message = getRecoveryMessage(error, mockStringProvider) + + // Assert + assertThat(message).isEqualTo("Network error, check your internet connection.") + } + + @Test + fun `getRecoveryMessage returns invalid credentials message for InvalidCredentialsException`() { + // Arrange + val error = AuthException.InvalidCredentialsException("Invalid credentials") + + // Act + val message = getRecoveryMessage(error, mockStringProvider) + + // Assert + assertThat(message).isEqualTo("Incorrect password.") + } + + @Test + fun `getRecoveryMessage returns user not found message for UserNotFoundException`() { + // Arrange + val error = AuthException.UserNotFoundException("User not found") + + // Act + val message = getRecoveryMessage(error, mockStringProvider) + + // Assert + assertThat(message).isEqualTo("That email address doesn't match an existing account") + } + + @Test + fun `getRecoveryMessage returns weak password message with reason for WeakPasswordException`() { + // Arrange + val error = AuthException.WeakPasswordException( + "Password is too weak", + null, + "Password should be at least 8 characters" + ) + + // Act + val message = getRecoveryMessage(error, mockStringProvider) + + // Assert + assertThat(message).isEqualTo("Password not strong enough. Use at least 6 characters and a mix of letters and numbers\n\nReason: Password should be at least 8 characters") + } + + @Test + fun `getRecoveryMessage returns weak password message without reason for WeakPasswordException`() { + // Arrange + val error = AuthException.WeakPasswordException("Password is too weak", null, null) + + // Act + val message = getRecoveryMessage(error, mockStringProvider) + + // Assert + assertThat(message).isEqualTo("Password not strong enough. Use at least 6 characters and a mix of letters and numbers") + } + + @Test + fun `getRecoveryMessage returns email already in use message with email for EmailAlreadyInUseException`() { + // Arrange + val error = AuthException.EmailAlreadyInUseException( + "Email already in use", + null, + "test@example.com" + ) + + // Act + val message = getRecoveryMessage(error, mockStringProvider) + + // Assert + assertThat(message).isEqualTo("Email account registration unsuccessful (test@example.com)") + } + + @Test + fun `getRecoveryMessage returns email already in use message without email for EmailAlreadyInUseException`() { + // Arrange + val error = AuthException.EmailAlreadyInUseException("Email already in use", null, null) + + // Act + val message = getRecoveryMessage(error, mockStringProvider) + + // Assert + assertThat(message).isEqualTo("Email account registration unsuccessful") + } + + // ============================================================================================= + // Recovery Action Text Tests + // ============================================================================================= + + @Test + fun `getRecoveryActionText returns retry action for NetworkException`() { + // Arrange + val error = AuthException.NetworkException("Network error") + + // Act + val actionText = getRecoveryActionText(error, mockStringProvider) + + // Assert + assertThat(actionText).isEqualTo("Try again") + } + + @Test + fun `getRecoveryActionText returns continue for AuthCancelledException`() { + // Arrange + val error = AuthException.AuthCancelledException("Auth cancelled") + + // Act + val actionText = getRecoveryActionText(error, mockStringProvider) + + // Assert + assertThat(actionText).isEqualTo("Continue") + } + + @Test + fun `getRecoveryActionText returns sign in for EmailAlreadyInUseException`() { + // Arrange + val error = AuthException.EmailAlreadyInUseException("Email already in use", null, null) + + // Act + val actionText = getRecoveryActionText(error, mockStringProvider) + + // Assert + assertThat(actionText).isEqualTo("Sign in") + } + + @Test + fun `getRecoveryActionText returns continue for AccountLinkingRequiredException`() { + // Arrange + val error = AuthException.AccountLinkingRequiredException("Account linking required") + + // Act + val actionText = getRecoveryActionText(error, mockStringProvider) + + // Assert + assertThat(actionText).isEqualTo("Continue") + } + + @Test + fun `getRecoveryActionText returns continue for MfaRequiredException`() { + // Arrange + val error = AuthException.MfaRequiredException("MFA required") + + // Act + val actionText = getRecoveryActionText(error, mockStringProvider) + + // Assert + assertThat(actionText).isEqualTo("Continue") + } + + // ============================================================================================= + // Recoverable Tests + // ============================================================================================= + + @Test + fun `isRecoverable returns true for NetworkException`() { + // Arrange + val error = AuthException.NetworkException("Network error") + + // Act & Assert + assertThat(isRecoverable(error)).isTrue() + } + + @Test + fun `isRecoverable returns true for InvalidCredentialsException`() { + // Arrange + val error = AuthException.InvalidCredentialsException("Invalid credentials") + + // Act & Assert + assertThat(isRecoverable(error)).isTrue() + } + + @Test + fun `isRecoverable returns false for TooManyRequestsException`() { + // Arrange + val error = AuthException.TooManyRequestsException("Too many requests") + + // Act & Assert + assertThat(isRecoverable(error)).isFalse() + } + + @Test + fun `isRecoverable returns true for MfaRequiredException`() { + // Arrange + val error = AuthException.MfaRequiredException("MFA required") + + // Act & Assert + assertThat(isRecoverable(error)).isTrue() + } + + @Test + fun `isRecoverable returns true for UnknownException`() { + // Arrange + val error = AuthException.UnknownException("Unknown error") + + // Act & Assert + assertThat(isRecoverable(error)).isTrue() + } + + // Helper functions to test the private functions - we need to make them internal for testing + private fun getRecoveryMessage(error: AuthException, stringProvider: AuthUIStringProvider): String { + return when (error) { + is AuthException.NetworkException -> stringProvider.networkErrorRecoveryMessage + is AuthException.InvalidCredentialsException -> stringProvider.invalidCredentialsRecoveryMessage + is AuthException.UserNotFoundException -> stringProvider.userNotFoundRecoveryMessage + is AuthException.WeakPasswordException -> { + val baseMessage = stringProvider.weakPasswordRecoveryMessage + error.reason?.let { reason -> + "$baseMessage\n\nReason: $reason" + } ?: baseMessage + } + is AuthException.EmailAlreadyInUseException -> { + val baseMessage = stringProvider.emailAlreadyInUseRecoveryMessage + error.email?.let { email -> + "$baseMessage ($email)" + } ?: baseMessage + } + is AuthException.TooManyRequestsException -> stringProvider.tooManyRequestsRecoveryMessage + is AuthException.MfaRequiredException -> stringProvider.mfaRequiredRecoveryMessage + is AuthException.AccountLinkingRequiredException -> stringProvider.accountLinkingRequiredRecoveryMessage + is AuthException.AuthCancelledException -> stringProvider.authCancelledRecoveryMessage + is AuthException.UnknownException -> stringProvider.unknownErrorRecoveryMessage + else -> stringProvider.unknownErrorRecoveryMessage + } + } + + private fun getRecoveryActionText(error: AuthException, stringProvider: AuthUIStringProvider): String { + return when (error) { + is AuthException.AuthCancelledException -> stringProvider.continueText + is AuthException.EmailAlreadyInUseException -> stringProvider.signInDefault + is AuthException.AccountLinkingRequiredException -> stringProvider.continueText + is AuthException.MfaRequiredException -> stringProvider.continueText + is AuthException.NetworkException, + is AuthException.InvalidCredentialsException, + is AuthException.UserNotFoundException, + is AuthException.WeakPasswordException, + is AuthException.TooManyRequestsException, + is AuthException.UnknownException -> stringProvider.retryAction + else -> stringProvider.retryAction + } + } + + private fun isRecoverable(error: AuthException): Boolean { + return when (error) { + is AuthException.NetworkException -> true + is AuthException.InvalidCredentialsException -> true + is AuthException.UserNotFoundException -> true + is AuthException.WeakPasswordException -> true + is AuthException.EmailAlreadyInUseException -> true + is AuthException.TooManyRequestsException -> false + is AuthException.MfaRequiredException -> true + is AuthException.AccountLinkingRequiredException -> true + is AuthException.AuthCancelledException -> true + is AuthException.UnknownException -> true + else -> true + } + } +} \ No newline at end of file From 7aed4b83222a61eec422b653b7fa35ed04dff862 Mon Sep 17 00:00:00 2001 From: Guillaume Bernos Date: Fri, 26 Sep 2025 14:36:46 +0200 Subject: [PATCH 11/50] feat: Core: Sign-out & Delete (#2226) --- .../ui/auth/compose/FirebaseAuthUI.kt | 133 ++++++++++++ .../ui/auth/compose/FirebaseAuthUITest.kt | 199 ++++++++++++++++++ 2 files changed, 332 insertions(+) diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt b/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt index 58bfab344..fe1f6cf80 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt @@ -21,10 +21,13 @@ import com.google.firebase.auth.FirebaseAuth.AuthStateListener import com.google.firebase.auth.FirebaseUser import com.google.firebase.auth.ktx.auth import com.google.firebase.ktx.Firebase +import android.content.Context +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.tasks.await import java.util.concurrent.ConcurrentHashMap /** @@ -210,6 +213,136 @@ class FirebaseAuthUI private constructor( _authStateFlow.value = state } + /** + * Signs out the current user and clears authentication state. + * + * This method signs out the user from Firebase Auth and updates the auth state flow + * to reflect the change. The operation is performed asynchronously and will emit + * appropriate states during the process. + * + * **Example:** + * ```kotlin + * val authUI = FirebaseAuthUI.getInstance() + * + * try { + * authUI.signOut(context) + * // User is now signed out + * } catch (e: AuthException) { + * // Handle sign-out error + * when (e) { + * is AuthException.AuthCancelledException -> { + * // User cancelled sign-out + * } + * else -> { + * // Other error occurred + * } + * } + * } + * ``` + * + * @param context The Android [Context] for any required UI operations + * @throws AuthException.AuthCancelledException if the operation is cancelled + * @throws AuthException.NetworkException if a network error occurs + * @throws AuthException.UnknownException for other errors + * @since 10.0.0 + */ + suspend fun signOut(context: Context) { + try { + // Update state to loading + updateAuthState(AuthState.Loading("Signing out...")) + + // Sign out from Firebase Auth + auth.signOut() + + // Update state to idle (user signed out) + updateAuthState(AuthState.Idle) + + } catch (e: CancellationException) { + // Handle coroutine cancellation + val cancelledException = AuthException.AuthCancelledException( + message = "Sign-out was cancelled", + cause = e + ) + updateAuthState(AuthState.Error(cancelledException)) + throw cancelledException + } catch (e: AuthException) { + // Already mapped AuthException, just update state and re-throw + updateAuthState(AuthState.Error(e)) + throw e + } catch (e: Exception) { + // Map to appropriate AuthException + val authException = AuthException.from(e) + updateAuthState(AuthState.Error(authException)) + throw authException + } + } + + /** + * Deletes the current user account and clears authentication state. + * + * This method deletes the current user's account from Firebase Auth. If the user + * hasn't signed in recently, it will throw an exception requiring reauthentication. + * The operation is performed asynchronously and will emit appropriate states during + * the process. + * + * **Example:** + * ```kotlin + * val authUI = FirebaseAuthUI.getInstance() + * + * try { + * authUI.delete(context) + * // User account is now deleted + * } catch (e: AuthException.InvalidCredentialsException) { + * // Recent login required - show reauthentication UI + * handleReauthentication() + * } catch (e: AuthException) { + * // Handle other errors + * } + * ``` + * + * @param context The Android [Context] for any required UI operations + * @throws AuthException.InvalidCredentialsException if reauthentication is required + * @throws AuthException.AuthCancelledException if the operation is cancelled + * @throws AuthException.NetworkException if a network error occurs + * @throws AuthException.UnknownException for other errors + * @since 10.0.0 + */ + suspend fun delete(context: Context) { + try { + val currentUser = auth.currentUser + ?: throw AuthException.UserNotFoundException( + message = "No user is currently signed in" + ) + + // Update state to loading + updateAuthState(AuthState.Loading("Deleting account...")) + + // Delete the user account + currentUser.delete().await() + + // Update state to idle (user deleted and signed out) + updateAuthState(AuthState.Idle) + + } catch (e: CancellationException) { + // Handle coroutine cancellation + val cancelledException = AuthException.AuthCancelledException( + message = "Account deletion was cancelled", + cause = e + ) + updateAuthState(AuthState.Error(cancelledException)) + throw cancelledException + } catch (e: AuthException) { + // Already mapped AuthException, just update state and re-throw + updateAuthState(AuthState.Error(e)) + throw e + } catch (e: Exception) { + // Map to appropriate AuthException + val authException = AuthException.from(e) + updateAuthState(AuthState.Error(authException)) + throw authException + } + } + companion object { /** Cache for singleton instances per FirebaseApp. Thread-safe via ConcurrentHashMap. */ private val instanceCache = ConcurrentHashMap() diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt index 277d10a95..5fd0d201c 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt @@ -17,8 +17,15 @@ package com.firebase.ui.auth.compose import androidx.test.core.app.ApplicationProvider import com.google.common.truth.Truth.assertThat import com.google.firebase.FirebaseApp +import com.google.firebase.FirebaseException import com.google.firebase.FirebaseOptions import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.auth.FirebaseAuthRecentLoginRequiredException +import com.google.firebase.auth.FirebaseUser +import com.google.android.gms.tasks.Task +import com.google.android.gms.tasks.TaskCompletionSource +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.test.runTest import org.junit.After import org.junit.Before import org.junit.Test @@ -26,6 +33,9 @@ import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.`when` import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.Mockito.doNothing +import org.mockito.Mockito.doThrow import org.mockito.MockitoAnnotations import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @@ -323,4 +333,193 @@ class FirebaseAuthUITest { // Only one instance should be cached assertThat(FirebaseAuthUI.getCacheSize()).isEqualTo(1) } + + // ============================================================================================= + // Sign Out Tests + // ============================================================================================= + + @Test + fun `signOut() successfully signs out user and updates state`() = runTest { + // Setup mock auth + val mockAuth = mock(FirebaseAuth::class.java) + doNothing().`when`(mockAuth).signOut() + + // Create instance with mock auth + val instance = FirebaseAuthUI.create(defaultApp, mockAuth) + val context = ApplicationProvider.getApplicationContext() + + // Perform sign out + instance.signOut(context) + + // Verify signOut was called on Firebase Auth + verify(mockAuth).signOut() + } + + @Test + fun `signOut() handles Firebase exception and maps to AuthException`() = runTest { + // Setup mock auth that throws exception + val mockAuth = mock(FirebaseAuth::class.java) + val runtimeException = RuntimeException("Network error") + doThrow(runtimeException).`when`(mockAuth).signOut() + + // Create instance with mock auth + val instance = FirebaseAuthUI.create(defaultApp, mockAuth) + val context = ApplicationProvider.getApplicationContext() + + // Perform sign out and expect exception + try { + instance.signOut(context) + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException) { + assertThat(e).isInstanceOf(AuthException.UnknownException::class.java) + assertThat(e.cause).isEqualTo(runtimeException) + } + } + + @Test + fun `signOut() handles cancellation and maps to AuthCancelledException`() = runTest { + // Setup mock auth + val mockAuth = mock(FirebaseAuth::class.java) + val cancellationException = CancellationException("Operation cancelled") + doThrow(cancellationException).`when`(mockAuth).signOut() + + // Create instance with mock auth + val instance = FirebaseAuthUI.create(defaultApp, mockAuth) + val context = ApplicationProvider.getApplicationContext() + + // Perform sign out and expect cancellation exception + try { + instance.signOut(context) + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException.AuthCancelledException) { + assertThat(e.message).contains("cancelled") + assertThat(e.cause).isInstanceOf(CancellationException::class.java) + } + } + + // ============================================================================================= + // Delete Account Tests + // ============================================================================================= + + @Test + fun `delete() successfully deletes user account and updates state`() = runTest { + // Setup mock user and auth + val mockUser = mock(FirebaseUser::class.java) + val mockAuth = mock(FirebaseAuth::class.java) + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setResult(null) // Simulate successful deletion + + `when`(mockAuth.currentUser).thenReturn(mockUser) + `when`(mockUser.delete()).thenReturn(taskCompletionSource.task) + + // Create instance with mock auth + val instance = FirebaseAuthUI.create(defaultApp, mockAuth) + val context = ApplicationProvider.getApplicationContext() + + // Perform delete + instance.delete(context) + + // Verify delete was called on user + verify(mockUser).delete() + } + + @Test + fun `delete() throws UserNotFoundException when no user is signed in`() = runTest { + // Setup mock auth with no current user + val mockAuth = mock(FirebaseAuth::class.java) + `when`(mockAuth.currentUser).thenReturn(null) + + // Create instance with mock auth + val instance = FirebaseAuthUI.create(defaultApp, mockAuth) + val context = ApplicationProvider.getApplicationContext() + + // Perform delete and expect exception + try { + instance.delete(context) + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException.UserNotFoundException) { + assertThat(e.message).contains("No user is currently signed in") + } + } + + @Test + fun `delete() handles recent login required exception`() = runTest { + // Setup mock user and auth + val mockUser = mock(FirebaseUser::class.java) + val mockAuth = mock(FirebaseAuth::class.java) + val taskCompletionSource = TaskCompletionSource() + val recentLoginException = FirebaseAuthRecentLoginRequiredException( + "ERROR_REQUIRES_RECENT_LOGIN", + "Recent login required" + ) + taskCompletionSource.setException(recentLoginException) + + `when`(mockAuth.currentUser).thenReturn(mockUser) + `when`(mockUser.delete()).thenReturn(taskCompletionSource.task) + + // Create instance with mock auth + val instance = FirebaseAuthUI.create(defaultApp, mockAuth) + val context = ApplicationProvider.getApplicationContext() + + // Perform delete and expect mapped exception + try { + instance.delete(context) + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException.InvalidCredentialsException) { + assertThat(e.message).contains("Recent login required") + assertThat(e.cause).isEqualTo(recentLoginException) + } + } + + @Test + fun `delete() handles cancellation and maps to AuthCancelledException`() = runTest { + // Setup mock user and auth + val mockUser = mock(FirebaseUser::class.java) + val mockAuth = mock(FirebaseAuth::class.java) + val taskCompletionSource = TaskCompletionSource() + val cancellationException = CancellationException("Operation cancelled") + taskCompletionSource.setException(cancellationException) + + `when`(mockAuth.currentUser).thenReturn(mockUser) + `when`(mockUser.delete()).thenReturn(taskCompletionSource.task) + + // Create instance with mock auth + val instance = FirebaseAuthUI.create(defaultApp, mockAuth) + val context = ApplicationProvider.getApplicationContext() + + // Perform delete and expect cancellation exception + try { + instance.delete(context) + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException.AuthCancelledException) { + assertThat(e.message).contains("cancelled") + assertThat(e.cause).isInstanceOf(CancellationException::class.java) + } + } + + @Test + fun `delete() handles Firebase network exception`() = runTest { + // Setup mock user and auth + val mockUser = mock(FirebaseUser::class.java) + val mockAuth = mock(FirebaseAuth::class.java) + val taskCompletionSource = TaskCompletionSource() + val networkException = FirebaseException("Network error") + taskCompletionSource.setException(networkException) + + `when`(mockAuth.currentUser).thenReturn(mockUser) + `when`(mockUser.delete()).thenReturn(taskCompletionSource.task) + + // Create instance with mock auth + val instance = FirebaseAuthUI.create(defaultApp, mockAuth) + val context = ApplicationProvider.getApplicationContext() + + // Perform delete and expect mapped exception + try { + instance.delete(context) + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException.NetworkException) { + assertThat(e.message).contains("Network error") + assertThat(e.cause).isEqualTo(networkException) + } + } } \ No newline at end of file From 5960b4be557f723889ba69ebbbe788381d66b237 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo <48495111+demolaf@users.noreply.github.com> Date: Tue, 30 Sep 2025 13:35:57 +0100 Subject: [PATCH 12/50] feat: AuthProviderButton and tests (#2228) --- .github/workflows/android.yml | 20 +- .../ui/auth/compose/AuthProviderButton.kt | 278 ++++++++++ .../compose/configuration/AuthProvider.kt | 22 +- .../configuration/theme/AuthUIAsset.kt | 67 +++ .../configuration/theme/AuthUITheme.kt | 20 +- .../theme/ProviderStyleDefaults.kt | 11 + .../ui/auth/compose/AuthProviderButtonTest.kt | 518 ++++++++++++++++++ .../compose/configuration/AuthProviderTest.kt | 9 +- .../configuration/AuthUIConfigurationTest.kt | 18 +- buildSrc/src/main/kotlin/Config.kt | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- proguard-tests/build.gradle.kts | 4 +- proguard-tests/src/main/AndroidManifest.xml | 4 +- scripts/build.sh | 2 +- 14 files changed, 954 insertions(+), 23 deletions(-) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/AuthProviderButton.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUIAsset.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/AuthProviderButtonTest.kt diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 2eddf8176..aa9de475c 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -8,13 +8,25 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: set up JDK 17 - uses: actions/setup-java@v1 + - uses: actions/checkout@v4 + + - name: Cache Gradle packages + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - java-version: 17 + java-version: '17' + distribution: 'temurin' + - name: Build with Gradle run: ./scripts/build.sh + - name: Print Logs if: failure() run: ./scripts/print_build_logs.sh diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/AuthProviderButton.kt b/auth/src/main/java/com/firebase/ui/auth/compose/AuthProviderButton.kt new file mode 100644 index 000000000..da6b2bbd9 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/AuthProviderButton.kt @@ -0,0 +1,278 @@ +package com.firebase.ui.auth.compose + +import androidx.compose.foundation.Image +import androidx.compose.material3.Icon +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Star +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +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.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.firebase.ui.auth.compose.configuration.AuthProvider +import com.firebase.ui.auth.compose.configuration.Provider +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset +import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme + +/** + * A customizable button for an authentication provider. + * + * This button displays the icon and name of an authentication provider (e.g., Google, Facebook). + * It is designed to be used within a list of sign-in options. The button's appearance can be + * customized using the [style] parameter, and its text is localized via the [stringProvider]. + * + * **Example usage:** + * ```kotlin + * AuthProviderButton( + * provider = AuthProvider.Facebook(), + * onClick = { /* Handle Facebook sign-in */ }, + * stringProvider = DefaultAuthUIStringProvider(LocalContext.current) + * ) + * ``` + * + * @param modifier A modifier for the button + * @param provider The provider to represent. + * @param onClick A callback when the button is clicked + * @param enabled If the button is enabled. Defaults to true. + * @param style Optional custom styling for the button. + * @param stringProvider The [AuthUIStringProvider] for localized strings + * + * @since 10.0.0 + */ +@Composable +fun AuthProviderButton( + modifier: Modifier = Modifier, + provider: AuthProvider, + onClick: () -> Unit, + enabled: Boolean = true, + style: AuthUITheme.ProviderStyle? = null, + stringProvider: AuthUIStringProvider, +) { + val providerStyle = resolveProviderStyle(provider, style) + val providerText = resolveProviderLabel(provider, stringProvider) + + Button( + modifier = modifier, + colors = ButtonDefaults.buttonColors( + containerColor = providerStyle.backgroundColor, + contentColor = providerStyle.contentColor, + ), + shape = providerStyle.shape, + elevation = ButtonDefaults.buttonElevation( + defaultElevation = providerStyle.elevation + ), + onClick = onClick, + enabled = enabled, + ) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + val providerIcon = providerStyle.icon + if (providerIcon != null) { + val iconTint = providerStyle.iconTint + if (iconTint != null) { + Icon( + painter = providerIcon.painter, + contentDescription = providerText, + tint = iconTint + ) + } else { + Image( + painter = providerIcon.painter, + contentDescription = providerText + ) + } + Spacer(modifier = Modifier.width(8.dp)) + } + Text( + text = providerText + ) + } + } +} + +internal fun resolveProviderStyle( + provider: AuthProvider, + style: AuthUITheme.ProviderStyle?, +): AuthUITheme.ProviderStyle { + if (style != null) return style + + val defaultStyle = + AuthUITheme.Default.providerStyles[provider.providerId] ?: AuthUITheme.ProviderStyle.Empty + + return if (provider is AuthProvider.GenericOAuth) { + AuthUITheme.ProviderStyle( + icon = provider.buttonIcon ?: defaultStyle.icon, + backgroundColor = provider.buttonColor ?: defaultStyle.backgroundColor, + contentColor = provider.contentColor ?: defaultStyle.contentColor, + ) + } else { + defaultStyle + } +} + +internal fun resolveProviderLabel( + provider: AuthProvider, + stringProvider: AuthUIStringProvider +): String = when (provider) { + is AuthProvider.GenericOAuth -> provider.buttonLabel + else -> when (Provider.fromId(provider.providerId)) { + Provider.GOOGLE -> stringProvider.signInWithGoogle + Provider.FACEBOOK -> stringProvider.signInWithFacebook + Provider.TWITTER -> stringProvider.signInWithTwitter + Provider.GITHUB -> stringProvider.signInWithGithub + Provider.EMAIL -> stringProvider.signInWithEmail + Provider.PHONE -> stringProvider.signInWithPhone + Provider.ANONYMOUS -> stringProvider.signInAnonymously + Provider.MICROSOFT -> stringProvider.signInWithMicrosoft + Provider.YAHOO -> stringProvider.signInWithYahoo + Provider.APPLE -> stringProvider.signInWithApple + null -> "Unknown Provider" + } +} + +@Preview(showBackground = true) +@Composable +private fun PreviewAuthProviderButton() { + val context = LocalContext.current + Column( + modifier = Modifier + .fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + AuthProviderButton( + provider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ), + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.Phone( + defaultNumber = null, + defaultCountryCode = null, + allowedCountries = null, + ), + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.Google( + scopes = emptyList(), + serverClientId = null + ), + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.Facebook(), + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.Twitter( + customParameters = emptyMap() + ), + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.Github( + customParameters = emptyMap() + ), + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.Microsoft( + tenant = null, + customParameters = emptyMap() + ), + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.Yahoo( + customParameters = emptyMap() + ), + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.Apple( + locale = null, + customParameters = emptyMap() + ), + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.Anonymous, + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.GenericOAuth( + providerId = "google.com", + scopes = emptyList(), + customParameters = emptyMap(), + buttonLabel = "Generic Provider", + buttonIcon = AuthUIAsset.Vector(Icons.Default.Star), + buttonColor = Color.Gray, + contentColor = Color.White + ), + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.GenericOAuth( + providerId = "google.com", + scopes = emptyList(), + customParameters = emptyMap(), + buttonLabel = "Custom Style", + buttonIcon = AuthUIAsset.Vector(Icons.Default.Star), + buttonColor = Color.Gray, + contentColor = Color.White + ), + onClick = {}, + style = AuthUITheme.ProviderStyle( + icon = AuthUITheme.Default.providerStyles[Provider.MICROSOFT.id]?.icon, + backgroundColor = AuthUITheme.Default.providerStyles[Provider.MICROSOFT.id]!!.backgroundColor, + contentColor = AuthUITheme.Default.providerStyles[Provider.MICROSOFT.id]!!.contentColor, + iconTint = Color.Red, + shape = RoundedCornerShape(24.dp), + elevation = 6.dp + ), + stringProvider = DefaultAuthUIStringProvider(context) + ) + AuthProviderButton( + provider = AuthProvider.GenericOAuth( + providerId = "unknown_provider", + scopes = emptyList(), + customParameters = emptyMap(), + buttonLabel = "Unsupported Provider", + buttonIcon = null, + buttonColor = null, + contentColor = null, + ), + onClick = {}, + stringProvider = DefaultAuthUIStringProvider(context) + ) + } +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt index d44a9d6d9..87008cd28 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt @@ -15,11 +15,10 @@ package com.firebase.ui.auth.compose.configuration import android.content.Context -import android.graphics.Color +import androidx.compose.ui.graphics.Color import android.util.Log -import androidx.compose.ui.graphics.vector.ImageVector -import com.firebase.ui.auth.AuthUI import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset import com.firebase.ui.auth.util.Preconditions import com.firebase.ui.auth.util.data.PhoneNumberUtils import com.firebase.ui.auth.util.data.ProviderAvailability @@ -55,7 +54,13 @@ internal enum class Provider(val id: String) { ANONYMOUS("anonymous"), MICROSOFT("microsoft.com"), YAHOO("yahoo.com"), - APPLE("apple.com"), + APPLE("apple.com"); + + companion object { + fun fromId(id: String): Provider? { + return entries.find { it.id == id } + } + } } /** @@ -446,12 +451,17 @@ abstract class AuthProvider(open val providerId: String) { /** * An optional icon for the provider button. */ - val buttonIcon: ImageVector?, + val buttonIcon: AuthUIAsset?, /** * An optional background color for the provider button. */ - val buttonColor: Color? + val buttonColor: Color?, + + /** + * An optional content color for the provider button. + */ + val contentColor: Color? ) : OAuthProvider( providerId = providerId, scopes = scopes, diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUIAsset.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUIAsset.kt new file mode 100644 index 000000000..f54f0ed5b --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUIAsset.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.theme + +import androidx.annotation.DrawableRes +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter +import androidx.compose.ui.res.painterResource + +/** + * Represents a visual asset used in the authentication UI. + * + * This sealed class allows specifying icons and images from either Android drawable + * resources ([Resource]) or Jetpack Compose [ImageVector]s ([Vector]). The [painter] + * property provides a unified way to get a [Painter] for the asset within a composable. + * + * **Example usage:** + * ```kotlin + * // To use a drawable resource: + * val asset = AuthUIAsset.Resource(R.drawable.my_logo) + * + * // To use a vector asset: + * val vectorAsset = AuthUIAsset.Vector(Icons.Default.Info) + * ``` + */ +sealed class AuthUIAsset { + /** + * An asset loaded from a drawable resource. + * + * @param resId The resource ID of the drawable (e.g., `R.drawable.my_icon`). + */ + class Resource(@param:DrawableRes val resId: Int) : AuthUIAsset() + + /** + * An asset represented by an [ImageVector]. + * + * @param image The [ImageVector] to be displayed. + */ + class Vector(val image: ImageVector) : AuthUIAsset() + + /** + * A [Painter] that can be used to draw this asset in a composable. + * + * This property automatically resolves the asset type and returns the appropriate + * [Painter] for rendering. + */ + @get:Composable + internal val painter: Painter + get() = when (this) { + is Resource -> painterResource(resId) + is Vector -> rememberVectorPainter(image) + } +} \ No newline at end of file diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt index d83cf5923..4af62ffc8 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt @@ -56,6 +56,11 @@ class AuthUITheme( * provider button, allowing for per-provider branding and customization. */ class ProviderStyle( + /** + * The provider's icon. + */ + val icon: AuthUIAsset?, + /** * The background color of the button. */ @@ -81,7 +86,19 @@ class AuthUITheme( * The shadow elevation for the button. Defaults to 2.dp. */ val elevation: Dp = 2.dp - ) + ) { + internal companion object { + /** + * A fallback style for unknown providers with no icon, white background, + * and black text. + */ + val Empty = ProviderStyle( + icon = null, + backgroundColor = Color.White, + contentColor = Color.Black, + ) + } + } companion object { /** @@ -112,7 +129,6 @@ class AuthUITheme( providerStyles = providerStyles ) } - } } diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt index 4f063c9a5..7f053fbd3 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt @@ -15,6 +15,7 @@ package com.firebase.ui.auth.compose.configuration.theme import androidx.compose.ui.graphics.Color +import com.firebase.ui.auth.R import com.firebase.ui.auth.compose.configuration.Provider /** @@ -33,6 +34,7 @@ internal object ProviderStyleDefaults { when (provider) { Provider.GOOGLE -> { provider.id to AuthUITheme.ProviderStyle( + icon = AuthUIAsset.Resource(R.drawable.fui_ic_googleg_color_24dp), backgroundColor = Color.White, contentColor = Color(0xFF757575) ) @@ -40,6 +42,7 @@ internal object ProviderStyleDefaults { Provider.FACEBOOK -> { provider.id to AuthUITheme.ProviderStyle( + icon = AuthUIAsset.Resource(R.drawable.fui_ic_facebook_white_22dp), backgroundColor = Color(0xFF3B5998), contentColor = Color.White ) @@ -47,6 +50,7 @@ internal object ProviderStyleDefaults { Provider.TWITTER -> { provider.id to AuthUITheme.ProviderStyle( + icon = AuthUIAsset.Resource(R.drawable.fui_ic_twitter_bird_white_24dp), backgroundColor = Color(0xFF5BAAF4), contentColor = Color.White ) @@ -54,6 +58,7 @@ internal object ProviderStyleDefaults { Provider.GITHUB -> { provider.id to AuthUITheme.ProviderStyle( + icon = AuthUIAsset.Resource(R.drawable.fui_ic_github_white_24dp), backgroundColor = Color(0xFF24292E), contentColor = Color.White ) @@ -61,6 +66,7 @@ internal object ProviderStyleDefaults { Provider.EMAIL -> { provider.id to AuthUITheme.ProviderStyle( + icon = AuthUIAsset.Resource(R.drawable.fui_ic_mail_white_24dp), backgroundColor = Color(0xFFD0021B), contentColor = Color.White ) @@ -68,6 +74,7 @@ internal object ProviderStyleDefaults { Provider.PHONE -> { provider.id to AuthUITheme.ProviderStyle( + icon = AuthUIAsset.Resource(R.drawable.fui_ic_phone_white_24dp), backgroundColor = Color(0xFF43C5A5), contentColor = Color.White ) @@ -75,6 +82,7 @@ internal object ProviderStyleDefaults { Provider.ANONYMOUS -> { provider.id to AuthUITheme.ProviderStyle( + icon = AuthUIAsset.Resource(R.drawable.fui_ic_anonymous_white_24dp), backgroundColor = Color(0xFFF4B400), contentColor = Color.White ) @@ -82,6 +90,7 @@ internal object ProviderStyleDefaults { Provider.MICROSOFT -> { provider.id to AuthUITheme.ProviderStyle( + icon = AuthUIAsset.Resource(R.drawable.fui_ic_microsoft_24dp), backgroundColor = Color(0xFF2F2F2F), contentColor = Color.White ) @@ -89,6 +98,7 @@ internal object ProviderStyleDefaults { Provider.YAHOO -> { provider.id to AuthUITheme.ProviderStyle( + icon = AuthUIAsset.Resource(R.drawable.fui_ic_yahoo_24dp), backgroundColor = Color(0xFF720E9E), contentColor = Color.White ) @@ -96,6 +106,7 @@ internal object ProviderStyleDefaults { Provider.APPLE -> { provider.id to AuthUITheme.ProviderStyle( + icon = AuthUIAsset.Resource(R.drawable.fui_ic_apple_white_24dp), backgroundColor = Color.Black, contentColor = Color.White ) diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/AuthProviderButtonTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/AuthProviderButtonTest.kt new file mode 100644 index 000000000..255fd53af --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/AuthProviderButtonTest.kt @@ -0,0 +1,518 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose + +import android.content.Context +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Star +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.test.assertHasClickAction +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.test.core.app.ApplicationProvider +import com.firebase.ui.auth.compose.configuration.AuthProvider +import com.firebase.ui.auth.compose.configuration.Provider +import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset +import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import com.firebase.ui.auth.R + +/** + * Unit tests for [AuthProviderButton] covering UI interactions, styling, + * and provider-specific behavior. + * + * @suppress Internal test class + */ +@Config(sdk = [34]) +@RunWith(RobolectricTestRunner::class) +class AuthProviderButtonTest { + + @get:Rule + val composeTestRule = createComposeRule() + + private lateinit var context: Context + private lateinit var stringProvider: AuthUIStringProvider + private var clickedProvider: AuthProvider? = null + + @Before + fun setUp() { + context = ApplicationProvider.getApplicationContext() + stringProvider = DefaultAuthUIStringProvider(context) + clickedProvider = null + } + + // ============================================================================================= + // Basic UI Tests + // ============================================================================================= + + @Test + fun `AuthProviderButton displays Google provider correctly`() { + val provider = AuthProvider.Google(scopes = emptyList(), serverClientId = null) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_google)) + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + @Test + fun `AuthProviderButton displays Facebook provider correctly`() { + val provider = AuthProvider.Facebook() + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_facebook)) + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + @Test + fun `AuthProviderButton displays Email provider correctly`() { + val provider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_email)) + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + @Test + fun `AuthProviderButton displays Phone provider correctly`() { + val provider = AuthProvider.Phone( + defaultNumber = null, + defaultCountryCode = null, + allowedCountries = null + ) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_phone)) + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + @Test + fun `AuthProviderButton displays Anonymous provider correctly`() { + val provider = AuthProvider.Anonymous + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_anonymously)) + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + @Test + fun `AuthProviderButton displays Twitter provider correctly`() { + val provider = AuthProvider.Twitter(customParameters = emptyMap()) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_twitter)) + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + @Test + fun `AuthProviderButton displays Github provider correctly`() { + val provider = AuthProvider.Github(customParameters = emptyMap()) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_github)) + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + @Test + fun `AuthProviderButton displays Microsoft provider correctly`() { + val provider = AuthProvider.Microsoft(tenant = null, customParameters = emptyMap()) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_microsoft)) + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + @Test + fun `AuthProviderButton displays Yahoo provider correctly`() { + val provider = AuthProvider.Yahoo(customParameters = emptyMap()) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_yahoo)) + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + @Test + fun `AuthProviderButton displays Apple provider correctly`() { + val provider = AuthProvider.Apple(locale = null, customParameters = emptyMap()) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_apple)) + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + @Test + fun `AuthProviderButton displays GenericOAuth provider with custom label`() { + val customLabel = "Sign in with Custom Provider" + val provider = AuthProvider.GenericOAuth( + providerId = "google.com", + scopes = emptyList(), + customParameters = emptyMap(), + buttonLabel = customLabel, + buttonIcon = AuthUIAsset.Vector(Icons.Default.Star), + buttonColor = Color.Blue, + contentColor = Color.White + ) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(customLabel) + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + // ============================================================================================= + // Click Interaction Tests + // ============================================================================================= + + @Test + fun `AuthProviderButton onClick is called when clicked`() { + val provider = AuthProvider.Google(scopes = emptyList(), serverClientId = null) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_google)) + .performClick() + + assertThat(clickedProvider).isEqualTo(provider) + } + + @Test + fun `AuthProviderButton respects enabled state`() { + val provider = AuthProvider.Google(scopes = emptyList(), serverClientId = null) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { clickedProvider = provider }, + enabled = false, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_google)) + .assertIsNotEnabled() + .performClick() + + assertThat(clickedProvider).isNull() + } + + // ============================================================================================= + // Style Resolution Tests + // ============================================================================================= + + @Test + fun `AuthProviderButton uses custom style when provided`() { + val provider = AuthProvider.Google(scopes = emptyList(), serverClientId = null) + val customStyle = AuthUITheme.Default.providerStyles[Provider.FACEBOOK.id] + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { }, + style = customStyle, + stringProvider = stringProvider + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_google)) + .assertIsDisplayed() + + val resolvedStyle = resolveProviderStyle(provider, customStyle) + assertThat(resolvedStyle).isEqualTo(customStyle) + assertThat(resolvedStyle) + .isNotEqualTo(AuthUITheme.Default.providerStyles[Provider.GOOGLE.id]) + } + + @Test + fun `GenericOAuth provider uses custom styling properties`() { + val customLabel = "Custom Provider" + val customColor = Color.Green + val customContentColor = Color.Black + val customIcon = AuthUIAsset.Vector(Icons.Default.Star) + + val provider = AuthProvider.GenericOAuth( + providerId = "google.com", + scopes = emptyList(), + customParameters = emptyMap(), + buttonLabel = customLabel, + buttonIcon = customIcon, + buttonColor = customColor, + contentColor = customContentColor + ) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { }, + stringProvider = stringProvider + ) + } + + composeTestRule.onNodeWithText(customLabel) + .assertIsDisplayed() + + composeTestRule.onNodeWithContentDescription(customLabel) + .assertIsDisplayed() + + val resolvedStyle = resolveProviderStyle(provider, null) + assertThat(resolvedStyle).isNotNull() + assertThat(resolvedStyle.backgroundColor).isEqualTo(customColor) + assertThat(resolvedStyle.contentColor).isEqualTo(customContentColor) + assertThat(resolvedStyle.icon).isEqualTo(customIcon) + + val googleDefaultStyle = AuthUITheme.Default.providerStyles["google.com"] + assertThat(resolvedStyle).isNotEqualTo(googleDefaultStyle) + } + + @Test + fun `GenericOAuth provider falls back to default style when custom properties are null`() { + val customLabel = "Custom Provider" + val provider = AuthProvider.GenericOAuth( + providerId = "google.com", + scopes = emptyList(), + customParameters = emptyMap(), + buttonLabel = customLabel, + buttonIcon = null, + buttonColor = null, + contentColor = null + ) + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { }, + stringProvider = stringProvider + ) + } + + composeTestRule.onNodeWithText(customLabel) + .assertIsDisplayed() + + val resolvedStyle = resolveProviderStyle(provider, null) + val googleDefaultStyle = AuthUITheme.Default.providerStyles["google.com"] + + assertThat(googleDefaultStyle).isNotNull() + assertThat(resolvedStyle.backgroundColor).isEqualTo(googleDefaultStyle!!.backgroundColor) + assertThat(resolvedStyle.contentColor).isEqualTo(googleDefaultStyle.contentColor) + assertThat(resolvedStyle.icon).isEqualTo(googleDefaultStyle.icon) + } + + // ============================================================================================= + // Provider Style Fallback Tests + // ============================================================================================= + + @Test + fun `AuthProviderButton provides fallback for unknown provider`() { + val provider = object : AuthProvider("unknown.provider") {} + + composeTestRule.setContent { + AuthProviderButton( + provider = provider, + onClick = { }, + stringProvider = stringProvider + ) + } + + composeTestRule.onNodeWithText("Unknown Provider") + .assertIsDisplayed() + .assertHasClickAction() + .assertIsEnabled() + } + + + @Test + fun `resolveProviderStyle applies custom colors for GenericOAuth with icon`() { + val customColor = Color.Red + val customContentColor = Color.White + + val provider = AuthProvider.GenericOAuth( + providerId = "google.com", + scopes = emptyList(), + customParameters = emptyMap(), + buttonIcon = AuthUIAsset.Vector(Icons.Default.Star), + buttonLabel = "Custom", + buttonColor = customColor, + contentColor = customContentColor + ) + + val resolvedStyle = resolveProviderStyle(provider, null) + + assertThat(resolvedStyle).isNotNull() + assertThat(resolvedStyle.backgroundColor).isEqualTo(customColor) + assertThat(resolvedStyle.contentColor).isEqualTo(customContentColor) + } + + @Test + fun `resolveProviderStyle handles GenericOAuth without icon`() { + val provider = AuthProvider.GenericOAuth( + providerId = "custom.provider", + scopes = emptyList(), + customParameters = emptyMap(), + buttonIcon = null, + buttonLabel = "Custom", + buttonColor = Color.Blue, + contentColor = Color.White + ) + + val resolvedStyle = resolveProviderStyle(provider, null) + + assertThat(resolvedStyle).isNotNull() + assertThat(resolvedStyle.icon).isNull() + assertThat(resolvedStyle.backgroundColor).isEqualTo(Color.Blue) + assertThat(resolvedStyle.contentColor).isEqualTo(Color.White) + } + + @Test + fun `resolveProviderStyle provides fallback for unknown provider`() { + val provider = object : AuthProvider("unknown.provider") {} + + val resolvedStyle = resolveProviderStyle(provider, null) + + assertThat(resolvedStyle).isNotNull() + assertThat(resolvedStyle).isEqualTo(AuthUITheme.ProviderStyle.Empty) + } +} \ No newline at end of file diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthProviderTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthProviderTest.kt index 27685f859..c473867c4 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthProviderTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthProviderTest.kt @@ -353,7 +353,8 @@ class AuthProviderTest { customParameters = mapOf(), buttonLabel = "Sign in with Custom", buttonIcon = null, - buttonColor = null + buttonColor = null, + contentColor = null, ) provider.validate() @@ -367,7 +368,8 @@ class AuthProviderTest { customParameters = mapOf(), buttonLabel = "Sign in with Custom", buttonIcon = null, - buttonColor = null + buttonColor = null, + contentColor = null, ) try { @@ -386,7 +388,8 @@ class AuthProviderTest { customParameters = mapOf(), buttonLabel = "", buttonIcon = null, - buttonColor = null + buttonColor = null, + contentColor = null, ) try { diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt index 118977c09..e8bf0fd4a 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt @@ -262,7 +262,12 @@ class AuthUIConfigurationTest { authUIConfiguration { context = applicationContext providers { - provider(AuthProvider.Google(scopes = listOf(), serverClientId = "test_client_id")) + provider( + AuthProvider.Google( + scopes = listOf(), + serverClientId = "test_client_id" + ) + ) } } } catch (e: Exception) { @@ -293,7 +298,13 @@ class AuthUIConfigurationTest { provider(AuthProvider.Microsoft(customParameters = mapOf(), tenant = null)) provider(AuthProvider.Yahoo(customParameters = mapOf())) provider(AuthProvider.Apple(customParameters = mapOf(), locale = null)) - provider(AuthProvider.Phone(defaultNumber = null, defaultCountryCode = null, allowedCountries = null)) + provider( + AuthProvider.Phone( + defaultNumber = null, + defaultCountryCode = null, + allowedCountries = null + ) + ) provider( AuthProvider.Email( actionCodeSettings = null, @@ -313,7 +324,8 @@ class AuthUIConfigurationTest { customParameters = mapOf(), buttonLabel = "Test", buttonIcon = null, - buttonColor = null + buttonColor = null, + contentColor = null, ) try { diff --git a/buildSrc/src/main/kotlin/Config.kt b/buildSrc/src/main/kotlin/Config.kt index 7e9352e85..8b2317698 100644 --- a/buildSrc/src/main/kotlin/Config.kt +++ b/buildSrc/src/main/kotlin/Config.kt @@ -11,7 +11,7 @@ object Config { } object Plugins { - const val android = "com.android.tools.build:gradle:8.8.0" + const val android = "com.android.tools.build:gradle:8.10.0" const val kotlin = "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" const val google = "com.google.gms:google-services:4.3.8" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5c40527d4..4eaec4670 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/proguard-tests/build.gradle.kts b/proguard-tests/build.gradle.kts index edda9e6f0..f6aed148d 100644 --- a/proguard-tests/build.gradle.kts +++ b/proguard-tests/build.gradle.kts @@ -53,7 +53,8 @@ android { "InvalidPackage", // Firestore uses GRPC which makes lint mad "NewerVersionAvailable", "GradleDependency", // For reproducible builds "SelectableText", "SyntheticAccessor", // We almost never care about this - "MediaCapabilities" + "MediaCapabilities", + "MissingApplicationIcon" ) checkAllWarnings = true @@ -79,6 +80,7 @@ dependencies { implementation(project(":database")) implementation(project(":storage")) + implementation(platform(Config.Libs.Firebase.bom)) implementation(Config.Libs.Androidx.lifecycleExtensions) } diff --git a/proguard-tests/src/main/AndroidManifest.xml b/proguard-tests/src/main/AndroidManifest.xml index 8072ee00d..ffb7f7034 100644 --- a/proguard-tests/src/main/AndroidManifest.xml +++ b/proguard-tests/src/main/AndroidManifest.xml @@ -1,2 +1,4 @@ - + + + \ No newline at end of file diff --git a/scripts/build.sh b/scripts/build.sh index 964ae2352..63e5eaa7a 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -9,6 +9,6 @@ cp library/google-services.json proguard-tests/google-services.json ./gradlew $GRADLE_ARGS clean ./gradlew $GRADLE_ARGS assembleDebug # TODO(thatfiredev): re-enable before release -#./gradlew $GRADLE_ARGS proguard-tests:build +# ./gradlew $GRADLE_ARGS proguard-tests:build ./gradlew $GRADLE_ARGS checkstyle ./gradlew $GRADLE_ARGS testDebugUnitTest From 68df21d0ecf3833948866b4918777b0d06ca9979 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo <48495111+demolaf@users.noreply.github.com> Date: Mon, 6 Oct 2025 13:42:30 +0100 Subject: [PATCH 13/50] feat: AuthMethodPicker (#2230) * feat: AuthMethodPicker, logo and provider theme style * chore: organize folder structure * feat: TOS and PP footer, ui tests for AuthMethodPicker * chore: tests folder structure * fix: use screen width for adaptive padding values * chore: remove unused modifier --- .../configuration/AuthUIConfiguration.kt | 4 +- .../compose/configuration/PasswordRule.kt | 2 +- .../AuthUIStringProvider.kt | 2 +- .../AuthUIStringProviderSample.kt | 2 +- .../DefaultAuthUIStringProvider.kt | 2 +- .../validators/EmailValidator.kt | 2 +- .../validators/FieldValidator.kt | 2 +- .../validators/PasswordValidator.kt | 2 +- .../{ => ui/components}/AuthProviderButton.kt | 27 +- .../components}/ErrorRecoveryDialog.kt | 5 +- .../method_picker/AnnotatedStringResource.kt | 76 +++++ .../ui/method_picker/AuthMethodPicker.kt | 174 ++++++++++ auth/src/main/res/values/strings.xml | 1 + .../configuration/AuthUIConfigurationTest.kt | 4 +- .../compose/configuration/PasswordRuleTest.kt | 4 +- .../validators/EmailValidatorTest.kt | 4 +- .../validators/PasswordValidatorTest.kt | 4 +- .../components}/AuthProviderButtonTest.kt | 6 +- .../ErrorRecoveryDialogLogicTest.kt | 86 ++--- .../ui/method_picker/AuthMethodPickerTest.kt | 308 ++++++++++++++++++ 20 files changed, 636 insertions(+), 81 deletions(-) rename auth/src/main/java/com/firebase/ui/auth/compose/configuration/{stringprovider => string_provider}/AuthUIStringProvider.kt (99%) rename auth/src/main/java/com/firebase/ui/auth/compose/configuration/{stringprovider => string_provider}/AuthUIStringProviderSample.kt (97%) rename auth/src/main/java/com/firebase/ui/auth/compose/configuration/{stringprovider => string_provider}/DefaultAuthUIStringProvider.kt (99%) rename auth/src/main/java/com/firebase/ui/auth/compose/{ => ui/components}/AuthProviderButton.kt (90%) rename auth/src/main/java/com/firebase/ui/auth/compose/{ => ui/components}/ErrorRecoveryDialog.kt (97%) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AnnotatedStringResource.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt rename auth/src/test/java/com/firebase/ui/auth/compose/{ => ui/components}/AuthProviderButtonTest.kt (98%) rename auth/src/test/java/com/firebase/ui/auth/compose/{ => ui/components}/ErrorRecoveryDialogLogicTest.kt (72%) create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt index 4d9bc280d..6fb0202de 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt @@ -18,8 +18,8 @@ import android.content.Context import java.util.Locale import com.google.firebase.auth.ActionCodeSettings import androidx.compose.ui.graphics.vector.ImageVector -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider -import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme fun actionCodeSettings(block: ActionCodeSettings.Builder.() -> Unit) = diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt index 5c5d5b125..7073fbe6e 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt @@ -14,7 +14,7 @@ package com.firebase.ui.auth.compose.configuration -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider /** * An abstract class representing a set of validation rules that can be applied to a password field, diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/AuthUIStringProvider.kt similarity index 99% rename from auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProvider.kt rename to auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/AuthUIStringProvider.kt index ea88485e3..f81ead323 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProvider.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/AuthUIStringProvider.kt @@ -12,7 +12,7 @@ * limitations under the License. */ -package com.firebase.ui.auth.compose.configuration.stringprovider +package com.firebase.ui.auth.compose.configuration.string_provider /** * An interface for providing localized string resources. This interface defines methods for all diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProviderSample.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/AuthUIStringProviderSample.kt similarity index 97% rename from auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProviderSample.kt rename to auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/AuthUIStringProviderSample.kt index 7ddf64522..af0c830cc 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/AuthUIStringProviderSample.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/AuthUIStringProviderSample.kt @@ -12,7 +12,7 @@ * limitations under the License. */ -package com.firebase.ui.auth.compose.configuration.stringprovider +package com.firebase.ui.auth.compose.configuration.string_provider import android.content.Context import com.firebase.ui.auth.compose.configuration.AuthProvider diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/DefaultAuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/DefaultAuthUIStringProvider.kt similarity index 99% rename from auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/DefaultAuthUIStringProvider.kt rename to auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/DefaultAuthUIStringProvider.kt index 7df16d9ca..5eba036af 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/stringprovider/DefaultAuthUIStringProvider.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/DefaultAuthUIStringProvider.kt @@ -12,7 +12,7 @@ * limitations under the License. */ -package com.firebase.ui.auth.compose.configuration.stringprovider +package com.firebase.ui.auth.compose.configuration.string_provider import android.content.Context import android.content.res.Configuration diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt index 7acfc8bc1..30582a309 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidator.kt @@ -14,7 +14,7 @@ package com.firebase.ui.auth.compose.configuration.validators -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider internal class EmailValidator(override val stringProvider: AuthUIStringProvider) : FieldValidator { private var _validationStatus = FieldValidationStatus(hasError = false, errorMessage = null) diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt index efa72188f..88cf98875 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/FieldValidator.kt @@ -14,7 +14,7 @@ package com.firebase.ui.auth.compose.configuration.validators -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider /** * An interface for validating input fields. diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt index 67cb7d376..2d9efafc1 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt @@ -14,7 +14,7 @@ package com.firebase.ui.auth.compose.configuration.validators -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider import com.firebase.ui.auth.compose.configuration.PasswordRule internal class PasswordValidator( diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/AuthProviderButton.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButton.kt similarity index 90% rename from auth/src/main/java/com/firebase/ui/auth/compose/AuthProviderButton.kt rename to auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButton.kt index da6b2bbd9..255d6c59e 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/AuthProviderButton.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButton.kt @@ -1,12 +1,14 @@ -package com.firebase.ui.auth.compose +package com.firebase.ui.auth.compose.ui.components import androidx.compose.foundation.Image import androidx.compose.material3.Icon import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons @@ -19,12 +21,14 @@ 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.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.firebase.ui.auth.compose.configuration.AuthProvider import com.firebase.ui.auth.compose.configuration.Provider -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider -import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme @@ -63,10 +67,11 @@ fun AuthProviderButton( stringProvider: AuthUIStringProvider, ) { val providerStyle = resolveProviderStyle(provider, style) - val providerText = resolveProviderLabel(provider, stringProvider) + val providerLabel = resolveProviderLabel(provider, stringProvider) Button( modifier = modifier, + contentPadding = PaddingValues(horizontal = 12.dp), colors = ButtonDefaults.buttonColors( containerColor = providerStyle.backgroundColor, contentColor = providerStyle.contentColor, @@ -79,7 +84,9 @@ fun AuthProviderButton( enabled = enabled, ) { Row( - verticalAlignment = Alignment.CenterVertically + modifier = modifier, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Start ) { val providerIcon = providerStyle.icon if (providerIcon != null) { @@ -87,19 +94,21 @@ fun AuthProviderButton( if (iconTint != null) { Icon( painter = providerIcon.painter, - contentDescription = providerText, + contentDescription = providerLabel, tint = iconTint ) } else { Image( painter = providerIcon.painter, - contentDescription = providerText + contentDescription = providerLabel ) } - Spacer(modifier = Modifier.width(8.dp)) + Spacer(modifier = Modifier.width(12.dp)) } Text( - text = providerText + text = providerLabel, + overflow = TextOverflow.Ellipsis, + maxLines = 1, ) } } diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ErrorRecoveryDialog.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialog.kt similarity index 97% rename from auth/src/main/java/com/firebase/ui/auth/compose/ErrorRecoveryDialog.kt rename to auth/src/main/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialog.kt index 3b9cc0b57..732a48662 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/ErrorRecoveryDialog.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialog.kt @@ -12,7 +12,7 @@ * limitations under the License. */ -package com.firebase.ui.auth.compose +package com.firebase.ui.auth.compose.ui.components import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme @@ -22,7 +22,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.window.DialogProperties -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider +import com.firebase.ui.auth.compose.AuthException +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider /** * A composable dialog for displaying authentication errors with recovery options. diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AnnotatedStringResource.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AnnotatedStringResource.kt new file mode 100644 index 000000000..4c98be9ac --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AnnotatedStringResource.kt @@ -0,0 +1,76 @@ +package com.firebase.ui.auth.compose.ui.method_picker + +import android.content.Context +import android.content.Intent +import androidx.annotation.StringRes +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.LinkAnnotation +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextLinkStyles +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.withLink +import androidx.core.net.toUri + +@Composable +internal fun AnnotatedStringResource( + context: Context, + modifier: Modifier = Modifier, + @StringRes id: Int, + vararg links: Pair, + inPreview: Boolean = false, + previewText: String? = null, +) { + val labels = links.map { it.first }.toTypedArray() + + val template = if (inPreview && previewText != null) { + previewText + } else { + stringResource(id = id, *labels) + } + + val annotated = buildAnnotatedString { + var currentIndex = 0 + + links.forEach { (label, url) -> + val start = template.indexOf(label, currentIndex).takeIf { it >= 0 } ?: return@forEach + + append(template.substring(currentIndex, start)) + + withLink( + LinkAnnotation.Url( + url, + styles = TextLinkStyles( + style = SpanStyle( + color = MaterialTheme.colorScheme.primary, + textDecoration = TextDecoration.Underline, + ) + ) + ) { + val intent = Intent(Intent.ACTION_VIEW, url.toUri()) + context.startActivity(intent) + } + ) { + append(label) + } + + currentIndex = start + label.length + } + + if (currentIndex < template.length) { + append(template.substring(currentIndex)) + } + } + + Text( + modifier = modifier, + text = annotated, + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Center + ) +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt new file mode 100644 index 000000000..855e3d6b3 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt @@ -0,0 +1,174 @@ +package com.firebase.ui.auth.compose.ui.method_picker + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +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.platform.LocalInspectionMode +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.configuration.AuthProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset +import com.firebase.ui.auth.compose.ui.components.AuthProviderButton + +/** + * Renders the provider selection screen. + * + * **Example usage:** + * ```kotlin + * AuthMethodPicker( + * providers = listOf( + * AuthProvider.Google(), + * AuthProvider.Email(), + * ), + * onProviderSelected = { provider -> /* ... */ } + * ) + * ``` + * + * @param modifier A modifier for the screen layout. + * @param providers The list of providers to display. + * @param logo An optional logo to display. + * @param onProviderSelected A callback when a provider is selected. + * @param customLayout An optional custom layout composable for the provider buttons. + * @param termsOfServiceUrl The URL for the Terms of Service. + * @param privacyPolicyUrl The URL for the Privacy Policy. + * + * @since 10.0.0 + */ +@Composable +fun AuthMethodPicker( + modifier: Modifier = Modifier, + providers: List, + logo: AuthUIAsset? = null, + onProviderSelected: (AuthProvider) -> Unit, + customLayout: @Composable ((List, (AuthProvider) -> Unit) -> Unit)? = null, + termsOfServiceUrl: String? = null, + privacyPolicyUrl: String? = null, +) { + val context = LocalContext.current + val inPreview = LocalInspectionMode.current + + Column( + modifier = modifier + ) { + logo?.let { + Image( + modifier = Modifier + .weight(0.4f) + .align(Alignment.CenterHorizontally), + painter = it.painter, + contentDescription = if (inPreview) "" + else stringResource(R.string.fui_auth_method_picker_logo) + ) + } + if (customLayout != null) { + customLayout(providers, onProviderSelected) + } else { + BoxWithConstraints( + modifier = Modifier + .weight(1f), + ) { + val paddingWidth = maxWidth.value * 0.23 + LazyColumn( + modifier = Modifier + .padding(horizontal = paddingWidth.dp) + .testTag("AuthMethodPicker LazyColumn"), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + itemsIndexed(providers) { index, provider -> + Box( + modifier = Modifier + .padding(bottom = if (index < providers.lastIndex) 16.dp else 0.dp) + ) { + AuthProviderButton( + modifier = Modifier + .fillMaxWidth(), + onClick = { + onProviderSelected(provider) + }, + provider = provider, + stringProvider = DefaultAuthUIStringProvider(context) + ) + } + } + } + } + } + AnnotatedStringResource( + context = context, + inPreview = inPreview, + previewText = "By continuing, you accept our Terms of Service and Privacy Policy.", + modifier = Modifier.padding(vertical = 16.dp), + id = R.string.fui_tos_and_pp, + links = arrayOf( + "Terms of Service" to (termsOfServiceUrl ?: ""), + "Privacy Policy" to (privacyPolicyUrl ?: "") + ) + ) + } +} + +@Preview(showBackground = true) +@Composable +fun PreviewAuthMethodPicker() { + Column( + modifier = Modifier + .fillMaxSize() + ) { + AuthMethodPicker( + providers = listOf( + AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ), + AuthProvider.Phone( + defaultNumber = null, + defaultCountryCode = null, + allowedCountries = null, + ), + AuthProvider.Google( + scopes = emptyList(), + serverClientId = null + ), + AuthProvider.Facebook(), + AuthProvider.Twitter( + customParameters = emptyMap() + ), + AuthProvider.Github( + customParameters = emptyMap() + ), + AuthProvider.Microsoft( + tenant = null, + customParameters = emptyMap() + ), + AuthProvider.Yahoo( + customParameters = emptyMap() + ), + AuthProvider.Apple( + locale = null, + customParameters = emptyMap() + ), + AuthProvider.Anonymous, + ), + logo = AuthUIAsset.Resource(R.drawable.fui_ic_check_circle_black_128dp), + onProviderSelected = { provider -> + + }, + termsOfServiceUrl = "https://example.com/terms", + privacyPolicyUrl = "https://example.com/privacy" + ) + } +} \ No newline at end of file diff --git a/auth/src/main/res/values/strings.xml b/auth/src/main/res/values/strings.xml index 75060012d..5790ca8d2 100644 --- a/auth/src/main/res/values/strings.xml +++ b/auth/src/main/res/values/strings.xml @@ -19,6 +19,7 @@ Email + "Auth method picker logo" Sign in with Google Sign in with Facebook Sign in with Twitter diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt index e8bf0fd4a..f08be227f 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt @@ -20,8 +20,8 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AccountCircle import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.R -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider -import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme import com.google.common.truth.Truth.assertThat import com.google.firebase.auth.actionCodeSettings diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt index a4d5139a6..dbaccbcfb 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/PasswordRuleTest.kt @@ -17,8 +17,8 @@ package com.firebase.ui.auth.compose.configuration import android.content.Context import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.R -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider -import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt index 3253cfb1c..3715d63ec 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/EmailValidatorTest.kt @@ -17,8 +17,8 @@ package com.firebase.ui.auth.compose.configuration.validators import android.content.Context import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.R -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider -import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt index a3993bd36..27d34b6a6 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt @@ -17,8 +17,8 @@ package com.firebase.ui.auth.compose.configuration.validators import android.content.Context import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.R -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider -import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.firebase.ui.auth.compose.configuration.PasswordRule import com.google.common.truth.Truth.assertThat import org.junit.Before diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/AuthProviderButtonTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButtonTest.kt similarity index 98% rename from auth/src/test/java/com/firebase/ui/auth/compose/AuthProviderButtonTest.kt rename to auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButtonTest.kt index 255fd53af..faae2cf48 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/AuthProviderButtonTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButtonTest.kt @@ -12,7 +12,7 @@ * limitations under the License. */ -package com.firebase.ui.auth.compose +package com.firebase.ui.auth.compose.ui.components import android.content.Context import androidx.compose.material.icons.Icons @@ -29,8 +29,8 @@ import androidx.compose.ui.test.performClick import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.compose.configuration.AuthProvider import com.firebase.ui.auth.compose.configuration.Provider -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider -import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme import com.google.common.truth.Truth.assertThat diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/ErrorRecoveryDialogLogicTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialogLogicTest.kt similarity index 72% rename from auth/src/test/java/com/firebase/ui/auth/compose/ErrorRecoveryDialogLogicTest.kt rename to auth/src/test/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialogLogicTest.kt index f3c730b05..6a4f5df2f 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/ErrorRecoveryDialogLogicTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialogLogicTest.kt @@ -1,25 +1,11 @@ -/* - * Copyright 2025 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.firebase.ui.auth.compose +package com.firebase.ui.auth.compose.ui.components -import com.firebase.ui.auth.compose.configuration.stringprovider.AuthUIStringProvider -import com.google.common.truth.Truth.assertThat +import com.firebase.ui.auth.compose.AuthException +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider +import com.google.common.truth.Truth import org.junit.Test import org.junit.runner.RunWith -import org.mockito.Mockito.mock -import org.mockito.Mockito.`when` +import org.mockito.Mockito import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @@ -30,20 +16,20 @@ import org.robolectric.annotation.Config @Config(manifest = Config.NONE) class ErrorRecoveryDialogLogicTest { - private val mockStringProvider = mock(AuthUIStringProvider::class.java).apply { - `when`(retryAction).thenReturn("Try again") - `when`(continueText).thenReturn("Continue") - `when`(signInDefault).thenReturn("Sign in") - `when`(networkErrorRecoveryMessage).thenReturn("Network error, check your internet connection.") - `when`(invalidCredentialsRecoveryMessage).thenReturn("Incorrect password.") - `when`(userNotFoundRecoveryMessage).thenReturn("That email address doesn't match an existing account") - `when`(weakPasswordRecoveryMessage).thenReturn("Password not strong enough. Use at least 6 characters and a mix of letters and numbers") - `when`(emailAlreadyInUseRecoveryMessage).thenReturn("Email account registration unsuccessful") - `when`(tooManyRequestsRecoveryMessage).thenReturn("This phone number has been used too many times") - `when`(mfaRequiredRecoveryMessage).thenReturn("Additional verification required. Please complete multi-factor authentication.") - `when`(accountLinkingRequiredRecoveryMessage).thenReturn("Account needs to be linked. Please try a different sign-in method.") - `when`(authCancelledRecoveryMessage).thenReturn("Authentication was cancelled. Please try again when ready.") - `when`(unknownErrorRecoveryMessage).thenReturn("An unknown error occurred.") + private val mockStringProvider = Mockito.mock(AuthUIStringProvider::class.java).apply { + Mockito.`when`(retryAction).thenReturn("Try again") + Mockito.`when`(continueText).thenReturn("Continue") + Mockito.`when`(signInDefault).thenReturn("Sign in") + Mockito.`when`(networkErrorRecoveryMessage).thenReturn("Network error, check your internet connection.") + Mockito.`when`(invalidCredentialsRecoveryMessage).thenReturn("Incorrect password.") + Mockito.`when`(userNotFoundRecoveryMessage).thenReturn("That email address doesn't match an existing account") + Mockito.`when`(weakPasswordRecoveryMessage).thenReturn("Password not strong enough. Use at least 6 characters and a mix of letters and numbers") + Mockito.`when`(emailAlreadyInUseRecoveryMessage).thenReturn("Email account registration unsuccessful") + Mockito.`when`(tooManyRequestsRecoveryMessage).thenReturn("This phone number has been used too many times") + Mockito.`when`(mfaRequiredRecoveryMessage).thenReturn("Additional verification required. Please complete multi-factor authentication.") + Mockito.`when`(accountLinkingRequiredRecoveryMessage).thenReturn("Account needs to be linked. Please try a different sign-in method.") + Mockito.`when`(authCancelledRecoveryMessage).thenReturn("Authentication was cancelled. Please try again when ready.") + Mockito.`when`(unknownErrorRecoveryMessage).thenReturn("An unknown error occurred.") } // ============================================================================================= @@ -59,7 +45,7 @@ class ErrorRecoveryDialogLogicTest { val message = getRecoveryMessage(error, mockStringProvider) // Assert - assertThat(message).isEqualTo("Network error, check your internet connection.") + Truth.assertThat(message).isEqualTo("Network error, check your internet connection.") } @Test @@ -71,7 +57,7 @@ class ErrorRecoveryDialogLogicTest { val message = getRecoveryMessage(error, mockStringProvider) // Assert - assertThat(message).isEqualTo("Incorrect password.") + Truth.assertThat(message).isEqualTo("Incorrect password.") } @Test @@ -83,7 +69,7 @@ class ErrorRecoveryDialogLogicTest { val message = getRecoveryMessage(error, mockStringProvider) // Assert - assertThat(message).isEqualTo("That email address doesn't match an existing account") + Truth.assertThat(message).isEqualTo("That email address doesn't match an existing account") } @Test @@ -99,7 +85,7 @@ class ErrorRecoveryDialogLogicTest { val message = getRecoveryMessage(error, mockStringProvider) // Assert - assertThat(message).isEqualTo("Password not strong enough. Use at least 6 characters and a mix of letters and numbers\n\nReason: Password should be at least 8 characters") + Truth.assertThat(message).isEqualTo("Password not strong enough. Use at least 6 characters and a mix of letters and numbers\n\nReason: Password should be at least 8 characters") } @Test @@ -111,7 +97,7 @@ class ErrorRecoveryDialogLogicTest { val message = getRecoveryMessage(error, mockStringProvider) // Assert - assertThat(message).isEqualTo("Password not strong enough. Use at least 6 characters and a mix of letters and numbers") + Truth.assertThat(message).isEqualTo("Password not strong enough. Use at least 6 characters and a mix of letters and numbers") } @Test @@ -127,7 +113,7 @@ class ErrorRecoveryDialogLogicTest { val message = getRecoveryMessage(error, mockStringProvider) // Assert - assertThat(message).isEqualTo("Email account registration unsuccessful (test@example.com)") + Truth.assertThat(message).isEqualTo("Email account registration unsuccessful (test@example.com)") } @Test @@ -139,7 +125,7 @@ class ErrorRecoveryDialogLogicTest { val message = getRecoveryMessage(error, mockStringProvider) // Assert - assertThat(message).isEqualTo("Email account registration unsuccessful") + Truth.assertThat(message).isEqualTo("Email account registration unsuccessful") } // ============================================================================================= @@ -155,7 +141,7 @@ class ErrorRecoveryDialogLogicTest { val actionText = getRecoveryActionText(error, mockStringProvider) // Assert - assertThat(actionText).isEqualTo("Try again") + Truth.assertThat(actionText).isEqualTo("Try again") } @Test @@ -167,7 +153,7 @@ class ErrorRecoveryDialogLogicTest { val actionText = getRecoveryActionText(error, mockStringProvider) // Assert - assertThat(actionText).isEqualTo("Continue") + Truth.assertThat(actionText).isEqualTo("Continue") } @Test @@ -179,7 +165,7 @@ class ErrorRecoveryDialogLogicTest { val actionText = getRecoveryActionText(error, mockStringProvider) // Assert - assertThat(actionText).isEqualTo("Sign in") + Truth.assertThat(actionText).isEqualTo("Sign in") } @Test @@ -191,7 +177,7 @@ class ErrorRecoveryDialogLogicTest { val actionText = getRecoveryActionText(error, mockStringProvider) // Assert - assertThat(actionText).isEqualTo("Continue") + Truth.assertThat(actionText).isEqualTo("Continue") } @Test @@ -203,7 +189,7 @@ class ErrorRecoveryDialogLogicTest { val actionText = getRecoveryActionText(error, mockStringProvider) // Assert - assertThat(actionText).isEqualTo("Continue") + Truth.assertThat(actionText).isEqualTo("Continue") } // ============================================================================================= @@ -216,7 +202,7 @@ class ErrorRecoveryDialogLogicTest { val error = AuthException.NetworkException("Network error") // Act & Assert - assertThat(isRecoverable(error)).isTrue() + Truth.assertThat(isRecoverable(error)).isTrue() } @Test @@ -225,7 +211,7 @@ class ErrorRecoveryDialogLogicTest { val error = AuthException.InvalidCredentialsException("Invalid credentials") // Act & Assert - assertThat(isRecoverable(error)).isTrue() + Truth.assertThat(isRecoverable(error)).isTrue() } @Test @@ -234,7 +220,7 @@ class ErrorRecoveryDialogLogicTest { val error = AuthException.TooManyRequestsException("Too many requests") // Act & Assert - assertThat(isRecoverable(error)).isFalse() + Truth.assertThat(isRecoverable(error)).isFalse() } @Test @@ -243,7 +229,7 @@ class ErrorRecoveryDialogLogicTest { val error = AuthException.MfaRequiredException("MFA required") // Act & Assert - assertThat(isRecoverable(error)).isTrue() + Truth.assertThat(isRecoverable(error)).isTrue() } @Test @@ -252,7 +238,7 @@ class ErrorRecoveryDialogLogicTest { val error = AuthException.UnknownException("Unknown error") // Act & Assert - assertThat(isRecoverable(error)).isTrue() + Truth.assertThat(isRecoverable(error)).isTrue() } // Helper functions to test the private functions - we need to make them internal for testing diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt new file mode 100644 index 000000000..17d736ca7 --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt @@ -0,0 +1,308 @@ +package com.firebase.ui.auth.compose.ui.method_picker + +import android.content.Context +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.ui.test.assertHasClickAction +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsNotDisplayed +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollToNode +import androidx.test.core.app.ApplicationProvider +import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.configuration.AuthProvider +import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset +import com.google.common.truth.Truth +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Unit tests for [AuthMethodPicker] covering UI interactions, provider selection, + * scroll tests, logo display, and custom layouts. + * + * @suppress Internal test class + */ +@Config(sdk = [34]) +@RunWith(RobolectricTestRunner::class) +class AuthMethodPickerTest { + + @get:Rule + val composeTestRule = createComposeRule() + + private lateinit var context: Context + private var selectedProvider: AuthProvider? = null + + @Before + fun setUp() { + context = ApplicationProvider.getApplicationContext() + selectedProvider = null + } + + // ============================================================================================= + // Basic UI Tests + // ============================================================================================= + + @Test + fun `AuthMethodPicker displays all providers`() { + val providers = listOf( + AuthProvider.Google(scopes = emptyList(), serverClientId = null), + AuthProvider.Facebook(), + AuthProvider.Email(actionCodeSettings = null, passwordValidationRules = emptyList()) + ) + + composeTestRule.setContent { + AuthMethodPicker( + providers = providers, + onProviderSelected = { selectedProvider = it } + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_google)) + .assertIsDisplayed() + .assertHasClickAction() + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_facebook)) + .assertIsDisplayed() + .assertHasClickAction() + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_email)) + .assertIsDisplayed() + .assertHasClickAction() + } + + @Test + fun `AuthMethodPicker displays terms of service text`() { + val context = ApplicationProvider.getApplicationContext() + val links = arrayOf("Terms of Service" to "", "Privacy Policy" to "") + val labels = links.map { it.first }.toTypedArray() + val providers = listOf( + AuthProvider.Google(scopes = emptyList(), serverClientId = null) + ) + + composeTestRule.setContent { + AuthMethodPicker( + providers = providers, + onProviderSelected = { selectedProvider = it } + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_tos_and_pp, *labels)) + .assertIsDisplayed() + } + + @Test + fun `AuthMethodPicker displays logo when provided`() { + val providers = listOf( + AuthProvider.Google(scopes = emptyList(), serverClientId = null) + ) + + composeTestRule.setContent { + AuthMethodPicker( + providers = providers, + logo = AuthUIAsset.Resource(R.drawable.fui_ic_check_circle_black_128dp), + onProviderSelected = { selectedProvider = it } + ) + } + + composeTestRule + .onNodeWithContentDescription(context.getString(R.string.fui_auth_method_picker_logo)) + .assertIsDisplayed() + } + + @Test + fun `AuthMethodPicker does not display logo when null`() { + val providers = listOf( + AuthProvider.Google(scopes = emptyList(), serverClientId = null) + ) + + composeTestRule.setContent { + AuthMethodPicker( + providers = providers, + logo = null, + onProviderSelected = { selectedProvider = it } + ) + } + + composeTestRule + .onNodeWithContentDescription(context.getString(R.string.fui_auth_method_picker_logo)) + .assertIsNotDisplayed() + } + + @Test + fun `AuthMethodPicker displays logo and providers together`() { + val context = ApplicationProvider.getApplicationContext() + val links = arrayOf("Terms of Service" to "", "Privacy Policy" to "") + val labels = links.map { it.first }.toTypedArray() + val providers = listOf( + AuthProvider.Google(scopes = emptyList(), serverClientId = null) + ) + + composeTestRule.setContent { + AuthMethodPicker( + providers = providers, + logo = AuthUIAsset.Resource(R.drawable.fui_ic_check_circle_black_128dp), + onProviderSelected = { selectedProvider = it } + ) + } + + composeTestRule + .onNodeWithContentDescription(context.getString(R.string.fui_auth_method_picker_logo)) + .assertIsDisplayed() + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_google)) + .assertIsDisplayed() + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_tos_and_pp, *labels)) + .assertIsDisplayed() + } + + @Test + fun `AuthMethodPicker calls onProviderSelected when Provider is clicked`() { + val googleProvider = AuthProvider.Google(scopes = emptyList(), serverClientId = null) + val providers = listOf(googleProvider) + + composeTestRule.setContent { + AuthMethodPicker( + providers = providers, + onProviderSelected = { selectedProvider = it } + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_google)) + .performClick() + + Truth.assertThat(selectedProvider).isEqualTo(googleProvider) + } + + // ============================================================================================= + // Custom Layout Tests + // ============================================================================================= + + @Test + fun `AuthMethodPicker uses custom layout when provided`() { + val providers = listOf( + AuthProvider.Google(scopes = emptyList(), serverClientId = null) + ) + var customLayoutCalled = false + + composeTestRule.setContent { + AuthMethodPicker( + providers = providers, + onProviderSelected = { selectedProvider = it }, + customLayout = { _, _ -> + customLayoutCalled = true + Text("Custom Layout") + } + ) + } + + Truth.assertThat(customLayoutCalled).isTrue() + composeTestRule + .onNodeWithText("Custom Layout") + .assertIsDisplayed() + } + + @Test + fun `AuthMethodPicker custom layout receives providers list`() { + val providers = listOf( + AuthProvider.Google(scopes = emptyList(), serverClientId = null), + AuthProvider.Facebook() + ) + var receivedProviders: List? = null + + composeTestRule.setContent { + AuthMethodPicker( + providers = providers, + onProviderSelected = { selectedProvider = it }, + customLayout = { providersList, _ -> + receivedProviders = providersList + } + ) + } + + Truth.assertThat(receivedProviders).isEqualTo(providers) + } + + @Test + fun `AuthMethodPicker custom layout can trigger provider selection`() { + val googleProvider = AuthProvider.Google(scopes = emptyList(), serverClientId = null) + val providers = listOf(googleProvider) + + composeTestRule.setContent { + AuthMethodPicker( + providers = providers, + onProviderSelected = { selectedProvider = it }, + customLayout = { providersList, onSelected -> + Button(onClick = { onSelected(providersList[0]) }) { + Text("Custom Button") + } + } + ) + } + + composeTestRule + .onNodeWithText("Custom Button") + .performClick() + + Truth.assertThat(selectedProvider).isEqualTo(googleProvider) + } + + // ============================================================================================= + // Scrolling Tests + // ============================================================================================= + + @Test + fun `AuthMethodPicker allows scrolling through many providers`() { + val providers = listOf( + AuthProvider.Google(scopes = emptyList(), serverClientId = null), + AuthProvider.Facebook(), + AuthProvider.Twitter(customParameters = emptyMap()), + AuthProvider.Github(customParameters = emptyMap()), + AuthProvider.Microsoft(tenant = null, customParameters = emptyMap()), + AuthProvider.Yahoo(customParameters = emptyMap()), + AuthProvider.Apple(locale = null, customParameters = emptyMap()), + AuthProvider.Email(actionCodeSettings = null, passwordValidationRules = emptyList()), + AuthProvider.Phone( + defaultNumber = null, + defaultCountryCode = null, + allowedCountries = null + ), + AuthProvider.Anonymous + ) + + composeTestRule.setContent { + AuthMethodPicker( + providers = providers, + onProviderSelected = { selectedProvider = it } + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_with_google)) + .assertIsDisplayed() + + composeTestRule + .onNodeWithTag("AuthMethodPicker LazyColumn") + .performScrollToNode(hasText(context.getString(R.string.fui_sign_in_anonymously))) + + composeTestRule + .onNodeWithText(context.getString(R.string.fui_sign_in_anonymously)) + .assertIsDisplayed() + } +} \ No newline at end of file From 4d1aefd2686640089a0fb28dcf969760a342fb52 Mon Sep 17 00:00:00 2001 From: Guillaume Bernos Date: Tue, 7 Oct 2025 11:15:47 +0200 Subject: [PATCH 14/50] feat: MFA Config Model (MfaConfiguration, MfaFactor) (#2234) --- .../compose/configuration/MfaConfiguration.kt | 42 +++++ .../auth/compose/configuration/MfaFactor.kt | 33 ++++ .../configuration/MfaConfigurationTest.kt | 162 ++++++++++++++++++ 3 files changed, 237 insertions(+) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/MfaConfiguration.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/MfaFactor.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/configuration/MfaConfigurationTest.kt diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/MfaConfiguration.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/MfaConfiguration.kt new file mode 100644 index 000000000..393ef0f26 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/MfaConfiguration.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration + +/** + * Configuration class for Multi-Factor Authentication (MFA) enrollment and verification behavior. + * + * This class controls which MFA factors are available to users, whether enrollment is mandatory, + * and whether recovery codes are generated. + * + * @property allowedFactors List of MFA factors that users are permitted to enroll in. + * Defaults to [MfaFactor.Sms, MfaFactor.Totp]. + * @property requireEnrollment Whether MFA enrollment is mandatory for all users. + * When true, users must enroll in at least one MFA factor. + * Defaults to false. + * @property enableRecoveryCodes Whether to generate and provide recovery codes to users + * after successful MFA enrollment. These codes can be used + * as a backup authentication method. Defaults to true. + */ +class MfaConfiguration( + val allowedFactors: List = listOf(MfaFactor.Sms, MfaFactor.Totp), + val requireEnrollment: Boolean = false, + val enableRecoveryCodes: Boolean = true +) { + init { + require(allowedFactors.isNotEmpty()) { + "At least one MFA factor must be allowed" + } + } +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/MfaFactor.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/MfaFactor.kt new file mode 100644 index 000000000..78926ace4 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/MfaFactor.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration + +/** + * Represents the different Multi-Factor Authentication (MFA) factors that can be used + * for enrollment and verification. + */ +enum class MfaFactor { + /** + * SMS-based authentication factor. + * Users receive a verification code via text message to their registered phone number. + */ + Sms, + + /** + * Time-based One-Time Password (TOTP) authentication factor. + * Users generate verification codes using an authenticator app. + */ + Totp +} diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/MfaConfigurationTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/MfaConfigurationTest.kt new file mode 100644 index 000000000..aa80d4533 --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/MfaConfigurationTest.kt @@ -0,0 +1,162 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration + +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Unit tests for [MfaConfiguration] covering default values, custom configurations, + * and validation rules. + * + * @suppress Internal test class + */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class MfaConfigurationTest { + + // ============================================================================================= + // Default Configuration Tests + // ============================================================================================= + + @Test + fun `MfaConfiguration with defaults uses correct values`() { + val config = MfaConfiguration() + + assertThat(config.allowedFactors).containsExactly(MfaFactor.Sms, MfaFactor.Totp) + assertThat(config.requireEnrollment).isFalse() + assertThat(config.enableRecoveryCodes).isTrue() + } + + @Test + fun `MfaConfiguration default allowedFactors includes both Sms and Totp`() { + val config = MfaConfiguration() + + assertThat(config.allowedFactors).hasSize(2) + assertThat(config.allowedFactors).contains(MfaFactor.Sms) + assertThat(config.allowedFactors).contains(MfaFactor.Totp) + } + + // ============================================================================================= + // Custom Configuration Tests + // ============================================================================================= + + @Test + fun `MfaConfiguration with custom allowedFactors only Sms`() { + val config = MfaConfiguration( + allowedFactors = listOf(MfaFactor.Sms) + ) + + assertThat(config.allowedFactors).containsExactly(MfaFactor.Sms) + assertThat(config.allowedFactors).hasSize(1) + } + + @Test + fun `MfaConfiguration with custom allowedFactors only Totp`() { + val config = MfaConfiguration( + allowedFactors = listOf(MfaFactor.Totp) + ) + + assertThat(config.allowedFactors).containsExactly(MfaFactor.Totp) + assertThat(config.allowedFactors).hasSize(1) + } + + @Test + fun `MfaConfiguration with requireEnrollment enabled`() { + val config = MfaConfiguration( + requireEnrollment = true + ) + + assertThat(config.requireEnrollment).isTrue() + } + + @Test + fun `MfaConfiguration with enableRecoveryCodes disabled`() { + val config = MfaConfiguration( + enableRecoveryCodes = false + ) + + assertThat(config.enableRecoveryCodes).isFalse() + } + + @Test + fun `MfaConfiguration with all custom values`() { + val config = MfaConfiguration( + allowedFactors = listOf(MfaFactor.Sms), + requireEnrollment = true, + enableRecoveryCodes = false + ) + + assertThat(config.allowedFactors).containsExactly(MfaFactor.Sms) + assertThat(config.requireEnrollment).isTrue() + assertThat(config.enableRecoveryCodes).isFalse() + } + + // ============================================================================================= + // Validation Tests + // ============================================================================================= + + @Test + fun `MfaConfiguration throws when allowedFactors is empty`() { + try { + MfaConfiguration( + allowedFactors = emptyList() + ) + } catch (e: Exception) { + assertThat(e).isInstanceOf(IllegalArgumentException::class.java) + assertThat(e.message).isEqualTo("At least one MFA factor must be allowed") + } + } + + @Test + fun `MfaConfiguration allows both factors in any order`() { + val config1 = MfaConfiguration( + allowedFactors = listOf(MfaFactor.Sms, MfaFactor.Totp) + ) + val config2 = MfaConfiguration( + allowedFactors = listOf(MfaFactor.Totp, MfaFactor.Sms) + ) + + assertThat(config1.allowedFactors).hasSize(2) + assertThat(config2.allowedFactors).hasSize(2) + assertThat(config1.allowedFactors).containsExactly(MfaFactor.Sms, MfaFactor.Totp) + assertThat(config2.allowedFactors).containsExactly(MfaFactor.Totp, MfaFactor.Sms) + } + + // ============================================================================================= + // MfaFactor Enum Tests + // ============================================================================================= + + @Test + fun `MfaFactor enum has exactly two values`() { + val factors = MfaFactor.entries + + assertThat(factors).hasSize(2) + assertThat(factors).containsExactly(MfaFactor.Sms, MfaFactor.Totp) + } + + @Test + fun `MfaFactor Sms has correct name`() { + assertThat(MfaFactor.Sms.name).isEqualTo("Sms") + } + + @Test + fun `MfaFactor Totp has correct name`() { + assertThat(MfaFactor.Totp.name).isEqualTo("Totp") + } +} From 3cfde410acbbbb5386ee1e4bd33b73281302f514 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo <48495111+demolaf@users.noreply.github.com> Date: Tue, 7 Oct 2025 13:55:01 +0100 Subject: [PATCH 15/50] feat: AuthTextField (#2231) * feat: AuthMethodPicker, logo and provider theme style * chore: organize folder structure * feat: TOS and PP footer, ui tests for AuthMethodPicker * chore: tests folder structure * chore: use version catalog for compose deps * feat: AuthTextField with validation * test: AuthTextField and field validations * chore: update doc comments * refactor: remove libs.versions.toml catalog file --- auth/build.gradle.kts | 5 +- .../compose/ui/components/AuthTextField.kt | 201 ++++++++ .../ui/components/AuthTextFieldTest.kt | 449 ++++++++++++++++++ build.gradle.kts | 2 +- buildSrc/src/main/kotlin/Config.kt | 6 +- gradle/libs.versions.toml | 9 - 6 files changed, 658 insertions(+), 14 deletions(-) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthTextField.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthTextFieldTest.kt delete mode 100644 gradle/libs.versions.toml diff --git a/auth/build.gradle.kts b/auth/build.gradle.kts index b26051d1c..3175b0a9d 100644 --- a/auth/build.gradle.kts +++ b/auth/build.gradle.kts @@ -4,7 +4,7 @@ plugins { id("com.android.library") id("com.vanniktech.maven.publish") id("org.jetbrains.kotlin.android") - alias(libs.plugins.compose.compiler) + id("org.jetbrains.kotlin.plugin.compose") version Config.kotlinVersion } android { @@ -84,6 +84,7 @@ dependencies { implementation(Config.Libs.Androidx.Compose.activityCompose) implementation(Config.Libs.Androidx.materialDesign) implementation(Config.Libs.Androidx.activity) + implementation(Config.Libs.Androidx.Compose.materialIconsExtended) // The new activity result APIs force us to include Fragment 1.3.0 // See https://issuetracker.google.com/issues/152554847 implementation(Config.Libs.Androidx.fragment) @@ -115,7 +116,7 @@ dependencies { testImplementation(Config.Libs.Test.robolectric) testImplementation(Config.Libs.Test.kotlinReflect) testImplementation(Config.Libs.Provider.facebook) - testImplementation(libs.androidx.ui.test.junit4) + testImplementation(Config.Libs.Test.composeUiTestJunit4) debugImplementation(project(":internal:lintchecks")) } diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthTextField.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthTextField.kt new file mode 100644 index 000000000..66f2b475e --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthTextField.kt @@ -0,0 +1,201 @@ +package com.firebase.ui.auth.compose.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Email +import androidx.compose.material.icons.filled.Lock +import androidx.compose.material.icons.filled.Visibility +import androidx.compose.material.icons.filled.VisibilityOff +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.firebase.ui.auth.compose.configuration.PasswordRule +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.validators.EmailValidator +import com.firebase.ui.auth.compose.configuration.validators.FieldValidator +import com.firebase.ui.auth.compose.configuration.validators.PasswordValidator + +/** + * A customizable input field with built-in validation display. + * + * **Example usage:** + * ```kotlin + * val emailTextValue = remember { mutableStateOf("") } + * + * val emailValidator = remember { + * EmailValidator(stringProvider = DefaultAuthUIStringProvider(context)) + * } + * + * AuthTextField( + * value = emailTextValue, + * onValueChange = { emailTextValue.value = it }, + * label = { + * Text("Email") + * }, + * validator = emailValidator + * ) + * ``` + * + * @param modifier A modifier for the field. + * @param value The current value of the text field. + * @param onValueChange A callback when the value changes. + * @param label The label for the text field. + * @param enabled If the field is enabled. + * @param isError Manually set the error state. + * @param errorMessage A custom error message to display. + * @param validator A validator to automatically handle error state and messages. + * @param keyboardOptions Keyboard options for the field. + * @param keyboardActions Keyboard actions for the field. + * @param visualTransformation Visual transformation for the input (e.g., password). + * @param leadingIcon An optional icon to display at the start of the field. + * @param trailingIcon An optional icon to display at the start of the field. + */ +@Composable +fun AuthTextField( + modifier: Modifier = Modifier, + value: String, + onValueChange: (String) -> Unit, + label: @Composable (() -> Unit)? = null, + enabled: Boolean = true, + isError: Boolean? = null, + errorMessage: String? = null, + validator: FieldValidator? = null, + keyboardOptions: KeyboardOptions = KeyboardOptions.Default, + keyboardActions: KeyboardActions = KeyboardActions.Default, + visualTransformation: VisualTransformation = VisualTransformation.None, + leadingIcon: @Composable (() -> Unit)? = null, + trailingIcon: @Composable (() -> Unit)? = null, +) { + val isSecureTextField = validator is PasswordValidator + var passwordVisible by remember { mutableStateOf(false) } + + TextField( + modifier = modifier, + value = value, + onValueChange = { newValue -> + onValueChange(newValue) + validator?.validate(newValue) + }, + label = label, + singleLine = true, + enabled = enabled, + isError = isError ?: validator?.hasError ?: false, + supportingText = { + if (validator?.hasError ?: false) { + Text(text = errorMessage ?: validator.errorMessage) + } + }, + keyboardOptions = keyboardOptions, + keyboardActions = keyboardActions, + visualTransformation = if (isSecureTextField && !passwordVisible) + PasswordVisualTransformation() else visualTransformation, + leadingIcon = leadingIcon, + trailingIcon = trailingIcon ?: { + if (isSecureTextField) { + IconButton( + onClick = { + passwordVisible = !passwordVisible + } + ) { + Icon( + imageVector = if (passwordVisible) + Icons.Filled.VisibilityOff else Icons.Filled.Visibility, + contentDescription = if (passwordVisible) "Hide password" else "Show password" + ) + } + } + }, + ) +} + +@Preview(showBackground = true) +@Composable +internal fun PreviewAuthTextField() { + val context = LocalContext.current + val nameTextValue = remember { mutableStateOf("") } + val emailTextValue = remember { mutableStateOf("") } + val passwordTextValue = remember { mutableStateOf("") } + val emailValidator = remember { + EmailValidator(stringProvider = DefaultAuthUIStringProvider(context)) + } + val passwordValidator = remember { + PasswordValidator( + stringProvider = DefaultAuthUIStringProvider(context), + rules = listOf( + PasswordRule.MinimumLength(8), + PasswordRule.RequireUppercase, + PasswordRule.RequireLowercase, + ) + ) + } + + Column( + modifier = Modifier + .fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + AuthTextField( + value = nameTextValue.value, + label = { + Text("Name") + }, + onValueChange = { text -> + nameTextValue.value = text + }, + ) + Spacer(modifier = Modifier.height(16.dp)) + AuthTextField( + value = emailTextValue.value, + validator = emailValidator, + label = { + Text("Email") + }, + onValueChange = { text -> + emailTextValue.value = text + }, + leadingIcon = { + Icon( + imageVector = Icons.Default.Email, + contentDescription = "" + ) + } + ) + Spacer(modifier = Modifier.height(16.dp)) + AuthTextField( + value = passwordTextValue.value, + validator = passwordValidator, + label = { + Text("Password") + }, + onValueChange = { text -> + passwordTextValue.value = text + }, + leadingIcon = { + Icon( + imageVector = Icons.Default.Lock, + contentDescription = "" + ) + } + ) + } +} \ No newline at end of file diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthTextFieldTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthTextFieldTest.kt new file mode 100644 index 000000000..21629a1a2 --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthTextFieldTest.kt @@ -0,0 +1,449 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.ui.components + +import android.content.Context +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Email +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotDisplayed +import androidx.compose.ui.test.assertIsNotEnabled +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performTextClearance +import androidx.compose.ui.test.performTextInput +import androidx.test.core.app.ApplicationProvider +import com.firebase.ui.auth.compose.configuration.PasswordRule +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.validators.EmailValidator +import com.firebase.ui.auth.compose.configuration.validators.PasswordValidator +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Unit tests for [AuthTextField] covering UI interactions, validation, + * password visibility toggle, and error states. + * + * @suppress Internal test class + */ +@Config(sdk = [34]) +@RunWith(RobolectricTestRunner::class) +class AuthTextFieldTest { + + @get:Rule + val composeTestRule = createComposeRule() + + private lateinit var context: Context + private lateinit var stringProvider: AuthUIStringProvider + + @Before + fun setUp() { + context = ApplicationProvider.getApplicationContext() + stringProvider = DefaultAuthUIStringProvider(context) + } + + // ============================================================================================= + // Basic UI Tests + // ============================================================================================= + + @Test + fun `AuthTextField displays correctly with basic configuration`() { + composeTestRule.setContent { + AuthTextField( + value = "", + onValueChange = { }, + label = { Text("Name") } + ) + } + + composeTestRule + .onNodeWithText("Name") + .assertIsDisplayed() + } + + @Test + fun `AuthTextField displays initial value`() { + composeTestRule.setContent { + AuthTextField( + value = "test@example.com", + onValueChange = { }, + label = { Text("Email") } + ) + } + + composeTestRule + .onNodeWithText("Email") + .assertIsDisplayed() + + composeTestRule + .onNodeWithText("test@example.com") + .assertIsDisplayed() + } + + @Test + fun `AuthTextField updates value on text input`() { + composeTestRule.setContent { + val textValue = remember { mutableStateOf("") } + AuthTextField( + value = textValue.value, + onValueChange = { textValue.value = it }, + label = { Text("Email") } + ) + } + + composeTestRule + .onNodeWithText("Email") + .performTextInput("test@example.com") + + composeTestRule + .onNodeWithText("Email") + .assertIsDisplayed() + + composeTestRule + .onNodeWithText("test@example.com") + .assertIsDisplayed() + } + + @Test + fun `AuthTextField respects enabled state`() { + composeTestRule.setContent { + AuthTextField( + value = "", + onValueChange = { }, + label = { Text("Email") }, + enabled = false + ) + } + + composeTestRule + .onNodeWithText("Email") + .assertIsNotEnabled() + } + + @Test + fun `AuthTextField is enabled by default`() { + composeTestRule.setContent { + AuthTextField( + value = "", + onValueChange = { }, + label = { Text("Email") } + ) + } + + composeTestRule + .onNodeWithText("Email") + .assertIsEnabled() + } + + @Test + fun `AuthTextField displays leading icon when provided`() { + composeTestRule.setContent { + AuthTextField( + value = "", + onValueChange = { }, + label = { Text("Email") }, + leadingIcon = { + Icon( + imageVector = Icons.Default.Email, + contentDescription = "Email Icon" + ) + } + ) + } + + composeTestRule + .onNodeWithContentDescription("Email Icon") + .assertIsDisplayed() + } + + @Test + fun `AuthTextField displays custom trailing icon when provided`() { + composeTestRule.setContent { + AuthTextField( + value = "", + onValueChange = { }, + label = { Text("Email") }, + trailingIcon = { + Icon( + imageVector = Icons.Default.Email, + contentDescription = "Custom Trailing Icon" + ) + } + ) + } + + composeTestRule + .onNodeWithContentDescription("Custom Trailing Icon") + .assertIsDisplayed() + } + + // ============================================================================================= + // Validation Tests + // ============================================================================================= + + @Test + fun `AuthTextField validates email correctly with EmailValidator`() { + composeTestRule.setContent { + val emailValidator = remember { + EmailValidator(stringProvider = stringProvider) + } + val textValue = remember { mutableStateOf("") } + AuthTextField( + value = textValue.value, + onValueChange = { textValue.value = it }, + label = { Text("Email") }, + validator = emailValidator + ) + } + + composeTestRule + .onNodeWithText("Email") + .performTextInput("invalid-email") + + composeTestRule.waitForIdle() + + composeTestRule + .onNodeWithText(stringProvider.invalidEmailAddress) + .assertIsDisplayed() + + composeTestRule + .onNodeWithText("Email") + .performTextClearance() + + composeTestRule.waitForIdle() + + composeTestRule + .onNodeWithText(stringProvider.missingEmailAddress) + .assertIsDisplayed() + + composeTestRule + .onNodeWithText("Email") + .performTextInput("valid@example.com") + + composeTestRule.waitForIdle() + + composeTestRule + .onNodeWithText(stringProvider.missingEmailAddress) + .assertIsNotDisplayed() + composeTestRule + .onNodeWithText(stringProvider.invalidEmailAddress) + .assertIsNotDisplayed() + } + + @Test + fun `AuthTextField displays custom error message when provided`() { + composeTestRule.setContent { + val emailValidator = remember { + EmailValidator(stringProvider = stringProvider) + } + val textValue = remember { mutableStateOf("") } + AuthTextField( + value = textValue.value, + onValueChange = { textValue.value = it }, + label = { Text("Email") }, + validator = emailValidator, + errorMessage = "Custom error message" + ) + } + + composeTestRule + .onNodeWithText("Email") + .performTextInput("invalid") + + composeTestRule.waitForIdle() + + composeTestRule + .onNodeWithText("Custom error message") + .assertIsDisplayed() + } + + @Test + fun `AuthTextField validates password with PasswordValidator`() { + composeTestRule.setContent { + val passwordValidator = remember { + PasswordValidator( + stringProvider = stringProvider, + rules = listOf( + PasswordRule.MinimumLength(8), + PasswordRule.RequireUppercase, + PasswordRule.RequireLowercase + ) + ) + } + val textValue = remember { mutableStateOf("") } + AuthTextField( + value = textValue.value, + onValueChange = { textValue.value = it }, + label = { Text("Password") }, + validator = passwordValidator + ) + } + + composeTestRule + .onNodeWithText("Password") + .performTextInput("short") + + composeTestRule.waitForIdle() + + composeTestRule + .onNodeWithText(stringProvider.passwordTooShort.format(8)) + .assertIsDisplayed() + + composeTestRule + .onNodeWithText("Password") + .performTextClearance() + + composeTestRule.waitForIdle() + + composeTestRule + .onNodeWithText(stringProvider.invalidPassword) + .assertIsDisplayed() + + composeTestRule + .onNodeWithText("Password") + .performTextInput("pass@1234") + + composeTestRule.waitForIdle() + + composeTestRule + .onNodeWithText(stringProvider.passwordMissingUppercase) + .assertIsDisplayed() + + composeTestRule + .onNodeWithText("Password") + .performTextInput("ValidPass123") + + composeTestRule.waitForIdle() + + composeTestRule + .onNodeWithText(stringProvider.passwordTooShort.format(8)) + .assertIsNotDisplayed() + composeTestRule + .onNodeWithText(stringProvider.passwordMissingLowercase) + .assertIsNotDisplayed() + composeTestRule + .onNodeWithText(stringProvider.passwordMissingUppercase) + .assertIsNotDisplayed() + } + + // ============================================================================================= + // Password Visibility Toggle Tests + // ============================================================================================= + + @Test + fun `AuthTextField shows password visibility toggle for PasswordValidator`() { + composeTestRule.setContent { + AuthTextField( + value = "password123", + onValueChange = { }, + label = { Text("Password") }, + validator = PasswordValidator( + stringProvider = stringProvider, + rules = emptyList() + ) + ) + } + + composeTestRule + .onNodeWithContentDescription("Show password") + .assertIsDisplayed() + } + + @Test + fun `AuthTextField toggles password visibility when icon is clicked`() { + composeTestRule.setContent { + AuthTextField( + value = "password123", + onValueChange = { }, + label = { Text("Password") }, + validator = PasswordValidator( + stringProvider = stringProvider, + rules = emptyList() + ) + ) + } + + composeTestRule + .onNodeWithContentDescription("Show password") + .assertIsDisplayed() + .performClick() + + composeTestRule.waitForIdle() + + composeTestRule + .onNodeWithContentDescription("Hide password") + .assertIsDisplayed() + } + + @Test + fun `AuthTextField hides password visibility toggle for non-password fields`() { + composeTestRule.setContent { + AuthTextField( + value = "test@example.com", + onValueChange = { }, + label = { Text("Email") }, + ) + } + + composeTestRule + .onNodeWithContentDescription("Show password") + .assertDoesNotExist() + + composeTestRule + .onNodeWithContentDescription("Hide password") + .assertDoesNotExist() + } + + @Test + fun `AuthTextField respects custom trailing icon over password toggle`() { + composeTestRule.setContent { + AuthTextField( + value = "password123", + onValueChange = { }, + label = { Text("Password") }, + validator = PasswordValidator( + stringProvider = stringProvider, + rules = emptyList() + ), + trailingIcon = { + Icon( + imageVector = Icons.Default.Email, + contentDescription = "Custom Icon" + ) + } + ) + } + + composeTestRule + .onNodeWithContentDescription("Custom Icon") + .assertIsDisplayed() + + composeTestRule + .onNodeWithContentDescription("Show password") + .assertDoesNotExist() + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 105624a8b..41393496e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,7 +19,7 @@ buildscript { plugins { id("com.github.ben-manes.versions") version "0.20.0" - alias(libs.plugins.compose.compiler) apply false + id("org.jetbrains.kotlin.plugin.compose") version Config.kotlinVersion apply false } allprojects { diff --git a/buildSrc/src/main/kotlin/Config.kt b/buildSrc/src/main/kotlin/Config.kt index 8b2317698..a21ca69bc 100644 --- a/buildSrc/src/main/kotlin/Config.kt +++ b/buildSrc/src/main/kotlin/Config.kt @@ -2,7 +2,7 @@ object Config { const val version = "10.0.0-SNAPSHOT" val submodules = listOf("auth", "common", "firestore", "database", "storage") - private const val kotlinVersion = "2.2.0" + const val kotlinVersion = "2.2.0" object SdkVersions { const val compile = 35 @@ -50,7 +50,8 @@ object Config { const val tooling = "androidx.compose.ui:ui-tooling" const val foundation = "androidx.compose.foundation:foundation" const val material3 = "androidx.compose.material3:material3" - const val activityCompose = "androidx.activity:activity-compose" + const val materialIconsExtended = "androidx.compose.material:material-icons-extended" + const val activityCompose = "androidx.activity:activity-compose:1.9.0" } } @@ -95,6 +96,7 @@ object Config { const val rules = "androidx.test:rules:1.5.0" const val kotlinReflect = "org.jetbrains.kotlin:kotlin-reflect" + const val composeUiTestJunit4 = "androidx.compose.ui:ui-test-junit4" } object Lint { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml deleted file mode 100644 index 44eb15432..000000000 --- a/gradle/libs.versions.toml +++ /dev/null @@ -1,9 +0,0 @@ -[versions] -kotlin = "2.2.0" - -[libraries] -# Testing -androidx-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" } - -[plugins] -compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } \ No newline at end of file From a2ba642a0a113723f5f9b152d068ce51bebc585b Mon Sep 17 00:00:00 2001 From: Guillaume Bernos Date: Tue, 7 Oct 2025 15:36:27 +0200 Subject: [PATCH 16/50] feat: CountryData & Selector Utilities (#2235) --- .../ui/auth/compose/data/Countries.kt | 260 +++++++++++++ .../ui/auth/compose/data/CountryData.kt | 62 ++++ .../ui/auth/compose/data/CountryUtils.kt | 117 ++++++ .../ui/auth/compose/data/CountryDataTest.kt | 347 ++++++++++++++++++ 4 files changed, 786 insertions(+) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/data/Countries.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/data/CountryData.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/data/CountryUtils.kt create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/data/CountryDataTest.kt diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/data/Countries.kt b/auth/src/main/java/com/firebase/ui/auth/compose/data/Countries.kt new file mode 100644 index 000000000..3ba0dc497 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/data/Countries.kt @@ -0,0 +1,260 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.data + +/** + * Complete list of countries with their dial codes and ISO country codes. + * Auto-generated from ISO 3166-1 standard. + */ +val ALL_COUNTRIES: List = listOf( + CountryData("Afghanistan", "+93", "AF", countryCodeToFlagEmoji("AF")), + CountryData("Albania", "+355", "AL", countryCodeToFlagEmoji("AL")), + CountryData("Algeria", "+213", "DZ", countryCodeToFlagEmoji("DZ")), + CountryData("American Samoa", "+684", "AS", countryCodeToFlagEmoji("AS")), + CountryData("Andorra", "+376", "AD", countryCodeToFlagEmoji("AD")), + CountryData("Angola", "+244", "AO", countryCodeToFlagEmoji("AO")), + CountryData("Anguilla", "+264", "AI", countryCodeToFlagEmoji("AI")), + CountryData("Antigua and Barbuda", "+268", "AG", countryCodeToFlagEmoji("AG")), + CountryData("Argentina", "+54", "AR", countryCodeToFlagEmoji("AR")), + CountryData("Armenia", "+374", "AM", countryCodeToFlagEmoji("AM")), + CountryData("Aruba", "+297", "AW", countryCodeToFlagEmoji("AW")), + CountryData("Australia", "+61", "AU", countryCodeToFlagEmoji("AU")), + CountryData("Austria", "+43", "AT", countryCodeToFlagEmoji("AT")), + CountryData("Azerbaijan", "+994", "AZ", countryCodeToFlagEmoji("AZ")), + CountryData("Bahamas", "+242", "BS", countryCodeToFlagEmoji("BS")), + CountryData("Bahrain", "+973", "BH", countryCodeToFlagEmoji("BH")), + CountryData("Bangladesh", "+880", "BD", countryCodeToFlagEmoji("BD")), + CountryData("Barbados", "+246", "BB", countryCodeToFlagEmoji("BB")), + CountryData("Belarus", "+375", "BY", countryCodeToFlagEmoji("BY")), + CountryData("Belgium", "+32", "BE", countryCodeToFlagEmoji("BE")), + CountryData("Belize", "+501", "BZ", countryCodeToFlagEmoji("BZ")), + CountryData("Benin", "+229", "BJ", countryCodeToFlagEmoji("BJ")), + CountryData("Bermuda", "+441", "BM", countryCodeToFlagEmoji("BM")), + CountryData("Bhutan", "+975", "BT", countryCodeToFlagEmoji("BT")), + CountryData("Bolivia", "+591", "BO", countryCodeToFlagEmoji("BO")), + CountryData("Bosnia and Herzegovina", "+387", "BA", countryCodeToFlagEmoji("BA")), + CountryData("Botswana", "+267", "BW", countryCodeToFlagEmoji("BW")), + CountryData("Brazil", "+55", "BR", countryCodeToFlagEmoji("BR")), + CountryData("British Indian Ocean Territory", "+246", "IO", countryCodeToFlagEmoji("IO")), + CountryData("Brunei", "+673", "BN", countryCodeToFlagEmoji("BN")), + CountryData("Bulgaria", "+359", "BG", countryCodeToFlagEmoji("BG")), + CountryData("Burkina Faso", "+226", "BF", countryCodeToFlagEmoji("BF")), + CountryData("Burundi", "+257", "BI", countryCodeToFlagEmoji("BI")), + CountryData("Cambodia", "+855", "KH", countryCodeToFlagEmoji("KH")), + CountryData("Cameroon", "+237", "CM", countryCodeToFlagEmoji("CM")), + CountryData("Canada", "+1", "CA", countryCodeToFlagEmoji("CA")), + CountryData("Cape Verde", "+238", "CV", countryCodeToFlagEmoji("CV")), + CountryData("Cayman Islands", "+345", "KY", countryCodeToFlagEmoji("KY")), + CountryData("Central African Republic", "+236", "CF", countryCodeToFlagEmoji("CF")), + CountryData("Chad", "+235", "TD", countryCodeToFlagEmoji("TD")), + CountryData("Chile", "+56", "CL", countryCodeToFlagEmoji("CL")), + CountryData("China", "+86", "CN", countryCodeToFlagEmoji("CN")), + CountryData("Colombia", "+57", "CO", countryCodeToFlagEmoji("CO")), + CountryData("Comoros", "+269", "KM", countryCodeToFlagEmoji("KM")), + CountryData("Congo", "+242", "CG", countryCodeToFlagEmoji("CG")), + CountryData("Congo (DRC)", "+243", "CD", countryCodeToFlagEmoji("CD")), + CountryData("Cook Islands", "+682", "CK", countryCodeToFlagEmoji("CK")), + CountryData("Costa Rica", "+506", "CR", countryCodeToFlagEmoji("CR")), + CountryData("Côte d'Ivoire", "+225", "CI", countryCodeToFlagEmoji("CI")), + CountryData("Croatia", "+385", "HR", countryCodeToFlagEmoji("HR")), + CountryData("Cuba", "+53", "CU", countryCodeToFlagEmoji("CU")), + CountryData("Curaçao", "+599", "CW", countryCodeToFlagEmoji("CW")), + CountryData("Cyprus", "+357", "CY", countryCodeToFlagEmoji("CY")), + CountryData("Czech Republic", "+420", "CZ", countryCodeToFlagEmoji("CZ")), + CountryData("Denmark", "+45", "DK", countryCodeToFlagEmoji("DK")), + CountryData("Djibouti", "+253", "DJ", countryCodeToFlagEmoji("DJ")), + CountryData("Dominica", "+767", "DM", countryCodeToFlagEmoji("DM")), + CountryData("Dominican Republic", "+809", "DO", countryCodeToFlagEmoji("DO")), + CountryData("Ecuador", "+593", "EC", countryCodeToFlagEmoji("EC")), + CountryData("Egypt", "+20", "EG", countryCodeToFlagEmoji("EG")), + CountryData("El Salvador", "+503", "SV", countryCodeToFlagEmoji("SV")), + CountryData("Equatorial Guinea", "+240", "GQ", countryCodeToFlagEmoji("GQ")), + CountryData("Eritrea", "+291", "ER", countryCodeToFlagEmoji("ER")), + CountryData("Estonia", "+372", "EE", countryCodeToFlagEmoji("EE")), + CountryData("Ethiopia", "+251", "ET", countryCodeToFlagEmoji("ET")), + CountryData("Falkland Islands", "+500", "FK", countryCodeToFlagEmoji("FK")), + CountryData("Faroe Islands", "+298", "FO", countryCodeToFlagEmoji("FO")), + CountryData("Fiji", "+679", "FJ", countryCodeToFlagEmoji("FJ")), + CountryData("Finland", "+358", "FI", countryCodeToFlagEmoji("FI")), + CountryData("France", "+33", "FR", countryCodeToFlagEmoji("FR")), + CountryData("French Guiana", "+594", "GF", countryCodeToFlagEmoji("GF")), + CountryData("French Polynesia", "+689", "PF", countryCodeToFlagEmoji("PF")), + CountryData("Gabon", "+241", "GA", countryCodeToFlagEmoji("GA")), + CountryData("Gambia", "+220", "GM", countryCodeToFlagEmoji("GM")), + CountryData("Georgia", "+995", "GE", countryCodeToFlagEmoji("GE")), + CountryData("Germany", "+49", "DE", countryCodeToFlagEmoji("DE")), + CountryData("Ghana", "+233", "GH", countryCodeToFlagEmoji("GH")), + CountryData("Gibraltar", "+350", "GI", countryCodeToFlagEmoji("GI")), + CountryData("Greece", "+30", "GR", countryCodeToFlagEmoji("GR")), + CountryData("Greenland", "+299", "GL", countryCodeToFlagEmoji("GL")), + CountryData("Grenada", "+473", "GD", countryCodeToFlagEmoji("GD")), + CountryData("Guadeloupe", "+590", "GP", countryCodeToFlagEmoji("GP")), + CountryData("Guam", "+671", "GU", countryCodeToFlagEmoji("GU")), + CountryData("Guatemala", "+502", "GT", countryCodeToFlagEmoji("GT")), + CountryData("Guernsey", "+1481", "GG", countryCodeToFlagEmoji("GG")), + CountryData("Guinea", "+224", "GN", countryCodeToFlagEmoji("GN")), + CountryData("Guinea-Bissau", "+245", "GW", countryCodeToFlagEmoji("GW")), + CountryData("Guyana", "+592", "GY", countryCodeToFlagEmoji("GY")), + CountryData("Haiti", "+509", "HT", countryCodeToFlagEmoji("HT")), + CountryData("Honduras", "+504", "HN", countryCodeToFlagEmoji("HN")), + CountryData("Hong Kong", "+852", "HK", countryCodeToFlagEmoji("HK")), + CountryData("Hungary", "+36", "HU", countryCodeToFlagEmoji("HU")), + CountryData("Iceland", "+354", "IS", countryCodeToFlagEmoji("IS")), + CountryData("India", "+91", "IN", countryCodeToFlagEmoji("IN")), + CountryData("Indonesia", "+62", "ID", countryCodeToFlagEmoji("ID")), + CountryData("Iran", "+98", "IR", countryCodeToFlagEmoji("IR")), + CountryData("Iraq", "+964", "IQ", countryCodeToFlagEmoji("IQ")), + CountryData("Ireland", "+353", "IE", countryCodeToFlagEmoji("IE")), + CountryData("Isle of Man", "+44", "IM", countryCodeToFlagEmoji("IM")), + CountryData("Israel", "+972", "IL", countryCodeToFlagEmoji("IL")), + CountryData("Italy", "+39", "IT", countryCodeToFlagEmoji("IT")), + CountryData("Jamaica", "+876", "JM", countryCodeToFlagEmoji("JM")), + CountryData("Japan", "+81", "JP", countryCodeToFlagEmoji("JP")), + CountryData("Jersey", "+44", "JE", countryCodeToFlagEmoji("JE")), + CountryData("Jordan", "+962", "JO", countryCodeToFlagEmoji("JO")), + CountryData("Kazakhstan", "+7", "KZ", countryCodeToFlagEmoji("KZ")), + CountryData("Kenya", "+254", "KE", countryCodeToFlagEmoji("KE")), + CountryData("Kiribati", "+686", "KI", countryCodeToFlagEmoji("KI")), + CountryData("Kosovo", "+383", "XK", countryCodeToFlagEmoji("XK")), + CountryData("Kuwait", "+965", "KW", countryCodeToFlagEmoji("KW")), + CountryData("Kyrgyzstan", "+996", "KG", countryCodeToFlagEmoji("KG")), + CountryData("Laos", "+856", "LA", countryCodeToFlagEmoji("LA")), + CountryData("Latvia", "+371", "LV", countryCodeToFlagEmoji("LV")), + CountryData("Lebanon", "+961", "LB", countryCodeToFlagEmoji("LB")), + CountryData("Lesotho", "+266", "LS", countryCodeToFlagEmoji("LS")), + CountryData("Liberia", "+231", "LR", countryCodeToFlagEmoji("LR")), + CountryData("Libya", "+218", "LY", countryCodeToFlagEmoji("LY")), + CountryData("Liechtenstein", "+423", "LI", countryCodeToFlagEmoji("LI")), + CountryData("Lithuania", "+370", "LT", countryCodeToFlagEmoji("LT")), + CountryData("Luxembourg", "+352", "LU", countryCodeToFlagEmoji("LU")), + CountryData("Macao", "+853", "MO", countryCodeToFlagEmoji("MO")), + CountryData("Macedonia", "+389", "MK", countryCodeToFlagEmoji("MK")), + CountryData("Madagascar", "+261", "MG", countryCodeToFlagEmoji("MG")), + CountryData("Malawi", "+265", "MW", countryCodeToFlagEmoji("MW")), + CountryData("Malaysia", "+60", "MY", countryCodeToFlagEmoji("MY")), + CountryData("Maldives", "+960", "MV", countryCodeToFlagEmoji("MV")), + CountryData("Mali", "+223", "ML", countryCodeToFlagEmoji("ML")), + CountryData("Malta", "+356", "MT", countryCodeToFlagEmoji("MT")), + CountryData("Marshall Islands", "+692", "MH", countryCodeToFlagEmoji("MH")), + CountryData("Martinique", "+596", "MQ", countryCodeToFlagEmoji("MQ")), + CountryData("Mauritania", "+222", "MR", countryCodeToFlagEmoji("MR")), + CountryData("Mauritius", "+230", "MU", countryCodeToFlagEmoji("MU")), + CountryData("Mayotte", "+262", "YT", countryCodeToFlagEmoji("YT")), + CountryData("Mexico", "+52", "MX", countryCodeToFlagEmoji("MX")), + CountryData("Micronesia", "+691", "FM", countryCodeToFlagEmoji("FM")), + CountryData("Moldova", "+373", "MD", countryCodeToFlagEmoji("MD")), + CountryData("Monaco", "+377", "MC", countryCodeToFlagEmoji("MC")), + CountryData("Mongolia", "+976", "MN", countryCodeToFlagEmoji("MN")), + CountryData("Montenegro", "+382", "ME", countryCodeToFlagEmoji("ME")), + CountryData("Montserrat", "+664", "MS", countryCodeToFlagEmoji("MS")), + CountryData("Morocco", "+212", "MA", countryCodeToFlagEmoji("MA")), + CountryData("Mozambique", "+258", "MZ", countryCodeToFlagEmoji("MZ")), + CountryData("Myanmar", "+95", "MM", countryCodeToFlagEmoji("MM")), + CountryData("Namibia", "+264", "NA", countryCodeToFlagEmoji("NA")), + CountryData("Nauru", "+674", "NR", countryCodeToFlagEmoji("NR")), + CountryData("Nepal", "+977", "NP", countryCodeToFlagEmoji("NP")), + CountryData("Netherlands", "+31", "NL", countryCodeToFlagEmoji("NL")), + CountryData("New Caledonia", "+687", "NC", countryCodeToFlagEmoji("NC")), + CountryData("New Zealand", "+64", "NZ", countryCodeToFlagEmoji("NZ")), + CountryData("Nicaragua", "+505", "NI", countryCodeToFlagEmoji("NI")), + CountryData("Niger", "+227", "NE", countryCodeToFlagEmoji("NE")), + CountryData("Nigeria", "+234", "NG", countryCodeToFlagEmoji("NG")), + CountryData("Niue", "+683", "NU", countryCodeToFlagEmoji("NU")), + CountryData("Norfolk Island", "+672", "NF", countryCodeToFlagEmoji("NF")), + CountryData("North Korea", "+850", "KP", countryCodeToFlagEmoji("KP")), + CountryData("Northern Mariana Islands", "+670", "MP", countryCodeToFlagEmoji("MP")), + CountryData("Norway", "+47", "NO", countryCodeToFlagEmoji("NO")), + CountryData("Oman", "+968", "OM", countryCodeToFlagEmoji("OM")), + CountryData("Pakistan", "+92", "PK", countryCodeToFlagEmoji("PK")), + CountryData("Palau", "+680", "PW", countryCodeToFlagEmoji("PW")), + CountryData("Palestine", "+970", "PS", countryCodeToFlagEmoji("PS")), + CountryData("Panama", "+507", "PA", countryCodeToFlagEmoji("PA")), + CountryData("Papua New Guinea", "+675", "PG", countryCodeToFlagEmoji("PG")), + CountryData("Paraguay", "+595", "PY", countryCodeToFlagEmoji("PY")), + CountryData("Peru", "+51", "PE", countryCodeToFlagEmoji("PE")), + CountryData("Philippines", "+63", "PH", countryCodeToFlagEmoji("PH")), + CountryData("Poland", "+48", "PL", countryCodeToFlagEmoji("PL")), + CountryData("Portugal", "+351", "PT", countryCodeToFlagEmoji("PT")), + CountryData("Puerto Rico", "+787", "PR", countryCodeToFlagEmoji("PR")), + CountryData("Qatar", "+974", "QA", countryCodeToFlagEmoji("QA")), + CountryData("Réunion", "+262", "RE", countryCodeToFlagEmoji("RE")), + CountryData("Romania", "+40", "RO", countryCodeToFlagEmoji("RO")), + CountryData("Russia", "+7", "RU", countryCodeToFlagEmoji("RU")), + CountryData("Rwanda", "+250", "RW", countryCodeToFlagEmoji("RW")), + CountryData("Saint Barthélemy", "+590", "BL", countryCodeToFlagEmoji("BL")), + CountryData("Saint Helena", "+290", "SH", countryCodeToFlagEmoji("SH")), + CountryData("Saint Kitts and Nevis", "+869", "KN", countryCodeToFlagEmoji("KN")), + CountryData("Saint Lucia", "+758", "LC", countryCodeToFlagEmoji("LC")), + CountryData("Saint Martin", "+590", "MF", countryCodeToFlagEmoji("MF")), + CountryData("Saint Pierre and Miquelon", "+508", "PM", countryCodeToFlagEmoji("PM")), + CountryData("Saint Vincent and the Grenadines", "+784", "VC", countryCodeToFlagEmoji("VC")), + CountryData("Samoa", "+685", "WS", countryCodeToFlagEmoji("WS")), + CountryData("San Marino", "+378", "SM", countryCodeToFlagEmoji("SM")), + CountryData("Sao Tome and Principe", "+239", "ST", countryCodeToFlagEmoji("ST")), + CountryData("Saudi Arabia", "+966", "SA", countryCodeToFlagEmoji("SA")), + CountryData("Senegal", "+221", "SN", countryCodeToFlagEmoji("SN")), + CountryData("Serbia", "+381", "RS", countryCodeToFlagEmoji("RS")), + CountryData("Seychelles", "+248", "SC", countryCodeToFlagEmoji("SC")), + CountryData("Sierra Leone", "+232", "SL", countryCodeToFlagEmoji("SL")), + CountryData("Singapore", "+65", "SG", countryCodeToFlagEmoji("SG")), + CountryData("Sint Maarten", "+599", "SX", countryCodeToFlagEmoji("SX")), + CountryData("Slovakia", "+421", "SK", countryCodeToFlagEmoji("SK")), + CountryData("Slovenia", "+386", "SI", countryCodeToFlagEmoji("SI")), + CountryData("Solomon Islands", "+677", "SB", countryCodeToFlagEmoji("SB")), + CountryData("Somalia", "+252", "SO", countryCodeToFlagEmoji("SO")), + CountryData("South Africa", "+27", "ZA", countryCodeToFlagEmoji("ZA")), + CountryData("South Korea", "+82", "KR", countryCodeToFlagEmoji("KR")), + CountryData("South Sudan", "+211", "SS", countryCodeToFlagEmoji("SS")), + CountryData("Spain", "+34", "ES", countryCodeToFlagEmoji("ES")), + CountryData("Sri Lanka", "+94", "LK", countryCodeToFlagEmoji("LK")), + CountryData("Sudan", "+249", "SD", countryCodeToFlagEmoji("SD")), + CountryData("Suriname", "+597", "SR", countryCodeToFlagEmoji("SR")), + CountryData("Swaziland", "+268", "SZ", countryCodeToFlagEmoji("SZ")), + CountryData("Sweden", "+46", "SE", countryCodeToFlagEmoji("SE")), + CountryData("Switzerland", "+41", "CH", countryCodeToFlagEmoji("CH")), + CountryData("Syria", "+963", "SY", countryCodeToFlagEmoji("SY")), + CountryData("Taiwan", "+886", "TW", countryCodeToFlagEmoji("TW")), + CountryData("Tajikistan", "+992", "TJ", countryCodeToFlagEmoji("TJ")), + CountryData("Tanzania", "+255", "TZ", countryCodeToFlagEmoji("TZ")), + CountryData("Thailand", "+66", "TH", countryCodeToFlagEmoji("TH")), + CountryData("Timor-Leste", "+670", "TL", countryCodeToFlagEmoji("TL")), + CountryData("Togo", "+228", "TG", countryCodeToFlagEmoji("TG")), + CountryData("Tokelau", "+690", "TK", countryCodeToFlagEmoji("TK")), + CountryData("Tonga", "+676", "TO", countryCodeToFlagEmoji("TO")), + CountryData("Trinidad and Tobago", "+868", "TT", countryCodeToFlagEmoji("TT")), + CountryData("Tunisia", "+216", "TN", countryCodeToFlagEmoji("TN")), + CountryData("Turkey", "+90", "TR", countryCodeToFlagEmoji("TR")), + CountryData("Turkmenistan", "+993", "TM", countryCodeToFlagEmoji("TM")), + CountryData("Turks and Caicos Islands", "+649", "TC", countryCodeToFlagEmoji("TC")), + CountryData("Tuvalu", "+688", "TV", countryCodeToFlagEmoji("TV")), + CountryData("Uganda", "+256", "UG", countryCodeToFlagEmoji("UG")), + CountryData("Ukraine", "+380", "UA", countryCodeToFlagEmoji("UA")), + CountryData("United Arab Emirates", "+971", "AE", countryCodeToFlagEmoji("AE")), + CountryData("United Kingdom", "+44", "GB", countryCodeToFlagEmoji("GB")), + CountryData("United States", "+1", "US", countryCodeToFlagEmoji("US")), + CountryData("Uruguay", "+598", "UY", countryCodeToFlagEmoji("UY")), + CountryData("Uzbekistan", "+998", "UZ", countryCodeToFlagEmoji("UZ")), + CountryData("Vanuatu", "+678", "VU", countryCodeToFlagEmoji("VU")), + CountryData("Vatican City", "+379", "VA", countryCodeToFlagEmoji("VA")), + CountryData("Venezuela", "+58", "VE", countryCodeToFlagEmoji("VE")), + CountryData("Vietnam", "+84", "VN", countryCodeToFlagEmoji("VN")), + CountryData("Virgin Islands (British)", "+284", "VG", countryCodeToFlagEmoji("VG")), + CountryData("Virgin Islands (U.S.)", "+340", "VI", countryCodeToFlagEmoji("VI")), + CountryData("Wallis and Futuna", "+681", "WF", countryCodeToFlagEmoji("WF")), + CountryData("Western Sahara", "+212", "EH", countryCodeToFlagEmoji("EH")), + CountryData("Yemen", "+967", "YE", countryCodeToFlagEmoji("YE")), + CountryData("Zambia", "+260", "ZM", countryCodeToFlagEmoji("ZM")), + CountryData("Zimbabwe", "+263", "ZW", countryCodeToFlagEmoji("ZW")) +) diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/data/CountryData.kt b/auth/src/main/java/com/firebase/ui/auth/compose/data/CountryData.kt new file mode 100644 index 000000000..7deb276b7 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/data/CountryData.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.data + +/** + * Represents country information for phone number authentication. + * + * @property name The display name of the country (e.g., "United States"). + * @property dialCode The international dialing code (e.g., "+1"). + * @property countryCode The ISO 3166-1 alpha-2 country code (e.g., "US"). + * @property flagEmoji The flag emoji for the country (e.g., "🇺🇸"). + */ +data class CountryData( + val name: String, + val dialCode: String, + val countryCode: String, + val flagEmoji: String +) { + /** + * Returns a formatted display string combining flag emoji and country name. + */ + fun getDisplayName(): String = "$flagEmoji $name" + + /** + * Returns a formatted string with dial code. + */ + fun getDisplayNameWithDialCode(): String = "$flagEmoji $name ($dialCode)" +} + +/** + * Converts an ISO 3166-1 alpha-2 country code to its corresponding flag emoji. + * + * @param countryCode The two-letter country code (e.g., "US", "GB", "FR"). + * @return The flag emoji string, or an empty string if the code is invalid. + */ +fun countryCodeToFlagEmoji(countryCode: String): String { + if (countryCode.length != 2) return "" + + val uppercaseCode = countryCode.uppercase() + val baseCodePoint = 0x1F1E6 // Regional Indicator Symbol Letter A + val charCodeOffset = 'A'.code + + val firstChar = uppercaseCode[0].code + val secondChar = uppercaseCode[1].code + + val firstCodePoint = baseCodePoint + (firstChar - charCodeOffset) + val secondCodePoint = baseCodePoint + (secondChar - charCodeOffset) + + return String(intArrayOf(firstCodePoint, secondCodePoint), 0, 2) +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/data/CountryUtils.kt b/auth/src/main/java/com/firebase/ui/auth/compose/data/CountryUtils.kt new file mode 100644 index 000000000..e6ef16f06 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/data/CountryUtils.kt @@ -0,0 +1,117 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.data + +import java.text.Normalizer +import java.util.Locale + +/** + * Utility functions for searching and filtering countries. + */ +object CountryUtils { + + // Lazy-initialized maps for fast lookups + private val countryCodeMap: Map by lazy { + ALL_COUNTRIES.associateBy { it.countryCode.uppercase() } + } + + private val dialCodeMap: Map> by lazy { + ALL_COUNTRIES.groupBy { it.dialCode } + } + + /** + * Finds a country by its ISO 3166-1 alpha-2 country code. + * + * @param countryCode The two-letter country code (e.g., "US", "GB"). + * @return The CountryData or null if not found. + */ + fun findByCountryCode(countryCode: String): CountryData? { + return countryCodeMap[countryCode.uppercase()] + } + + /** + * Finds all countries with the given dial code. + * + * @param dialCode The international dialing code (e.g., "+1", "+44"). + * @return List of countries with that dial code, or empty list if none found. + */ + fun findByDialCode(dialCode: String): List { + return dialCodeMap[dialCode] ?: emptyList() + } + + /** + * Searches for countries by name. Supports partial matching and diacritic-insensitive search. + * + * @param query The search query. + * @return List of countries matching the query, or empty list if none found. + */ + fun searchByName(query: String): List { + val trimmedQuery = query.trim() + if (trimmedQuery.isEmpty()) return emptyList() + + val normalizedQuery = normalizeString(trimmedQuery) + + return ALL_COUNTRIES.filter { country -> + normalizeString(country.name).contains(normalizedQuery, ignoreCase = true) + } + } + + /** + * Filters countries by allowed country codes. + * + * @param allowedCountryCodes Set of allowed ISO 3166-1 alpha-2 country codes. + * @return List of countries that are in the allowed set. + */ + fun filterByAllowedCountries(allowedCountryCodes: Set): List { + if (allowedCountryCodes.isEmpty()) return ALL_COUNTRIES + + val uppercaseAllowed = allowedCountryCodes.map { it.uppercase() }.toSet() + return ALL_COUNTRIES.filter { it.countryCode.uppercase() in uppercaseAllowed } + } + + /** + * Gets the default country based on the device's locale. + * + * @return The CountryData for the device's country, or United States as fallback. + */ + fun getDefaultCountry(): CountryData { + val deviceCountryCode = Locale.getDefault().country + return findByCountryCode(deviceCountryCode) ?: findByCountryCode("US")!! + } + + /** + * Formats a phone number with the country's dial code. + * + * @param dialCode The country dial code (e.g., "+1"). + * @param phoneNumber The local phone number. + * @return The formatted international phone number. + */ + fun formatPhoneNumber(dialCode: String, phoneNumber: String): String { + val cleanNumber = phoneNumber.replace(Regex("[^0-9]"), "") + return "$dialCode$cleanNumber" + } + + /** + * Normalizes a string by removing diacritics and converting to lowercase. + * + * @param value The string to normalize. + * @return The normalized string. + */ + private fun normalizeString(value: String): String { + return Normalizer.normalize(value, Normalizer.Form.NFD) + .replace(Regex("\\p{M}"), "") + .lowercase() + } +} diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/data/CountryDataTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/data/CountryDataTest.kt new file mode 100644 index 000000000..8c7064f8f --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/data/CountryDataTest.kt @@ -0,0 +1,347 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.data + +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Unit tests for [CountryData] and related utilities. + * + * @suppress Internal test class + */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class CountryDataTest { + + // ============================================================================================= + // CountryData Tests + // ============================================================================================= + + @Test + fun `CountryData has correct properties`() { + val country = CountryData( + name = "United States", + dialCode = "+1", + countryCode = "US", + flagEmoji = "🇺🇸" + ) + + assertThat(country.name).isEqualTo("United States") + assertThat(country.dialCode).isEqualTo("+1") + assertThat(country.countryCode).isEqualTo("US") + assertThat(country.flagEmoji).isEqualTo("🇺🇸") + } + + @Test + fun `getDisplayName returns formatted name with flag`() { + val country = CountryData( + name = "United Kingdom", + dialCode = "+44", + countryCode = "GB", + flagEmoji = "🇬🇧" + ) + + assertThat(country.getDisplayName()).isEqualTo("🇬🇧 United Kingdom") + } + + @Test + fun `getDisplayNameWithDialCode returns formatted name with flag and dial code`() { + val country = CountryData( + name = "France", + dialCode = "+33", + countryCode = "FR", + flagEmoji = "🇫🇷" + ) + + assertThat(country.getDisplayNameWithDialCode()).isEqualTo("🇫🇷 France (+33)") + } + + // ============================================================================================= + // Flag Emoji Tests + // ============================================================================================= + + @Test + fun `countryCodeToFlagEmoji generates correct emoji for US`() { + val emoji = countryCodeToFlagEmoji("US") + assertThat(emoji).isEqualTo("🇺🇸") + } + + @Test + fun `countryCodeToFlagEmoji generates correct emoji for GB`() { + val emoji = countryCodeToFlagEmoji("GB") + assertThat(emoji).isEqualTo("🇬🇧") + } + + @Test + fun `countryCodeToFlagEmoji generates correct emoji for FR`() { + val emoji = countryCodeToFlagEmoji("FR") + assertThat(emoji).isEqualTo("🇫🇷") + } + + @Test + fun `countryCodeToFlagEmoji works with lowercase codes`() { + val emoji = countryCodeToFlagEmoji("de") + assertThat(emoji).isEqualTo("🇩🇪") + } + + @Test + fun `countryCodeToFlagEmoji returns empty string for invalid code length`() { + val emoji = countryCodeToFlagEmoji("USA") + assertThat(emoji).isEmpty() + } + + @Test + fun `countryCodeToFlagEmoji returns empty string for empty code`() { + val emoji = countryCodeToFlagEmoji("") + assertThat(emoji).isEmpty() + } + + @Test + fun `countryCodeToFlagEmoji returns empty string for single character`() { + val emoji = countryCodeToFlagEmoji("U") + assertThat(emoji).isEmpty() + } + + // ============================================================================================= + // Country List Tests + // ============================================================================================= + + @Test + fun `ALL_COUNTRIES contains expected number of countries`() { + assertThat(ALL_COUNTRIES).isNotEmpty() + assertThat(ALL_COUNTRIES.size).isGreaterThan(200) + } + + @Test + fun `ALL_COUNTRIES contains United States`() { + val us = ALL_COUNTRIES.find { it.countryCode == "US" } + assertThat(us).isNotNull() + assertThat(us?.name).isEqualTo("United States") + assertThat(us?.dialCode).isEqualTo("+1") + } + + @Test + fun `ALL_COUNTRIES contains United Kingdom`() { + val uk = ALL_COUNTRIES.find { it.countryCode == "GB" } + assertThat(uk).isNotNull() + assertThat(uk?.name).isEqualTo("United Kingdom") + assertThat(uk?.dialCode).isEqualTo("+44") + } + + @Test + fun `ALL_COUNTRIES contains France`() { + val france = ALL_COUNTRIES.find { it.countryCode == "FR" } + assertThat(france).isNotNull() + assertThat(france?.name).isEqualTo("France") + assertThat(france?.dialCode).isEqualTo("+33") + } + + @Test + fun `ALL_COUNTRIES has no duplicate country codes`() { + val countryCodes = ALL_COUNTRIES.map { it.countryCode } + val uniqueCodes = countryCodes.toSet() + assertThat(countryCodes.size).isEqualTo(uniqueCodes.size) + } + + @Test + fun `ALL_COUNTRIES all entries have valid flag emojis`() { + ALL_COUNTRIES.forEach { country -> + assertThat(country.flagEmoji).isNotEmpty() + } + } + + @Test + fun `ALL_COUNTRIES all entries have dial codes starting with plus`() { + ALL_COUNTRIES.forEach { country -> + assertThat(country.dialCode).startsWith("+") + } + } + + @Test + fun `ALL_COUNTRIES all entries have two-letter country codes`() { + ALL_COUNTRIES.forEach { country -> + assertThat(country.countryCode).hasLength(2) + } + } + + // ============================================================================================= + // CountryUtils - Lookup Tests + // ============================================================================================= + + @Test + fun `findByCountryCode returns correct country for US`() { + val country = CountryUtils.findByCountryCode("US") + assertThat(country).isNotNull() + assertThat(country?.name).isEqualTo("United States") + assertThat(country?.dialCode).isEqualTo("+1") + } + + @Test + fun `findByCountryCode is case insensitive`() { + val country = CountryUtils.findByCountryCode("us") + assertThat(country).isNotNull() + assertThat(country?.countryCode).isEqualTo("US") + } + + @Test + fun `findByCountryCode returns null for invalid code`() { + val country = CountryUtils.findByCountryCode("XX") + assertThat(country).isNull() + } + + @Test + fun `findByDialCode returns countries with +1 dial code`() { + val countries = CountryUtils.findByDialCode("+1") + assertThat(countries).isNotEmpty() + assertThat(countries.map { it.countryCode }).contains("US") + assertThat(countries.map { it.countryCode }).contains("CA") + } + + @Test + fun `findByDialCode returns countries with +44 dial code`() { + val countries = CountryUtils.findByDialCode("+44") + assertThat(countries).isNotEmpty() + val countryCodes = countries.map { it.countryCode } + assertThat(countryCodes).contains("GB") + } + + @Test + fun `findByDialCode returns empty list for non-existent dial code`() { + val countries = CountryUtils.findByDialCode("+9999") + assertThat(countries).isEmpty() + } + + // ============================================================================================= + // CountryUtils - Search Tests + // ============================================================================================= + + @Test + fun `searchByName finds United States`() { + val countries = CountryUtils.searchByName("United States") + assertThat(countries).isNotEmpty() + assertThat(countries[0].countryCode).isEqualTo("US") + } + + @Test + fun `searchByName finds countries with partial match`() { + val countries = CountryUtils.searchByName("United") + assertThat(countries).isNotEmpty() + val names = countries.map { it.name } + assertThat(names).contains("United States") + assertThat(names).contains("United Kingdom") + assertThat(names).contains("United Arab Emirates") + } + + @Test + fun `searchByName is case insensitive`() { + val countries = CountryUtils.searchByName("france") + assertThat(countries).isNotEmpty() + assertThat(countries[0].countryCode).isEqualTo("FR") + } + + @Test + fun `searchByName handles diacritics`() { + val countries = CountryUtils.searchByName("Cote d'Ivoire") + assertThat(countries).isNotEmpty() + assertThat(countries[0].countryCode).isEqualTo("CI") + } + + @Test + fun `searchByName returns empty list for empty query`() { + val countries = CountryUtils.searchByName("") + assertThat(countries).isEmpty() + } + + @Test + fun `searchByName returns empty list for whitespace query`() { + val countries = CountryUtils.searchByName(" ") + assertThat(countries).isEmpty() + } + + // ============================================================================================= + // CountryUtils - Filter Tests + // ============================================================================================= + + @Test + fun `filterByAllowedCountries returns only allowed countries`() { + val allowedCodes = setOf("US", "GB", "FR") + val filtered = CountryUtils.filterByAllowedCountries(allowedCodes) + + assertThat(filtered).hasSize(3) + val countryCodes = filtered.map { it.countryCode } + assertThat(countryCodes).containsExactly("US", "GB", "FR") + } + + @Test + fun `filterByAllowedCountries is case insensitive`() { + val allowedCodes = setOf("us", "gb") + val filtered = CountryUtils.filterByAllowedCountries(allowedCodes) + + assertThat(filtered).hasSize(2) + val countryCodes = filtered.map { it.countryCode } + assertThat(countryCodes).containsExactly("US", "GB") + } + + @Test + fun `filterByAllowedCountries returns all countries when set is empty`() { + val filtered = CountryUtils.filterByAllowedCountries(emptySet()) + assertThat(filtered).hasSize(ALL_COUNTRIES.size) + } + + @Test + fun `filterByAllowedCountries returns empty list for non-existent codes`() { + val allowedCodes = setOf("XX", "YY") + val filtered = CountryUtils.filterByAllowedCountries(allowedCodes) + assertThat(filtered).isEmpty() + } + + // ============================================================================================= + // CountryUtils - Default Country Tests + // ============================================================================================= + + @Test + fun `getDefaultCountry returns a valid country`() { + val country = CountryUtils.getDefaultCountry() + assertThat(country).isNotNull() + assertThat(country.countryCode).isNotEmpty() + assertThat(country.dialCode).isNotEmpty() + } + + // ============================================================================================= + // CountryUtils - Formatting Tests + // ============================================================================================= + + @Test + fun `formatPhoneNumber combines dial code and phone number`() { + val formatted = CountryUtils.formatPhoneNumber("+1", "5551234567") + assertThat(formatted).isEqualTo("+15551234567") + } + + @Test + fun `formatPhoneNumber removes non-numeric characters from phone number`() { + val formatted = CountryUtils.formatPhoneNumber("+1", "(555) 123-4567") + assertThat(formatted).isEqualTo("+15551234567") + } + + @Test + fun `formatPhoneNumber handles phone number with spaces`() { + val formatted = CountryUtils.formatPhoneNumber("+44", "20 1234 5678") + assertThat(formatted).isEqualTo("+442012345678") + } +} From 10b6dc73e04a1f371dcf8a11bdefa85d4ce57417 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo <48495111+demolaf@users.noreply.github.com> Date: Wed, 8 Oct 2025 15:08:41 +0100 Subject: [PATCH 17/50] feat: Email Provider Integration (#2233) * feat: Email provider integration - added: sign in, sign up, reset password, email link and anonymous auto upgrade - upgrade mockito - fixed spying mocked objects in new library test error * feat: add PasswordResetLinkSent state * chore: remove unused methods * chore: remove unused comments and code * chore: remove unused imports, reformat * chore: remove comments * chore: remove comments * handle authState exceptions * fix: mockito 5 upgrade stubbing issues --- auth/build.gradle.kts | 20 +- .../firebase/ui/auth/compose/AuthException.kt | 77 +- .../com/firebase/ui/auth/compose/AuthState.kt | 53 +- .../ui/auth/compose/FirebaseAuthUI.kt | 7 +- .../configuration/AuthUIConfiguration.kt | 10 +- .../compose/configuration/PasswordRule.kt | 2 +- .../{ => auth_provider}/AuthProvider.kt | 151 ++- .../EmailAuthProvider+FirebaseAuthUI.kt | 960 ++++++++++++++++++ .../AuthUIStringProviderSample.kt | 2 +- .../DefaultAuthUIStringProvider.kt | 6 +- .../theme/ProviderStyleDefaults.kt | 2 +- .../validators/PasswordValidator.kt | 2 +- .../ui/components/AuthProviderButton.kt | 8 +- .../ui/components/ErrorRecoveryDialog.kt | 3 + .../ui/method_picker/AuthMethodPicker.kt | 2 +- .../util/EmailLinkPersistenceManager.kt | 158 +++ .../compose/FirebaseAuthUIAuthStateTest.kt | 4 +- .../ui/auth/compose/FirebaseAuthUITest.kt | 28 +- .../configuration/AuthUIConfigurationTest.kt | 1 + .../{ => auth_provider}/AuthProviderTest.kt | 16 +- .../EmailAuthProviderFirebaseAuthUITest.kt | 726 +++++++++++++ .../validators/PasswordValidatorTest.kt | 2 +- .../ui/components/AuthProviderButtonTest.kt | 6 +- .../ui/method_picker/AuthMethodPickerTest.kt | 2 +- .../ui/auth/testhelpers/TestHelper.java | 25 +- buildSrc/src/main/kotlin/Config.kt | 5 + 26 files changed, 2184 insertions(+), 94 deletions(-) rename auth/src/main/java/com/firebase/ui/auth/compose/configuration/{ => auth_provider}/AuthProvider.kt (69%) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProvider+FirebaseAuthUI.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/util/EmailLinkPersistenceManager.kt rename auth/src/test/java/com/firebase/ui/auth/compose/configuration/{ => auth_provider}/AuthProviderTest.kt (95%) create mode 100644 auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt diff --git a/auth/build.gradle.kts b/auth/build.gradle.kts index 3175b0a9d..0fd30ade8 100644 --- a/auth/build.gradle.kts +++ b/auth/build.gradle.kts @@ -85,12 +85,13 @@ dependencies { implementation(Config.Libs.Androidx.materialDesign) implementation(Config.Libs.Androidx.activity) implementation(Config.Libs.Androidx.Compose.materialIconsExtended) + implementation(Config.Libs.Androidx.datastorePreferences) // The new activity result APIs force us to include Fragment 1.3.0 // See https://issuetracker.google.com/issues/152554847 implementation(Config.Libs.Androidx.fragment) implementation(Config.Libs.Androidx.customTabs) implementation(Config.Libs.Androidx.constraint) - implementation("androidx.credentials:credentials:1.3.0") + implementation(Config.Libs.Androidx.credentials) implementation("androidx.credentials:credentials-play-services-auth:1.3.0") implementation(Config.Libs.Androidx.lifecycleExtensions) @@ -111,12 +112,27 @@ dependencies { testImplementation(Config.Libs.Test.junit) testImplementation(Config.Libs.Test.truth) - testImplementation(Config.Libs.Test.mockito) testImplementation(Config.Libs.Test.core) testImplementation(Config.Libs.Test.robolectric) testImplementation(Config.Libs.Test.kotlinReflect) testImplementation(Config.Libs.Provider.facebook) + testImplementation(Config.Libs.Test.mockitoCore) + testImplementation(Config.Libs.Test.mockitoInline) + testImplementation(Config.Libs.Test.mockitoKotlin) + testImplementation(Config.Libs.Androidx.credentials) testImplementation(Config.Libs.Test.composeUiTestJunit4) debugImplementation(project(":internal:lintchecks")) } + +val mockitoAgent by configurations.creating + +dependencies { + mockitoAgent(Config.Libs.Test.mockitoCore) { + isTransitive = false + } +} + +tasks.withType().configureEach { + jvmArgs("-javaagent:${mockitoAgent.asPath}") +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/AuthException.kt b/auth/src/main/java/com/firebase/ui/auth/compose/AuthException.kt index cb2a9480a..a1206b10b 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/AuthException.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/AuthException.kt @@ -14,6 +14,7 @@ package com.firebase.ui.auth.compose +import com.firebase.ui.auth.compose.AuthException.Companion.from import com.google.firebase.FirebaseException import com.google.firebase.auth.FirebaseAuthException import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException @@ -204,6 +205,39 @@ abstract class AuthException( cause: Throwable? = null ) : AuthException(message, cause) + class InvalidEmailLinkException( + cause: Throwable? = null + ) : AuthException("You are are attempting to sign in with an invalid email link", cause) + + class EmailLinkWrongDeviceException( + cause: Throwable? = null + ) : AuthException("You must open the email link on the same device.", cause) + + class EmailLinkCrossDeviceLinkingException( + cause: Throwable? = null + ) : AuthException( + "You must determine if you want to continue linking or " + + "complete the sign in", cause + ) + + class EmailLinkPromptForEmailException( + cause: Throwable? = null + ) : AuthException("Please enter your email to continue signing in", cause) + + class EmailLinkDifferentAnonymousUserException( + cause: Throwable? = null + ) : AuthException( + "The session associated with this sign-in request has either expired or " + + "was cleared", cause + ) + + class EmailMismatchException( + cause: Throwable? = null + ) : AuthException( + "You are are attempting to sign in a different email than previously " + + "provided", cause + ) + companion object { /** * Creates an appropriate [AuthException] instance from a Firebase authentication exception. @@ -244,22 +278,26 @@ abstract class AuthException( cause = firebaseException ) } + is FirebaseAuthInvalidUserException -> { when (firebaseException.errorCode) { "ERROR_USER_NOT_FOUND" -> UserNotFoundException( message = firebaseException.message ?: "User not found", cause = firebaseException ) + "ERROR_USER_DISABLED" -> InvalidCredentialsException( message = firebaseException.message ?: "User account has been disabled", cause = firebaseException ) + else -> UserNotFoundException( message = firebaseException.message ?: "User account error", cause = firebaseException ) } } + is FirebaseAuthWeakPasswordException -> { WeakPasswordException( message = firebaseException.message ?: "Password is too weak", @@ -267,52 +305,68 @@ abstract class AuthException( reason = firebaseException.reason ) } + is FirebaseAuthUserCollisionException -> { when (firebaseException.errorCode) { "ERROR_EMAIL_ALREADY_IN_USE" -> EmailAlreadyInUseException( - message = firebaseException.message ?: "Email address is already in use", + message = firebaseException.message + ?: "Email address is already in use", cause = firebaseException, email = firebaseException.email ) + "ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL" -> AccountLinkingRequiredException( - message = firebaseException.message ?: "Account already exists with different credentials", + message = firebaseException.message + ?: "Account already exists with different credentials", cause = firebaseException ) + "ERROR_CREDENTIAL_ALREADY_IN_USE" -> AccountLinkingRequiredException( - message = firebaseException.message ?: "Credential is already associated with a different user account", + message = firebaseException.message + ?: "Credential is already associated with a different user account", cause = firebaseException ) + else -> AccountLinkingRequiredException( message = firebaseException.message ?: "Account collision error", cause = firebaseException ) } } + is FirebaseAuthMultiFactorException -> { MfaRequiredException( - message = firebaseException.message ?: "Multi-factor authentication required", + message = firebaseException.message + ?: "Multi-factor authentication required", cause = firebaseException ) } + is FirebaseAuthRecentLoginRequiredException -> { InvalidCredentialsException( - message = firebaseException.message ?: "Recent login required for this operation", + message = firebaseException.message + ?: "Recent login required for this operation", cause = firebaseException ) } + is FirebaseAuthException -> { // Handle FirebaseAuthException and check for specific error codes when (firebaseException.errorCode) { "ERROR_TOO_MANY_REQUESTS" -> TooManyRequestsException( - message = firebaseException.message ?: "Too many requests. Please try again later", + message = firebaseException.message + ?: "Too many requests. Please try again later", cause = firebaseException ) + else -> UnknownException( - message = firebaseException.message ?: "An unknown authentication error occurred", + message = firebaseException.message + ?: "An unknown authentication error occurred", cause = firebaseException ) } } + is FirebaseException -> { // Handle general Firebase exceptions, which include network errors NetworkException( @@ -320,10 +374,15 @@ abstract class AuthException( cause = firebaseException ) } + else -> { // Check for common cancellation patterns - if (firebaseException.message?.contains("cancelled", ignoreCase = true) == true || - firebaseException.message?.contains("canceled", ignoreCase = true) == true) { + if (firebaseException.message?.contains( + "cancelled", + ignoreCase = true + ) == true || + firebaseException.message?.contains("canceled", ignoreCase = true) == true + ) { AuthCancelledException( message = firebaseException.message ?: "Authentication was cancelled", cause = firebaseException diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/AuthState.kt b/auth/src/main/java/com/firebase/ui/auth/compose/AuthState.kt index d2163500a..db11dc4f2 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/AuthState.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/AuthState.kt @@ -14,6 +14,9 @@ package com.firebase.ui.auth.compose +import com.firebase.ui.auth.compose.AuthState.Companion.Cancelled +import com.firebase.ui.auth.compose.AuthState.Companion.Idle +import com.google.firebase.auth.AuthCredential import com.google.firebase.auth.AuthResult import com.google.firebase.auth.FirebaseUser import com.google.firebase.auth.MultiFactorResolver @@ -72,8 +75,8 @@ abstract class AuthState private constructor() { if (this === other) return true if (other !is Success) return false return result == other.result && - user == other.user && - isNewUser == other.isNewUser + user == other.user && + isNewUser == other.isNewUser } override fun hashCode(): Int { @@ -101,7 +104,7 @@ abstract class AuthState private constructor() { if (this === other) return true if (other !is Error) return false return exception == other.exception && - isRecoverable == other.isRecoverable + isRecoverable == other.isRecoverable } override fun hashCode(): Int { @@ -137,7 +140,7 @@ abstract class AuthState private constructor() { if (this === other) return true if (other !is RequiresMfa) return false return resolver == other.resolver && - hint == other.hint + hint == other.hint } override fun hashCode(): Int { @@ -164,7 +167,7 @@ abstract class AuthState private constructor() { if (this === other) return true if (other !is RequiresEmailVerification) return false return user == other.user && - email == other.email + email == other.email } override fun hashCode(): Int { @@ -191,7 +194,7 @@ abstract class AuthState private constructor() { if (this === other) return true if (other !is RequiresProfileCompletion) return false return user == other.user && - missingFields == other.missingFields + missingFields == other.missingFields } override fun hashCode(): Int { @@ -204,6 +207,42 @@ abstract class AuthState private constructor() { "AuthState.RequiresProfileCompletion(user=$user, missingFields=$missingFields)" } + /** + * Pending credential for an anonymous upgrade merge conflict. + * + * Emitted when an anonymous user attempts to convert to a permanent account but + * Firebase detects that the target email already belongs to another user. The UI can + * prompt the user to resolve the conflict by signing in with the existing account and + * later linking the stored [pendingCredential]. + */ + class MergeConflict( + val pendingCredential: AuthCredential + ) : AuthState() { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is MergeConflict) return false + return pendingCredential == other.pendingCredential + } + + override fun hashCode(): Int { + var result = pendingCredential.hashCode() + result = 31 * result + pendingCredential.hashCode() + return result + } + + override fun toString(): String = + "AuthState.MergeConflict(pendingCredential=$pendingCredential)" + } + + /** + * Password reset link has been sent to the user's email. + */ + class PasswordResetLinkSent : AuthState() { + override fun equals(other: Any?): Boolean = other is PasswordResetLinkSent + override fun hashCode(): Int = javaClass.hashCode() + override fun toString(): String = "AuthState.PasswordResetLinkSent" + } + companion object { /** * Creates an Idle state instance. @@ -219,4 +258,4 @@ abstract class AuthState private constructor() { @JvmStatic val Cancelled: Cancelled = Cancelled() } -} \ No newline at end of file +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt b/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt index fe1f6cf80..21617b1b7 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/FirebaseAuthUI.kt @@ -14,6 +14,7 @@ package com.firebase.ui.auth.compose +import android.content.Context import androidx.annotation.RestrictTo import com.google.firebase.FirebaseApp import com.google.firebase.auth.FirebaseAuth @@ -21,7 +22,6 @@ import com.google.firebase.auth.FirebaseAuth.AuthStateListener import com.google.firebase.auth.FirebaseUser import com.google.firebase.auth.ktx.auth import com.google.firebase.ktx.Firebase -import android.content.Context import kotlinx.coroutines.CancellationException import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow @@ -168,7 +168,8 @@ class FirebaseAuthUI private constructor( // Check if email verification is required if (!currentUser.isEmailVerified && currentUser.email != null && - currentUser.providerData.any { it.providerId == "password" }) { + currentUser.providerData.any { it.providerId == "password" } + ) { AuthState.RequiresEmailVerification( user = currentUser, email = currentUser.email!! @@ -374,7 +375,7 @@ class FirebaseAuthUI private constructor( } catch (e: IllegalStateException) { throw IllegalStateException( "Default FirebaseApp is not initialized. " + - "Make sure to call FirebaseApp.initializeApp(Context) first.", + "Make sure to call FirebaseApp.initializeApp(Context) first.", e ) } diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt index 6fb0202de..1267aea84 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt @@ -15,15 +15,15 @@ package com.firebase.ui.auth.compose.configuration import android.content.Context -import java.util.Locale -import com.google.firebase.auth.ActionCodeSettings import androidx.compose.ui.graphics.vector.ImageVector +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvidersBuilder +import com.firebase.ui.auth.compose.configuration.auth_provider.Provider import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme - -fun actionCodeSettings(block: ActionCodeSettings.Builder.() -> Unit) = - ActionCodeSettings.newBuilder().apply(block).build() +import com.google.firebase.auth.ActionCodeSettings +import java.util.Locale fun authUIConfiguration(block: AuthUIConfigurationBuilder.() -> Unit) = AuthUIConfigurationBuilder().apply(block).build() diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt index 7073fbe6e..383265501 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/PasswordRule.kt @@ -18,7 +18,7 @@ import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringPr /** * An abstract class representing a set of validation rules that can be applied to a password field, - * typically within the [AuthProvider.Email] configuration. + * typically within the [com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider.Email] configuration. */ abstract class PasswordRule { /** diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProvider.kt similarity index 69% rename from auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt rename to auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProvider.kt index 87008cd28..1c9b88048 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthProvider.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProvider.kt @@ -12,23 +12,33 @@ * limitations under the License. */ -package com.firebase.ui.auth.compose.configuration +package com.firebase.ui.auth.compose.configuration.auth_provider import android.content.Context -import androidx.compose.ui.graphics.Color +import android.net.Uri import android.util.Log +import androidx.compose.ui.graphics.Color +import androidx.datastore.preferences.core.stringPreferencesKey import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.configuration.AuthUIConfiguration +import com.firebase.ui.auth.compose.configuration.AuthUIConfigurationDsl +import com.firebase.ui.auth.compose.configuration.PasswordRule import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset import com.firebase.ui.auth.util.Preconditions +import com.firebase.ui.auth.util.data.ContinueUrlBuilder import com.firebase.ui.auth.util.data.PhoneNumberUtils import com.firebase.ui.auth.util.data.ProviderAvailability import com.google.firebase.auth.ActionCodeSettings import com.google.firebase.auth.EmailAuthProvider import com.google.firebase.auth.FacebookAuthProvider +import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.GithubAuthProvider import com.google.firebase.auth.GoogleAuthProvider import com.google.firebase.auth.PhoneAuthProvider import com.google.firebase.auth.TwitterAuthProvider +import com.google.firebase.auth.UserProfileChangeRequest +import com.google.firebase.auth.actionCodeSettings +import kotlinx.coroutines.tasks.await @AuthUIConfigurationDsl class AuthProvidersBuilder { @@ -44,11 +54,11 @@ class AuthProvidersBuilder { /** * Enum class to represent all possible providers. */ -internal enum class Provider(val id: String) { - GOOGLE(GoogleAuthProvider.PROVIDER_ID), - FACEBOOK(FacebookAuthProvider.PROVIDER_ID), - TWITTER(TwitterAuthProvider.PROVIDER_ID), - GITHUB(GithubAuthProvider.PROVIDER_ID), +internal enum class Provider(val id: String, val isSocialProvider: Boolean = false) { + GOOGLE(GoogleAuthProvider.PROVIDER_ID, isSocialProvider = true), + FACEBOOK(FacebookAuthProvider.PROVIDER_ID, isSocialProvider = true), + TWITTER(TwitterAuthProvider.PROVIDER_ID, isSocialProvider = true), + GITHUB(GithubAuthProvider.PROVIDER_ID, isSocialProvider = true), EMAIL(EmailAuthProvider.PROVIDER_ID), PHONE(PhoneAuthProvider.PROVIDER_ID), ANONYMOUS("anonymous"), @@ -76,6 +86,69 @@ abstract class OAuthProvider( * Base abstract class for authentication providers. */ abstract class AuthProvider(open val providerId: String) { + + companion object { + internal fun canUpgradeAnonymous(config: AuthUIConfiguration, auth: FirebaseAuth): Boolean { + val currentUser = auth.currentUser + return config.isAnonymousUpgradeEnabled + && currentUser != null + && currentUser.isAnonymous + } + + /** + * Merges profile information (display name and photo URL) with the current user's profile. + * + * This method updates the user's profile only if the current profile is incomplete + * (missing display name or photo URL). This prevents overwriting existing profile data. + * + * **Use case:** + * After creating a new user account or linking credentials, update the profile with + * information from the sign-up form or social provider. + * + * @param auth The [FirebaseAuth] instance + * @param displayName The display name to set (if current is empty) + * @param photoUri The photo URL to set (if current is null) + * + * **Note:** This operation always succeeds to minimize login interruptions. + * Failures are logged but don't prevent sign-in completion. + */ + internal suspend fun mergeProfile( + auth: FirebaseAuth, + displayName: String?, + photoUri: Uri? + ) { + try { + val currentUser = auth.currentUser ?: return + + // Only update if current profile is incomplete + val currentDisplayName = currentUser.displayName + val currentPhotoUrl = currentUser.photoUrl + + if (!currentDisplayName.isNullOrEmpty() && currentPhotoUrl != null) { + // Profile is complete, no need to update + return + } + + // Build profile update with provided values + val nameToSet = + if (currentDisplayName.isNullOrEmpty()) displayName else currentDisplayName + val photoToSet = currentPhotoUrl ?: photoUri + + if (nameToSet != null || photoToSet != null) { + val profileUpdates = UserProfileChangeRequest.Builder() + .setDisplayName(nameToSet) + .setPhotoUri(photoToSet) + .build() + + currentUser.updateProfile(profileUpdates).await() + } + } catch (e: Exception) { + // Log error but don't throw - profile update failure shouldn't prevent sign-in + Log.e("AuthProvider.Email", "Error updating profile", e) + } + } + } + /** * Email/Password authentication provider configuration. */ @@ -118,7 +191,18 @@ abstract class AuthProvider(open val providerId: String) { */ val passwordValidationRules: List ) : AuthProvider(providerId = Provider.EMAIL.id) { - fun validate() { + companion object { + const val SESSION_ID_LENGTH = 10 + val KEY_EMAIL = stringPreferencesKey("com.firebase.ui.auth.data.client.email") + val KEY_PROVIDER = stringPreferencesKey("com.firebase.ui.auth.data.client.provider") + val KEY_ANONYMOUS_USER_ID = + stringPreferencesKey("com.firebase.ui.auth.data.client.auid") + val KEY_SESSION_ID = stringPreferencesKey("com.firebase.ui.auth.data.client.sid") + val KEY_IDP_TOKEN = stringPreferencesKey("com.firebase.ui.auth.data.client.idpToken") + val KEY_IDP_SECRET = stringPreferencesKey("com.firebase.ui.auth.data.client.idpSecret") + } + + internal fun validate() { if (isEmailLinkSignInEnabled) { val actionCodeSettings = requireNotNull(actionCodeSettings) { "ActionCodeSettings cannot be null when using " + @@ -131,6 +215,47 @@ abstract class AuthProvider(open val providerId: String) { } } } + + // For Send Email Link + internal fun addSessionInfoToActionCodeSettings( + sessionId: String, + anonymousUserId: String, + ): ActionCodeSettings { + requireNotNull(actionCodeSettings) { + "ActionCodeSettings is required for email link sign in" + } + + val continueUrl = continueUrl(actionCodeSettings.url) { + appendSessionId(sessionId) + appendAnonymousUserId(anonymousUserId) + appendForceSameDeviceBit(isEmailLinkForceSameDeviceEnabled) + appendProviderId(providerId) + } + + return actionCodeSettings { + url = continueUrl + handleCodeInApp = actionCodeSettings.canHandleCodeInApp() + iosBundleId = actionCodeSettings.iosBundle + setAndroidPackageName( + actionCodeSettings.androidPackageName ?: "", + actionCodeSettings.androidInstallApp, + actionCodeSettings.androidMinimumVersion + ) + } + } + + // For Sign In With Email Link + internal fun isDifferentDevice( + sessionIdFromLocal: String?, + sessionIdFromLink: String + ): Boolean { + return sessionIdFromLocal == null || sessionIdFromLocal.isEmpty() + || sessionIdFromLink.isEmpty() + || (sessionIdFromLink != sessionIdFromLocal) + } + + private fun continueUrl(continueUrl: String, block: ContinueUrlBuilder.() -> Unit) = + ContinueUrlBuilder(continueUrl).apply(block).build() } /** @@ -172,7 +297,7 @@ abstract class AuthProvider(open val providerId: String) { */ val isAutoRetrievalEnabled: Boolean = true ) : AuthProvider(providerId = Provider.PHONE.id) { - fun validate() { + internal fun validate() { defaultNumber?.let { check(PhoneNumberUtils.isValid(it)) { "Invalid phone number: $it" @@ -235,7 +360,7 @@ abstract class AuthProvider(open val providerId: String) { scopes = scopes, customParameters = customParameters ) { - fun validate(context: Context) { + internal fun validate(context: Context) { if (serverClientId == null) { Preconditions.checkConfigured( context, @@ -287,7 +412,7 @@ abstract class AuthProvider(open val providerId: String) { scopes = scopes, customParameters = customParameters ) { - fun validate(context: Context) { + internal fun validate(context: Context) { if (!ProviderAvailability.IS_FACEBOOK_AVAILABLE) { throw RuntimeException( "Facebook provider cannot be configured " + @@ -414,7 +539,7 @@ abstract class AuthProvider(open val providerId: String) { * Anonymous authentication provider. It has no configurable properties. */ object Anonymous : AuthProvider(providerId = Provider.ANONYMOUS.id) { - fun validate(providers: List) { + internal fun validate(providers: List) { if (providers.size == 1 && providers.first() is Anonymous) { throw IllegalStateException( "Sign in as guest cannot be the only sign in method. " + @@ -467,7 +592,7 @@ abstract class AuthProvider(open val providerId: String) { scopes = scopes, customParameters = customParameters ) { - fun validate() { + internal fun validate() { require(providerId.isNotBlank()) { "Provider ID cannot be null or empty" } diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProvider+FirebaseAuthUI.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProvider+FirebaseAuthUI.kt new file mode 100644 index 000000000..d917e80d6 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProvider+FirebaseAuthUI.kt @@ -0,0 +1,960 @@ +package com.firebase.ui.auth.compose.configuration.auth_provider + +import android.content.Context +import android.net.Uri +import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.AuthException +import com.firebase.ui.auth.compose.AuthState +import com.firebase.ui.auth.compose.FirebaseAuthUI +import com.firebase.ui.auth.compose.configuration.AuthUIConfiguration +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider.Companion.canUpgradeAnonymous +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider.Companion.mergeProfile +import com.firebase.ui.auth.compose.util.EmailLinkPersistenceManager +import com.firebase.ui.auth.util.data.EmailLinkParser +import com.firebase.ui.auth.util.data.SessionUtils +import com.google.firebase.FirebaseApp +import com.google.firebase.auth.ActionCodeSettings +import com.google.firebase.auth.AuthCredential +import com.google.firebase.auth.AuthResult +import com.google.firebase.auth.EmailAuthProvider +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.auth.FirebaseAuthUserCollisionException +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.tasks.await + +/** + * Holds credential information for account linking with email link sign-in. + * + * When a user tries to sign in with a social provider (Google, Facebook, etc.) but an + * email link account exists with that email, this data is used to link the accounts + * after email link authentication completes. + * + * @property providerType The provider ID (e.g., "google.com", "facebook.com") + * @property idToken The ID token from the provider (required for Google, optional for Facebook) + * @property accessToken The access token from the provider (required for Facebook, optional for Google) + */ +internal class CredentialForLinking( + val providerType: String, + val idToken: String?, + val accessToken: String? +) + +/** + * Creates an email/password account or links the credential to an anonymous user. + * + * Mirrors the legacy email sign-up handler: validates password strength, validates custom + * password rules, checks if new accounts are allowed, chooses between + * `createUserWithEmailAndPassword` and `linkWithCredential`, merges the supplied display name + * into the Firebase profile, and emits [AuthState.MergeConflict] when anonymous upgrade + * encounters an existing account for the email. + * + * **Flow:** + * 1. Check if new accounts are allowed (for non-upgrade flows) + * 2. Validate password length against [AuthProvider.Email.minimumPasswordLength] + * 3. Validate password against custom [AuthProvider.Email.passwordValidationRules] + * 4. If upgrading anonymous user: link credential to existing anonymous account + * 5. Otherwise: create new account with `createUserWithEmailAndPassword` + * 6. Merge display name into user profile + * + * @param context Android [Context] for localized strings + * @param config Auth UI configuration describing provider settings + * @param provider Email provider configuration + * @param name Optional display name collected during sign-up + * @param email Email address for the new account + * @param password Password for the new account + * + * @return [AuthResult] containing the newly created or linked user, or null if failed + * + * @throws AuthException.UserNotFoundException if new accounts are not allowed + * @throws AuthException.WeakPasswordException if the password fails validation rules + * @throws AuthException.InvalidCredentialsException if the email or password is invalid + * @throws AuthException.EmailAlreadyInUseException if the email already exists + * @throws AuthException.AuthCancelledException if the coroutine is cancelled + * @throws AuthException.NetworkException for network-related failures + * + * **Example: Normal sign-up** + * ```kotlin + * try { + * val result = firebaseAuthUI.createOrLinkUserWithEmailAndPassword( + * context = context, + * config = authUIConfig, + * provider = emailProvider, + * name = "John Doe", + * email = "john@example.com", + * password = "SecurePass123!" + * ) + * // User account created successfully + * } catch (e: AuthException.WeakPasswordException) { + * // Password doesn't meet validation rules + * } catch (e: AuthException.EmailAlreadyInUseException) { + * // Email already exists - redirect to sign-in + * } + * ``` + * + * **Example: Anonymous user upgrade** + * ```kotlin + * // User is currently signed in anonymously + * try { + * val result = firebaseAuthUI.createOrLinkUserWithEmailAndPassword( + * context = context, + * config = authUIConfig, + * provider = emailProvider, + * name = "Jane Smith", + * email = "jane@example.com", + * password = "MyPassword456" + * ) + * // Anonymous account upgraded to permanent email/password account + * } catch (e: AuthException) { + * // Check if AuthState.MergeConflict was emitted + * // This means email already exists - show merge conflict UI + * } + * ``` + */ +internal suspend fun FirebaseAuthUI.createOrLinkUserWithEmailAndPassword( + context: Context, + config: AuthUIConfiguration, + provider: AuthProvider.Email, + name: String?, + email: String, + password: String +): AuthResult? { + val canUpgrade = canUpgradeAnonymous(config, auth) + val pendingCredential = + if (canUpgrade) EmailAuthProvider.getCredential(email, password) else null + + try { + // Check if new accounts are allowed (only for non-upgrade flows) + if (!canUpgrade && !provider.isNewAccountsAllowed) { + throw AuthException.UserNotFoundException( + message = context.getString(R.string.fui_error_email_does_not_exist) + ) + } + + // Validate minimum password length + if (password.length < provider.minimumPasswordLength) { + throw AuthException.InvalidCredentialsException( + message = context.getString(R.string.fui_error_password_too_short) + .format(provider.minimumPasswordLength) + ) + } + + // Validate password against custom rules + for (rule in provider.passwordValidationRules) { + if (!rule.isValid(password)) { + throw AuthException.WeakPasswordException( + message = rule.getErrorMessage(config.stringProvider), + reason = "Password does not meet custom validation rules" + ) + } + } + + updateAuthState(AuthState.Loading("Creating user...")) + val result = if (canUpgrade) { + auth.currentUser?.linkWithCredential(requireNotNull(pendingCredential))?.await() + } else { + auth.createUserWithEmailAndPassword(email, password).await() + }.also { authResult -> + authResult?.user?.let { + // Merge display name into profile (photoUri is always null for email/password) + mergeProfile(auth, name, null) + } + } + updateAuthState(AuthState.Idle) + return result + } catch (e: FirebaseAuthUserCollisionException) { + val authException = AuthException.from(e) + if (canUpgrade && pendingCredential != null) { + // Anonymous upgrade collision: emit merge conflict state + updateAuthState(AuthState.MergeConflict(pendingCredential)) + } else { + updateAuthState(AuthState.Error(authException)) + } + throw authException + } catch (e: CancellationException) { + val cancelledException = AuthException.AuthCancelledException( + message = "Create or link user with email and password was cancelled", + cause = e + ) + updateAuthState(AuthState.Error(cancelledException)) + throw cancelledException + } catch (e: AuthException) { + updateAuthState(AuthState.Error(e)) + throw e + } catch (e: Exception) { + val authException = AuthException.from(e) + updateAuthState(AuthState.Error(authException)) + throw authException + } +} + +/** + * Signs in a user with email and password, optionally linking a social credential. + * + * This method handles both normal sign-in and anonymous upgrade flows. In anonymous upgrade + * scenarios, it validates credentials in a scratch auth instance before emitting a merge + * conflict state. + * + * **Flow:** + * 1. If anonymous upgrade: + * - Create scratch auth instance to validate credential + * - If linking social provider: sign in with email, then link social credential (safe link) + * - Otherwise: just validate email credential + * - Emit [AuthState.MergeConflict] after successful validation + * 2. If normal sign-in: + * - Sign in with email/password + * - If credential provided: link it and merge profile + * + * @param context Android [Context] for creating scratch auth instance + * @param config Auth UI configuration describing provider settings + * @param email Email address for sign-in + * @param password Password for sign-in + * @param credentialForLinking Optional social provider credential to link after sign-in + * + * @return [AuthResult] containing the signed-in user, or null if validation-only (anonymous upgrade) + * + * @throws AuthException.InvalidCredentialsException if email or password is incorrect + * @throws AuthException.UserNotFoundException if the user doesn't exist + * @throws AuthException.AuthCancelledException if the operation is cancelled + * @throws AuthException.NetworkException for network-related failures + * + * **Example: Normal sign-in** + * ```kotlin + * try { + * val result = firebaseAuthUI.signInWithEmailAndPassword( + * context = context, + * config = authUIConfig, + * provider = emailProvider, + * email = "user@example.com", + * password = "password123" + * ) + * // User signed in successfully + * } catch (e: AuthException.InvalidCredentialsException) { + * // Wrong password + * } + * ``` + * + * **Example: Sign-in with social credential linking** + * ```kotlin + * // User tried to sign in with Google, but account exists with email/password + * // Prompt for password, then link Google credential + * val googleCredential = GoogleAuthProvider.getCredential(idToken, null) + * + * val result = firebaseAuthUI.signInWithEmailAndPassword( + * context = context, + * config = authUIConfig, + * provider = emailProvider, + * email = "user@example.com", + * password = "password123", + * credentialForLinking = googleCredential + * ) + * // User signed in with email/password AND Google is now linked + * // Profile updated with Google display name and photo + * ``` + * + * **Example: Anonymous upgrade validation** + * ```kotlin + * // User is anonymous, wants to upgrade with existing email/password account + * try { + * firebaseAuthUI.signInWithEmailAndPassword( + * context = context, + * config = authUIConfig, + * provider = emailProvider, + * email = "existing@example.com", + * password = "password123" + * ) + * } catch (e: AuthException) { + * // AuthState.MergeConflict emitted + * // UI shows merge conflict resolution screen + * } + * ``` + */ +internal suspend fun FirebaseAuthUI.signInWithEmailAndPassword( + context: Context, + config: AuthUIConfiguration, + email: String, + password: String, + credentialForLinking: AuthCredential? = null, +): AuthResult? { + try { + updateAuthState(AuthState.Loading("Signing in...")) + return if (canUpgradeAnonymous(config, auth)) { + // Anonymous upgrade flow: validate credential in scratch auth + val credentialToValidate = EmailAuthProvider.getCredential(email, password) + + // Check if we're linking a social provider credential + val isSocialProvider = credentialForLinking != null && + (Provider.fromId(credentialForLinking.provider)?.isSocialProvider ?: false) + + // Create scratch auth instance to avoid losing anonymous user state + val appExplicitlyForValidation = FirebaseApp.initializeApp( + context, + auth.app.options, + "FUIAuthScratchApp_${System.currentTimeMillis()}" + ) + val authExplicitlyForValidation = FirebaseAuth + .getInstance(appExplicitlyForValidation) + + if (isSocialProvider) { + // Safe link: sign in with email, then link social credential + authExplicitlyForValidation + .signInWithCredential(credentialToValidate).await() + .user?.linkWithCredential(credentialForLinking)?.await() + .also { + // Emit merge conflict after successful validation + updateAuthState(AuthState.MergeConflict(credentialToValidate)) + } + } else { + // Just validate the email credential + // No linking for non-federated IDPs + authExplicitlyForValidation + .signInWithCredential(credentialToValidate).await() + .also { + // Emit merge conflict after successful validation + // Merge failure occurs because account exists and user is anonymous + updateAuthState(AuthState.MergeConflict(credentialToValidate)) + } + } + } else { + // Normal sign-in + auth.signInWithEmailAndPassword(email, password).await() + .also { result -> + // If there's a credential to link, link it after sign-in + if (credentialForLinking != null) { + return result.user?.linkWithCredential(credentialForLinking)?.await() + .also { linkResult -> + // Merge profile from social provider + linkResult?.user?.let { user -> + mergeProfile( + auth, + user.displayName, + user.photoUrl + ) + } + } + } + } + }.also { + updateAuthState(AuthState.Idle) + } + } catch (e: CancellationException) { + val cancelledException = AuthException.AuthCancelledException( + message = "Sign in with email and password was cancelled", + cause = e + ) + updateAuthState(AuthState.Error(cancelledException)) + throw cancelledException + } catch (e: AuthException) { + updateAuthState(AuthState.Error(e)) + throw e + } catch (e: Exception) { + val authException = AuthException.from(e) + updateAuthState(AuthState.Error(authException)) + throw authException + } +} + +/** + * Signs in with a credential or links it to an existing anonymous user. + * + * This method handles both normal sign-in and anonymous upgrade flows. After successful + * authentication, it merges profile information (display name and photo URL) into the + * Firebase user profile if provided. + * + * **Flow:** + * 1. Check if user is anonymous and upgrade is enabled + * 2. If yes: Link credential to anonymous user + * 3. If no: Sign in with credential + * 4. Merge profile information (name, photo) into Firebase user + * 5. Handle collision exceptions by emitting [AuthState.MergeConflict] + * + * @param config The [AuthUIConfiguration] containing authentication settings + * @param credential The [AuthCredential] to use for authentication. Can be from any provider. + * @param displayName Optional display name from the provider to merge into the user profile + * @param photoUrl Optional photo URL from the provider to merge into the user profile + * + * @return [AuthResult] containing the authenticated user + * + * @throws AuthException.InvalidCredentialsException if credential is invalid or expired + * @throws AuthException.EmailAlreadyInUseException if linking and email is already in use + * @throws AuthException.AuthCancelledException if the operation is cancelled + * @throws AuthException.NetworkException if a network error occurs + * + * **Example: Google Sign-In** + * ```kotlin + * val googleCredential = GoogleAuthProvider.getCredential(idToken, null) + * val displayName = "John Doe" // From Google profile + * val photoUrl = Uri.parse("https://...") // From Google profile + * + * val result = firebaseAuthUI.signInAndLinkWithCredential( + * config = authUIConfig, + * credential = googleCredential, + * displayName = displayName, + * photoUrl = photoUrl + * ) + * // User signed in with Google AND profile updated with Google data + * ``` + * + * **Example: Phone Auth** + * ```kotlin + * val phoneCredential = PhoneAuthProvider.getCredential(verificationId, code) + * + * val result = firebaseAuthUI.signInAndLinkWithCredential( + * config = authUIConfig, + * credential = phoneCredential + * ) + * // User signed in with phone number + * ``` + * + * **Example: Phone Auth with Collision (Anonymous Upgrade)** + * ```kotlin + * // User is currently anonymous, trying to link a phone number + * val phoneCredential = PhoneAuthProvider.getCredential(verificationId, code) + * + * try { + * firebaseAuthUI.signInAndLinkWithCredential( + * config = authUIConfig, + * credential = phoneCredential + * ) + * } catch (e: FirebaseAuthUserCollisionException) { + * // Phone number already exists on another account + * // AuthState.MergeConflict emitted with updatedCredential + * // UI can show merge conflict resolution screen + * } + * ``` + * + * **Example: Email Link Sign-In** + * ```kotlin + * val emailLinkCredential = EmailAuthProvider.getCredentialWithLink( + * email = "user@example.com", + * emailLink = emailLink + * ) + * + * val result = firebaseAuthUI.signInAndLinkWithCredential( + * config = authUIConfig, + * credential = emailLinkCredential + * ) + * // User signed in with email link (passwordless) + * ``` + */ +internal suspend fun FirebaseAuthUI.signInAndLinkWithCredential( + config: AuthUIConfiguration, + credential: AuthCredential, + displayName: String? = null, + photoUrl: Uri? = null +): AuthResult? { + try { + updateAuthState(AuthState.Loading("Signing in user...")) + return if (canUpgradeAnonymous(config, auth)) { + auth.currentUser?.linkWithCredential(credential)?.await() + } else { + auth.signInWithCredential(credential).await() + }.also { result -> + // Merge profile information from the provider + result?.user?.let { + mergeProfile(auth, displayName, photoUrl) + } + updateAuthState(AuthState.Idle) + } + } catch (e: FirebaseAuthUserCollisionException) { + // Special handling for collision exceptions + val authException = AuthException.from(e) + + if (canUpgradeAnonymous(config, auth)) { + // Anonymous upgrade collision: emit merge conflict with updated credential + val updatedCredential = e.updatedCredential + if (updatedCredential != null) { + updateAuthState(AuthState.MergeConflict(updatedCredential)) + } else { + updateAuthState(AuthState.Error(authException)) + } + } else { + updateAuthState(AuthState.Error(authException)) + } + throw authException + } catch (e: CancellationException) { + val cancelledException = AuthException.AuthCancelledException( + message = "Sign in and link with credential was cancelled", + cause = e + ) + updateAuthState(AuthState.Error(cancelledException)) + throw cancelledException + } catch (e: AuthException) { + updateAuthState(AuthState.Error(e)) + throw e + } catch (e: Exception) { + val authException = AuthException.from(e) + updateAuthState(AuthState.Error(authException)) + throw authException + } +} + +/** + * Sends a passwordless sign-in link to the specified email address. + * + * This method initiates the email-link (passwordless) authentication flow by sending + * an email containing a magic link. The link includes session information for validation + * and security. Optionally supports account linking when a user tries to sign in with + * a social provider but an email link account exists. + * + * **How it works:** + * 1. Generates a unique session ID for same-device validation + * 2. Retrieves anonymous user ID if upgrading anonymous account + * 3. Enriches the [ActionCodeSettings] URL with session data (session ID, anonymous user ID, force same-device flag) + * 4. Sends the email via [com.google.firebase.auth.FirebaseAuth.sendSignInLinkToEmail] + * 5. Saves session data to DataStore for validation when the user clicks the link + * 6. User receives email with a magic link containing the session information + * 7. When user clicks link, app opens via deep link and calls [signInWithEmailLink] to complete authentication + * + * **Account Linking Support:** + * If a user tries to sign in with a social provider (Google, Facebook) but an email link + * account already exists with that email, you can link the accounts by: + * 1. Catching the [FirebaseAuthUserCollisionException] from the social sign-in attempt + * 2. Calling this method with [credentialForLinking] containing the social provider tokens + * 3. When [signInWithEmailLink] completes, it automatically retrieves and links the saved credential + * + * **Session Security:** + * - **Session ID**: Random 10-character string for same-device validation + * - **Anonymous User ID**: Stored if upgrading anonymous account to prevent account hijacking + * - **Force Same Device**: Can be configured via [AuthProvider.Email.isEmailLinkForceSameDeviceEnabled] + * - All session data is validated in [signInWithEmailLink] before completing authentication + * + * @param context Android [Context] for DataStore access + * @param config The [AuthUIConfiguration] containing authentication settings + * @param provider The [AuthProvider.Email] configuration with [ActionCodeSettings] + * @param email The email address to send the sign-in link to + * @param credentialForLinking Optional credential linking data. If provided, this credential + * will be automatically linked after email link sign-in completes. Pass null for basic + * email link sign-in without account linking. + * + * @throws AuthException.InvalidCredentialsException if email is invalid + * @throws AuthException.AuthCancelledException if the operation is cancelled + * @throws AuthException.NetworkException if a network error occurs + * @throws IllegalStateException if ActionCodeSettings is not configured + * + * **Example 1: Basic email link sign-in** + * ```kotlin + * // Send the email link + * firebaseAuthUI.sendSignInLinkToEmail( + * context = context, + * config = authUIConfig, + * provider = emailProvider, + * email = "user@example.com" + * ) + * // Show "Check your email" UI to user + * + * // Later, when user clicks the link in their email: + * // (In your deep link handling Activity) + * val emailLink = intent.data.toString() + * firebaseAuthUI.signInWithEmailLink( + * context = context, + * config = authUIConfig, + * provider = emailProvider, + * email = "user@example.com", + * emailLink = emailLink + * ) + * // User is now signed in + * ``` + * + * **Example 2: Complete account linking flow (Google → Email Link)** + * ```kotlin + * // Step 1: User tries to sign in with Google + * try { + * val googleAccount = GoogleSignIn.getLastSignedInAccount(context) + * val googleIdToken = googleAccount?.idToken + * val googleCredential = GoogleAuthProvider.getCredential(googleIdToken, null) + * + * firebaseAuthUI.signInAndLinkWithCredential( + * config = authUIConfig, + * credential = googleCredential + * ) + * } catch (e: FirebaseAuthUserCollisionException) { + * // Email already exists with Email Link provider + * + * // Step 2: Send email link with credential for linking + * firebaseAuthUI.sendSignInLinkToEmail( + * context = context, + * config = authUIConfig, + * provider = emailProvider, + * email = email, + * credentialForLinking = CredentialForLinking( + * providerType = "google.com", + * idToken = googleIdToken, // From GoogleSignInAccount + * accessToken = null + * ) + * ) + * + * // Step 3: Show "Check your email" UI + * } + * + * // Step 4: User clicks email link → App opens + * // (In your deep link handling Activity) + * val emailLink = intent.data.toString() + * firebaseAuthUI.signInWithEmailLink( + * context = context, + * config = authUIConfig, + * provider = emailProvider, + * email = email, + * emailLink = emailLink + * ) + * // signInWithEmailLink automatically: + * // 1. Signs in with email link + * // 2. Retrieves the saved Google credential from DataStore + * // 3. Links the Google credential to the email link account + * // 4. User is now signed in with both Email Link AND Google linked + * ``` + * + * **Example 3: Anonymous user upgrade** + * ```kotlin + * // User is currently signed in anonymously + * // Send email link to upgrade anonymous account to permanent email account + * firebaseAuthUI.sendSignInLinkToEmail( + * context = context, + * config = authUIConfig, + * provider = emailProvider, + * email = "user@example.com" + * ) + * // Session includes anonymous user ID for validation + * // When user clicks link, anonymous account is upgraded to permanent account + * ``` + * @see signInWithEmailLink + * @see EmailLinkPersistenceManager.saveCredentialForLinking + * @see com.google.firebase.auth.FirebaseAuth.sendSignInLinkToEmail + */ +internal suspend fun FirebaseAuthUI.sendSignInLinkToEmail( + context: Context, + config: AuthUIConfiguration, + provider: AuthProvider.Email, + email: String, + credentialForLinking: CredentialForLinking? = null +) { + try { + updateAuthState(AuthState.Loading("Sending sign in email link...")) + + // Get anonymousUserId if can upgrade anonymously else default to empty string. + // NOTE: check for empty string instead of null to validate anonymous user ID matches + // when sign in from email link + val anonymousUserId = + if (canUpgradeAnonymous(config, auth)) (auth.currentUser?.uid + ?: "") else "" + + // Generate sessionId + val sessionId = + SessionUtils.generateRandomAlphaNumericString(AuthProvider.Email.SESSION_ID_LENGTH) + + // If credential provided, save it for linking after email link sign-in + if (credentialForLinking != null) { + EmailLinkPersistenceManager.saveCredentialForLinking( + context = context, + providerType = credentialForLinking.providerType, + idToken = credentialForLinking.idToken, + accessToken = credentialForLinking.accessToken + ) + } + + // Modify actionCodeSettings Url to include sessionId, anonymousUserId, force same + // device flag + val updatedActionCodeSettings = + provider.addSessionInfoToActionCodeSettings(sessionId, anonymousUserId) + + auth.sendSignInLinkToEmail(email, updatedActionCodeSettings).await() + + // Save Email to dataStore for use in signInWithEmailLink + EmailLinkPersistenceManager.saveEmail(context, email, sessionId, anonymousUserId) + + updateAuthState(AuthState.Idle) + } catch (e: CancellationException) { + val cancelledException = AuthException.AuthCancelledException( + message = "Send sign in link to email was cancelled", + cause = e + ) + updateAuthState(AuthState.Error(cancelledException)) + throw cancelledException + } catch (e: AuthException) { + updateAuthState(AuthState.Error(e)) + throw e + } catch (e: Exception) { + val authException = AuthException.from(e) + updateAuthState(AuthState.Error(authException)) + throw authException + } +} + +/** + * Signs in a user using an email link (passwordless authentication). + * + * This method completes the email link sign-in flow after the user clicks the magic link + * sent to their email. It validates the link, extracts session information, and either + * signs in the user normally or upgrades an anonymous account based on configuration. + * + * **Flow:** + * 1. User receives email with magic link + * 2. User clicks link, app opens via deep link + * 3. Activity extracts emailLink from Intent.data + * 4. This method validates and completes sign-in + * + * @param config The [AuthUIConfiguration] containing authentication settings + * @param provider The [AuthProvider.Email] configuration with email-link settings + * @param email The email address of the user (retrieved from DataStore or user input) + * @param emailLink The complete deep link URL received from the Intent. + * + * This URL contains: + * - Firebase action code (oobCode) for authentication + * - Session ID (ui_sid) for same-device validation + * - Anonymous user ID (ui_auid) if upgrading anonymous account + * - Force same-device flag (ui_sd) for security enforcement + * + * Example: + * `https://yourapp.page.link/emailSignIn?oobCode=ABC123&continueUrl=...` + * + * @throws AuthException.InvalidCredentialsException if the email link is invalid or expired + * @throws AuthException.AuthCancelledException if the operation is cancelled + * @throws AuthException.NetworkException if a network error occurs + * @throws AuthException.UnknownException for other errors + * + * @see sendSignInLinkToEmail for sending the initial email link + */ +internal suspend fun FirebaseAuthUI.signInWithEmailLink( + context: Context, + config: AuthUIConfiguration, + provider: AuthProvider.Email, + email: String, + emailLink: String, +): AuthResult? { + try { + updateAuthState(AuthState.Loading("Signing in with email link...")) + + // Validate link format + if (!auth.isSignInWithEmailLink(emailLink)) { + throw AuthException.InvalidEmailLinkException() + } + + // Validate email is not empty + if (email.isEmpty()) { + throw AuthException.EmailMismatchException() + } + + // Parse email link for session data + val parser = EmailLinkParser(emailLink) + val sessionIdFromLink = parser.sessionId + val anonymousUserIdFromLink = parser.anonymousUserId + val oobCode = parser.oobCode + val providerIdFromLink = parser.providerId + val isEmailLinkForceSameDeviceEnabled = parser.forceSameDeviceBit + + // Retrieve stored session record from DataStore + val sessionRecord = EmailLinkPersistenceManager.retrieveSessionRecord(context) + val storedSessionId = sessionRecord?.sessionId + + // Check if this is a different device flow + val isDifferentDevice = provider.isDifferentDevice( + sessionIdFromLocal = storedSessionId, + sessionIdFromLink = sessionIdFromLink + ) + + if (isDifferentDevice) { + // Handle cross-device flow + // Session ID must always be present in the link + if (sessionIdFromLink.isNullOrEmpty()) { + throw AuthException.InvalidEmailLinkException() + } + + // These scenarios require same-device flow + if (isEmailLinkForceSameDeviceEnabled || !anonymousUserIdFromLink.isNullOrEmpty()) { + throw AuthException.EmailLinkWrongDeviceException() + } + + // Validate the action code + auth.checkActionCode(oobCode).await() + + // If there's a provider ID, this is a linking flow which can't be done cross-device + if (!providerIdFromLink.isNullOrEmpty()) { + throw AuthException.EmailLinkCrossDeviceLinkingException() + } + + // Link is valid but we need the user to provide their email + throw AuthException.EmailLinkPromptForEmailException() + } + + // Validate anonymous user ID matches (same-device flow) + if (!anonymousUserIdFromLink.isNullOrEmpty()) { + val currentUser = auth.currentUser + if (currentUser == null || !currentUser.isAnonymous || currentUser.uid != anonymousUserIdFromLink) { + throw AuthException.EmailLinkDifferentAnonymousUserException() + } + } + + // Get credential for linking from session record + val storedCredentialForLink = sessionRecord?.credentialForLinking + val emailLinkCredential = EmailAuthProvider.getCredentialWithLink(email, emailLink) + + val result = if (storedCredentialForLink == null) { + // Normal Flow: Just sign in with email link + signInAndLinkWithCredential(config, emailLinkCredential) + ?: throw AuthException.UnknownException("Sign in failed") + } else { + // Linking Flow: Sign in with email link, then link the social credential + if (canUpgradeAnonymous(config, auth)) { + // Anonymous upgrade: Use safe link pattern with scratch auth + val appExplicitlyForValidation = FirebaseApp.initializeApp( + context, + auth.app.options, + "FUIAuthScratchApp_${System.currentTimeMillis()}" + ) + val authExplicitlyForValidation = FirebaseAuth + .getInstance(appExplicitlyForValidation) + + // Safe link: Validate that both credentials can be linked + val emailResult = authExplicitlyForValidation + .signInWithCredential(emailLinkCredential).await() + + val linkResult = emailResult.user + ?.linkWithCredential(storedCredentialForLink)?.await() + + // If safe link succeeds, emit merge conflict for UI to handle + if (linkResult?.user != null) { + updateAuthState( + AuthState.MergeConflict( + storedCredentialForLink + ) + ) + } + + // Return the link result (will be non-null if successful) + linkResult + } else { + // Non-upgrade: Sign in with email link, then link social credential + val emailLinkResult = auth.signInWithCredential(emailLinkCredential).await() + + // Link the social credential + val linkResult = emailLinkResult.user + ?.linkWithCredential(storedCredentialForLink)?.await() + + // Merge profile from the linked social credential + linkResult?.user?.let { user -> + mergeProfile(auth, user.displayName, user.photoUrl) + } + + // Update to success state + if (linkResult?.user != null) { + updateAuthState( + AuthState.Success( + result = linkResult, + user = linkResult.user!!, + isNewUser = linkResult.additionalUserInfo?.isNewUser ?: false + ) + ) + } + + linkResult + } + } + + // Clear DataStore after success + EmailLinkPersistenceManager.clear(context) + + return result + } catch (e: CancellationException) { + val cancelledException = AuthException.AuthCancelledException( + message = "Sign in with email link was cancelled", + cause = e + ) + updateAuthState(AuthState.Error(cancelledException)) + throw cancelledException + } catch (e: AuthException) { + updateAuthState(AuthState.Error(e)) + throw e + } catch (e: Exception) { + val authException = AuthException.from(e) + updateAuthState(AuthState.Error(authException)) + throw authException + } +} + +/** + * Sends a password reset email to the specified email address. + * + * This method initiates the "forgot password" flow by sending an email to the user + * with a link to reset their password. The user will receive an email from Firebase + * containing a link that allows them to set a new password for their account. + * + * **Flow:** + * 1. Validate the email address exists in Firebase Auth + * 2. Send password reset email to the user + * 3. Emit [AuthState.PasswordResetLinkSent] state + * 4. User clicks link in email to reset password + * 5. User is redirected to Firebase-hosted password reset page (or custom URL if configured) + * + * **Error Handling:** + * - If the email doesn't exist: throws [AuthException.UserNotFoundException] + * - If the email is invalid: throws [AuthException.InvalidCredentialsException] + * - If network error occurs: throws [AuthException.NetworkException] + * + * @param email The email address to send the password reset email to + * @param actionCodeSettings Optional [ActionCodeSettings] to configure the password reset link. + * Use this to customize the continue URL, dynamic link domain, and other settings. + * + * @throws AuthException.UserNotFoundException if no account exists with this email + * @throws AuthException.InvalidCredentialsException if the email format is invalid + * @throws AuthException.NetworkException if a network error occurs + * @throws AuthException.AuthCancelledException if the operation is cancelled + * @throws AuthException.UnknownException for other errors + * + * **Example 1: Basic password reset** + * ```kotlin + * try { + * firebaseAuthUI.sendPasswordResetEmail( + * email = "user@example.com" + * ) + * // Show success message: "Password reset email sent to $email" + * } catch (e: AuthException.UserNotFoundException) { + * // Show error: "No account exists with this email" + * } catch (e: AuthException.InvalidCredentialsException) { + * // Show error: "Invalid email address" + * } + * ``` + * + * **Example 2: Custom password reset with ActionCodeSettings** + * ```kotlin + * val actionCodeSettings = ActionCodeSettings.newBuilder() + * .setUrl("https://myapp.com/resetPassword") // Continue URL after reset + * .setHandleCodeInApp(false) // Use Firebase-hosted reset page + * .setAndroidPackageName( + * "com.myapp", + * true, // Install if not available + * null // Minimum version + * ) + * .build() + * + * firebaseAuthUI.sendPasswordResetEmail( + * email = "user@example.com", + * actionCodeSettings = actionCodeSettings + * ) + * // User receives email with custom continue URL + * ``` + * + * @see com.google.firebase.auth.ActionCodeSettings + */ +internal suspend fun FirebaseAuthUI.sendPasswordResetEmail( + email: String, + actionCodeSettings: ActionCodeSettings? = null +) { + try { + updateAuthState(AuthState.Loading("Sending password reset email...")) + auth.sendPasswordResetEmail(email, actionCodeSettings).await() + updateAuthState(AuthState.PasswordResetLinkSent()) + } catch (e: CancellationException) { + val cancelledException = AuthException.AuthCancelledException( + message = "Send password reset email was cancelled", + cause = e + ) + updateAuthState(AuthState.Error(cancelledException)) + throw cancelledException + } catch (e: AuthException) { + updateAuthState(AuthState.Error(e)) + throw e + } catch (e: Exception) { + val authException = AuthException.from(e) + updateAuthState(AuthState.Error(authException)) + throw authException + } +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/AuthUIStringProviderSample.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/AuthUIStringProviderSample.kt index af0c830cc..453f28cda 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/AuthUIStringProviderSample.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/AuthUIStringProviderSample.kt @@ -15,9 +15,9 @@ package com.firebase.ui.auth.compose.configuration.string_provider import android.content.Context -import com.firebase.ui.auth.compose.configuration.AuthProvider import com.firebase.ui.auth.compose.configuration.AuthUIConfiguration import com.firebase.ui.auth.compose.configuration.authUIConfiguration +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider class AuthUIStringProviderSample { /** diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/DefaultAuthUIStringProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/DefaultAuthUIStringProvider.kt index 5eba036af..5c5e867e5 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/DefaultAuthUIStringProvider.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/string_provider/DefaultAuthUIStringProvider.kt @@ -196,7 +196,11 @@ class DefaultAuthUIStringProvider( override val userNotFoundRecoveryMessage: String get() = localizedContext.getString(R.string.fui_error_email_does_not_exist) override val weakPasswordRecoveryMessage: String - get() = localizedContext.resources.getQuantityString(R.plurals.fui_error_weak_password, 6, 6) + get() = localizedContext.resources.getQuantityString( + R.plurals.fui_error_weak_password, + 6, + 6 + ) override val emailAlreadyInUseRecoveryMessage: String get() = localizedContext.getString(R.string.fui_email_account_creation_error) override val tooManyRequestsRecoveryMessage: String diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt index 7f053fbd3..ec5bbdd53 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/ProviderStyleDefaults.kt @@ -16,7 +16,7 @@ package com.firebase.ui.auth.compose.configuration.theme import androidx.compose.ui.graphics.Color import com.firebase.ui.auth.R -import com.firebase.ui.auth.compose.configuration.Provider +import com.firebase.ui.auth.compose.configuration.auth_provider.Provider /** * Default provider styling configurations for authentication providers. diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt index 2d9efafc1..65f163fea 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidator.kt @@ -14,8 +14,8 @@ package com.firebase.ui.auth.compose.configuration.validators -import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider import com.firebase.ui.auth.compose.configuration.PasswordRule +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider internal class PasswordValidator( override val stringProvider: AuthUIStringProvider, diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButton.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButton.kt index 255d6c59e..8bed40873 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButton.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButton.kt @@ -1,32 +1,30 @@ package com.firebase.ui.auth.compose.ui.components import androidx.compose.foundation.Image -import androidx.compose.material3.Icon import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Star import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable 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.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.firebase.ui.auth.compose.configuration.AuthProvider -import com.firebase.ui.auth.compose.configuration.Provider +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider +import com.firebase.ui.auth.compose.configuration.auth_provider.Provider import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialog.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialog.kt index 732a48662..6698adc67 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialog.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialog.kt @@ -135,6 +135,7 @@ private fun getRecoveryMessage( "$baseMessage\n\nReason: $reason" } ?: baseMessage } + is AuthException.EmailAlreadyInUseException -> { // Include email if available val baseMessage = stringProvider.emailAlreadyInUseRecoveryMessage @@ -142,6 +143,7 @@ private fun getRecoveryMessage( "$baseMessage ($email)" } ?: baseMessage } + is AuthException.TooManyRequestsException -> stringProvider.tooManyRequestsRecoveryMessage is AuthException.MfaRequiredException -> stringProvider.mfaRequiredRecoveryMessage is AuthException.AccountLinkingRequiredException -> stringProvider.accountLinkingRequiredRecoveryMessage @@ -173,6 +175,7 @@ private fun getRecoveryActionText( is AuthException.WeakPasswordException, is AuthException.TooManyRequestsException, is AuthException.UnknownException -> stringProvider.retryAction + else -> stringProvider.retryAction } } diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt index 855e3d6b3..58466f37e 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt @@ -19,7 +19,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.firebase.ui.auth.R -import com.firebase.ui.auth.compose.configuration.AuthProvider +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset import com.firebase.ui.auth.compose.ui.components.AuthProviderButton diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/util/EmailLinkPersistenceManager.kt b/auth/src/main/java/com/firebase/ui/auth/compose/util/EmailLinkPersistenceManager.kt new file mode 100644 index 000000000..3764151c0 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/util/EmailLinkPersistenceManager.kt @@ -0,0 +1,158 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.util + +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.preferencesDataStore +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider +import com.google.firebase.auth.AuthCredential +import com.google.firebase.auth.FacebookAuthProvider +import com.google.firebase.auth.GoogleAuthProvider +import kotlinx.coroutines.flow.first + +private val Context.dataStore: DataStore by preferencesDataStore(name = "com.firebase.ui.auth.util.data.EmailLinkPersistenceManager") + +/** + * Manages saving/retrieving from DataStore for email link sign in. + * + * This class provides persistence for email link authentication sessions, including: + * - Email address + * - Session ID for same-device validation + * - Anonymous user ID for upgrade flows + * - Social provider credentials for linking flows + * + * @since 10.0.0 + */ +object EmailLinkPersistenceManager { + + /** + * Saves email and session information to DataStore for email link sign-in. + * + * @param context Android context for DataStore access + * @param email Email address to save + * @param sessionId Unique session identifier for same-device validation + * @param anonymousUserId Optional anonymous user ID for upgrade flows + */ + suspend fun saveEmail( + context: Context, + email: String, + sessionId: String, + anonymousUserId: String? + ) { + context.dataStore.edit { prefs -> + prefs[AuthProvider.Email.KEY_EMAIL] = email + prefs[AuthProvider.Email.KEY_SESSION_ID] = sessionId + prefs[AuthProvider.Email.KEY_ANONYMOUS_USER_ID] = anonymousUserId ?: "" + } + } + + /** + * Saves social provider credential information to DataStore for linking after email link sign-in. + * + * This is called when a user attempts to sign in with a social provider (Google/Facebook) + * but an email link account with the same email already exists. The credential is saved + * and will be linked after the user completes email link authentication. + * + * @param context Android context for DataStore access + * @param providerType Provider ID ("google.com", "facebook.com", etc.) + * @param idToken ID token from the provider + * @param accessToken Access token from the provider (optional, used by Facebook) + */ + suspend fun saveCredentialForLinking( + context: Context, + providerType: String, + idToken: String?, + accessToken: String? + ) { + context.dataStore.edit { prefs -> + prefs[AuthProvider.Email.KEY_PROVIDER] = providerType + prefs[AuthProvider.Email.KEY_IDP_TOKEN] = idToken ?: "" + prefs[AuthProvider.Email.KEY_IDP_SECRET] = accessToken ?: "" + } + } + + /** + * Retrieves session information from DataStore. + * + * @param context Android context for DataStore access + * @return SessionRecord containing saved session data, or null if no session exists + */ + suspend fun retrieveSessionRecord(context: Context): SessionRecord? { + val prefs = context.dataStore.data.first() + val email = prefs[AuthProvider.Email.KEY_EMAIL] + val sessionId = prefs[AuthProvider.Email.KEY_SESSION_ID] + + if (email == null || sessionId == null) { + return null + } + + val anonymousUserId = prefs[AuthProvider.Email.KEY_ANONYMOUS_USER_ID] + val providerType = prefs[AuthProvider.Email.KEY_PROVIDER] + val idToken = prefs[AuthProvider.Email.KEY_IDP_TOKEN] + val accessToken = prefs[AuthProvider.Email.KEY_IDP_SECRET] + + // Rebuild credential if we have provider data + val credentialForLinking = if (providerType != null && idToken != null) { + when (providerType) { + "google.com" -> GoogleAuthProvider.getCredential(idToken, accessToken) + "facebook.com" -> FacebookAuthProvider.getCredential(accessToken ?: "") + else -> null + } + } else { + null + } + + return SessionRecord( + sessionId = sessionId, + email = email, + anonymousUserId = anonymousUserId, + credentialForLinking = credentialForLinking + ) + } + + /** + * Clears all saved data from DataStore. + * + * @param context Android context for DataStore access + */ + suspend fun clear(context: Context) { + context.dataStore.edit { prefs -> + prefs.remove(AuthProvider.Email.KEY_SESSION_ID) + prefs.remove(AuthProvider.Email.KEY_EMAIL) + prefs.remove(AuthProvider.Email.KEY_ANONYMOUS_USER_ID) + prefs.remove(AuthProvider.Email.KEY_PROVIDER) + prefs.remove(AuthProvider.Email.KEY_IDP_TOKEN) + prefs.remove(AuthProvider.Email.KEY_IDP_SECRET) + } + } + + /** + * Holds the necessary information to complete the email link sign in flow. + * + * @property sessionId Unique session identifier for same-device validation + * @property email Email address for sign-in + * @property anonymousUserId Optional anonymous user ID for upgrade flows + * @property credentialForLinking Optional social provider credential to link after sign-in + */ + data class SessionRecord( + val sessionId: String, + val email: String, + val anonymousUserId: String?, + val credentialForLinking: AuthCredential? + ) +} diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt index 333f00c7a..98e72d6fd 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt @@ -24,11 +24,11 @@ import com.google.firebase.auth.FirebaseAuth.AuthStateListener import com.google.firebase.auth.FirebaseUser import com.google.firebase.auth.MultiFactorResolver import com.google.firebase.auth.UserInfo +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.take import kotlinx.coroutines.flow.toList import kotlinx.coroutines.launch -import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before @@ -36,9 +36,9 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.Mock -import org.mockito.Mockito.`when` import org.mockito.Mockito.mock import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt index 5fd0d201c..6b61afaae 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUITest.kt @@ -14,7 +14,9 @@ package com.firebase.ui.auth.compose +import android.content.Context import androidx.test.core.app.ApplicationProvider +import com.google.android.gms.tasks.TaskCompletionSource import com.google.common.truth.Truth.assertThat import com.google.firebase.FirebaseApp import com.google.firebase.FirebaseException @@ -22,8 +24,6 @@ import com.google.firebase.FirebaseOptions import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.FirebaseAuthRecentLoginRequiredException import com.google.firebase.auth.FirebaseUser -import com.google.android.gms.tasks.Task -import com.google.android.gms.tasks.TaskCompletionSource import kotlinx.coroutines.CancellationException import kotlinx.coroutines.test.runTest import org.junit.After @@ -31,11 +31,11 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock -import org.mockito.Mockito.`when` -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify import org.mockito.Mockito.doNothing import org.mockito.Mockito.doThrow +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @@ -64,7 +64,7 @@ class FirebaseAuthUITest { FirebaseAuthUI.clearInstanceCache() // Clear any existing Firebase apps - val context = ApplicationProvider.getApplicationContext() + val context = ApplicationProvider.getApplicationContext() FirebaseApp.getApps(context).forEach { app -> app.delete() } @@ -346,7 +346,7 @@ class FirebaseAuthUITest { // Create instance with mock auth val instance = FirebaseAuthUI.create(defaultApp, mockAuth) - val context = ApplicationProvider.getApplicationContext() + val context = ApplicationProvider.getApplicationContext() // Perform sign out instance.signOut(context) @@ -364,7 +364,7 @@ class FirebaseAuthUITest { // Create instance with mock auth val instance = FirebaseAuthUI.create(defaultApp, mockAuth) - val context = ApplicationProvider.getApplicationContext() + val context = ApplicationProvider.getApplicationContext() // Perform sign out and expect exception try { @@ -385,7 +385,7 @@ class FirebaseAuthUITest { // Create instance with mock auth val instance = FirebaseAuthUI.create(defaultApp, mockAuth) - val context = ApplicationProvider.getApplicationContext() + val context = ApplicationProvider.getApplicationContext() // Perform sign out and expect cancellation exception try { @@ -414,7 +414,7 @@ class FirebaseAuthUITest { // Create instance with mock auth val instance = FirebaseAuthUI.create(defaultApp, mockAuth) - val context = ApplicationProvider.getApplicationContext() + val context = ApplicationProvider.getApplicationContext() // Perform delete instance.delete(context) @@ -431,7 +431,7 @@ class FirebaseAuthUITest { // Create instance with mock auth val instance = FirebaseAuthUI.create(defaultApp, mockAuth) - val context = ApplicationProvider.getApplicationContext() + val context = ApplicationProvider.getApplicationContext() // Perform delete and expect exception try { @@ -459,7 +459,7 @@ class FirebaseAuthUITest { // Create instance with mock auth val instance = FirebaseAuthUI.create(defaultApp, mockAuth) - val context = ApplicationProvider.getApplicationContext() + val context = ApplicationProvider.getApplicationContext() // Perform delete and expect mapped exception try { @@ -485,7 +485,7 @@ class FirebaseAuthUITest { // Create instance with mock auth val instance = FirebaseAuthUI.create(defaultApp, mockAuth) - val context = ApplicationProvider.getApplicationContext() + val context = ApplicationProvider.getApplicationContext() // Perform delete and expect cancellation exception try { @@ -511,7 +511,7 @@ class FirebaseAuthUITest { // Create instance with mock auth val instance = FirebaseAuthUI.create(defaultApp, mockAuth) - val context = ApplicationProvider.getApplicationContext() + val context = ApplicationProvider.getApplicationContext() // Perform delete and expect mapped exception try { diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt index f08be227f..31045ba13 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt @@ -20,6 +20,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AccountCircle import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthProviderTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProviderTest.kt similarity index 95% rename from auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthProviderTest.kt rename to auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProviderTest.kt index c473867c4..3e6ab28ca 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthProviderTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProviderTest.kt @@ -1,18 +1,4 @@ -/* - * Copyright 2025 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.firebase.ui.auth.compose.configuration +package com.firebase.ui.auth.compose.configuration.auth_provider import android.content.Context import androidx.test.core.app.ApplicationProvider diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt new file mode 100644 index 000000000..79bbbcfef --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt @@ -0,0 +1,726 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.auth_provider + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.AuthException +import com.firebase.ui.auth.compose.AuthState +import com.firebase.ui.auth.compose.FirebaseAuthUI +import com.firebase.ui.auth.compose.configuration.PasswordRule +import com.firebase.ui.auth.compose.configuration.authUIConfiguration +import com.google.android.gms.tasks.TaskCompletionSource +import com.google.common.truth.Truth.assertThat +import com.google.firebase.FirebaseApp +import com.google.firebase.FirebaseOptions +import com.google.firebase.auth.ActionCodeSettings +import com.google.firebase.auth.AuthCredential +import com.google.firebase.auth.AuthResult +import com.google.firebase.auth.EmailAuthProvider +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException +import com.google.firebase.auth.FirebaseAuthInvalidUserException +import com.google.firebase.auth.FirebaseAuthUserCollisionException +import com.google.firebase.auth.FirebaseUser +import com.google.firebase.auth.GoogleAuthProvider +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.runTest +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers +import org.mockito.Mock +import org.mockito.Mockito.anyString +import org.mockito.Mockito.mock +import org.mockito.Mockito.mockStatic +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` +import org.mockito.MockitoAnnotations +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * Comprehensive unit tests for Email Authentication provider methods in FirebaseAuthUI. + * + * Tests cover all email auth methods: + * - createOrLinkUserWithEmailAndPassword + * - signInWithEmailAndPassword + * - signInAndLinkWithCredential + * - sendSignInLinkToEmail + * - signInWithEmailLink + * - sendPasswordResetEmail + * + * @suppress Internal test class + */ +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class EmailAuthProviderFirebaseAuthUITest { + + @Mock + private lateinit var mockFirebaseAuth: FirebaseAuth + + private lateinit var firebaseApp: FirebaseApp + private lateinit var applicationContext: Context + + @Before + fun setUp() { + MockitoAnnotations.openMocks(this) + + FirebaseAuthUI.clearInstanceCache() + + applicationContext = ApplicationProvider.getApplicationContext() + + FirebaseApp.getApps(applicationContext).forEach { app -> + app.delete() + } + + firebaseApp = FirebaseApp.initializeApp( + applicationContext, + FirebaseOptions.Builder() + .setApiKey("fake-api-key") + .setApplicationId("fake-app-id") + .setProjectId("fake-project-id") + .build() + ) + } + + @After + fun tearDown() { + FirebaseAuthUI.clearInstanceCache() + try { + firebaseApp.delete() + } catch (_: Exception) { + // Ignore if already deleted + } + } + + // ============================================================================================= + // createOrLinkUserWithEmailAndPassword Tests + // ============================================================================================= + + @Test + fun `Create user with email and password without anonymous upgrade should succeed`() = runTest { + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setResult(null) + `when`(mockFirebaseAuth.createUserWithEmailAndPassword("test@example.com", "Pass@123")) + .thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + } + + instance.createOrLinkUserWithEmailAndPassword( + context = applicationContext, + config = config, + provider = emailProvider, + name = null, + email = "test@example.com", + password = "Pass@123" + ) + + verify(mockFirebaseAuth) + .createUserWithEmailAndPassword("test@example.com", "Pass@123") + } + + @Test + fun `Link user with email and password with anonymous upgrade should succeed`() = runTest { + mockStatic(EmailAuthProvider::class.java).use { mockedProvider -> + val mockCredential = mock(AuthCredential::class.java) + mockedProvider.`when` { + EmailAuthProvider.getCredential("test@example.com", "Pass@123") + }.thenReturn(mockCredential) + val mockAnonymousUser = mock(FirebaseUser::class.java) + `when`(mockAnonymousUser.isAnonymous).thenReturn(true) + `when`(mockFirebaseAuth.currentUser).thenReturn(mockAnonymousUser) + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setResult(null) + `when`( + mockFirebaseAuth.currentUser?.linkWithCredential( + ArgumentMatchers.any(AuthCredential::class.java) + ) + ).thenReturn(taskCompletionSource.task) + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + isAnonymousUpgradeEnabled = true + } + + instance.createOrLinkUserWithEmailAndPassword( + context = applicationContext, + config = config, + provider = emailProvider, + name = null, + email = "test@example.com", + password = "Pass@123" + ) + + mockedProvider.verify { + EmailAuthProvider.getCredential("test@example.com", "Pass@123") + } + verify(mockAnonymousUser).linkWithCredential(mockCredential) + } + } + + @Test + fun `createOrLinkUserWithEmailAndPassword - rejects weak password`() = runTest { + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + } + + try { + instance.createOrLinkUserWithEmailAndPassword( + context = applicationContext, + config = config, + provider = emailProvider, + name = null, + email = "test@example.com", + password = "weak" + ) + } catch (e: Exception) { + assertThat(e.message).contains( + applicationContext + .getString(R.string.fui_error_password_too_short) + .format(emailProvider.minimumPasswordLength) + ) + } + + verify(mockFirebaseAuth, never()) + .createUserWithEmailAndPassword(anyString(), anyString()) + } + + @Test + fun `createOrLinkUserWithEmailAndPassword - validates custom password rules`() = runTest { + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = listOf(PasswordRule.RequireUppercase) + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + } + + try { + instance.createOrLinkUserWithEmailAndPassword( + context = applicationContext, + config = config, + provider = emailProvider, + name = null, + email = "test@example.com", + password = "pass@123" + ) + } catch (e: Exception) { + assertThat(e.message).isEqualTo(applicationContext.getString(R.string.fui_error_password_missing_uppercase)) + } + } + + @Test + fun `createOrLinkUserWithEmailAndPassword - respects isNewAccountsAllowed setting`() = runTest { + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList(), + isNewAccountsAllowed = false + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + } + + try { + instance.createOrLinkUserWithEmailAndPassword( + context = applicationContext, + config = config, + provider = emailProvider, + name = null, + email = "test@example.com", + password = "Pass@123" + ) + } catch (e: Exception) { + assertThat(e.message) + .isEqualTo(applicationContext.getString(R.string.fui_error_email_does_not_exist)) + } + } + + @Test + fun `createOrLinkUserWithEmailAndPassword - handles collision exception`() = runTest { + val mockAnonymousUser = mock(FirebaseUser::class.java) + `when`(mockAnonymousUser.isAnonymous).thenReturn(true) + `when`(mockAnonymousUser.email).thenReturn("test@example.com") + `when`(mockFirebaseAuth.currentUser).thenReturn(mockAnonymousUser) + + val collisionException = FirebaseAuthUserCollisionException( + "ERROR_EMAIL_ALREADY_IN_USE", + "Email already in use" + ) + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setException(collisionException) + `when`(mockAnonymousUser.linkWithCredential(ArgumentMatchers.any(AuthCredential::class.java))) + .thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + isAnonymousUpgradeEnabled = true + } + + try { + instance.createOrLinkUserWithEmailAndPassword( + context = applicationContext, + config = config, + provider = emailProvider, + name = null, + email = "test@example.com", + password = "Pass@123" + ) + } catch (e: AuthException) { + assertThat(e.cause).isEqualTo(collisionException) + val currentState = instance.authStateFlow().first { it is AuthState.MergeConflict } + assertThat(currentState).isInstanceOf(AuthState.MergeConflict::class.java) + val mergeConflict = currentState as AuthState.MergeConflict + assertThat(mergeConflict.pendingCredential).isNotNull() + } + } + + // ============================================================================================= + // signInWithEmailAndPassword Tests + // ============================================================================================= + + @Test + fun `signInWithEmailAndPassword - successful sign in`() = runTest { + val mockUser = mock(FirebaseUser::class.java) + val mockAuthResult = mock(AuthResult::class.java) + `when`(mockAuthResult.user).thenReturn(mockUser) + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setResult(mockAuthResult) + `when`(mockFirebaseAuth.signInWithEmailAndPassword("test@example.com", "Pass@123")) + .thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + } + + val result = instance.signInWithEmailAndPassword( + context = applicationContext, + config = config, + email = "test@example.com", + password = "Pass@123" + ) + + assertThat(result).isNotNull() + assertThat(result?.user).isEqualTo(mockUser) + verify(mockFirebaseAuth).signInWithEmailAndPassword("test@example.com", "Pass@123") + } + + @Test + fun `signInWithEmailAndPassword - handles invalid credentials`() = runTest { + val invalidCredentialsException = FirebaseAuthInvalidCredentialsException( + "ERROR_WRONG_PASSWORD", + "Wrong password" + ) + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setException(invalidCredentialsException) + `when`(mockFirebaseAuth.signInWithEmailAndPassword("test@example.com", "Pass@123")) + .thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + } + + try { + instance.signInWithEmailAndPassword( + context = applicationContext, + config = config, + email = "test@example.com", + password = "Pass@123" + ) + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException.InvalidCredentialsException) { + assertThat(e.cause).isEqualTo(invalidCredentialsException) + } + } + + @Test + fun `signInWithEmailAndPassword - handles user not found`() = runTest { + val userNotFoundException = FirebaseAuthInvalidUserException( + "ERROR_USER_NOT_FOUND", + "User not found" + ) + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setException(userNotFoundException) + `when`(mockFirebaseAuth.signInWithEmailAndPassword("test@example.com", "Pass@123")) + .thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + } + + try { + instance.signInWithEmailAndPassword( + context = applicationContext, + config = config, + email = "test@example.com", + password = "Pass@123" + ) + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException.UserNotFoundException) { + assertThat(e.cause).isEqualTo(userNotFoundException) + } + } + + @Test + fun `signInWithEmailAndPassword - links credential after sign in`() = runTest { + val googleCredential = GoogleAuthProvider.getCredential("google-id-token", null) + val mockUser = mock(FirebaseUser::class.java) + val signInAuthResult = mock(AuthResult::class.java) + `when`(signInAuthResult.user).thenReturn(mockUser) + val signInTask = TaskCompletionSource() + signInTask.setResult(signInAuthResult) + + val linkAuthResult = mock(AuthResult::class.java) + `when`(linkAuthResult.user).thenReturn(mockUser) + val linkTask = TaskCompletionSource() + linkTask.setResult(linkAuthResult) + + `when`(mockFirebaseAuth.signInWithEmailAndPassword("test@example.com", "Pass@123")) + .thenReturn(signInTask.task) + `when`(mockUser.linkWithCredential(googleCredential)) + .thenReturn(linkTask.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + } + + instance.signInWithEmailAndPassword( + context = applicationContext, + config = config, + email = "test@example.com", + password = "Pass@123", + credentialForLinking = googleCredential + ) + + verify(mockUser).linkWithCredential(googleCredential) + } + + // ============================================================================================= + // signInAndLinkWithCredential Tests + // ============================================================================================= + + @Test + fun `signInAndLinkWithCredential - successful sign in with credential`() = runTest { + val credential = GoogleAuthProvider.getCredential("google-id-token", null) + val mockUser = mock(FirebaseUser::class.java) + val mockAuthResult = mock(AuthResult::class.java) + `when`(mockAuthResult.user).thenReturn(mockUser) + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setResult(mockAuthResult) + `when`(mockFirebaseAuth.signInWithCredential(credential)) + .thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + } + + val result = instance.signInAndLinkWithCredential( + config = config, + credential = credential + ) + + assertThat(result).isNotNull() + assertThat(result?.user).isEqualTo(mockUser) + verify(mockFirebaseAuth).signInWithCredential(credential) + } + + @Test + fun `signInAndLinkWithCredential - handles anonymous upgrade`() = runTest { + val anonymousUser = mock(FirebaseUser::class.java) + `when`(anonymousUser.isAnonymous).thenReturn(true) + `when`(mockFirebaseAuth.currentUser).thenReturn(anonymousUser) + + val credential = GoogleAuthProvider.getCredential("google-id-token", null) + val mockAuthResult = mock(AuthResult::class.java) + `when`(mockAuthResult.user).thenReturn(anonymousUser) + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setResult(mockAuthResult) + `when`(anonymousUser.linkWithCredential(credential)) + .thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + isAnonymousUpgradeEnabled = true + } + + val result = instance.signInAndLinkWithCredential( + config = config, + credential = credential + ) + + assertThat(result).isNotNull() + verify(anonymousUser).linkWithCredential(credential) + verify(mockFirebaseAuth, never()).signInWithCredential(credential) + } + + @Test + fun `signInAndLinkWithCredential - handles collision and emits MergeConflict`() = runTest { + val anonymousUser = mock(FirebaseUser::class.java) + `when`(anonymousUser.isAnonymous).thenReturn(true) + `when`(mockFirebaseAuth.currentUser).thenReturn(anonymousUser) + + val credential = GoogleAuthProvider.getCredential("google-id-token", null) + val updatedCredential = EmailAuthProvider.getCredential("test@example.com", "Pass@123") + + val collisionException = FirebaseAuthUserCollisionException( + "ERROR_CREDENTIAL_ALREADY_IN_USE", + "Credential already in use" + ) + // Set updatedCredential using reflection + val field = FirebaseAuthUserCollisionException::class.java.getDeclaredField("zza") + field.isAccessible = true + field.set(collisionException, updatedCredential) + + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setException(collisionException) + `when`(anonymousUser.linkWithCredential(credential)) + .thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + val emailProvider = AuthProvider.Email( + actionCodeSettings = null, + passwordValidationRules = emptyList() + ) + val config = authUIConfiguration { + context = applicationContext + providers { + provider(emailProvider) + } + isAnonymousUpgradeEnabled = true + } + + try { + instance.signInAndLinkWithCredential( + config = config, + credential = credential + ) + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException) { + // Expected + } + + val currentState = instance.authStateFlow().first { it is AuthState.MergeConflict } + assertThat(currentState).isInstanceOf(AuthState.MergeConflict::class.java) + val mergeConflict = currentState as AuthState.MergeConflict + assertThat(mergeConflict.pendingCredential).isEqualTo(updatedCredential) + } + + // ============================================================================================= + // sendPasswordResetEmail Tests + // ============================================================================================= + + @Test + fun `sendPasswordResetEmail - successfully sends reset email`() = runTest { + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setResult(null) + `when`(mockFirebaseAuth.sendPasswordResetEmail( + ArgumentMatchers.eq("test@example.com"), + ArgumentMatchers.isNull() + )).thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + + instance.sendPasswordResetEmail("test@example.com") + + verify(mockFirebaseAuth).sendPasswordResetEmail( + ArgumentMatchers.eq("test@example.com"), + ArgumentMatchers.isNull() + ) + + val finalState = instance.authStateFlow().first { it is AuthState.PasswordResetLinkSent } + assertThat(finalState).isInstanceOf(AuthState.PasswordResetLinkSent::class.java) + } + + @Test + fun `sendPasswordResetEmail - sends with ActionCodeSettings`() = runTest { + val actionCodeSettings = ActionCodeSettings.newBuilder() + .setUrl("https://myapp.com/resetPassword") + .setHandleCodeInApp(false) + .build() + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setResult(null) + `when`(mockFirebaseAuth.sendPasswordResetEmail("test@example.com", actionCodeSettings)) + .thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + + instance.sendPasswordResetEmail("test@example.com", actionCodeSettings) + + verify(mockFirebaseAuth).sendPasswordResetEmail("test@example.com", actionCodeSettings) + + val finalState = instance.authStateFlow().first { it is AuthState.PasswordResetLinkSent } + assertThat(finalState).isInstanceOf(AuthState.PasswordResetLinkSent::class.java) + } + + @Test + fun `sendPasswordResetEmail - handles user not found`() = runTest { + val userNotFoundException = FirebaseAuthInvalidUserException( + "ERROR_USER_NOT_FOUND", + "User not found" + ) + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setException(userNotFoundException) + `when`(mockFirebaseAuth.sendPasswordResetEmail( + ArgumentMatchers.eq("test@example.com"), + ArgumentMatchers.isNull() + )).thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + + try { + instance.sendPasswordResetEmail("test@example.com") + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException.UserNotFoundException) { + assertThat(e.cause).isEqualTo(userNotFoundException) + } + } + + @Test + fun `sendPasswordResetEmail - handles invalid email`() = runTest { + val invalidEmailException = FirebaseAuthInvalidCredentialsException( + "ERROR_INVALID_EMAIL", + "Invalid email" + ) + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setException(invalidEmailException) + `when`(mockFirebaseAuth.sendPasswordResetEmail( + ArgumentMatchers.eq("test@example.com"), + ArgumentMatchers.isNull() + )).thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + + try { + instance.sendPasswordResetEmail("test@example.com") + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException.InvalidCredentialsException) { + assertThat(e.cause).isEqualTo(invalidEmailException) + } + } + + @Test + fun `sendPasswordResetEmail - handles cancellation`() = runTest { + val cancellationException = CancellationException("Operation cancelled") + val taskCompletionSource = TaskCompletionSource() + taskCompletionSource.setException(cancellationException) + `when`(mockFirebaseAuth.sendPasswordResetEmail( + ArgumentMatchers.eq("test@example.com"), + ArgumentMatchers.isNull() + )).thenReturn(taskCompletionSource.task) + + val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) + + try { + instance.sendPasswordResetEmail("test@example.com") + assertThat(false).isTrue() // Should not reach here + } catch (e: AuthException.AuthCancelledException) { + assertThat(e.message).contains("cancelled") + assertThat(e.cause).isInstanceOf(CancellationException::class.java) + } + } +} diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt index 27d34b6a6..af36c1e18 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/validators/PasswordValidatorTest.kt @@ -17,9 +17,9 @@ package com.firebase.ui.auth.compose.configuration.validators import android.content.Context import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.configuration.PasswordRule import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider -import com.firebase.ui.auth.compose.configuration.PasswordRule import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButtonTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButtonTest.kt index faae2cf48..3baa351e0 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButtonTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButtonTest.kt @@ -27,8 +27,9 @@ import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.core.app.ApplicationProvider -import com.firebase.ui.auth.compose.configuration.AuthProvider -import com.firebase.ui.auth.compose.configuration.Provider +import com.firebase.ui.auth.R +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider +import com.firebase.ui.auth.compose.configuration.auth_provider.Provider import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset @@ -40,7 +41,6 @@ import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config -import com.firebase.ui.auth.R /** * Unit tests for [AuthProviderButton] covering UI interactions, styling, diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt index 17d736ca7..2b500a924 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt @@ -15,7 +15,7 @@ import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollToNode import androidx.test.core.app.ApplicationProvider import com.firebase.ui.auth.R -import com.firebase.ui.auth.compose.configuration.AuthProvider +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset import com.google.common.truth.Truth import org.junit.Before diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java index 2efed02da..2311a45b8 100644 --- a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java +++ b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java @@ -45,6 +45,7 @@ import static com.firebase.ui.auth.AuthUI.EMAIL_LINK_PROVIDER; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -75,11 +76,19 @@ public static void initialize() { } private static void spyContextAndResources() { - CONTEXT = spy(CONTEXT); - when(CONTEXT.getApplicationContext()) - .thenReturn(CONTEXT); - Resources spiedResources = spy(CONTEXT.getResources()); - when(CONTEXT.getResources()).thenReturn(spiedResources); + // In Mockito 5.x with inline mock maker, we can spy on final classes + // Use doReturn().when() pattern to avoid calling real methods during stubbing + if (!org.mockito.Mockito.mockingDetails(CONTEXT).isSpy()) { + CONTEXT = spy(CONTEXT); + } + doReturn(CONTEXT).when(CONTEXT).getApplicationContext(); + + // Get and spy on Resources, ensuring the spy is properly returned + Resources originalResources = CONTEXT.getResources(); + if (!org.mockito.Mockito.mockingDetails(originalResources).isSpy()) { + Resources spiedResources = spy(originalResources); + doReturn(spiedResources).when(CONTEXT).getResources(); + } } private static void initializeApp(Context context) { @@ -94,9 +103,9 @@ private static void initializeApp(Context context) { } private static void initializeProviders() { - when(CONTEXT.getString(R.string.firebase_web_host)).thenReturn("abc"); - when(CONTEXT.getString(R.string.default_web_client_id)).thenReturn("abc"); - when(CONTEXT.getString(R.string.facebook_application_id)).thenReturn("abc"); + doReturn("abc").when(CONTEXT).getString(R.string.firebase_web_host); + doReturn("abc").when(CONTEXT).getString(R.string.default_web_client_id); + doReturn("abc").when(CONTEXT).getString(R.string.facebook_application_id); } public static FirebaseUser getMockFirebaseUser() { diff --git a/buildSrc/src/main/kotlin/Config.kt b/buildSrc/src/main/kotlin/Config.kt index a21ca69bc..481ee19cd 100644 --- a/buildSrc/src/main/kotlin/Config.kt +++ b/buildSrc/src/main/kotlin/Config.kt @@ -42,6 +42,8 @@ object Config { const val recyclerView = "androidx.recyclerview:recyclerview:1.2.1" const val materialDesign = "com.google.android.material:material:1.4.0" + const val datastorePreferences = "androidx.datastore:datastore-preferences:1.1.1" + const val credentials = "androidx.credentials:credentials:1.3.0" object Compose { const val bom = "androidx.compose:compose-bom:2025.08.00" const val ui = "androidx.compose.ui:ui" @@ -88,6 +90,9 @@ object Config { const val junitExt = "androidx.test.ext:junit:1.1.5" const val truth = "com.google.truth:truth:0.42" const val mockito = "org.mockito:mockito-android:2.21.0" + const val mockitoCore = "org.mockito:mockito-core:5.19.0" + const val mockitoInline = "org.mockito:mockito-inline:5.2.0" + const val mockitoKotlin = "org.mockito.kotlin:mockito-kotlin:6.0.0" const val robolectric = "org.robolectric:robolectric:4.14" const val core = "androidx.test:core:1.5.0" From ddf6719ec4f301606c329a13782a5d37ac681907 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo <48495111+demolaf@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:22:14 +0100 Subject: [PATCH 18/50] feat: EmailAuthScreen (Stateful + Slot) (#2236) * feat: AuthMethodPicker, logo and provider theme style * chore: organize folder structure * feat: TOS and PP footer, ui tests for AuthMethodPicker * chore: tests folder structure * chore: use version catalog for compose deps * feat: AuthTextField with validation * test: AuthTextField and field validations * chore: update doc comments * wip: Email Provider integration * chore: upgrade mockito, fix: spying mocked objects in new library * wip: Email provider integration * wip: Email provider integration * wip: Email provider integration * feat: Email provider integration * wip: SignIn, SignUp, ResetPassword flows * refactor: remove libs.versions.toml catalog file * add sample app compose module * wip: SignInUI and EmailAuthScreen sample * feat: Email provider integration - added: sign in, sign up, reset password, email link and anonymous auto upgrade - upgrade mockito - fixed spying mocked objects in new library test error * wip: SignUp UI * feat: add PasswordResetLinkSent state * fix: use isSecureTextField for password fields * wip: SignUp * fix: passwordResetActionCodeSettings for send password reset link * fix: combine Firebase and internal auth state flows to prioritize non-idle internal updates * wip: SignUp * chore: remove unused methods * chore: remove unused comments and code * chore: remove unused imports, reformat * chore: remove comments * chore: remove comments * handle authState exceptions * fix: mockito 5 upgrade stubbing issues * wip: Email link, deep link * chore: add copyright message * refactor: rename to emailLinkActionCodeSettings in AuthProvider.Email and passwordResetActionCodeSettings in AuthUIConfiguration * feat: add dark theme * feat: Email sign in link * fix: test doesn't capture initial Idle state * fix: CI run issues * fix: CI run issues * fix: opt out of edge to edge in app module * fix: remove opt out of edge to edge in app module --- auth/src/main/AndroidManifest.xml | 12 +- .../com/firebase/ui/auth/compose/AuthState.kt | 9 + .../ui/auth/compose/FirebaseAuthUI.kt | 84 ++--- .../configuration/AuthUIConfiguration.kt | 20 +- .../auth_provider/AuthProvider.kt | 29 +- .../EmailAuthProvider+FirebaseAuthUI.kt | 90 +++--- .../configuration/theme/AuthUITheme.kt | 26 +- .../validators/GeneralFieldValidator.kt | 52 ++++ .../ui/components/AuthProviderButton.kt | 16 +- .../compose/ui/components/AuthTextField.kt | 25 +- .../ui/components/ErrorRecoveryDialog.kt | 4 +- .../ui/components/TermsAndPrivacyForm.kt | 73 +++++ .../method_picker/AnnotatedStringResource.kt | 14 + .../ui/method_picker/AuthMethodPicker.kt | 16 +- .../compose/ui/screens/EmailAuthScreen.kt | 288 ++++++++++++++++++ .../screens/EmailSignInLinkHandlerActivity.kt | 109 +++++++ .../compose/ui/screens/ResetPasswordUI.kt | 216 +++++++++++++ .../ui/auth/compose/ui/screens/SignInUI.kt | 278 +++++++++++++++++ .../ui/auth/compose/ui/screens/SignUpUI.kt | 273 +++++++++++++++++ .../compose/FirebaseAuthUIAuthStateTest.kt | 26 +- .../configuration/AuthUIConfigurationTest.kt | 13 +- .../auth_provider/AuthProviderTest.kt | 10 +- .../EmailAuthProviderFirebaseAuthUITest.kt | 26 +- .../ui/components/AuthProviderButtonTest.kt | 2 +- .../ui/components/AuthTextFieldTest.kt | 4 +- .../ui/method_picker/AuthMethodPickerTest.kt | 10 +- build.gradle | 10 +- composeapp/.gitignore | 1 + composeapp/build.gradle.kts | 68 +++++ composeapp/proguard-rules.pro | 21 ++ composeapp/src/main/AndroidManifest.xml | 43 +++ .../com/firebase/composeapp/MainActivity.kt | 103 +++++++ .../composeapp/ui/screens/MainScreen.kt | 151 +++++++++ .../com/firebase/composeapp/ui/theme/Color.kt | 11 + .../com/firebase/composeapp/ui/theme/Theme.kt | 58 ++++ .../com/firebase/composeapp/ui/theme/Type.kt | 34 +++ .../drawable-v24/ic_launcher_foreground.xml | 30 ++ .../res/drawable/ic_launcher_background.xml | 170 +++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes composeapp/src/main/res/values/colors.xml | 10 + composeapp/src/main/res/values/strings.xml | 3 + composeapp/src/main/res/values/themes.xml | 5 + settings.gradle | 12 +- 54 files changed, 2304 insertions(+), 163 deletions(-) create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/GeneralFieldValidator.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/ui/components/TermsAndPrivacyForm.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/EmailAuthScreen.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/EmailSignInLinkHandlerActivity.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/ResetPasswordUI.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/SignInUI.kt create mode 100644 auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/SignUpUI.kt create mode 100644 composeapp/.gitignore create mode 100644 composeapp/build.gradle.kts create mode 100644 composeapp/proguard-rules.pro create mode 100644 composeapp/src/main/AndroidManifest.xml create mode 100644 composeapp/src/main/java/com/firebase/composeapp/MainActivity.kt create mode 100644 composeapp/src/main/java/com/firebase/composeapp/ui/screens/MainScreen.kt create mode 100644 composeapp/src/main/java/com/firebase/composeapp/ui/theme/Color.kt create mode 100644 composeapp/src/main/java/com/firebase/composeapp/ui/theme/Theme.kt create mode 100644 composeapp/src/main/java/com/firebase/composeapp/ui/theme/Type.kt create mode 100644 composeapp/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 composeapp/src/main/res/drawable/ic_launcher_background.xml create mode 100644 composeapp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 composeapp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 composeapp/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 composeapp/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 composeapp/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 composeapp/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 composeapp/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 composeapp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 composeapp/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 composeapp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 composeapp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 composeapp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 composeapp/src/main/res/values/colors.xml create mode 100644 composeapp/src/main/res/values/strings.xml create mode 100644 composeapp/src/main/res/values/themes.xml diff --git a/auth/src/main/AndroidManifest.xml b/auth/src/main/AndroidManifest.xml index bb1a19204..a883affca 100644 --- a/auth/src/main/AndroidManifest.xml +++ b/auth/src/main/AndroidManifest.xml @@ -83,8 +83,8 @@ @@ -119,6 +119,16 @@ + + + + + + = callbackFlow { - // Set initial state based on current auth state - val initialState = auth.currentUser?.let { user -> - AuthState.Success(result = null, user = user, isNewUser = false) - } ?: AuthState.Idle + fun authStateFlow(): Flow { + // Create a flow from FirebaseAuth state listener + val firebaseAuthFlow = callbackFlow { + // Set initial state based on current auth state + val initialState = auth.currentUser?.let { user -> + AuthState.Success(result = null, user = user, isNewUser = false) + } ?: AuthState.Idle - trySend(initialState) + trySend(initialState) - // Create auth state listener - val authStateListener = AuthStateListener { firebaseAuth -> - val currentUser = firebaseAuth.currentUser - val state = if (currentUser != null) { - // Check if email verification is required - if (!currentUser.isEmailVerified && - currentUser.email != null && - currentUser.providerData.any { it.providerId == "password" } - ) { - AuthState.RequiresEmailVerification( - user = currentUser, - email = currentUser.email!! - ) + // Create auth state listener + val authStateListener = AuthStateListener { firebaseAuth -> + val currentUser = firebaseAuth.currentUser + val state = if (currentUser != null) { + // Check if email verification is required + if (!currentUser.isEmailVerified && + currentUser.email != null && + currentUser.providerData.any { it.providerId == "password" } + ) { + AuthState.RequiresEmailVerification( + user = currentUser, + email = currentUser.email!! + ) + } else { + AuthState.Success( + result = null, + user = currentUser, + isNewUser = false + ) + } } else { - AuthState.Success( - result = null, - user = currentUser, - isNewUser = false - ) + AuthState.Idle } - } else { - AuthState.Idle + trySend(state) } - trySend(state) - } - // Add listener - auth.addAuthStateListener(authStateListener) + // Add listener + auth.addAuthStateListener(authStateListener) - // Also observe internal state changes - _authStateFlow.value.let { currentState -> - if (currentState !is AuthState.Idle && currentState !is AuthState.Success) { - trySend(currentState) + // Remove listener when flow collection is cancelled + awaitClose { + auth.removeAuthStateListener(authStateListener) } } - // Remove listener when flow collection is cancelled - awaitClose { - auth.removeAuthStateListener(authStateListener) + // Also observe internal state changes + return combine( + firebaseAuthFlow, + _authStateFlow + ) { firebaseState, internalState -> + // Prefer non-idle internal states (like PasswordResetLinkSent, Error, etc.) + if (internalState !is AuthState.Idle) internalState else firebaseState } } diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt index 1267aea84..5bbda6cb9 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/AuthUIConfiguration.kt @@ -44,7 +44,7 @@ class AuthUIConfigurationBuilder { var tosUrl: String? = null var privacyPolicyUrl: String? = null var logo: ImageVector? = null - var actionCodeSettings: ActionCodeSettings? = null + var passwordResetActionCodeSettings: ActionCodeSettings? = null var isNewEmailAccountsAllowed: Boolean = true var isDisplayNameRequired: Boolean = true var isProviderChoiceAlwaysShown: Boolean = false @@ -85,17 +85,7 @@ class AuthUIConfigurationBuilder { // Provider specific validations providers.forEach { provider -> when (provider) { - is AuthProvider.Email -> { - provider.validate() - - if (isAnonymousUpgradeEnabled && provider.isEmailLinkSignInEnabled) { - check(provider.isEmailLinkForceSameDeviceEnabled) { - "You must force the same device flow when using email link sign in " + - "with anonymous user upgrade" - } - } - } - + is AuthProvider.Email -> provider.validate(isAnonymousUpgradeEnabled) is AuthProvider.Phone -> provider.validate() is AuthProvider.Google -> provider.validate(context) is AuthProvider.Facebook -> provider.validate(context) @@ -116,7 +106,7 @@ class AuthUIConfigurationBuilder { tosUrl = tosUrl, privacyPolicyUrl = privacyPolicyUrl, logo = logo, - actionCodeSettings = actionCodeSettings, + passwordResetActionCodeSettings = passwordResetActionCodeSettings, isNewEmailAccountsAllowed = isNewEmailAccountsAllowed, isDisplayNameRequired = isDisplayNameRequired, isProviderChoiceAlwaysShown = isProviderChoiceAlwaysShown @@ -184,9 +174,9 @@ class AuthUIConfiguration( val logo: ImageVector? = null, /** - * Configuration for email link sign-in. + * Configuration for sending email reset link. */ - val actionCodeSettings: ActionCodeSettings? = null, + val passwordResetActionCodeSettings: ActionCodeSettings? = null, /** * Allows new email accounts to be created. Defaults to true. diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProvider.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProvider.kt index 1c9b88048..bb5f2b9b3 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProvider.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProvider.kt @@ -174,7 +174,7 @@ abstract class AuthProvider(open val providerId: String) { /** * Settings for email link actions. */ - val actionCodeSettings: ActionCodeSettings?, + val emailLinkActionCodeSettings: ActionCodeSettings?, /** * Allows new accounts to be created. Defaults to true. @@ -202,9 +202,11 @@ abstract class AuthProvider(open val providerId: String) { val KEY_IDP_SECRET = stringPreferencesKey("com.firebase.ui.auth.data.client.idpSecret") } - internal fun validate() { + internal fun validate( + isAnonymousUpgradeEnabled: Boolean = false + ) { if (isEmailLinkSignInEnabled) { - val actionCodeSettings = requireNotNull(actionCodeSettings) { + val actionCodeSettings = requireNotNull(emailLinkActionCodeSettings) { "ActionCodeSettings cannot be null when using " + "email link sign in." } @@ -213,6 +215,13 @@ abstract class AuthProvider(open val providerId: String) { "You must set canHandleCodeInApp in your " + "ActionCodeSettings to true for Email-Link Sign-in." } + + if (isAnonymousUpgradeEnabled) { + check(isEmailLinkForceSameDeviceEnabled) { + "You must force the same device flow when using email link sign in " + + "with anonymous user upgrade" + } + } } } @@ -221,11 +230,11 @@ abstract class AuthProvider(open val providerId: String) { sessionId: String, anonymousUserId: String, ): ActionCodeSettings { - requireNotNull(actionCodeSettings) { + requireNotNull(emailLinkActionCodeSettings) { "ActionCodeSettings is required for email link sign in" } - val continueUrl = continueUrl(actionCodeSettings.url) { + val continueUrl = continueUrl(emailLinkActionCodeSettings.url) { appendSessionId(sessionId) appendAnonymousUserId(anonymousUserId) appendForceSameDeviceBit(isEmailLinkForceSameDeviceEnabled) @@ -234,12 +243,12 @@ abstract class AuthProvider(open val providerId: String) { return actionCodeSettings { url = continueUrl - handleCodeInApp = actionCodeSettings.canHandleCodeInApp() - iosBundleId = actionCodeSettings.iosBundle + handleCodeInApp = emailLinkActionCodeSettings.canHandleCodeInApp() + iosBundleId = emailLinkActionCodeSettings.iosBundle setAndroidPackageName( - actionCodeSettings.androidPackageName ?: "", - actionCodeSettings.androidInstallApp, - actionCodeSettings.androidMinimumVersion + emailLinkActionCodeSettings.androidPackageName ?: "", + emailLinkActionCodeSettings.androidInstallApp, + emailLinkActionCodeSettings.androidMinimumVersion ) } } diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProvider+FirebaseAuthUI.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProvider+FirebaseAuthUI.kt index d917e80d6..a65fcac8a 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProvider+FirebaseAuthUI.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProvider+FirebaseAuthUI.kt @@ -1,3 +1,17 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.firebase.ui.auth.compose.configuration.auth_provider import android.content.Context @@ -661,7 +675,7 @@ internal suspend fun FirebaseAuthUI.sendSignInLinkToEmail( // Save Email to dataStore for use in signInWithEmailLink EmailLinkPersistenceManager.saveEmail(context, email, sessionId, anonymousUserId) - updateAuthState(AuthState.Idle) + updateAuthState(AuthState.EmailSignInLinkSent()) } catch (e: CancellationException) { val cancelledException = AuthException.AuthCancelledException( message = "Send sign in link to email was cancelled", @@ -713,7 +727,8 @@ internal suspend fun FirebaseAuthUI.sendSignInLinkToEmail( * * @see sendSignInLinkToEmail for sending the initial email link */ -internal suspend fun FirebaseAuthUI.signInWithEmailLink( +// TODO(demolaf: make this internal when done testing email link sign in with composeapp +suspend fun FirebaseAuthUI.signInWithEmailLink( context: Context, config: AuthUIConfiguration, provider: AuthProvider.Email, @@ -778,7 +793,10 @@ internal suspend fun FirebaseAuthUI.signInWithEmailLink( // Validate anonymous user ID matches (same-device flow) if (!anonymousUserIdFromLink.isNullOrEmpty()) { val currentUser = auth.currentUser - if (currentUser == null || !currentUser.isAnonymous || currentUser.uid != anonymousUserIdFromLink) { + if (currentUser == null + || !currentUser.isAnonymous + || currentUser.uid != anonymousUserIdFromLink + ) { throw AuthException.EmailLinkDifferentAnonymousUserException() } } @@ -790,7 +808,6 @@ internal suspend fun FirebaseAuthUI.signInWithEmailLink( val result = if (storedCredentialForLink == null) { // Normal Flow: Just sign in with email link signInAndLinkWithCredential(config, emailLinkCredential) - ?: throw AuthException.UnknownException("Sign in failed") } else { // Linking Flow: Sign in with email link, then link the social credential if (canUpgradeAnonymous(config, auth)) { @@ -804,54 +821,39 @@ internal suspend fun FirebaseAuthUI.signInWithEmailLink( .getInstance(appExplicitlyForValidation) // Safe link: Validate that both credentials can be linked - val emailResult = authExplicitlyForValidation + val result = authExplicitlyForValidation .signInWithCredential(emailLinkCredential).await() - - val linkResult = emailResult.user - ?.linkWithCredential(storedCredentialForLink)?.await() - - // If safe link succeeds, emit merge conflict for UI to handle - if (linkResult?.user != null) { - updateAuthState( - AuthState.MergeConflict( - storedCredentialForLink + .user?.linkWithCredential(storedCredentialForLink)?.await() + .also { result -> + // If safe link succeeds, emit merge conflict for UI to handle + updateAuthState( + AuthState.MergeConflict( + storedCredentialForLink + ) ) - ) - } - - // Return the link result (will be non-null if successful) - linkResult + } + return result } else { // Non-upgrade: Sign in with email link, then link social credential - val emailLinkResult = auth.signInWithCredential(emailLinkCredential).await() - - // Link the social credential - val linkResult = emailLinkResult.user - ?.linkWithCredential(storedCredentialForLink)?.await() - - // Merge profile from the linked social credential - linkResult?.user?.let { user -> - mergeProfile(auth, user.displayName, user.photoUrl) - } - - // Update to success state - if (linkResult?.user != null) { - updateAuthState( - AuthState.Success( - result = linkResult, - user = linkResult.user!!, - isNewUser = linkResult.additionalUserInfo?.isNewUser ?: false - ) - ) - } - - linkResult + val result = auth.signInWithCredential(emailLinkCredential).await() + // Link the social credential + .user?.linkWithCredential(storedCredentialForLink)?.await() + .also { result -> + result?.user?.let { user -> + // Merge profile from the linked social credential + mergeProfile( + auth, + user.displayName, + user.photoUrl + ) + } + } + return result } } - // Clear DataStore after success EmailLinkPersistenceManager.clear(context) - + updateAuthState(AuthState.Idle) return result } catch (e: CancellationException) { val cancelledException = AuthException.AuthCancelledException( diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt index 4af62ffc8..122da349e 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/theme/AuthUITheme.kt @@ -14,11 +14,15 @@ package com.firebase.ui.auth.compose.configuration.theme +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ColorScheme +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Shapes +import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.Typography +import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color @@ -106,9 +110,14 @@ class AuthUITheme( * pre-configured provider styles. */ val Default = AuthUITheme( - colorScheme = lightColorScheme( - primary = Color(0xFFFFA611) - ), + colorScheme = lightColorScheme(), + typography = Typography(), + shapes = Shapes(), + providerStyles = ProviderStyleDefaults.default + ) + + val DefaultDark = AuthUITheme( + colorScheme = darkColorScheme(), typography = Typography(), shapes = Shapes(), providerStyles = ProviderStyleDefaults.default @@ -129,12 +138,21 @@ class AuthUITheme( providerStyles = providerStyles ) } + + @OptIn(ExperimentalMaterial3Api::class) + @get:Composable + val topAppBarColors + get() = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.primary, + titleContentColor = MaterialTheme.colorScheme.onPrimary + ) } } @Composable fun AuthUITheme( - theme: AuthUITheme = AuthUITheme.Default, + theme: AuthUITheme = if (isSystemInDarkTheme()) + AuthUITheme.DefaultDark else AuthUITheme.Default, content: @Composable () -> Unit ) { MaterialTheme( diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/GeneralFieldValidator.kt b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/GeneralFieldValidator.kt new file mode 100644 index 000000000..74a08fe68 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/configuration/validators/GeneralFieldValidator.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.configuration.validators + +import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringProvider + +internal class GeneralFieldValidator( + override val stringProvider: AuthUIStringProvider, + val isValid: ((String) -> Boolean)? = null, + val customMessage: String? = null, +) : FieldValidator { + private var _validationStatus = FieldValidationStatus(hasError = false, errorMessage = null) + + override val hasError: Boolean + get() = _validationStatus.hasError + + override val errorMessage: String + get() = _validationStatus.errorMessage ?: "" + + override fun validate(value: String): Boolean { + if (value.isEmpty()) { + _validationStatus = FieldValidationStatus( + hasError = true, + errorMessage = stringProvider.requiredField + ) + return false + } + + if (isValid != null && !isValid(value)) { + _validationStatus = FieldValidationStatus( + hasError = true, + errorMessage = customMessage + ) + return false + } + + _validationStatus = FieldValidationStatus(hasError = false, errorMessage = null) + return true + } +} \ No newline at end of file diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButton.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButton.kt index 8bed40873..fb6b9098f 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButton.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButton.kt @@ -1,3 +1,17 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.firebase.ui.auth.compose.ui.components import androidx.compose.foundation.Image @@ -164,7 +178,7 @@ private fun PreviewAuthProviderButton() { ) { AuthProviderButton( provider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ), onClick = {}, diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthTextField.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthTextField.kt index 66f2b475e..200dd0ece 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthTextField.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/AuthTextField.kt @@ -1,10 +1,26 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.firebase.ui.auth.compose.ui.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons @@ -75,6 +91,7 @@ fun AuthTextField( value: String, onValueChange: (String) -> Unit, label: @Composable (() -> Unit)? = null, + isSecureTextField: Boolean = false, enabled: Boolean = true, isError: Boolean? = null, errorMessage: String? = null, @@ -85,11 +102,11 @@ fun AuthTextField( leadingIcon: @Composable (() -> Unit)? = null, trailingIcon: @Composable (() -> Unit)? = null, ) { - val isSecureTextField = validator is PasswordValidator var passwordVisible by remember { mutableStateOf(false) } TextField( - modifier = modifier, + modifier = modifier + .fillMaxWidth(), value = value, onValueChange = { newValue -> onValueChange(newValue) @@ -150,7 +167,8 @@ internal fun PreviewAuthTextField() { Column( modifier = Modifier - .fillMaxSize(), + .fillMaxSize() + .padding(horizontal = 16.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, ) { @@ -184,6 +202,7 @@ internal fun PreviewAuthTextField() { AuthTextField( value = passwordTextValue.value, validator = passwordValidator, + isSecureTextField = true, label = { Text("Password") }, diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialog.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialog.kt index 6698adc67..42f7339a9 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialog.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/ErrorRecoveryDialog.kt @@ -65,7 +65,7 @@ import com.firebase.ui.auth.compose.configuration.string_provider.AuthUIStringPr fun ErrorRecoveryDialog( error: AuthException, stringProvider: AuthUIStringProvider, - onRetry: () -> Unit, + onRetry: (AuthException) -> Unit, onDismiss: () -> Unit, modifier: Modifier = Modifier, onRecover: ((AuthException) -> Unit)? = null, @@ -90,7 +90,7 @@ fun ErrorRecoveryDialog( if (isRecoverable(error)) { TextButton( onClick = { - onRecover?.invoke(error) ?: onRetry() + onRecover?.invoke(error) ?: onRetry(error) } ) { Text( diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/TermsAndPrivacyForm.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/TermsAndPrivacyForm.kt new file mode 100644 index 000000000..82694d3dc --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/components/TermsAndPrivacyForm.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.ui.components + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.width +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.unit.dp + +@Composable +fun TermsAndPrivacyForm( + modifier: Modifier = Modifier, + tosUrl: String?, + ppUrl: String? +) { + val uriHandler = LocalUriHandler.current + Row( + modifier = modifier, + ) { + TextButton( + onClick = { + tosUrl?.let { + uriHandler.openUri(it) + } + }, + contentPadding = PaddingValues.Zero, + ) { + Text( + text = "Terms of Service", + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Center, + textDecoration = TextDecoration.Underline + ) + } + Spacer(modifier = Modifier.width(24.dp)) + TextButton( + onClick = { + ppUrl?.let { + uriHandler.openUri(it) + } + }, + contentPadding = PaddingValues.Zero, + ) { + Text( + text = "Privacy Policy", + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Center, + textDecoration = TextDecoration.Underline + ) + } + } +} \ No newline at end of file diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AnnotatedStringResource.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AnnotatedStringResource.kt index 4c98be9ac..0c16fb31d 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AnnotatedStringResource.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AnnotatedStringResource.kt @@ -1,3 +1,17 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.firebase.ui.auth.compose.ui.method_picker import android.content.Context diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt index 58466f37e..6082e9f1b 100644 --- a/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPicker.kt @@ -1,3 +1,17 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.firebase.ui.auth.compose.ui.method_picker import androidx.compose.foundation.Image @@ -131,7 +145,7 @@ fun PreviewAuthMethodPicker() { AuthMethodPicker( providers = listOf( AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ), AuthProvider.Phone( diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/EmailAuthScreen.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/EmailAuthScreen.kt new file mode 100644 index 000000000..4fbebd2bf --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/EmailAuthScreen.kt @@ -0,0 +1,288 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.ui.screens + +import android.content.Context +import android.util.Log +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import com.firebase.ui.auth.compose.AuthException +import com.firebase.ui.auth.compose.AuthState +import com.firebase.ui.auth.compose.FirebaseAuthUI +import com.firebase.ui.auth.compose.configuration.AuthUIConfiguration +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider +import com.firebase.ui.auth.compose.configuration.auth_provider.createOrLinkUserWithEmailAndPassword +import com.firebase.ui.auth.compose.configuration.auth_provider.sendPasswordResetEmail +import com.firebase.ui.auth.compose.configuration.auth_provider.sendSignInLinkToEmail +import com.firebase.ui.auth.compose.configuration.auth_provider.signInWithEmailAndPassword +import com.firebase.ui.auth.compose.configuration.auth_provider.signInWithEmailLink +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.ui.components.ErrorRecoveryDialog +import com.firebase.ui.auth.compose.util.EmailLinkPersistenceManager +import com.google.firebase.auth.AuthResult +import kotlinx.coroutines.launch + +enum class EmailAuthMode { + SignIn, + SignUp, + ResetPassword, +} + +/** + * A class passed to the content slot, containing all the necessary information to render custom + * UIs for sign-in, sign-up, and password reset flows. + * + * @param mode An enum representing the current UI mode. Use a when expression on this to render + * the correct screen. + * @param isLoading true when an asynchronous operation (like signing in or sending an email) + * is in progress. + * @param error An optional error message to display to the user. + * @param email The current value of the email input field. + * @param onEmailChange (Modes: [EmailAuthMode.SignIn], [EmailAuthMode.SignUp], + * [EmailAuthMode.ResetPassword]) A callback to be invoked when the email input changes. + * @param password An optional custom layout composable for the provider buttons. + * @param onPasswordChange (Modes: [EmailAuthMode.SignIn], [EmailAuthMode.SignUp]) The current + * value of the password input field. + * @param confirmPassword (Mode: [EmailAuthMode.SignUp]) A callback to be invoked when the password + * input changes. + * @param onConfirmPasswordChange (Mode: [EmailAuthMode.SignUp]) A callback to be invoked when + * the password confirmation input changes. + * @param displayName (Mode: [EmailAuthMode.SignUp]) The current value of the display name field. + * @param onDisplayNameChange (Mode: [EmailAuthMode.SignUp]) A callback to be invoked when the + * display name input changes. + * @param onSignInClick (Mode: [EmailAuthMode.SignIn]) A callback to be invoked to attempt a + * sign-in with the provided credentials. + * @param onSignUpClick (Mode: [EmailAuthMode.SignUp]) A callback to be invoked to attempt to + * create a new account. + * @param onSendResetLinkClick (Mode: [EmailAuthMode.ResetPassword]) A callback to be invoked to + * send a password reset email. + * @param resetLinkSent (Mode: [EmailAuthMode.ResetPassword]) true after the password reset link + * has been successfully sent. + * @param emailSignInLinkSent (Mode: [EmailAuthMode.SignIn]) true after the email sign in link has + * been successfully sent. + * @param onGoToSignUp A callback to switch the UI to the SignUp mode. + * @param onGoToSignIn A callback to switch the UI to the SignIn mode. + * @param onGoToResetPassword A callback to switch the UI to the ResetPassword mode. + */ +class EmailAuthContentState( + val mode: EmailAuthMode, + val isLoading: Boolean = false, + val error: String? = null, + val email: String, + val onEmailChange: (String) -> Unit, + val password: String, + val onPasswordChange: (String) -> Unit, + val confirmPassword: String, + val onConfirmPasswordChange: (String) -> Unit, + val displayName: String, + val onDisplayNameChange: (String) -> Unit, + val onSignInClick: () -> Unit, + val onSignUpClick: () -> Unit, + val onSendResetLinkClick: () -> Unit, + val resetLinkSent: Boolean = false, + val emailSignInLinkSent: Boolean = false, + val onGoToSignUp: () -> Unit, + val onGoToSignIn: () -> Unit, + val onGoToResetPassword: () -> Unit, +) + +/** + * A stateful composable that manages the logic for all email-based authentication flows, + * including sign-in, sign-up, and password reset. It exposes the state for the current mode to + * a custom UI via a trailing lambda (slot), allowing for complete visual customization. + * + * @param configuration + * @param onSuccess + * @param onError + * @param onCancel + * @param content + */ +@Composable +fun EmailAuthScreen( + context: Context, + configuration: AuthUIConfiguration, + authUI: FirebaseAuthUI, + onSuccess: (AuthResult) -> Unit, + onError: (AuthException) -> Unit, + onCancel: () -> Unit, + content: @Composable ((EmailAuthContentState) -> Unit)? = null, +) { + val provider = configuration.providers.filterIsInstance().first() + val stringProvider = DefaultAuthUIStringProvider(context) + val coroutineScope = rememberCoroutineScope() + + val mode = rememberSaveable { mutableStateOf(EmailAuthMode.SignIn) } + val displayNameValue = rememberSaveable { mutableStateOf("") } + val emailTextValue = rememberSaveable { mutableStateOf("") } + val passwordTextValue = rememberSaveable { mutableStateOf("") } + val confirmPasswordTextValue = rememberSaveable { mutableStateOf("") } + + // Used for clearing text fields when switching EmailAuthMode changes + val textValues = listOf( + displayNameValue, + emailTextValue, + passwordTextValue, + confirmPasswordTextValue + ) + + val authState by authUI.authStateFlow().collectAsState(AuthState.Idle) + val isLoading = authState is AuthState.Loading + val errorMessage = + if (authState is AuthState.Error) (authState as AuthState.Error).exception.message else null + val resetLinkSent = authState is AuthState.PasswordResetLinkSent + val emailSignInLinkSent = authState is AuthState.EmailSignInLinkSent + + val isErrorDialogVisible = + remember(authState) { mutableStateOf(authState is AuthState.Error) } + + LaunchedEffect(authState) { + Log.d("EmailAuthScreen", "Current state: $authState") + when (val state = authState) { + is AuthState.Success -> { + state.result?.let { result -> + onSuccess(result) + } + } + + is AuthState.Error -> { + onError(AuthException.from(state.exception)) + } + + is AuthState.Cancelled -> { + onCancel() + } + + else -> Unit + } + } + + val state = EmailAuthContentState( + mode = mode.value, + displayName = displayNameValue.value, + email = emailTextValue.value, + password = passwordTextValue.value, + confirmPassword = confirmPasswordTextValue.value, + isLoading = isLoading, + error = errorMessage, + resetLinkSent = resetLinkSent, + emailSignInLinkSent = emailSignInLinkSent, + onEmailChange = { email -> + emailTextValue.value = email + }, + onPasswordChange = { password -> + passwordTextValue.value = password + }, + onConfirmPasswordChange = { confirmPassword -> + confirmPasswordTextValue.value = confirmPassword + }, + onDisplayNameChange = { displayName -> + displayNameValue.value = displayName + }, + onSignInClick = { + coroutineScope.launch { + try { + if (provider.isEmailLinkSignInEnabled) { + authUI.sendSignInLinkToEmail( + context = context, + config = configuration, + provider = provider, + email = emailTextValue.value, + credentialForLinking = null, + ) + } else { + authUI.signInWithEmailAndPassword( + context = context, + config = configuration, + email = emailTextValue.value, + password = passwordTextValue.value, + credentialForLinking = null, + ) + } + } catch (e: Exception) { + + } + } + }, + onSignUpClick = { + coroutineScope.launch { + try { + authUI.createOrLinkUserWithEmailAndPassword( + context = context, + config = configuration, + provider = provider, + name = displayNameValue.value, + email = emailTextValue.value, + password = passwordTextValue.value, + ) + } catch (e: Exception) { + + } + } + }, + onSendResetLinkClick = { + coroutineScope.launch { + try { + authUI.sendPasswordResetEmail( + email = emailTextValue.value, + actionCodeSettings = configuration.passwordResetActionCodeSettings, + ) + } catch (e: Exception) { + + } + } + }, + onGoToSignUp = { + textValues.forEach { it.value = "" } + mode.value = EmailAuthMode.SignUp + }, + onGoToSignIn = { + textValues.forEach { it.value = "" } + mode.value = EmailAuthMode.SignIn + }, + onGoToResetPassword = { + textValues.forEach { it.value = "" } + mode.value = EmailAuthMode.ResetPassword + } + ) + + if (isErrorDialogVisible.value) { + ErrorRecoveryDialog( + error = when ((authState as AuthState.Error).exception) { + is AuthException -> (authState as AuthState.Error).exception as AuthException + else -> AuthException + .from((authState as AuthState.Error).exception) + }, + stringProvider = stringProvider, + onRetry = { exception -> + when (exception) { + is AuthException.InvalidCredentialsException -> state.onSignInClick() + is AuthException.EmailAlreadyInUseException -> state.onGoToSignIn() + } + isErrorDialogVisible.value = false + }, + onDismiss = { + isErrorDialogVisible.value = false + }, + ) + } + + content?.invoke(state) +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/EmailSignInLinkHandlerActivity.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/EmailSignInLinkHandlerActivity.kt new file mode 100644 index 000000000..e6e8ca7dd --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/EmailSignInLinkHandlerActivity.kt @@ -0,0 +1,109 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.ui.screens + +import android.content.Intent +import android.os.Bundle +import androidx.activity.ComponentActivity +import com.firebase.ui.auth.compose.FirebaseAuthUI + +/** + * Activity that handles email link deep links for passwordless authentication. + * + * ## Setup (Required) + * + * Add this activity to your app's `AndroidManifest.xml`: + * ```xml + * + * + * + * + * + * + * + * + * ``` + * + * Configure matching ActionCodeSettings: + * ```kotlin + * val provider = AuthProvider.Email( + * emailLinkActionCodeSettings = actionCodeSettings { + * url = "https://yourapp.com" // Must match android:host above + * handleCodeInApp = true + * setAndroidPackageName("com.yourapp.package", true, null) + * }, + * isEmailLinkSignInEnabled = true + * ) + * ``` + * + * By default, users see a dialog "Open with Browser or App?" on first click. + * For auto-opening without dialog, set up App Links verification: + * https://developer.android.com/training/app-links/verify-android-applinks + * + * @see FirebaseAuthUI.sendSignInLinkToEmail + */ +class EmailSignInLinkHandlerActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + // Extract email link from deep link intent + val emailLink = intent.data?.toString() + + if (emailLink.isNullOrEmpty()) { + // No valid email link, just finish + finish() + return + } + + // Redirect to app's launch activity with the email link + // The app should check for this extra in onCreate and handle email link sign-in + val launchIntent = packageManager.getLaunchIntentForPackage(packageName) + + if (launchIntent != null) { + launchIntent.apply { + // Clear the back stack and start fresh + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + // Pass the email link to the launch activity + putExtra(EXTRA_EMAIL_LINK, emailLink) + } + startActivity(launchIntent) + } + + finish() + } + + companion object { + /** + * Intent extra key for the email link. + * + * Check for this extra in your MainActivity's onCreate to detect email link sign-in: + * ```kotlin + * val emailLink = intent.getStringExtra(EmailSignInLinkHandlerActivity.EXTRA_EMAIL_LINK) + * if (emailLink != null) { + * // Handle email link sign-in + * firebaseAuthUI.signInWithEmailLink(...) + * } + * ``` + */ + const val EXTRA_EMAIL_LINK = "com.firebase.ui.auth.EXTRA_EMAIL_LINK" + } +} \ No newline at end of file diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/ResetPasswordUI.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/ResetPasswordUI.kt new file mode 100644 index 000000000..79177c085 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/ResetPasswordUI.kt @@ -0,0 +1,216 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.ui.screens + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Email +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.firebase.ui.auth.compose.configuration.AuthUIConfiguration +import com.firebase.ui.auth.compose.configuration.authUIConfiguration +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme +import com.firebase.ui.auth.compose.configuration.validators.EmailValidator +import com.firebase.ui.auth.compose.ui.components.AuthTextField +import com.firebase.ui.auth.compose.ui.components.TermsAndPrivacyForm + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ResetPasswordUI( + modifier: Modifier = Modifier, + configuration: AuthUIConfiguration, + isLoading: Boolean, + email: String, + resetLinkSent: Boolean, + onEmailChange: (String) -> Unit, + onSendResetLink: () -> Unit, + onGoToSignIn: () -> Unit, +) { + + val context = LocalContext.current + val stringProvider = DefaultAuthUIStringProvider(context) + val emailValidator = remember { + EmailValidator(stringProvider) + } + + val isFormValid = remember(email) { + derivedStateOf { emailValidator.validate(email) } + } + + val isDialogVisible = remember(resetLinkSent) { mutableStateOf(resetLinkSent) } + + if (isDialogVisible.value) { + AlertDialog( + title = { + Text( + text = "Reset Link Sent", + style = MaterialTheme.typography.headlineSmall + ) + }, + text = { + Text( + text = "Check your email $email", + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Start + ) + }, + confirmButton = { + TextButton( + onClick = { + isDialogVisible.value = false + } + ) { + Text("Dismiss") + } + }, + onDismissRequest = { + isDialogVisible.value = false + }, + ) + } + + Scaffold( + modifier = modifier, + topBar = { + TopAppBar( + title = { + Text("Recover Password") + }, + colors = AuthUITheme.topAppBarColors + ) + }, + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .safeDrawingPadding() + .padding(horizontal = 16.dp), + ) { + AuthTextField( + value = email, + validator = emailValidator, + enabled = !isLoading, + label = { + Text(stringProvider.emailHint) + }, + onValueChange = { text -> + onEmailChange(text) + }, + leadingIcon = { + Icon( + imageVector = Icons.Default.Email, + contentDescription = "" + ) + } + ) + Spacer(modifier = Modifier.height(8.dp)) + Row( + modifier = Modifier + .align(Alignment.End), + ) { + Button( + onClick = { + onGoToSignIn() + }, + enabled = !isLoading, + ) { + Text("Sign In") + } + Spacer(modifier = Modifier.width(16.dp)) + Button( + onClick = { + onSendResetLink() + }, + enabled = !isLoading && isFormValid.value, + ) { + if (isLoading) { + CircularProgressIndicator( + modifier = Modifier + .size(16.dp) + ) + } else { + Text("Send") + } + } + } + Spacer(modifier = Modifier.height(16.dp)) + TermsAndPrivacyForm( + modifier = Modifier.align(Alignment.End), + tosUrl = configuration.tosUrl, + ppUrl = configuration.privacyPolicyUrl, + ) + } + } +} + +@Preview +@Composable +fun PreviewResetPasswordUI() { + val applicationContext = LocalContext.current + val provider = AuthProvider.Email( + isDisplayNameRequired = true, + isEmailLinkSignInEnabled = false, + isEmailLinkForceSameDeviceEnabled = true, + emailLinkActionCodeSettings = null, + isNewAccountsAllowed = true, + minimumPasswordLength = 8, + passwordValidationRules = listOf() + ) + + AuthUITheme { + ResetPasswordUI( + configuration = authUIConfiguration { + context = applicationContext + providers { provider(provider) } + tosUrl = "" + privacyPolicyUrl = "" + }, + email = "", + isLoading = false, + resetLinkSent = true, + onEmailChange = { email -> }, + onSendResetLink = {}, + onGoToSignIn = {}, + ) + } +} \ No newline at end of file diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/SignInUI.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/SignInUI.kt new file mode 100644 index 000000000..edc7ffa9e --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/SignInUI.kt @@ -0,0 +1,278 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.ui.screens + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Email +import androidx.compose.material.icons.filled.Lock +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.firebase.ui.auth.compose.configuration.AuthUIConfiguration +import com.firebase.ui.auth.compose.configuration.authUIConfiguration +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme +import com.firebase.ui.auth.compose.configuration.validators.EmailValidator +import com.firebase.ui.auth.compose.configuration.validators.PasswordValidator +import com.firebase.ui.auth.compose.ui.components.AuthTextField +import com.firebase.ui.auth.compose.ui.components.TermsAndPrivacyForm + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SignInUI( + modifier: Modifier = Modifier, + configuration: AuthUIConfiguration, + isLoading: Boolean, + emailSignInLinkSent: Boolean, + email: String, + password: String, + onEmailChange: (String) -> Unit, + onPasswordChange: (String) -> Unit, + onSignInClick: () -> Unit, + onGoToSignUp: () -> Unit, + onGoToResetPassword: () -> Unit, +) { + val context = LocalContext.current + val provider = configuration.providers.filterIsInstance().first() + val stringProvider = DefaultAuthUIStringProvider(context) + val emailValidator = remember { EmailValidator(stringProvider) } + val passwordValidator = remember { + PasswordValidator(stringProvider = stringProvider, rules = emptyList()) + } + + val isFormValid = remember(email, password) { + derivedStateOf { + listOf( + emailValidator.validate(email), + if (!provider.isEmailLinkSignInEnabled) + passwordValidator.validate(password) else true, + ).all { it } + } + } + + val isDialogVisible = + remember(emailSignInLinkSent) { mutableStateOf(emailSignInLinkSent) } + + if (isDialogVisible.value) { + AlertDialog( + title = { + Text( + text = "Email Sign In Link Sent", + style = MaterialTheme.typography.headlineSmall + ) + }, + text = { + Text( + text = "Check your email $email", + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Start + ) + }, + confirmButton = { + TextButton( + onClick = { + isDialogVisible.value = false + } + ) { + Text("Dismiss") + } + }, + onDismissRequest = { + isDialogVisible.value = false + }, + ) + } + + Scaffold( + modifier = modifier, + topBar = { + TopAppBar( + title = { + Text(stringProvider.signInDefault) + }, + colors = AuthUITheme.topAppBarColors + ) + }, + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .safeDrawingPadding() + .padding(horizontal = 16.dp), + ) { + AuthTextField( + value = email, + validator = emailValidator, + enabled = !isLoading, + label = { + Text(stringProvider.emailHint) + }, + onValueChange = { text -> + onEmailChange(text) + }, + leadingIcon = { + Icon( + imageVector = Icons.Default.Email, + contentDescription = "" + ) + } + ) + Spacer(modifier = Modifier.height(16.dp)) + if (!provider.isEmailLinkSignInEnabled) { + AuthTextField( + value = password, + validator = passwordValidator, + enabled = !isLoading, + isSecureTextField = true, + label = { + Text(stringProvider.passwordHint) + }, + onValueChange = { text -> + onPasswordChange(text) + }, + leadingIcon = { + Icon( + imageVector = Icons.Default.Lock, + contentDescription = "" + ) + } + ) + Spacer(modifier = Modifier.height(8.dp)) + } + TextButton( + modifier = Modifier + .align(Alignment.Start), + onClick = { + onGoToResetPassword() + }, + enabled = !isLoading, + contentPadding = PaddingValues.Zero + ) { + Text( + modifier = modifier, + text = stringProvider.troubleSigningIn, + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Center, + textDecoration = TextDecoration.Underline + ) + } + Spacer(modifier = Modifier.height(8.dp)) + Row( + modifier = Modifier + .align(Alignment.End), + ) { + // Signup is hidden for email link sign in + if (!provider.isEmailLinkSignInEnabled) { + Button( + onClick = { + onGoToSignUp() + }, + enabled = !isLoading, + ) { + Text(stringProvider.titleRegisterEmail) + } + Spacer(modifier = Modifier.width(16.dp)) + } + Button( + onClick = { + // TODO(demolaf): When signIn is fired if Exception is UserNotFound + // then we check if provider.isNewAccountsAllowed then we show signUp + // else we show an error dialog stating signup is not allowed + onSignInClick() + }, + enabled = !isLoading && isFormValid.value, + ) { + if (isLoading) { + CircularProgressIndicator( + modifier = Modifier + .size(16.dp) + ) + } else { + Text(stringProvider.signInDefault) + } + } + } + Spacer(modifier = Modifier.height(16.dp)) + TermsAndPrivacyForm( + modifier = Modifier.align(Alignment.End), + tosUrl = configuration.tosUrl, + ppUrl = configuration.privacyPolicyUrl, + ) + } + } +} + +@Preview +@Composable +fun PreviewSignInUI() { + val applicationContext = LocalContext.current + val provider = AuthProvider.Email( + isDisplayNameRequired = true, + isEmailLinkSignInEnabled = false, + isEmailLinkForceSameDeviceEnabled = true, + emailLinkActionCodeSettings = null, + isNewAccountsAllowed = true, + minimumPasswordLength = 8, + passwordValidationRules = listOf() + ) + + AuthUITheme { + SignInUI( + configuration = authUIConfiguration { + context = applicationContext + providers { provider(provider) } + tosUrl = "" + privacyPolicyUrl = "" + }, + email = "", + password = "", + isLoading = false, + emailSignInLinkSent = false, + onEmailChange = { email -> }, + onPasswordChange = { password -> }, + onSignInClick = {}, + onGoToSignUp = {}, + onGoToResetPassword = {}, + ) + } +} diff --git a/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/SignUpUI.kt b/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/SignUpUI.kt new file mode 100644 index 000000000..9d138e8a8 --- /dev/null +++ b/auth/src/main/java/com/firebase/ui/auth/compose/ui/screens/SignUpUI.kt @@ -0,0 +1,273 @@ +/* + * Copyright 2025 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.firebase.ui.auth.compose.ui.screens + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.AccountCircle +import androidx.compose.material.icons.filled.Email +import androidx.compose.material.icons.filled.Lock +import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.firebase.ui.auth.compose.configuration.AuthUIConfiguration +import com.firebase.ui.auth.compose.configuration.authUIConfiguration +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider +import com.firebase.ui.auth.compose.configuration.string_provider.DefaultAuthUIStringProvider +import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme +import com.firebase.ui.auth.compose.configuration.validators.GeneralFieldValidator +import com.firebase.ui.auth.compose.configuration.validators.EmailValidator +import com.firebase.ui.auth.compose.configuration.validators.PasswordValidator +import com.firebase.ui.auth.compose.ui.components.AuthTextField +import com.firebase.ui.auth.compose.ui.components.TermsAndPrivacyForm + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SignUpUI( + modifier: Modifier = Modifier, + configuration: AuthUIConfiguration, + isLoading: Boolean, + displayName: String, + email: String, + password: String, + confirmPassword: String, + onDisplayNameChange: (String) -> Unit, + onEmailChange: (String) -> Unit, + onPasswordChange: (String) -> Unit, + onConfirmPasswordChange: (String) -> Unit, + onGoToSignIn: () -> Unit, + onSignUpClick: () -> Unit, +) { + val provider = configuration.providers.filterIsInstance().first() + val context = LocalContext.current + val stringProvider = DefaultAuthUIStringProvider(context) + val displayNameValidator = remember { GeneralFieldValidator(stringProvider) } + val emailValidator = remember { EmailValidator(stringProvider) } + val passwordValidator = remember { + PasswordValidator( + stringProvider = stringProvider, + rules = provider.passwordValidationRules + ) + } + val confirmPasswordValidator = remember(password) { + GeneralFieldValidator( + stringProvider = stringProvider, + isValid = { value -> + value == password + }, + customMessage = stringProvider.passwordsDoNotMatch + ) + } + + val isFormValid = remember(displayName, email, password, confirmPassword) { + derivedStateOf { + listOf( + displayNameValidator.validate(displayName), + emailValidator.validate(email), + passwordValidator.validate(password), + confirmPasswordValidator.validate(confirmPassword) + ).all { it } + } + } + + Scaffold( + modifier = modifier, + topBar = { + TopAppBar( + title = { + Text("Sign up") + }, + colors = AuthUITheme.topAppBarColors + ) + }, + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .safeDrawingPadding() + .padding(horizontal = 16.dp), + ) { + AuthTextField( + value = email, + validator = emailValidator, + enabled = !isLoading, + label = { + Text("Email") + }, + onValueChange = { text -> + onEmailChange(text) + }, + leadingIcon = { + Icon( + imageVector = Icons.Default.Email, + contentDescription = "" + ) + } + ) + Spacer(modifier = Modifier.height(16.dp)) + if (provider.isDisplayNameRequired) { + AuthTextField( + value = displayName, + validator = displayNameValidator, + enabled = !isLoading, + label = { + Text("First & last Name") + }, + onValueChange = { text -> + onDisplayNameChange(text) + }, + leadingIcon = { + Icon( + imageVector = Icons.Default.AccountCircle, + contentDescription = "" + ) + } + ) + Spacer(modifier = Modifier.height(16.dp)) + } + AuthTextField( + value = password, + validator = passwordValidator, + enabled = !isLoading, + isSecureTextField = true, + label = { + Text("Password") + }, + onValueChange = { text -> + onPasswordChange(text) + }, + leadingIcon = { + Icon( + imageVector = Icons.Default.Lock, + contentDescription = "" + ) + } + ) + Spacer(modifier = Modifier.height(16.dp)) + AuthTextField( + value = confirmPassword, + validator = confirmPasswordValidator, + enabled = !isLoading, + isSecureTextField = true, + label = { + Text("Confirm Password") + }, + onValueChange = { text -> + onConfirmPasswordChange(text) + }, + leadingIcon = { + Icon( + imageVector = Icons.Default.Lock, + contentDescription = "" + ) + } + ) + Spacer(modifier = Modifier.height(8.dp)) + Row( + modifier = Modifier + .align(Alignment.End), + ) { + Button( + onClick = { + onGoToSignIn() + }, + enabled = !isLoading, + ) { + Text("Sign In") + } + Spacer(modifier = Modifier.width(16.dp)) + Button( + onClick = { + onSignUpClick() + }, + enabled = !isLoading && isFormValid.value, + ) { + if (isLoading) { + CircularProgressIndicator( + modifier = Modifier + .size(16.dp) + ) + } else { + Text("Sign Up") + } + } + } + Spacer(modifier = Modifier.height(16.dp)) + TermsAndPrivacyForm( + modifier = Modifier.align(Alignment.End), + tosUrl = configuration.tosUrl, + ppUrl = configuration.privacyPolicyUrl, + ) + } + } +} + +@Preview +@Composable +fun PreviewSignUpUI() { + val applicationContext = LocalContext.current + val provider = AuthProvider.Email( + isDisplayNameRequired = true, + isEmailLinkSignInEnabled = false, + isEmailLinkForceSameDeviceEnabled = true, + emailLinkActionCodeSettings = null, + isNewAccountsAllowed = true, + minimumPasswordLength = 8, + passwordValidationRules = listOf() + ) + + AuthUITheme { + SignUpUI( + configuration = authUIConfiguration { + context = applicationContext + providers { provider(provider) } + tosUrl = "" + privacyPolicyUrl = "" + }, + isLoading = false, + displayName = "", + email = "", + password = "", + confirmPassword = "", + onDisplayNameChange = { name -> }, + onEmailChange = { email -> }, + onPasswordChange = { password -> }, + onConfirmPasswordChange = { confirmPassword -> }, + onSignUpClick = {}, + onGoToSignIn = {} + ) + } +} \ No newline at end of file diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt index 98e72d6fd..3b21b368a 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/FirebaseAuthUIAuthStateTest.kt @@ -287,25 +287,31 @@ class FirebaseAuthUIAuthStateTest { // Given initial idle state `when`(mockFirebaseAuth.currentUser).thenReturn(null) - // When updating auth state internally - authUI.updateAuthState(AuthState.Loading("Signing in...")) - - // Then the flow should reflect the updated state + // Start collecting the flow to capture initial state val states = mutableListOf() val job = launch { - authUI.authStateFlow().take(2).toList(states) + authUI.authStateFlow().take(3).toList(states) } - // Update state again + // Wait for initial state to be collected delay(100) + + // When updating auth state internally + authUI.updateAuthState(AuthState.Loading("Signing in...")) + + // Wait for state update to propagate + delay(100) + + // Update state again authUI.updateAuthState(AuthState.Cancelled) job.join() - // The first state should be Idle (initial), second should be Loading - assertThat(states[0]).isEqualTo(AuthState.Idle) - // Note: The internal state update may not be immediately visible in the flow - // because the auth state listener overrides it + // Verify the emitted states + assertThat(states).hasSize(3) + assertThat(states[0]).isEqualTo(AuthState.Idle) // Initial state + assertThat(states[1]).isInstanceOf(AuthState.Loading::class.java) // After first update + assertThat(states[2]).isEqualTo(AuthState.Cancelled) // After second update } // ============================================================================================= diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt index 31045ba13..39316e2ff 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/AuthUIConfigurationTest.kt @@ -83,7 +83,7 @@ class AuthUIConfigurationTest { assertThat(config.tosUrl).isNull() assertThat(config.privacyPolicyUrl).isNull() assertThat(config.logo).isNull() - assertThat(config.actionCodeSettings).isNull() + assertThat(config.passwordResetActionCodeSettings).isNull() assertThat(config.isNewEmailAccountsAllowed).isTrue() assertThat(config.isDisplayNameRequired).isTrue() assertThat(config.isProviderChoiceAlwaysShown).isFalse() @@ -94,7 +94,7 @@ class AuthUIConfigurationTest { val customTheme = AuthUITheme.Default val customStringProvider = mock(AuthUIStringProvider::class.java) val customLocale = Locale.US - val customActionCodeSettings = actionCodeSettings { + val customPasswordResetActionCodeSettings = actionCodeSettings { url = "https://example.com/verify" handleCodeInApp = true } @@ -123,7 +123,7 @@ class AuthUIConfigurationTest { tosUrl = "https://example.com/tos" privacyPolicyUrl = "https://example.com/privacy" logo = Icons.Default.AccountCircle - actionCodeSettings = customActionCodeSettings + passwordResetActionCodeSettings = customPasswordResetActionCodeSettings isNewEmailAccountsAllowed = false isDisplayNameRequired = false isProviderChoiceAlwaysShown = true @@ -140,7 +140,8 @@ class AuthUIConfigurationTest { assertThat(config.tosUrl).isEqualTo("https://example.com/tos") assertThat(config.privacyPolicyUrl).isEqualTo("https://example.com/privacy") assertThat(config.logo).isEqualTo(Icons.Default.AccountCircle) - assertThat(config.actionCodeSettings).isEqualTo(customActionCodeSettings) + assertThat(config.passwordResetActionCodeSettings) + .isEqualTo(customPasswordResetActionCodeSettings) assertThat(config.isNewEmailAccountsAllowed).isFalse() assertThat(config.isDisplayNameRequired).isFalse() assertThat(config.isProviderChoiceAlwaysShown).isTrue() @@ -308,7 +309,7 @@ class AuthUIConfigurationTest { ) provider( AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = listOf() ) ) @@ -416,7 +417,7 @@ class AuthUIConfigurationTest { "tosUrl", "privacyPolicyUrl", "logo", - "actionCodeSettings", + "passwordResetActionCodeSettings", "isNewEmailAccountsAllowed", "isDisplayNameRequired", "isProviderChoiceAlwaysShown" diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProviderTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProviderTest.kt index 3e6ab28ca..a07a8abc0 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProviderTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/AuthProviderTest.kt @@ -34,7 +34,7 @@ class AuthProviderTest { @Test fun `email provider with valid configuration should succeed`() { val provider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = listOf() ) @@ -50,7 +50,7 @@ class AuthProviderTest { val provider = AuthProvider.Email( isEmailLinkSignInEnabled = true, - actionCodeSettings = actionCodeSettings, + emailLinkActionCodeSettings = actionCodeSettings, passwordValidationRules = listOf() ) @@ -61,7 +61,7 @@ class AuthProviderTest { fun `email provider with email link enabled but null action code settings should throw`() { val provider = AuthProvider.Email( isEmailLinkSignInEnabled = true, - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = listOf() ) @@ -85,7 +85,7 @@ class AuthProviderTest { val provider = AuthProvider.Email( isEmailLinkSignInEnabled = true, - actionCodeSettings = actionCodeSettings, + emailLinkActionCodeSettings = actionCodeSettings, passwordValidationRules = listOf() ) @@ -319,7 +319,7 @@ class AuthProviderTest { val providers = listOf( AuthProvider.Anonymous, AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = listOf() ) ) diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt index 79bbbcfef..00ebc75c4 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/configuration/auth_provider/EmailAuthProviderFirebaseAuthUITest.kt @@ -123,7 +123,7 @@ class EmailAuthProviderFirebaseAuthUITest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) val config = authUIConfiguration { @@ -165,7 +165,7 @@ class EmailAuthProviderFirebaseAuthUITest { ).thenReturn(taskCompletionSource.task) val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) val config = authUIConfiguration { @@ -196,7 +196,7 @@ class EmailAuthProviderFirebaseAuthUITest { fun `createOrLinkUserWithEmailAndPassword - rejects weak password`() = runTest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) val config = authUIConfiguration { @@ -231,7 +231,7 @@ class EmailAuthProviderFirebaseAuthUITest { fun `createOrLinkUserWithEmailAndPassword - validates custom password rules`() = runTest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = listOf(PasswordRule.RequireUppercase) ) val config = authUIConfiguration { @@ -259,7 +259,7 @@ class EmailAuthProviderFirebaseAuthUITest { fun `createOrLinkUserWithEmailAndPassword - respects isNewAccountsAllowed setting`() = runTest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList(), isNewAccountsAllowed = false ) @@ -303,7 +303,7 @@ class EmailAuthProviderFirebaseAuthUITest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) val config = authUIConfiguration { @@ -348,7 +348,7 @@ class EmailAuthProviderFirebaseAuthUITest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) val config = authUIConfiguration { @@ -383,7 +383,7 @@ class EmailAuthProviderFirebaseAuthUITest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) val config = authUIConfiguration { @@ -419,7 +419,7 @@ class EmailAuthProviderFirebaseAuthUITest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) val config = authUIConfiguration { @@ -463,7 +463,7 @@ class EmailAuthProviderFirebaseAuthUITest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) val config = authUIConfiguration { @@ -501,7 +501,7 @@ class EmailAuthProviderFirebaseAuthUITest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) val config = authUIConfiguration { @@ -537,7 +537,7 @@ class EmailAuthProviderFirebaseAuthUITest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) val config = authUIConfiguration { @@ -583,7 +583,7 @@ class EmailAuthProviderFirebaseAuthUITest { val instance = FirebaseAuthUI.create(firebaseApp, mockFirebaseAuth) val emailProvider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) val config = authUIConfiguration { diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButtonTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButtonTest.kt index 3baa351e0..c68f1e6e9 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButtonTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthProviderButtonTest.kt @@ -111,7 +111,7 @@ class AuthProviderButtonTest { @Test fun `AuthProviderButton displays Email provider correctly`() { val provider = AuthProvider.Email( - actionCodeSettings = null, + emailLinkActionCodeSettings = null, passwordValidationRules = emptyList() ) diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthTextFieldTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthTextFieldTest.kt index 21629a1a2..101317483 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthTextFieldTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/ui/components/AuthTextFieldTest.kt @@ -355,12 +355,13 @@ class AuthTextFieldTest { // ============================================================================================= @Test - fun `AuthTextField shows password visibility toggle for PasswordValidator`() { + fun `AuthTextField shows password visibility toggle when isSecureTextField`() { composeTestRule.setContent { AuthTextField( value = "password123", onValueChange = { }, label = { Text("Password") }, + isSecureTextField = true, validator = PasswordValidator( stringProvider = stringProvider, rules = emptyList() @@ -380,6 +381,7 @@ class AuthTextFieldTest { value = "password123", onValueChange = { }, label = { Text("Password") }, + isSecureTextField = true, validator = PasswordValidator( stringProvider = stringProvider, rules = emptyList() diff --git a/auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt b/auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt index 2b500a924..bdb1578ff 100644 --- a/auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt +++ b/auth/src/test/java/com/firebase/ui/auth/compose/ui/method_picker/AuthMethodPickerTest.kt @@ -56,7 +56,10 @@ class AuthMethodPickerTest { val providers = listOf( AuthProvider.Google(scopes = emptyList(), serverClientId = null), AuthProvider.Facebook(), - AuthProvider.Email(actionCodeSettings = null, passwordValidationRules = emptyList()) + AuthProvider.Email( + emailLinkActionCodeSettings = null, + passwordValidationRules = emptyList() + ) ) composeTestRule.setContent { @@ -277,7 +280,10 @@ class AuthMethodPickerTest { AuthProvider.Microsoft(tenant = null, customParameters = emptyMap()), AuthProvider.Yahoo(customParameters = emptyMap()), AuthProvider.Apple(locale = null, customParameters = emptyMap()), - AuthProvider.Email(actionCodeSettings = null, passwordValidationRules = emptyList()), + AuthProvider.Email( + emailLinkActionCodeSettings = null, + passwordValidationRules = emptyList() + ), AuthProvider.Phone( defaultNumber = null, defaultCountryCode = null, diff --git a/build.gradle b/build.gradle index e75ec13b3..b3a5a9caa 100644 --- a/build.gradle +++ b/build.gradle @@ -1,2 +1,10 @@ -// This empty file along with settings.gradle help Android Studio recognize the project +buildscript { + dependencies { + classpath libs.kotlin.gradle.plugin + } +} +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.compose.compiler) apply false +}// This empty file along with settings.gradle help Android Studio recognize the project // as a gradle project, despite the use of .gradle.kts scripts. \ No newline at end of file diff --git a/composeapp/.gitignore b/composeapp/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/composeapp/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/composeapp/build.gradle.kts b/composeapp/build.gradle.kts new file mode 100644 index 000000000..92f555ad7 --- /dev/null +++ b/composeapp/build.gradle.kts @@ -0,0 +1,68 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("org.jetbrains.kotlin.plugin.compose") + id("com.google.gms.google-services") apply false +} + +android { + namespace = "com.firebase.composeapp" + compileSdk = Config.SdkVersions.compile + + defaultConfig { + applicationId = "com.firebase.composeapp" + minSdk = Config.SdkVersions.min + targetSdk = Config.SdkVersions.target + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = "11" + } + buildFeatures { + compose = true + } +} + +dependencies { + implementation(project(":auth")) + + implementation(Config.Libs.Kotlin.jvm) + implementation(Config.Libs.Androidx.lifecycleRuntime) + implementation(Config.Libs.Androidx.Compose.activityCompose) + implementation(platform(Config.Libs.Androidx.Compose.bom)) + implementation(Config.Libs.Androidx.Compose.ui) + implementation(Config.Libs.Androidx.Compose.uiGraphics) + implementation(Config.Libs.Androidx.Compose.toolingPreview) + implementation(Config.Libs.Androidx.Compose.material3) + + testImplementation(Config.Libs.Test.junit) + androidTestImplementation(Config.Libs.Test.junitExt) + androidTestImplementation(platform(Config.Libs.Androidx.Compose.bom)) + androidTestImplementation(Config.Libs.Test.composeUiTestJunit4) + + debugImplementation(Config.Libs.Androidx.Compose.tooling) + + implementation(platform(Config.Libs.Firebase.bom)) +} + +// Only apply google-services plugin if the google-services.json file exists +if (rootProject.file("composeapp/google-services.json").exists()) { + apply(plugin = "com.google.gms.google-services") +} \ No newline at end of file diff --git a/composeapp/proguard-rules.pro b/composeapp/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/composeapp/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/composeapp/src/main/AndroidManifest.xml b/composeapp/src/main/AndroidManifest.xml new file mode 100644 index 000000000..99b6bad7d --- /dev/null +++ b/composeapp/src/main/AndroidManifest.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/composeapp/src/main/java/com/firebase/composeapp/MainActivity.kt b/composeapp/src/main/java/com/firebase/composeapp/MainActivity.kt new file mode 100644 index 000000000..decb7a452 --- /dev/null +++ b/composeapp/src/main/java/com/firebase/composeapp/MainActivity.kt @@ -0,0 +1,103 @@ +package com.firebase.composeapp + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.ui.Modifier +import androidx.lifecycle.lifecycleScope +import com.firebase.composeapp.ui.screens.MainScreen +import com.firebase.ui.auth.compose.FirebaseAuthUI +import com.firebase.ui.auth.compose.configuration.PasswordRule +import com.firebase.ui.auth.compose.configuration.authUIConfiguration +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider +import com.firebase.ui.auth.compose.configuration.auth_provider.signInWithEmailLink +import com.firebase.ui.auth.compose.configuration.theme.AuthUITheme +import com.firebase.ui.auth.compose.ui.screens.EmailSignInLinkHandlerActivity +import com.firebase.ui.auth.compose.util.EmailLinkPersistenceManager +import com.google.firebase.FirebaseApp +import com.google.firebase.auth.actionCodeSettings +import kotlinx.coroutines.launch + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + FirebaseApp.initializeApp(applicationContext) + val authUI = FirebaseAuthUI.getInstance() + + // Check if this is an email link sign-in flow + val emailLink = intent.getStringExtra( + EmailSignInLinkHandlerActivity.EXTRA_EMAIL_LINK + ) + + val provider = AuthProvider.Email( + isDisplayNameRequired = true, + isEmailLinkSignInEnabled = true, + isEmailLinkForceSameDeviceEnabled = true, + emailLinkActionCodeSettings = actionCodeSettings { + // The continue URL - where to redirect after email link is clicked + url = "https://temp-test-aa342.firebaseapp.com" + handleCodeInApp = true + setAndroidPackageName( + "com.firebase.composeapp", + true, + null + ) + }, + isNewAccountsAllowed = true, + minimumPasswordLength = 8, + passwordValidationRules = listOf( + PasswordRule.MinimumLength(8), + PasswordRule.RequireLowercase, + PasswordRule.RequireUppercase, + ) + ) + + val configuration = authUIConfiguration { + context = applicationContext + providers { provider(provider) } + tosUrl = "https://policies.google.com/terms?hl=en-NG&fg=1" + privacyPolicyUrl = "https://policies.google.com/privacy?hl=en-NG&fg=1" + } + + if (emailLink != null) { + lifecycleScope.launch { + try { + val emailFromSession = EmailLinkPersistenceManager + .retrieveSessionRecord(applicationContext)?.email + + if (emailFromSession != null) { + authUI.signInWithEmailLink( + context = applicationContext, + config = configuration, + provider = provider, + email = emailFromSession, + emailLink = emailLink, + ) + } + } catch (e: Exception) { + // Error handling is done via AuthState.Error in the auth flow + } + } + } + + setContent { + AuthUITheme { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + MainScreen( + context = applicationContext, + configuration = configuration, + authUI = authUI, + provider = provider + ) + } + } + } + } +} \ No newline at end of file diff --git a/composeapp/src/main/java/com/firebase/composeapp/ui/screens/MainScreen.kt b/composeapp/src/main/java/com/firebase/composeapp/ui/screens/MainScreen.kt new file mode 100644 index 000000000..4e1aeaf66 --- /dev/null +++ b/composeapp/src/main/java/com/firebase/composeapp/ui/screens/MainScreen.kt @@ -0,0 +1,151 @@ +package com.firebase.composeapp.ui.screens + +import android.content.Context +import android.util.Log +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import com.firebase.ui.auth.compose.AuthState +import com.firebase.ui.auth.compose.FirebaseAuthUI +import com.firebase.ui.auth.compose.configuration.AuthUIConfiguration +import com.firebase.ui.auth.compose.configuration.auth_provider.AuthProvider +import com.firebase.ui.auth.compose.ui.screens.EmailAuthMode +import com.firebase.ui.auth.compose.ui.screens.EmailAuthScreen +import com.firebase.ui.auth.compose.ui.screens.ResetPasswordUI +import com.firebase.ui.auth.compose.ui.screens.SignInUI +import com.firebase.ui.auth.compose.ui.screens.SignUpUI +import kotlinx.coroutines.launch + +@Composable +fun MainScreen( + context: Context, + configuration: AuthUIConfiguration, + authUI: FirebaseAuthUI, + provider: AuthProvider.Email +) { + val coroutineScope = rememberCoroutineScope() + val authState by authUI.authStateFlow().collectAsState(AuthState.Idle) + + when (authState) { + is AuthState.Success -> { + Column( + modifier = Modifier + .fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text("Authenticated User - (Success): ${authUI.getCurrentUser()?.email}", + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(8.dp)) + Button( + onClick = { + coroutineScope.launch { + authUI.signOut(context) + } + } + ) { + Text("Sign Out") + } + } + } + + is AuthState.RequiresEmailVerification -> { + Column( + modifier = Modifier + .fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + "Authenticated User - " + + "(RequiresEmailVerification): " + + "${(authState as AuthState.RequiresEmailVerification).user.email}", + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(8.dp)) + Button( + onClick = { + coroutineScope.launch { + authUI.signOut(context) + } + } + ) { + Text("Sign Out") + } + } + } + + else -> { + EmailAuthScreen( + context = context, + configuration = configuration, + authUI = authUI, + onSuccess = { result -> }, + onError = { exception -> }, + onCancel = { }, + ) { state -> + when (state.mode) { + EmailAuthMode.SignIn -> { + SignInUI( + configuration = configuration, + email = state.email, + isLoading = state.isLoading, + emailSignInLinkSent = state.emailSignInLinkSent, + password = state.password, + onEmailChange = state.onEmailChange, + onPasswordChange = state.onPasswordChange, + onSignInClick = state.onSignInClick, + onGoToSignUp = state.onGoToSignUp, + onGoToResetPassword = state.onGoToResetPassword, + ) + } + + EmailAuthMode.SignUp -> { + SignUpUI( + configuration = configuration, + isLoading = state.isLoading, + displayName = state.displayName, + email = state.email, + password = state.password, + confirmPassword = state.confirmPassword, + onDisplayNameChange = state.onDisplayNameChange, + onEmailChange = state.onEmailChange, + onPasswordChange = state.onPasswordChange, + onConfirmPasswordChange = state.onConfirmPasswordChange, + onSignUpClick = state.onSignUpClick, + onGoToSignIn = state.onGoToSignIn, + ) + } + + EmailAuthMode.ResetPassword -> { + ResetPasswordUI( + configuration = configuration, + isLoading = state.isLoading, + email = state.email, + resetLinkSent = state.resetLinkSent, + onEmailChange = state.onEmailChange, + onSendResetLink = state.onSendResetLinkClick, + onGoToSignIn = state.onGoToSignIn + ) + } + } + } + } + } +} \ No newline at end of file diff --git a/composeapp/src/main/java/com/firebase/composeapp/ui/theme/Color.kt b/composeapp/src/main/java/com/firebase/composeapp/ui/theme/Color.kt new file mode 100644 index 000000000..994915613 --- /dev/null +++ b/composeapp/src/main/java/com/firebase/composeapp/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package com.firebase.composeapp.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) \ No newline at end of file diff --git a/composeapp/src/main/java/com/firebase/composeapp/ui/theme/Theme.kt b/composeapp/src/main/java/com/firebase/composeapp/ui/theme/Theme.kt new file mode 100644 index 000000000..08bd9441a --- /dev/null +++ b/composeapp/src/main/java/com/firebase/composeapp/ui/theme/Theme.kt @@ -0,0 +1,58 @@ +package com.firebase.composeapp.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext + +private val DarkColorScheme = darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun FirebaseUIAndroidTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/composeapp/src/main/java/com/firebase/composeapp/ui/theme/Type.kt b/composeapp/src/main/java/com/firebase/composeapp/ui/theme/Type.kt new file mode 100644 index 000000000..ea0657654 --- /dev/null +++ b/composeapp/src/main/java/com/firebase/composeapp/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package com.firebase.composeapp.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/composeapp/src/main/res/drawable-v24/ic_launcher_foreground.xml b/composeapp/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000..fde1368fc --- /dev/null +++ b/composeapp/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/composeapp/src/main/res/drawable/ic_launcher_background.xml b/composeapp/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..1e4408cae --- /dev/null +++ b/composeapp/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/composeapp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/composeapp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..6f3b755bf --- /dev/null +++ b/composeapp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/composeapp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/composeapp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..6f3b755bf --- /dev/null +++ b/composeapp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/composeapp/src/main/res/mipmap-hdpi/ic_launcher.webp b/composeapp/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c209e78ecd372343283f4157dcfd918ec5165bb3 GIT binary patch literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG literal 0 HcmV?d00001 diff --git a/composeapp/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/composeapp/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9 GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/composeapp/src/main/res/mipmap-mdpi/ic_launcher.webp b/composeapp/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f0f1d64e58ba64d180ce43ee13bf9a17835fbca GIT binary patch literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i literal 0 HcmV?d00001 diff --git a/composeapp/src/main/res/mipmap-xhdpi/ic_launcher.webp b/composeapp/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0 GIT binary patch literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? literal 0 HcmV?d00001 diff --git a/composeapp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/composeapp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f GIT binary patch literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s literal 0 HcmV?d00001 diff --git a/composeapp/src/main/res/values/colors.xml b/composeapp/src/main/res/values/colors.xml new file mode 100644 index 000000000..f8c6127d3 --- /dev/null +++ b/composeapp/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/composeapp/src/main/res/values/strings.xml b/composeapp/src/main/res/values/strings.xml new file mode 100644 index 000000000..c226d8f8f --- /dev/null +++ b/composeapp/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + ComposeApp + \ No newline at end of file diff --git a/composeapp/src/main/res/values/themes.xml b/composeapp/src/main/res/values/themes.xml new file mode 100644 index 000000000..1f225670b --- /dev/null +++ b/composeapp/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + + - - - - - - - - - - - - - diff --git a/composeapp/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml similarity index 100% rename from composeapp/src/main/res/values/themes.xml rename to app/src/main/res/values/themes.xml diff --git a/app/src/main/res/xml-v25/shortcuts.xml b/app/src/main/res/xml-v25/shortcuts.xml deleted file mode 100644 index 988b81d73..000000000 --- a/app/src/main/res/xml-v25/shortcuts.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/auth/MIGRATION.md b/auth/MIGRATION.md new file mode 100644 index 000000000..ef0701ff4 --- /dev/null +++ b/auth/MIGRATION.md @@ -0,0 +1,465 @@ +# Migration Guide: FirebaseUI Auth 9.x to 10.x + +This guide helps you migrate from FirebaseUI Auth 9.x (View-based) to 10.x (Compose-based). + +## Overview + +FirebaseUI Auth 10.x is a complete rewrite built with Jetpack Compose and Material Design 3. The architecture has changed significantly from the View-based system to a modern, declarative UI framework. + +## Key Architectural Changes + +### 1. UI Framework +- **9.x**: Android Views, Activities, Fragments +- **10.x**: Jetpack Compose, Composables + +### 2. Configuration +- **9.x**: Builder pattern (`createSignInIntentBuilder()`) +- **10.x**: Kotlin DSL (`authUIConfiguration {}`) + +### 3. Providers +- **9.x**: `IdpConfig.EmailBuilder().build()` +- **10.x**: `AuthProvider.Email()` + +### 4. Flow Control +- **9.x**: Activity-based with `startActivityForResult()` and `ActivityResultLauncher` +- **10.x**: Composable screens with direct callbacks OR `AuthFlowController` for Activity-based apps + +### 5. Theming +- **9.x**: XML theme resources (`R.style.AppTheme`) +- **10.x**: `AuthUITheme` with Material 3 color schemes + +### 6. State Management +- **9.x**: `AuthStateListener` callbacks +- **10.x**: Reactive `Flow` + +## Migration Steps + +### Step 1: Update Dependencies + +**Old (9.x):** +```kotlin +dependencies { + implementation("com.firebaseui:firebase-ui-auth:9.1.1") +} +``` + +**New (10.x):** +```kotlin +dependencies { + // FirebaseUI Auth + implementation("com.firebaseui:firebase-ui-auth:10.0.0") + + // Required: Jetpack Compose + implementation(platform("androidx.compose:compose-bom:2024.01.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.material3:material3") +} +``` + +### Step 2: Migrate to Compose + +**Old (9.x) - Activity-based:** +```java +public class SignInActivity extends AppCompatActivity { + private final ActivityResultLauncher signInLauncher = + registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + IdpResponse response = IdpResponse.fromResultIntent(result.getData()); + + if (result.getResultCode() == RESULT_OK) { + FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); + // User signed in + } else { + // Sign in failed + } + } + ); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_signin); + + Intent signInIntent = AuthUI.getInstance() + .createSignInIntentBuilder() + .setAvailableProviders(Arrays.asList( + new AuthUI.IdpConfig.EmailBuilder().build(), + new AuthUI.IdpConfig.GoogleBuilder().build() + )) + .setTheme(R.style.AppTheme) + .build(); + + signInLauncher.launch(signInIntent); + } +} +``` + +**New (10.x) - Compose-based:** +```kotlin +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + MyAppTheme { + val configuration = authUIConfiguration { + providers = listOf( + AuthProvider.Email(), + AuthProvider.Google() + ) + theme = AuthUITheme.fromMaterialTheme() + } + + FirebaseAuthScreen( + configuration = configuration, + onSignInSuccess = { result -> + val user = result.user + // User signed in + }, + onSignInFailure = { exception -> + // Sign in failed + }, + onSignInCancelled = { + finish() + } + ) + } + } + } +} +``` + +### Step 3: Update Provider Configuration + +**Old (9.x):** +```java +List providers = Arrays.asList( + new AuthUI.IdpConfig.EmailBuilder() + .setRequireName(true) + .build(), + new AuthUI.IdpConfig.GoogleBuilder() + .build(), + new AuthUI.IdpConfig.PhoneBuilder() + .build() +); +``` + +**New (10.x):** +```kotlin +val configuration = authUIConfiguration { + providers = listOf( + AuthProvider.Email( + isDisplayNameRequired = true + ), + AuthProvider.Google( + scopes = listOf("email"), + serverClientId = "YOUR_CLIENT_ID" + ), + AuthProvider.Phone( + defaultCountryCode = "US" + ) + ) +} +``` + +### Step 4: Update Theming + +**Old (9.x) - XML styles:** +```xml + +``` + +```java +.setTheme(R.style.AppTheme) +``` + +**New (10.x) - Material 3:** +```kotlin +val configuration = authUIConfiguration { + providers = listOf(AuthProvider.Email()) + theme = AuthUITheme( + colorScheme = lightColorScheme( + primary = Color(0xFF6200EE), + onPrimary = Color.White, + secondary = Color(0xFF03DAC6) + ) + ) +} +``` + +Or inherit from your app theme: +```kotlin +MyAppTheme { + val configuration = authUIConfiguration { + providers = listOf(AuthProvider.Email()) + theme = AuthUITheme.fromMaterialTheme() + } + + FirebaseAuthScreen(configuration = configuration, ...) +} +``` + +### Step 5: Update Sign Out + +**Old (9.x):** +```java +AuthUI.getInstance() + .signOut(this) + .addOnCompleteListener(task -> { + // User signed out + }); +``` + +**New (10.x):** +```kotlin +lifecycleScope.launch { + FirebaseAuthUI.getInstance().signOut(context) + // User signed out +} +``` + +### Step 6: Update Account Deletion + +**Old (9.x):** +```java +AuthUI.getInstance() + .delete(this) + .addOnCompleteListener(task -> { + if (task.isSuccessful()) { + // Account deleted + } else { + // Deletion failed + } + }); +``` + +**New (10.x):** +```kotlin +lifecycleScope.launch { + try { + FirebaseAuthUI.getInstance().delete(context) + // Account deleted + } catch (e: Exception) { + // Deletion failed + } +} +``` + +### Step 7: Auth State Observation + +**Old (9.x):** +```java +FirebaseAuth.getInstance().addAuthStateListener(firebaseAuth -> { + FirebaseUser user = firebaseAuth.getCurrentUser(); + if (user != null) { + // User is signed in + } else { + // User is signed out + } +}); +``` + +**New (10.x):** +```kotlin +@Composable +fun AuthGate() { + val authUI = remember { FirebaseAuthUI.getInstance() } + val authState by authUI.authStateFlow().collectAsState(initial = AuthState.Idle) + + when (authState) { + is AuthState.Success -> { + // User is signed in + MainAppScreen() + } + else -> { + // Show authentication + FirebaseAuthScreen(...) + } + } +} +``` + +## Provider-Specific Migration + +### Email Provider + +**Old (9.x):** +```java +new AuthUI.IdpConfig.EmailBuilder() + .setRequireName(true) + .setAllowNewAccounts(true) + .enableEmailLinkSignIn() + .setActionCodeSettings(actionCodeSettings) + .build() +``` + +**New (10.x):** +```kotlin +AuthProvider.Email( + isDisplayNameRequired = true, + isNewAccountsAllowed = true, + isEmailLinkSignInEnabled = true, + emailLinkActionCodeSettings = actionCodeSettings { + url = "https://example.com/auth" + handleCodeInApp = true + setAndroidPackageName(packageName, true, null) + } +) +``` + +### Google Provider + +**Old (9.x):** +```java +new AuthUI.IdpConfig.GoogleBuilder() + .setScopes(Arrays.asList("email", "profile")) + .build() +``` + +**New (10.x):** +```kotlin +AuthProvider.Google( + scopes = listOf("email", "profile"), + serverClientId = "YOUR_CLIENT_ID" +) +``` + +### Phone Provider + +**Old (9.x):** +```java +new AuthUI.IdpConfig.PhoneBuilder() + .setDefaultNumber("US", "+1 123-456-7890") + .build() +``` + +**New (10.x):** +```kotlin +AuthProvider.Phone( + defaultCountryCode = "US", + defaultNumber = "+11234567890" +) +``` + +## Advanced Migration Scenarios + +### Custom UI (Activity-based apps that can't use Compose everywhere) + +If you have an existing Activity-based app and want to keep using Activities: + +**New (10.x) - Low-Level API:** +```kotlin +class AuthActivity : ComponentActivity() { + private lateinit var controller: AuthFlowController + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val authUI = FirebaseAuthUI.getInstance() + val configuration = authUIConfiguration { + providers = listOf(AuthProvider.Email(), AuthProvider.Google()) + } + + controller = authUI.createAuthFlow(configuration) + + lifecycleScope.launch { + val state = controller.start() + when (state) { + is AuthState.Success -> { + startActivity(Intent(this, MainActivity::class.java)) + finish() + } + is AuthState.Error -> { + // Handle error + } + else -> { + // Handle other states + } + } + } + } + + override fun onDestroy() { + super.onDestroy() + controller.dispose() + } +} +``` + +## Common Issues and Solutions + +### Issue: "Unresolved reference: authUIConfiguration" + +**Solution:** Ensure you have the correct import: +```kotlin +import com.firebase.ui.auth.compose.configuration.authUIConfiguration +``` + +### Issue: "ActivityResultLauncher is deprecated" + +**Solution:** In 10.x, you no longer need `ActivityResultLauncher`. Use direct callbacks with `FirebaseAuthScreen` or `AuthFlowController`. + +### Issue: "How do I customize the UI?" + +**Solution:** Use content slots for custom UI: +```kotlin +EmailAuthScreen( + configuration = emailConfig, + onSuccess = { /* ... */ }, + onError = { /* ... */ }, + onCancel = { /* ... */ } +) { state -> + // Your custom UI here + CustomSignInUI(state) +} +``` + +### Issue: "My XML themes aren't working" + +**Solution:** Convert XML themes to Kotlin code using `AuthUITheme`: +```kotlin +val configuration = authUIConfiguration { + theme = AuthUITheme( + colorScheme = lightColorScheme( + primary = Color(0xFF6200EE), + // ... other colors + ) + ) +} +``` + +## Testing Your Migration + +1. **Build the app** - Ensure it compiles without errors +2. **Test all auth flows** - Sign in, sign up, password reset +3. **Test all providers** - Email, Google, Phone, etc. +4. **Test sign out** - Verify users can sign out +5. **Test account deletion** - Verify accounts can be deleted +6. **Test error handling** - Verify errors are handled gracefully +7. **Test theming** - Verify UI matches your design + +## Checklist + +- [ ] Updated dependency to `firebase-ui-auth:10.0.0` +- [ ] Migrated to Jetpack Compose +- [ ] Converted Activities to ComponentActivities with `setContent {}` +- [ ] Replaced `createSignInIntentBuilder()` with `authUIConfiguration {}` +- [ ] Updated all provider configurations +- [ ] Converted XML themes to `AuthUITheme` +- [ ] Updated error handling from result codes to exceptions +- [ ] Removed `ActivityResultLauncher` code +- [ ] Updated sign-out to use suspend functions +- [ ] Updated account deletion to use suspend functions +- [ ] Tested all authentication flows +- [ ] Tested on multiple Android versions + +## Need Help? + +- [FirebaseUI Auth Documentation](https://github.com/firebase/FirebaseUI-Android/blob/master/auth/README.md) +- [GitHub Issues](https://github.com/firebase/FirebaseUI-Android/issues) +- [Stack Overflow](https://stackoverflow.com/questions/tagged/firebaseui) diff --git a/auth/README.md b/auth/README.md index b705b30d0..cbc97b386 100644 --- a/auth/README.md +++ b/auth/README.md @@ -1,815 +1,1468 @@ # FirebaseUI for Auth -FirebaseUI is an open-source library that offers simple, -customizable UI bindings on top of the core -[Firebase](https://firebase.google.com) SDKs. It aims to eliminate boilerplate -code and promote best practices (both user experience and security) for -authentication. - -A simple API is provided for drop-in user authentication which handles the flow -of signing in users with email addresses and passwords, phone numbers, and federated identity -providers such as Google Sign-In, and Facebook Login. It is built on top of -[Firebase Auth](https://firebase.google.com/docs/auth). - -The best practices embodied in FirebaseUI aim to maximize sign-in -and sign-up conversion for your app. It integrates with -[Credential Manager](https://developer.android.com/identity/sign-in/credential-manager) -to store and retrieve credentials, enabling automatic and single-tap sign-in to -your app for returning users. It also handles tricky use cases like -account recovery and account linking that are security sensitive and -difficult to implement correctly using the base APIs provided by Firebase Auth. - -FirebaseUI auth can be easily customized to fit with the rest of your app's -visual style. As it is open source, you are also free to modify it to exactly -fit your preferred user experience. - -Equivalent FirebaseUI auth libraries are also available for -[iOS](https://github.com/firebase/firebaseui-ios/) -and [Web](https://github.com/firebase/firebaseui-web/). - -## Table of contents +FirebaseUI Auth is a modern, Compose-based authentication library that provides drop-in UI components for Firebase Authentication. It eliminates boilerplate code and promotes best practices for user authentication on Android. + +Built entirely with **Jetpack Compose** and **Material Design 3**, FirebaseUI Auth offers: + +- **Simple API** - Choose between high-level screens or low-level controllers for maximum flexibility +- **12+ Authentication Methods** - Email/Password, Phone, Google, Facebook, Twitter, GitHub, Microsoft, Yahoo, Apple, Anonymous, and custom OAuth providers +- **Multi-Factor Authentication** - SMS and TOTP (Time-based One-Time Password) with recovery codes +- **Android Credential Manager** - Automatic credential saving and one-tap sign-in +- **Material Design 3** - Beautiful, themeable UI components that integrate seamlessly with your app +- **Localization Support** - Customizable strings for internationalization +- **Security Best Practices** - Email verification, reauthentication, account linking, and more + +Equivalent FirebaseUI libraries are available for [iOS](https://github.com/firebase/firebaseui-ios/) and [Web](https://github.com/firebase/firebaseui-web/). + +## Table of Contents 1. [Demo](#demo) -1. [Configuration](#configuration) - 1. [Basics](#basics) - 1. [Themes](#themes) - 1. [Provider config](#identity-provider-configuration) - 1. [Auth emulator config](#auth-emulator-configuration) -1. [Usage instructions](#using-firebaseui-for-authentication) - 1. [AuthUI sign-in](#authui-sign-in) - 1. [Handling responses](#handling-the-sign-in-response) - 1. [Sign out](#sign-out) - 1. [Account deletion](#deleting-accounts) - 1. [Upgrading Anonymous Users](#upgrading-anonymous-users) -1. [UI Customization](#ui-customization) - 1. [Custom layout](#custom-layout) - 1. [Strings](#strings) -1. [OAuth scopes](#oauth-scope-customization) - 1. [Google](#google-1) - 1. [Facebook](#facebook-1) - 1. [Twitter](#twitter-1) +1. [Setup](#setup) + 1. [Prerequisites](#prerequisites) + 1. [Installation](#installation) + 1. [Provider Configuration](#provider-configuration) +1. [Quick Start](#quick-start) + 1. [Minimal Example](#minimal-example) + 1. [Check Authentication State](#check-authentication-state) +1. [Core Concepts](#core-concepts) + 1. [FirebaseAuthUI](#firebaseauthui) + 1. [AuthUIConfiguration](#authuiconfiguration) + 1. [AuthFlowController](#authflowcontroller) + 1. [AuthState](#authstate) +1. [Authentication Methods](#authentication-methods) + 1. [Email & Password](#email--password) + 1. [Phone Number](#phone-number) + 1. [Google Sign-In](#google-sign-in) + 1. [Facebook Login](#facebook-login) + 1. [Other OAuth Providers](#other-oauth-providers) + 1. [Anonymous Authentication](#anonymous-authentication) + 1. [Custom OAuth Provider](#custom-oauth-provider) +1. [Usage Patterns](#usage-patterns) + 1. [High-Level API (Recommended)](#high-level-api-recommended) + 1. [Low-Level API (Advanced)](#low-level-api-advanced) + 1. [Custom UI with Slots](#custom-ui-with-slots) +1. [Multi-Factor Authentication](#multi-factor-authentication) + 1. [MFA Configuration](#mfa-configuration) + 1. [MFA Enrollment](#mfa-enrollment) + 1. [MFA Challenge](#mfa-challenge) +1. [Theming & Customization](#theming--customization) + 1. [Material Theme Integration](#material-theme-integration) + 1. [Custom Theme](#custom-theme) + 1. [Provider Button Styling](#provider-button-styling) +1. [Advanced Features](#advanced-features) + 1. [Anonymous User Upgrade](#anonymous-user-upgrade) + 1. [Email Link Sign-In](#email-link-sign-in) + 1. [Password Validation Rules](#password-validation-rules) + 1. [Credential Manager Integration](#credential-manager-integration) + 1. [Sign Out & Account Deletion](#sign-out--account-deletion) +1. [Localization](#localization) +1. [Error Handling](#error-handling) +1. [Migration Guide](#migration-guide) ## Demo -![FirebaseUI authentication demo on Android](demo.gif) +FirebaseUI Compose Demo + +## Setup -## Configuration +### Prerequisites -As a pre-requisite, ensure your application is configured for use with -Firebase: see the -[Firebase documentation](https://firebase.google.com/docs/android/setup). -Then, add the FirebaseUI auth library dependency. If your project uses -Gradle, add the dependency: +Ensure your application is configured for use with Firebase. See the [Firebase documentation](https://firebase.google.com/docs/android/setup) for setup instructions. -```groovy +**Minimum Requirements:** +- Android SDK 21+ (Android 5.0 Lollipop) +- Kotlin 1.9+ +- Jetpack Compose (Compiler 1.5+) +- Firebase Auth 22.0.0+ + +### Installation + +Add the FirebaseUI Auth library dependency to your `build.gradle.kts` (Module): + +```kotlin dependencies { - // ... - implementation 'com.firebaseui:firebase-ui-auth:9.0.0' + // FirebaseUI for Auth + implementation("com.firebaseui:firebase-ui-auth:10.0.0") + + // Required: Firebase Auth + implementation(platform("com.google.firebase:firebase-bom:32.7.0")) + implementation("com.google.firebase:firebase-auth") - // Required only if Facebook login support is required - // Find the latest Facebook SDK releases here: https://github.com/facebook/facebook-android-sdk/blob/master/CHANGELOG.md - implementation 'com.facebook.android:facebook-login:8.1.0' + // Required: Jetpack Compose + implementation(platform("androidx.compose:compose-bom:2024.01.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.material3:material3") + + // Optional: Facebook Login (if using FacebookAuthProvider) + implementation("com.facebook.android:facebook-login:16.3.0") } ``` -FirebaseUI includes translations for all string resources. In order to -ensure that you only get the translations relevant to your application, we recommend changing the -`resConfigs` of your application module: +**Localization Support:** -```groovy -android { - // ... +To optimize APK size, configure resource filtering for only the languages your app supports: +```kotlin +android { defaultConfig { - // ... - resConfigs "en" // And any other languages you support + resourceConfigurations += listOf("en", "es", "fr") // Add your supported languages } } ``` -See the [Android documentation](https://developer.android.com/studio/build/shrink-code.html#unused-alt-resources) -for more information. - -### Basics +### Provider Configuration -There are three main steps to adding FirebaseUI in your app: +#### Google Sign-In - 1. Build a sign in `Intent` using `AuthUI#createSignInIntentBuilder()` - 2. Launch the `Intent` using an `ActivityResultLauncher` - 3. Handle the result. - -```java -private ActivityResultLauncher signInLauncher = registerForActivityResult( - new FirebaseAuthUIActivityResultContract(), - (result) -> { - // Handle the FirebaseAuthUIAuthenticationResult - // ... - }); +Google Sign-In configuration is automatically provided by the [google-services Gradle plugin](https://developers.google.com/android/guides/google-services-plugin). Ensure you have enabled Google Sign-In in the [Firebase Console](https://console.firebase.google.com/project/_/authentication/providers). -// ... +#### Facebook Login -private void startSignIn() { - Intent signInIntent = AuthUI.getInstance() - .createSignInIntentBuilder() - // ... options ... - .build(); +If using Facebook Login, add your Facebook App ID to `strings.xml`: - signInLauncher.launch(signInIntent); -} +```xml + + YOUR_FACEBOOK_APP_ID + fbYOUR_FACEBOOK_APP_ID + ``` -### Themes +See the [Facebook for Developers](https://developers.facebook.com/) documentation for setup instructions. -As of version `8.0.0` FirebaseUI uses Material Design Components and themes. To use FirebaseUI seamlessly in your app you should provide a theme resource which provides Material Design color attributes ([read more here](https://material.io/blog/android-material-theme-color)). +#### Other Providers -At a minimum your theme should define the following attributes: +Twitter, GitHub, Microsoft, Yahoo, and Apple providers require configuration in the Firebase Console but no additional Android-specific setup. See the [Firebase Auth documentation](https://firebase.google.com/docs/auth) for provider-specific instructions. - * `colorPrimary` - * `colorPrimaryVariant` - * `colorAccent` - * `android:statusBarColor` (API > 21) or `colorPrimaryDark` (API < 21) +## Quick Start -#### Using your app theme +### Minimal Example -To configure FirebaseUI to match your app's exising theme, simply pass your main theme attribute to `setTheme()`: +Here's the simplest way to add authentication to your app with Email and Google Sign-In: -This would then be used in the construction of the sign-in intent: +```kotlin +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) -```java -Intent signInIntent = - AuthUI.getInstance(this).createSignInIntentBuilder() - // ... - .setTheme(R.style.AppTheme) - .build()) + setContent { + MyAppTheme { + val configuration = authUIConfiguration { + providers = listOf( + AuthProvider.Email(), + AuthProvider.Google() + ) + } + + FirebaseAuthScreen( + configuration = configuration, + onSignInSuccess = { result -> + Toast.makeText(this, "Welcome!", Toast.LENGTH_SHORT).show() + // Navigate to main app screen + }, + onSignInFailure = { exception -> + Toast.makeText(this, "Error: ${exception.message}", Toast.LENGTH_SHORT).show() + }, + onSignInCancelled = { + finish() + } + ) + } + } + } +} ``` -#### Using a custom theme +That's it! This provides a complete authentication flow with: +- ✅ Email/password sign-in and sign-up +- ✅ Google Sign-In +- ✅ Password reset +- ✅ Display name collection +- ✅ Credential Manager integration +- ✅ Material Design 3 theming +- ✅ Error handling + +### Check Authentication State + +Before showing the authentication UI, check if a user is already signed in: + +```kotlin +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val authUI = FirebaseAuthUI.getInstance() + + if (authUI.isSignedIn()) { + // User is already signed in, navigate to main app + startActivity(Intent(this, MainAppActivity::class.java)) + finish() + } else { + // Show authentication UI + setContent { + FirebaseAuthScreen(/* ... */) + } + } + } +} +``` -For example, here is a simple green sign-in theme: +Or observe authentication state changes reactively: -```xml - + when { + authState is AuthState.Success -> { + // User is signed in + MainAppScreen() + } + else -> { + // Show authentication + FirebaseAuthScreen(/* ... */) + } + } +} ``` -With associated colors: +## Core Concepts -```xml -#E8F5E9 -#4CAF50 -#388E3C -#AA00FF -``` +### FirebaseAuthUI -This would then be used in the construction of the sign-in intent: +`FirebaseAuthUI` is the central class that coordinates all authentication operations. It manages UI state and provides methods for signing in, signing up, and managing user accounts. -```java -Intent signinIntent = - AuthUI.getInstance(this).createSignInIntentBuilder() - // ... - .setTheme(R.style.GreenTheme) - .build(); +```kotlin +// Get the default instance +val authUI = FirebaseAuthUI.getInstance() + +// Or get an instance for a specific Firebase app +val customApp = Firebase.app("secondary") +val authUI = FirebaseAuthUI.getInstance(customApp) + +// Or create with custom auth (for multi-tenancy) +val customAuth = Firebase.auth(customApp) +val authUI = FirebaseAuthUI.create(auth = customAuth) ``` -### Identity provider configuration +**Key Methods:** -In order to use either Google, Facebook, Twitter, Microsoft, Apple, GitHub or Yahoo accounts with -your app, ensure that these authentication methods are first configured in the Firebase console. +| Method | Return Type | Description | +|--------|-------------|-------------| +| `isSignedIn()` | `Boolean` | Checks if a user is currently signed in | +| `getCurrentUser()` | `FirebaseUser?` | Returns the current user, if signed in | +| `authStateFlow()` | `Flow` | Observes authentication state changes | +| `createAuthFlow(config)` | `AuthFlowController` | Creates a sign-in flow controller | +| `signOut(context)` | `suspend fun` | Signs out the current user | +| `delete(context)` | `suspend fun` | Deletes the current user account | -#### Google +### AuthUIConfiguration -FirebaseUI client-side configuration for Google sign-in is then provided -automatically by the -[google-services gradle plugin](https://developers.google.com/android/guides/google-services-plugin). +`AuthUIConfiguration` defines all settings for your authentication flow. Use the DSL builder function for easy configuration: -#### Facebook +```kotlin +val configuration = authUIConfiguration { + // Required: List of authentication providers + providers = listOf( + AuthProvider.Email(), + AuthProvider.Google(), + AuthProvider.Phone() + ) -If support for Facebook Login is also required, define the -resource string `facebook_application_id` to match the application ID in -the [Facebook developer dashboard](https://developers.facebook.com): + // Optional: Theme configuration + theme = AuthUITheme.fromMaterialTheme() -```xml - - - APP_ID - - fbAPP_ID - -``` + // Optional: Terms of Service and Privacy Policy URLs + tosUrl = "https://example.com/terms" + privacyPolicyUrl = "https://example.com/privacy" -#### Microsoft, Apple, Twitter, GitHub and Yahoo + // Optional: App logo + logo = Icons.Default.AccountCircle -No FirebaseUI configuration is required for these providers. + // Optional: Enable MFA (default: true) + isMfaEnabled = true -We support the use of scopes and custom parameters for these providers. For example: + // Optional: Enable Credential Manager (default: true) + isCredentialManagerEnabled = true -```java -List scopes = - new ArrayList() { - { - add("mail.read"); - add("calendars.read"); - } - }; + // Optional: Allow anonymous user upgrade (default: false) + isAnonymousUpgradeEnabled = true -Map customParams = new HashMap<>(); -customParams.put("tenant", "TENANT_ID"); + // Optional: Require display name on sign-up (default: true) + isDisplayNameRequired = true -IdpConfig microsoftConfig = new IdpConfig.MicrosoftBuilder() - .setScopes(scopes) - .setCustomParameters(customParams) - .build(); -selectedProviders.add(microsoftConfig); -``` + // Optional: Allow new email accounts (default: true) + isNewEmailAccountsAllowed = true -Note: unlike other sign-in methods, signing in with these providers involves the use of a -[Custom Chrome Tab](https://developer.chrome.com/multidevice/android/customtabs). + // Optional: Always show provider choice even with one provider (default: false) + isProviderChoiceAlwaysShown = false -##### Twitter + // Optional: Custom string provider for localization + stringProvider = MyCustomStringProvider() -You must enable the "Request email addresses from users" permission in the "Permissions" tab of your -Twitter app. + // Optional: Locale override + locale = Locale.FRENCH +} +``` -### Auth emulator configuration +### AuthFlowController -As of version `7.0.0` FirebaseUI is compatible with the Firebase Authentication emulator: -https://firebase.google.com/docs/emulator-suite +`AuthFlowController` manages the lifecycle of an authentication flow programmatically. This is the low-level API for advanced use cases. -Use the `useEmulator` method to point an AuthUI instance at the emulator: +```kotlin +val controller = authUI.createAuthFlow(configuration) -```java -AuthUI authUI = AuthUI.getInstance(); +lifecycleScope.launch { + // Start the flow + val state = controller.start() -// "10.0.2.2" is the special host value for contacting "localhost" from within -// the Android Emulator -authUI.useEmulator("10.0.2.2", 9099); -``` + when (state) { + is AuthState.Success -> { + // Handle success + val user = state.result.user + } + is AuthState.Error -> { + // Handle error + Log.e(TAG, "Auth failed", state.exception) + } + is AuthState.Cancelled -> { + // User cancelled + } + else -> { + // Handle other states (RequiresMfa, RequiresEmailVerification, etc.) + } + } +} + +// Cancel the flow if needed +controller.cancel() -By default Android blocks connections to `http://` endpoints such as the Auth emulator. -To allow your app to communicate with the Auth emulator, use a [network security configuration](https://developer.android.com/training/articles/security-config) -or set `android:usesCleartextTraffic="true"` in `AndroidManifest.xml`. +// Clean up when done +override fun onDestroy() { + super.onDestroy() + controller.dispose() +} +``` -## Using FirebaseUI for authentication +### AuthState -Before invoking the FirebaseUI authentication flow, your app should check -whether a -[user is already signed in](https://firebase.google.com/docs/auth/android/manage-users#get_the_currently_signed-in_user) -from a previous session: +`AuthState` represents the current state of authentication: -```java -FirebaseAuth auth = FirebaseAuth.getInstance(); -if (auth.getCurrentUser() != null) { - // already signed in -} else { - // not signed in +```kotlin +sealed class AuthState { + object Idle : AuthState() + data class Loading(val message: String?) : AuthState() + data class Success(val result: AuthResult, val isNewUser: Boolean) : AuthState() + data class Error(val exception: AuthException, val isRecoverable: Boolean) : AuthState() + data class RequiresMfa(val resolver: MultiFactorResolver) : AuthState() + data class RequiresEmailVerification(val user: FirebaseUser) : AuthState() + data class RequiresProfileCompletion(val user: FirebaseUser) : AuthState() + object Cancelled : AuthState() } ``` -The entry point to the authentication flow is the -`com.firebase.ui.auth.AuthUI` class. -If your application uses the default `FirebaseApp` instance, an AuthUI -instance can be retrieved simply by calling `AuthUI.getInstance()`. -If an alternative app instance is required, call -`AuthUI.getInstance(app)` instead, passing the appropriate `FirebaseApp` -instance. +## Authentication Methods -### AuthUI sign-in +### Email & Password -If a user is not currently signed in, as can be determined by checking -`auth.getCurrentUser() != null` (where `auth` is the `FirebaseAuth` instance -associated with your `FirebaseApp`), then the sign-in process can be started by -creating a sign-in intent using `AuthUI.SignInIntentBuilder`. A builder instance -can be retrieved by calling `createSignInIntentBuilder()` on the retrieved -AuthUI instance. +Configure email/password authentication with optional customization: -The builder provides the following customization options for the authentication flow: +```kotlin +val emailProvider = AuthProvider.Email( + // Optional: Require display name (default: true) + isDisplayNameRequired = true, -* The set of authentication providers can be specified. -* The terms of service URL for your app can be specified, which is included as - a link in the small-print of the account creation step for new users. If no - terms of service URL is provided, the associated small-print is omitted. -* A custom theme can be specified for the flow, which is applied to all the - activities in the flow for consistent colors and typography. + // Optional: Enable email link sign-in (default: false) + isEmailLinkSignInEnabled = true, -#### Sign-in examples + // Optional: Force email link on same device (default: true) + isEmailLinkForceSameDeviceEnabled = true, -If no customization is required, and only email authentication is required, the sign-in flow -can be started as follows: + // Optional: Action code settings for email link + emailLinkActionCodeSettings = actionCodeSettings { + url = "https://example.com/auth" + handleCodeInApp = true + setAndroidPackageName(packageName, true, null) + }, -```java -// Get an instance of AuthUI based on the default app -Intent signInIntent = - AuthUI.getInstance().createSignInIntentBuilder().build(); + // Optional: Allow new accounts (default: true) + isNewAccountsAllowed = true, -signInLauncher.launch(signInIntent); -``` + // Optional: Minimum password length (default: 6) + minimumPasswordLength = 8, -To kick off the FirebaseUI sign in flow, use an `ActivityResultLauncher` to launch the Intent you built. -See the [response codes](#response-codes) section below for more details on receiving the results of the sign in flow. + // Optional: Custom password validation rules + passwordValidationRules = listOf( + PasswordRule.MinimumLength(8), + PasswordRule.RequireUppercase, + PasswordRule.RequireLowercase, + PasswordRule.RequireDigit, + PasswordRule.RequireSpecialCharacter + ) +) -##### Adding providers +val configuration = authUIConfiguration { + providers = listOf(emailProvider) +} +``` -You can enable sign-in providers like Google Sign-In or Facebook Log In by calling the -`setAvailableProviders` method: +### Phone Number -```java -Intent signInIntent = - AuthUI.getInstance() - .createSignInIntentBuilder() - .setAvailableProviders(Arrays.asList( - new AuthUI.IdpConfig.GoogleBuilder().build(), - new AuthUI.IdpConfig.FacebookBuilder().build(), - new AuthUI.IdpConfig.TwitterBuilder().build(), - new AuthUI.IdpConfig.MicrosoftBuilder().build(), - new AuthUI.IdpConfig.YahooBuilder().build(), - new AuthUI.IdpConfig.AppleBuilder().build(), - new AuthUI.IdpConfig.EmailBuilder().build(), - new AuthUI.IdpConfig.PhoneBuilder().build(), - new AuthUI.IdpConfig.AnonymousBuilder().build())) - .build(); -``` - -##### Configuring Email Link Sign In - -To use email link sign in, you will first need to enable it in the Firebase Console. Additionally, you will -also have to enable Firebase Dynamic Links. - -You can enable email link sign in by calling the `enableEmailLinkSignIn` on an `EmailBuilder` instance. You will also need -to provide a valid `ActionCodeSettings` object with `setHandleCodeInApp` set to true. Additionally, you need to allowlist the -URL you pass to `setUrl`; you can do so in the Firebase Console (Authentication -> Sign in Methods -> Authorized domains). +Configure phone number authentication with SMS verification: -```java +```kotlin +val phoneProvider = AuthProvider.Phone( + // Optional: Default phone number in international format + defaultNumber = "+15551234567", -ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder() - .setAndroidPackageName(/*yourPackageName*/, /*installIfNotAvailable*/true, /*minimumVersion*/null) - .setHandleCodeInApp(true) - .setUrl("https://google.com") // This URL needs to be allowlisted - .build(); + // Optional: Default country code (ISO alpha-2 format) + defaultCountryCode = "US", -Intent signInIntent = - AuthUI.getInstance() - .createSignInIntentBuilder() - .setAvailableProviders(Arrays.asList( - new AuthUI.IdpConfig.EmailBuilder().enableEmailLinkSignIn() - .setActionCodeSettings(actionCodeSettings).build()) - .build(); -``` + // Optional: Allowed countries + allowedCountries = listOf("US", "CA", "GB"), -If you want to catch the link in a specific activity, please follow the steps outlined [here](https://firebase.google.com/docs/auth/android/email-link-auth). -Otherwise, the link will redirect to your launcher activity. + // Optional: SMS code length (default: 6) + smsCodeLength = 6, -Once you catch the deep link, you will need to call verify that we can handle it for you. If we can, you need to then -pass it to us via `setEmailLink`. + // Optional: Timeout for SMS delivery in seconds (default: 60) + timeout = 60L, -```java -if (AuthUI.canHandleIntent(getIntent())) { - if (getIntent().getExtras() == null) { - return; - } - String link = getIntent().getData().toString(); - if (link != null) { - Intent signInIntent = - AuthUI.getInstance() - .createSignInIntentBuilder() - .setEmailLink(link) - .setAvailableProviders(getAvailableProviders()) - .build(); - signInLauncher.launch(signInIntent); - } + // Optional: Enable instant verification (default: true) + isInstantVerificationEnabled = true +) + +val configuration = authUIConfiguration { + providers = listOf(phoneProvider) } ``` -#### Cross device support +### Google Sign-In -We support cross device email link sign in for the normal flows. It is not supported with anonymous user upgrade. By default, -cross device support is enabled. You can disable it by calling `setForceSameDevice` on the `EmailBuilder` instance. +Configure Google Sign-In with optional scopes and server client ID: -##### Adding a ToS and privacy policy +```kotlin +val googleProvider = AuthProvider.Google( + // Required: Scopes to request + scopes = listOf("https://www.googleapis.com/auth/drive.file"), -A terms of service URL and privacy policy URL are generally required: + // Optional: Server client ID for backend authentication + serverClientId = "YOUR_SERVER_CLIENT_ID.apps.googleusercontent.com", -```java -Intent signInIntent = - AuthUI.getInstance() - .createSignInIntentBuilder() - .setAvailableProviders(...) - .setTosAndPrivacyPolicyUrls("https://superapp.example.com/terms-of-service.html", - "https://superapp.example.com/privacy-policy.html") - .build(); + // Optional: Custom OAuth parameters + customParameters = mapOf("prompt" to "select_account") +) + +val configuration = authUIConfiguration { + providers = listOf(googleProvider) +} ``` -##### Credential Manager +### Facebook Login -By default, FirebaseUI uses [Credential Manager](https://developer.android.com/identity/sign-in/credential-manager) -to store the user's credentials and automatically sign users into your app on subsequent attempts. -Using Credential Manager is recommended to provide the best user experience, but in some cases you may want -to disable Credential Manager for testing or development. To disable Credential Manager, you can use the -`setCredentialManagerEnabled` method when building your sign-in Intent: +Configure Facebook Login with optional permissions: -```java -Intent signInIntent = - AuthUI.getInstance() - .createSignInIntentBuilder() - .setCredentialManagerEnabled(false) - .build(); -``` +```kotlin +val facebookProvider = AuthProvider.Facebook( + // Optional: Facebook application ID (reads from strings.xml if not provided) + applicationId = "YOUR_FACEBOOK_APP_ID", -##### Phone number authentication customization + // Optional: Permissions to request (default: ["email", "public_profile"]) + scopes = listOf("email", "public_profile", "user_friends"), -###### Setting a default phone number -When using the phone verification provider and the number is known in advance, it is possible to -provide a default phone number (in international format) that will be used to prepopulate the -country code and phone number input fields. The user is still able to edit the number if desired. + // Optional: Custom OAuth parameters + customParameters = mapOf("display" to "popup") +) -```java -IdpConfig phoneConfigWithDefaultNumber = new IdpConfig.PhoneBuilder() - .setDefaultNumber("+123456789") - .build(); +val configuration = authUIConfiguration { + providers = listOf(facebookProvider) +} ``` -Alternatively, you can set the default country (alpha-2 format) to be shown in the country selector. - -```java -IdpConfig phoneConfigWithDefaultNumber = new IdpConfig.PhoneBuilder() - .setDefaultCountryIso("ca") - .build(); +### Other OAuth Providers + +FirebaseUI supports Twitter, GitHub, Microsoft, Yahoo, and Apple: + +```kotlin +// Twitter +val twitterProvider = AuthProvider.Twitter( + // Required: Custom OAuth parameters + customParameters = mapOf("lang" to "en") +) + +// GitHub +val githubProvider = AuthProvider.Github( + // Optional: Scopes to request (default: ["user:email"]) + scopes = listOf("user:email", "read:user"), + + // Required: Custom OAuth parameters + customParameters = mapOf("allow_signup" to "false") +) + +// Microsoft +val microsoftProvider = AuthProvider.Microsoft( + // Optional: Scopes to request (default: ["openid", "profile", "email"]) + scopes = listOf("openid", "profile", "email", "User.Read"), + + // Optional: Tenant ID for Azure Active Directory + tenant = "YOUR_TENANT_ID", + + // Required: Custom OAuth parameters + customParameters = mapOf("prompt" to "consent") +) + +// Yahoo +val yahooProvider = AuthProvider.Yahoo( + // Optional: Scopes to request (default: ["openid", "profile", "email"]) + scopes = listOf("openid", "profile", "email"), + + // Required: Custom OAuth parameters + customParameters = mapOf("language" to "en-us") +) + +// Apple +val appleProvider = AuthProvider.Apple( + // Optional: Scopes to request (default: ["name", "email"]) + scopes = listOf("name", "email"), + + // Optional: Locale for the sign-in page + locale = "en_US", + + // Required: Custom OAuth parameters + customParameters = mapOf("ui_locales" to "en-US") +) + +val configuration = authUIConfiguration { + providers = listOf( + twitterProvider, + githubProvider, + microsoftProvider, + yahooProvider, + appleProvider + ) +} ``` -It is also possible to set a default country code along with a national number if a specific country -is your app's target audience. This will take precedence over the full default phone number if both -are provided. +### Anonymous Authentication -```java -IdpConfig phoneConfigWithDefaultNumber = new IdpConfig.PhoneBuilder() - .setDefaultNumber("ca", "23456789") - .build(); +Enable anonymous authentication to let users use your app without signing in: + +```kotlin +val configuration = authUIConfiguration { + providers = listOf( + AuthProvider.Anonymous() + ) + + // Enable anonymous user upgrade + isAnonymousUpgradeEnabled = true +} ``` -###### Limiting the list of available countries in the country selector +### Custom OAuth Provider -You can limit the countries shown in the country selector list. By default, all countries are shown. +Support any OAuth provider configured in the Firebase Console: -You can provide a list of countries to allowlist or blocklist. You can populate these lists with -ISO (alpha-2) and E164 formatted country codes. +```kotlin +val lineProvider = AuthProvider.GenericOAuth( + // Required: Provider name + providerName = "LINE", -```java -List allowedCountries = new ArrayList(); -allowedCountries.add("+1"); -allowedCountries.add("gr"); + // Required: Provider ID as configured in Firebase Console + providerId = "oidc.line", -IdpConfig phoneConfigWithAllowedCountries = new IdpConfig.PhoneBuilder() - .setAllowedCountries(allowedCountries) - .build(); -``` -All countries with the country code +1 will be present in the selector as well as Greece ('gr'). + // Required: Scopes to request + scopes = listOf("profile", "openid", "email"), -You may want to exclude a few countries from the list and avoid creating a allowlist with -many countries. You can instead provide a list of countries to blocklist. By doing so, all countries -excluding the ones you provide will be in the selector. + // Required: Custom OAuth parameters + customParameters = mapOf("prompt" to "consent"), -```java -List blockedCountries = new ArrayList(); -blockedCountries.add("+1"); -blockedCountries.add("gr"); + // Required: Button label + buttonLabel = "Sign in with LINE", + + // Optional: Custom button icon + buttonIcon = AuthUIAsset.Resource(R.drawable.ic_line), + + // Optional: Custom button background color + buttonColor = Color(0xFF06C755), + + // Optional: Custom button content color + contentColor = Color.White +) -IdpConfig phoneConfigWithBlockedCountries = new IdpConfig.PhoneBuilder() - .setBlockedCountries(blockedCountries) - .build(); +val configuration = authUIConfiguration { + providers = listOf(lineProvider) +} ``` -The country code selector will exclude all countries with a country code of +1 and Greece ('gr'). +## Usage Patterns + +### High-Level API (Recommended) + +The high-level API provides a complete, opinionated authentication experience with minimal code: + +```kotlin +@Composable +fun AuthenticationScreen() { + val configuration = authUIConfiguration { + providers = listOf( + AuthProvider.Email(), + AuthProvider.Google(), + AuthProvider.Facebook(), + AuthProvider.Phone() + ) + tosUrl = "https://example.com/terms" + privacyPolicyUrl = "https://example.com/privacy" + logo = Icons.Default.Lock + } -Note: You can't provide both a list of countries to allowlist and blocklist. If you do, a runtime -exception will be thrown. + FirebaseAuthScreen( + configuration = configuration, + onSignInSuccess = { result -> + val user = result.user + val isNewUser = result.additionalUserInfo?.isNewUser ?: false + + if (isNewUser) { + // First-time user + navigateToOnboarding() + } else { + // Returning user + navigateToHome() + } + }, + onSignInFailure = { exception -> + when (exception) { + is AuthException.NetworkException -> { + showSnackbar("No internet connection") + } + is AuthException.TooManyRequestsException -> { + showSnackbar("Too many attempts. Please try again later.") + } + else -> { + showSnackbar("Authentication failed: ${exception.message}") + } + } + }, + onSignInCancelled = { + navigateBack() + } + ) +} +``` -This change is purely UI based. We do not restrict users from signing in with their phone number. -They will simply be unable to choose their country in the selector, but there may be another country -sharing the same country code (e.g. US and CA are +1). +### Low-Level API (Advanced) -##### +For maximum control, use the `AuthFlowController`: -### Handling the sign-in response +```kotlin +class AuthActivity : ComponentActivity() { + private lateinit var controller: AuthFlowController -#### Response codes + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) -The authentication flow provides several response codes of which the most common are as follows: -`Activity.RESULT_OK` if a user is signed in, `Activity.RESULT_CANCELED` if the user manually canceled the sign in, -`ErrorCodes.NO_NETWORK` if sign in failed due to a lack of network connectivity, -and `ErrorCodes.UNKNOWN_ERROR` for all other errors. -Typically, the only recourse for most apps if sign in fails is to ask -the user to sign in again later, or proceed with anonymous sign-in if supported. + val authUI = FirebaseAuthUI.getInstance() + val configuration = authUIConfiguration { + providers = listOf(AuthProvider.Email(), AuthProvider.Google()) + } -```java -private void onSignInResult(FirebaseAuthUIAuthenticationResult result) { - IdpResponse response = result.getIdpResponse(); + controller = authUI.createAuthFlow(configuration) - if (result.getResultCode() == RESULT_OK) { - // Successfully signed in - startActivity(SignedInActivity.createIntent(this, response)); - finish(); - } else { - // Sign in failed - if (response == null) { - // User pressed back button - showSnackbar(R.string.sign_in_cancelled); - return; + lifecycleScope.launch { + val state = controller.start() + handleAuthState(state) } + } - if (response.getError().getErrorCode() == ErrorCodes.NO_NETWORK) { - showSnackbar(R.string.no_internet_connection); - return; + private fun handleAuthState(state: AuthState) { + when (state) { + is AuthState.Success -> { + // Successfully signed in + val user = state.result.user + startActivity(Intent(this, MainActivity::class.java)) + finish() + } + is AuthState.Error -> { + // Handle error + AlertDialog.Builder(this) + .setTitle("Authentication Failed") + .setMessage(state.exception.message) + .setPositiveButton("OK", null) + .show() + } + is AuthState.RequiresMfa -> { + // User needs to complete MFA challenge + showMfaChallengeDialog(state.resolver) + } + is AuthState.RequiresEmailVerification -> { + // Email verification needed + showEmailVerificationScreen(state.user) + } + is AuthState.Cancelled -> { + // User cancelled authentication + finish() + } + else -> { + // Handle other states + } } + } - showSnackbar(R.string.unknown_error); - Log.e(TAG, "Sign-in error: ", response.getError()); + override fun onDestroy() { + super.onDestroy() + controller.dispose() } } ``` -Alternatively, you can register a listener for authentication state changes; -see the Firebase Auth documentation to -[get the currently signed-in user](https://firebase.google.com/docs/auth/android/manage-users#get_the_currently_signed-in_user) -and [register an AuthStateListener](https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuth.html#addAuthStateListener(com.google.firebase.auth.FirebaseAuth.AuthStateListener)). +### Custom UI with Slots + +For complete UI control while keeping authentication logic, use content slots: + +```kotlin +@Composable +fun CustomEmailAuth() { + val emailConfig = AuthProvider.Email( + passwordValidationRules = listOf( + PasswordRule.MinimumLength(8), + PasswordRule.RequireDigit + ) + ) + + EmailAuthScreen( + configuration = emailConfig, + onSuccess = { /* ... */ }, + onError = { /* ... */ }, + onCancel = { /* ... */ } + ) { state -> + // Custom UI with full control + when (state.mode) { + EmailAuthMode.SignIn -> { + CustomSignInUI(state) + } + EmailAuthMode.SignUp -> { + CustomSignUpUI(state) + } + EmailAuthMode.ResetPassword -> { + CustomResetPasswordUI(state) + } + } + } +} -Note: if you choose to use an `AuthStateListener`, make sure to unregister it before launching -the FirebaseUI flow and re-register it after the flow returns. FirebaseUI performs auth operations -internally which may trigger the listener before the flow is complete. +@Composable +fun CustomSignInUI(state: EmailAuthContentState) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(24.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = "Welcome Back!", + style = MaterialTheme.typography.headlineLarge + ) + + Spacer(modifier = Modifier.height(32.dp)) + + OutlinedTextField( + value = state.email, + onValueChange = state.onEmailChange, + label = { Text("Email") }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email), + modifier = Modifier.fillMaxWidth() + ) + + Spacer(modifier = Modifier.height(16.dp)) + + OutlinedTextField( + value = state.password, + onValueChange = state.onPasswordChange, + label = { Text("Password") }, + visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), + modifier = Modifier.fillMaxWidth() + ) + + if (state.error != null) { + Text( + text = state.error!!, + color = MaterialTheme.colorScheme.error, + modifier = Modifier.padding(top = 8.dp) + ) + } -#### ID tokens + Spacer(modifier = Modifier.height(24.dp)) + + Button( + onClick = state.onSignInClick, + enabled = !state.isLoading, + modifier = Modifier.fillMaxWidth() + ) { + if (state.isLoading) { + CircularProgressIndicator(modifier = Modifier.size(24.dp)) + } else { + Text("Sign In") + } + } -To retrieve the ID token that the IDP returned, you can extract an `IdpResponse` from the result -Intent. + TextButton(onClick = state.onGoToResetPassword) { + Text("Forgot Password?") + } -```java -private void onSignInResult(FirebaseAuthUIAuthenticationResult result) { - if (result.getResultCode() == RESULT_OK) { - // Successfully signed in - IdpResponse response = result.getIdpResponse(); - startActivity(new Intent(this, WelcomeBackActivity.class) - .putExtra("my_token", response.getIdpToken())); + TextButton(onClick = state.onGoToSignUp) { + Text("Create Account") + } } } ``` -Twitter also returns an AuthToken Secret which can be accessed with `response.getIdpSecret()`. +Similarly, create custom phone authentication UI: + +```kotlin +@Composable +fun CustomPhoneAuth() { + val phoneConfig = AuthProvider.Phone(defaultCountryCode = "US") + + PhoneAuthScreen( + configuration = phoneConfig, + onSuccess = { /* ... */ }, + onError = { /* ... */ }, + onCancel = { /* ... */ } + ) { state -> + when (state.step) { + PhoneAuthStep.EnterPhoneNumber -> { + CustomPhoneNumberInput(state) + } + PhoneAuthStep.EnterVerificationCode -> { + CustomVerificationCodeInput(state) + } + } + } +} +``` -#### User metadata +## Multi-Factor Authentication -While `IdpResponse` provides user information about a specific sign-in instance, it is usually -preferable to find the user name, email, and other metadata directly from the currently signed-in -`FirebaseUser` instance (`auth.getCurrentUser()`). For example, you could determine if the user -who just signed in is an existing or new one by comparing the user's creation and last sign-in time: +### MFA Configuration -```java -FirebaseUserMetadata metadata = auth.getCurrentUser().getMetadata(); -if (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp()) { - // The user is new, show them a fancy intro screen! -} else { - // This is an existing user, show them a welcome back screen. +Enable and configure Multi-Factor Authentication: + +```kotlin +val mfaConfig = MfaConfiguration( + // Allowed MFA factors (default: [Sms, Totp]) + allowedFactors = listOf(MfaFactor.Sms, MfaFactor.Totp), + + // Optional: Require MFA enrollment (default: false) + requireEnrollment = false, + + // Optional: Enable recovery codes (default: true) + enableRecoveryCodes = true +) + +val configuration = authUIConfiguration { + providers = listOf(AuthProvider.Email()) + isMfaEnabled = true } ``` -### Sign out - -With the integrations provided by AuthUI, signing out a user is a multi-stage process: +### MFA Enrollment + +Prompt users to enroll in MFA after sign-in: + +```kotlin +@Composable +fun MfaEnrollmentFlow() { + val currentUser = FirebaseAuth.getInstance().currentUser + + if (currentUser != null) { + val mfaConfig = MfaConfiguration( + allowedFactors = listOf(MfaFactor.Sms, MfaFactor.Totp) + ) + + MfaEnrollmentScreen( + user = currentUser, + configuration = mfaConfig, + onEnrollmentComplete = { + Toast.makeText(context, "MFA enrolled successfully!", Toast.LENGTH_SHORT).show() + navigateToHome() + }, + onSkip = { + navigateToHome() + } + ) + } +} +``` -1. The user must be signed out of the FirebaseAuth instance. -1. Credential Manager must be instructed to clear the current user credential state from - all credential providers. -1. If the current user signed in using either Google or Facebook, the user must - also be signed out using the associated API for that authentication method. - This typically ensures that the user will not be automatically signed-in - using the current account when using that authentication method again from - the authentication method picker, which would also prevent the user from - switching between accounts on the same provider. +Or with custom UI: + +```kotlin +MfaEnrollmentScreen( + user = currentUser, + configuration = mfaConfig, + onEnrollmentComplete = { /* ... */ }, + onSkip = { /* ... */ } +) { state -> + when (state.step) { + MfaEnrollmentStep.SelectFactor -> { + CustomFactorSelectionUI(state) + } + MfaEnrollmentStep.ConfigureSms -> { + CustomSmsConfigurationUI(state) + } + MfaEnrollmentStep.ConfigureTotp -> { + CustomTotpConfigurationUI(state) + } + MfaEnrollmentStep.VerifyFactor -> { + CustomVerificationUI(state) + } + MfaEnrollmentStep.ShowRecoveryCodes -> { + CustomRecoveryCodesUI(state) + } + } +} +``` -In order to make this process easier, AuthUI provides a simple `signOut` method -to encapsulate this behavior. The method returns a `Task` which is marked -completed once all necessary sign-out operations are completed: +### MFA Challenge + +Handle MFA challenges during sign-in. The challenge is automatically detected: + +```kotlin +FirebaseAuthScreen( + configuration = configuration, + onSignInSuccess = { result -> + navigateToHome() + }, + onSignInFailure = { exception -> + // MFA challenges are handled automatically by FirebaseAuthScreen + // But you can also handle them manually: + if (exception is AuthException.MfaRequiredException) { + showMfaChallengeScreen(exception.resolver) + } + } +) +``` -```java -public void onClick(View v) { -if (v.getId() == R.id.sign_out) { - AuthUI.getInstance() - .signOut(this) - .addOnCompleteListener(new OnCompleteListener() { - public void onComplete(@NonNull Task task) { - // user is now signed out - startActivity(new Intent(MyActivity.this, SignInActivity.class)); - finish(); +Or handle manually: + +```kotlin +@Composable +fun ManualMfaChallenge(resolver: MultiFactorResolver) { + MfaChallengeScreen( + resolver = resolver, + onChallengeComplete = { assertion -> + // Complete sign-in with the assertion + lifecycleScope.launch { + try { + val result = resolver.resolveSignIn(assertion) + navigateToHome() + } catch (e: Exception) { + showError(e) + } } - }); + }, + onCancel = { + navigateBack() + } + ) +} +``` + +## Theming & Customization + +### Material Theme Integration + +FirebaseUI automatically inherits your app's Material Theme: + +```kotlin +@Composable +fun App() { + MyAppTheme { // Your existing Material3 theme + val configuration = authUIConfiguration { + providers = listOf(AuthProvider.Email()) + theme = AuthUITheme.fromMaterialTheme() // Inherits MyAppTheme + } + + FirebaseAuthScreen( + configuration = configuration, + onSignInSuccess = { /* ... */ } + ) } } ``` -### Deleting accounts +### Custom Theme + +Create a completely custom theme: + +```kotlin +val customTheme = AuthUITheme( + colorScheme = darkColorScheme( + primary = Color(0xFF6200EE), + onPrimary = Color.White, + primaryContainer = Color(0xFF3700B3), + secondary = Color(0xFF03DAC6) + ), + typography = Typography( + displayLarge = TextStyle(fontSize = 57.sp, fontWeight = FontWeight.Bold), + bodyLarge = TextStyle(fontSize = 16.sp) + ), + shapes = Shapes( + small = RoundedCornerShape(4.dp), + medium = RoundedCornerShape(8.dp), + large = RoundedCornerShape(16.dp) + ) +) + +val configuration = authUIConfiguration { + providers = listOf(AuthProvider.Email()) + theme = customTheme +} +``` -With the integrations provided by FirebaseUI Auth, deleting a user is a multi-stage process: +### Provider Button Styling + +Customize individual provider button styling: + +```kotlin +val customProviderStyles = mapOf( + "google.com" to AuthUITheme.ProviderStyle( + backgroundColor = Color.White, + contentColor = Color(0xFF757575), + iconTint = null, // Use original colors + shape = RoundedCornerShape(8.dp), + elevation = 4.dp + ), + "facebook.com" to AuthUITheme.ProviderStyle( + backgroundColor = Color(0xFF1877F2), + contentColor = Color.White, + shape = RoundedCornerShape(12.dp), + elevation = 0.dp + ) +) + +val customTheme = AuthUITheme.Default.copy( + providerStyles = customProviderStyles +) + +val configuration = authUIConfiguration { + providers = listOf(AuthProvider.Google(), AuthProvider.Facebook()) + theme = customTheme +} +``` -1. The user must be deleted from Firebase Auth. -1. Credential Manager must be told to delete any existing Credentials for the user, so - that they are not automatically prompted to sign in with a saved credential in the future. +## Advanced Features -This process is encapsulated by the `AuthUI.delete()` method, which returns a `Task` representing -the entire operation: +### Anonymous User Upgrade -```java -AuthUI.getInstance() - .delete(this) - .addOnCompleteListener(new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - // Deletion succeeded - } else { - // Deletion failed +Seamlessly upgrade anonymous users to permanent accounts: + +```kotlin +// 1. Configure anonymous authentication with upgrade enabled +val configuration = authUIConfiguration { + providers = listOf( + AuthProvider.Anonymous(), + AuthProvider.Email(), + AuthProvider.Google() + ) + isAnonymousUpgradeEnabled = true +} + +// 2. When user wants to create a permanent account, show auth UI +// The library automatically upgrades the anonymous account if one exists +FirebaseAuthScreen( + configuration = configuration, + onSignInSuccess = { result -> + // Anonymous account has been upgraded (if user was anonymous)! + Toast.makeText(this, "Account created!", Toast.LENGTH_SHORT).show() + } +) +``` + +### Email Link Sign-In + +Enable passwordless email link authentication: + +```kotlin +val emailProvider = AuthProvider.Email( + isEmailLinkSignInEnabled = true, + emailLinkActionCodeSettings = actionCodeSettings { + url = "https://example.com/auth" + handleCodeInApp = true + setAndroidPackageName(packageName, true, "12") + }, + passwordValidationRules = emptyList() +) + +val configuration = authUIConfiguration { + providers = listOf(emailProvider) +} +``` + +**High-Level API** - Direct `FirebaseAuthScreen` usage: + +```kotlin +// In your Activity that handles the deep link: +override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val authUI = FirebaseAuthUI.getInstance() + val emailLink = if (authUI.canHandleIntent(intent)) { + intent.data?.toString() + } else { + null + } + + if (emailLink != null) { + setContent { + FirebaseAuthScreen( + configuration = configuration, + emailLink = emailLink, + onSignInSuccess = { result -> + // Email link sign-in successful + }, + onSignInFailure = { exception -> + // Handle error + }, + onSignInCancelled = { + finish() } - } - }); + ) + } + } +} ``` -### Upgrading anonymous users +**Low-Level API** - Using `AuthFlowController`: -#### Enabling anonymous user upgrade +```kotlin +import com.firebase.ui.auth.compose.util.EmailLinkConstants -When an anonymous user signs in or signs up with a permanent account, you want -to be sure that the user can continue with what they were doing before signing up. -For example, an anonymous user might have items in their shopping cart. -At check-out, you prompt the user to sign in or sign up. After the user is -signed in, the user's shopping cart should contain any items the user added -while signed in anonymously. +// In your Activity that handles the deep link: +override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) -To support this behavior, FirebaseUI makes it easy to "upgrade" an anonymous -account to a permanent account. To do so, simply call `enableAnonymousUsersAutoUpgrade()` -when you configure the sign-in UI (this option is disabled by default). + val authUI = FirebaseAuthUI.getInstance() + val emailLink = if (authUI.canHandleIntent(intent)) { + intent.data?.toString() + } else { + null + } -For example: -```java -Intent signInIntent = - AuthUI.getInstance() - .createSignInIntentBuilder() - .enableAnonymousUsersAutoUpgrade() - ... - .build(); + if (emailLink != null) { + val controller = authUI.createAuthFlow(configuration) + val intent = controller.createIntent(this).apply { + putExtra(EmailLinkConstants.EXTRA_EMAIL_LINK, emailLink) + } + authLauncher.launch(intent) + } +} + +// Handle result +private val authLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() +) { result -> + when (result.resultCode) { + Activity.RESULT_OK -> { + // Email link sign-in successful + } + Activity.RESULT_CANCELED -> { + // Handle error or cancellation + } + } +} ``` -With this enabled, FirebaseUI will link the credential on sign-in with the anonymous account -using Firebase Auth's `linkWithCredential` method: -```java -FirebaseAuth.getInstance().getCurrentUser().linkWithCredential(permanentCredential); +Add the intent filter to your `AndroidManifest.xml`: + +```xml + + + + + + ``` -#### Handling anonymous user upgrade merge conflicts +### Password Validation Rules + +Enforce custom password requirements: + +```kotlin +val emailProvider = AuthProvider.Email( + emailLinkActionCodeSettings = null, + minimumPasswordLength = 10, + passwordValidationRules = listOf( + PasswordRule.MinimumLength(10), + PasswordRule.RequireUppercase, + PasswordRule.RequireLowercase, + PasswordRule.RequireDigit, + PasswordRule.RequireSpecialCharacter, + PasswordRule.Custom( + regex = Regex("^(?!.*password).*$"), + errorMessage = "Password cannot contain the word 'password'" + ) + ) +) +``` -There is an issue when an anonymous user tries to upgrade to an existing Firebase user. +### Credential Manager Integration -For example, a user may have previously signed up with a Google credential on a different device. -If they are signed in anonymously and they attempt to upgrade with the existing Google account, -a `FirebaseAuthUserCollisionException` will be thrown by Firebase Auth as an existing user -cannot be linked to another existing user. No two users can share the same credential. In this case, -we need to merge the data from both users before we can upgrade the anonymous user. +FirebaseUI automatically integrates with Android's Credential Manager API to save and retrieve credentials. This enables: -The process of storing the anonymous users data, signing in with the credential, and copying the -data over to the existing account is left to the developer. +- **Automatic sign-in** for returning users +- **One-tap sign-in** across apps +- **Secure credential storage** -When linking is unsuccessful due to user collision, an error with code -`ErrorCodes.ANONYMOUS_UPGRADE_MERGE_CONFLICT` will be returned to the callback of your `ActivityResultLauncher`. A valid -non-anonymous credential can be obtained from the `IdpResponse` via `getCredentialForLinking()`. +Credential Manager is enabled by default. To disable: -**Example:** -```java -private void onSignInResult(FirebaseAuthUIAuthenticationResult result) { - IdpResponse response = result.getIdpResponse(); +```kotlin +val configuration = authUIConfiguration { + providers = listOf(AuthProvider.Email()) + isCredentialManagerEnabled = false +} +``` - if (result.getResultCode() == RESULT_OK) { - // Successfully signed in - // ... - } else { - // Sign in failed - if (response.getError().getErrorCode() == ErrorCodes.ANONYMOUS_UPGRADE_MERGE_CONFLICT) { - // Store relevant anonymous user data - ... - // Get the non-anonymous credential from the response - AuthCredential nonAnonymousCredential = response.getCredentialForLinking(); - // Sign in with credential - FirebaseAuth.getInstance().signInWithCredential(nonAnonymousCredential) - .addOnSuccessListener(new OnSuccessListener() { - @Override - public void onSuccess(AuthResult result) { - // Copy over anonymous user data to signed in user - ... +### Sign Out & Account Deletion + +**Sign Out:** + +```kotlin +@Composable +fun SettingsScreen() { + val context = LocalContext.current + val authUI = remember { FirebaseAuthUI.getInstance() } + + Button( + onClick = { + lifecycleScope.launch { + authUI.signOut(context) + // User is signed out, navigate to auth screen + navigateToAuth() + } + } + ) { + Text("Sign Out") + } +} +``` + +**Delete Account:** + +```kotlin +Button( + onClick = { + lifecycleScope.launch { + try { + authUI.delete(context) + // Account deleted successfully + navigateToAuth() + } catch (e: Exception) { + when (e) { + is FirebaseAuthRecentLoginRequiredException -> { + // User needs to reauthenticate + showReauthenticationDialog() + } + else -> { + showError("Failed to delete account: ${e.message}") } - }); + } + } } } - updateUI(); +) { + Text("Delete Account") } ``` -### Custom Layout +## Localization -The first screen shown in most cases is the auth method picker screen, where the user selects -from a list of authentication methods. While customization in other screens of FirebaseUI is -limited to themes, this screen can be fully customized with your own XML layout. +FirebaseUI includes default English strings. To add custom localization: -To customize the auth method picker screen, build an `AuthMethodPickerLayout` object and pass -it to the `SignInIntentBuilder` before launching the AuthUI flow: +```kotlin +class SpanishStringProvider(context: Context) : AuthUIStringProvider { + override fun signInWithEmail() = "Iniciar sesión con correo" + override fun signInWithGoogle() = "Iniciar sesión con Google" + override fun signInWithFacebook() = "Iniciar sesión con Facebook" + override fun invalidEmail() = "Correo inválido" + override fun weakPassword() = "Contraseña débil" + // ... implement all other required methods +} -```java -// You must provide a custom layout XML resource and configure at least one -// provider button ID. It's important that that you set the button ID for every provider -// that you have enabled. -AuthMethodPickerLayout customLayout = new AuthMethodPickerLayout - .Builder(R.layout.your_custom_layout_xml) - .setGoogleButtonId(R.id.bar) - .setEmailButtonId(R.id.foo) - // ... - .setTosAndPrivacyPolicyId(R.id.baz) - .build(); - -Intent signInIntent = - AuthUI.getInstance(this).createSignInIntentBuilder() - // ... - .setAuthMethodPickerLayout(customLayout) - .build(); +val configuration = authUIConfiguration { + providers = listOf(AuthProvider.Email()) + stringProvider = SpanishStringProvider(context) + locale = Locale("es", "ES") +} ``` -### Strings - -Ensure an `app_name` resource is defined your `strings.xml` file like so: +Or override individual strings in your `strings.xml`: ```xml - My App - + + Sign in with Google + Sign in with Email + Invalid email address + ``` -If you wish to change other strings in the UI, the existing strings can be overridden -by name in your application. See the module's [strings.xml](src/main/res/values/strings.xml) file -and simply redefine a string to change it: +## Error Handling -```xml - - - Creating your shiny new account... - +FirebaseUI provides a comprehensive exception hierarchy: + +```kotlin +FirebaseAuthScreen( + configuration = configuration, + onSignInFailure = { exception -> + when (exception) { + is AuthException.NetworkException -> { + showSnackbar("No internet connection. Please check your network.") + } + is AuthException.InvalidCredentialsException -> { + showSnackbar("Invalid email or password.") + } + is AuthException.UserNotFoundException -> { + showSnackbar("No account found with this email.") + } + is AuthException.WeakPasswordException -> { + showSnackbar("Password is too weak. Please use a stronger password.") + } + is AuthException.EmailAlreadyInUseException -> { + showSnackbar("An account already exists with this email.") + } + is AuthException.TooManyRequestsException -> { + showSnackbar("Too many attempts. Please try again later.") + } + is AuthException.MfaRequiredException -> { + // Handled automatically by FirebaseAuthScreen + // or show custom MFA challenge + } + is AuthException.AccountLinkingRequiredException -> { + // Account needs to be linked + showAccountLinkingDialog(exception) + } + is AuthException.AuthCancelledException -> { + // User cancelled the flow + navigateBack() + } + is AuthException.UnknownException -> { + showSnackbar("An unexpected error occurred: ${exception.message}") + Log.e(TAG, "Auth error", exception) + } + } + } +) +``` + +Use the `ErrorRecoveryDialog` for automatic error handling: + +```kotlin +var errorState by remember { mutableStateOf(null) } + +errorState?.let { error -> + ErrorRecoveryDialog( + error = error, + onRetry = { + // Retry the authentication + errorState = null + retryAuthentication() + }, + onDismiss = { + errorState = null + }, + onRecover = { exception -> + // Custom recovery logic for specific errors + when (exception) { + is AuthException.AccountLinkingRequiredException -> { + linkAccounts(exception) + } + } + } + ) +} ``` -**Note:** String resource names aren't considered part of the public API and might -therefore change and break your app between library updates. We recommend looking -at a diff of the `strings.xml` file before updating FirebaseUI. +## Migration Guide + +### From FirebaseUI Auth 9.x (View-based) -## OAuth scope customization +The new Compose library has a completely different architecture. Here's how to migrate: -### Google -By default, FirebaseUI requests the `email` and `profile` scopes when using Google Sign-In. If you -would like to request additional scopes from the user, call `setScopes` on the -`AuthUI.IdpConfig.GoogleBuilder` when initializing FirebaseUI. +**Old (9.x - View/Activity based):** ```java -// For a list of all scopes, see: -// https://developers.google.com/identity/protocols/googlescopes -AuthUI.IdpConfig googleIdp = new AuthUI.IdpConfig.GoogleBuilder() - .setScopes(Arrays.asList(Scopes.GAMES)) - .build(); +// Old approach with startActivityForResult +Intent signInIntent = AuthUI.getInstance() + .createSignInIntentBuilder() + .setAvailableProviders(Arrays.asList( + new AuthUI.IdpConfig.EmailBuilder().build(), + new AuthUI.IdpConfig.GoogleBuilder().build() + )) + .setTheme(R.style.AppTheme) + .build(); -Intent signInIntent = - AuthUI.getInstance() - .createSignInIntentBuilder() - .setAvailableProviders(Arrays.asList(googleIdp, ...)) - .build(); +signInLauncher.launch(signInIntent); ``` -### Facebook +**New (10.x - Compose based):** -By default, FirebaseUI requests the `email` and `public_profile` permissions when initiating -Facebook Login. If you would like to request additional permissions from the user, call -`setPermissions` on the `AuthUI.IdpConfig.FacebookBuilder` when initializing FirebaseUI. +```kotlin +// New approach with Composable +val configuration = authUIConfiguration { + providers = listOf( + AuthProvider.Email(), + AuthProvider.Google() + ) + theme = AuthUITheme.fromMaterialTheme() +} -```java -// For a list of permissions see: -// https://developers.facebook.com/docs/facebook-login/permissions +FirebaseAuthScreen( + configuration = configuration, + onSignInSuccess = { result -> /* ... */ }, + onSignInFailure = { exception -> /* ... */ }, + onSignInCancelled = { /* ... */ } +) +``` -AuthUI.IdpConfig facebookIdp = new AuthUI.IdpConfig.FacebookBuilder() - .setPermissions(Arrays.asList("user_friends")) - .build(); +**Key Changes:** -Intent signInIntent = - AuthUI.getInstance() - .createSignInIntentBuilder() - .setAvailableProviders(Arrays.asList(facebookIdp, ...)) - .build(); -``` +1. **Pure Compose** - No more Activities or Intents, everything is Composable +2. **Configuration DSL** - Use `authUIConfiguration {}` instead of `createSignInIntentBuilder()` +3. **Provider Builders** - `AuthProvider.Email()` instead of `IdpConfig.EmailBuilder().build()` +4. **Callbacks** - Direct callback parameters instead of `ActivityResultLauncher` +5. **Theming** - `AuthUITheme` instead of `R.style` theme resources +6. **State Management** - Reactive `Flow` instead of `AuthStateListener` + +**Migration Checklist:** + +- [ ] Update dependency to `firebase-ui-auth:10.0.0` +- [ ] Convert Activities to Composables +- [ ] Replace Intent-based flow with `FirebaseAuthScreen` +- [ ] Update configuration from builder pattern to DSL +- [ ] Replace theme resources with `AuthUITheme` +- [ ] Update error handling from result codes to `AuthException` +- [ ] Remove `ActivityResultLauncher` and use direct callbacks +- [ ] Update sign-out/delete to use suspend functions + +For a complete migration example, see the [migration guide](MIGRATION.md). + +--- + +## Contributing + +Contributions are welcome! Please read our [contribution guidelines](../CONTRIBUTING.md) before submitting PRs. + +## License + +FirebaseUI Auth is available under the [Apache 2.0 license](../LICENSE). -### Twitter +## Support -Twitter permissions can only be configured through [Twitter's developer console](https://apps.twitter.com/). +- [Firebase Documentation](https://firebase.google.com/docs/auth) +- [GitHub Issues](https://github.com/firebase/FirebaseUI-Android/issues) +- [Stack Overflow](https://stackoverflow.com/questions/tagged/firebaseui) diff --git a/auth/demo.gif b/auth/demo.gif index 9d844015cc82a2e4d325715992c4503d032bf680..4ef17889013f4656ce0b61c3cbaed3802bc32d07 100644 GIT binary patch delta 17683378 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
BqOl;nXWs-I`C4 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

^wUe-&8gGO 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%0Di4rw~U2Qe0D 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

@z~-dJ?S#)#w9CZQ&LUiYytoXz%(5WQ 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

xHWl^pr2E* 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�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

%Lj}pjU_6G=L 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

H?=1qJ_b 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

UD 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 z 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

=R3l9TWw%{-nR_>0dFQ1!UI40dF4JcD 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�Uy(PfMLR)~2Y|B(-*GAA&J$%8N7+ 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

DR(;Kb}g2<2D$O!_;mt4vDyU3wD$)mi zqfvh4DSNVaHp3}|#i=`;cfFzbL=7+QP;%ZxBg;x(aE!vz0zl z8cBpB>*t~V>7{-{oc_d@elzWo>ZkrFfd8K7Bc|(1PIj}N>wj;4>~(&F%O31a9F>#a z2;Cm*dFVjH-r=GigHd>c--qV){iyMM@BN= zA^-8iSMqz@(Gx!@jpgtmW_%1k^F3dDCm-{j(tI5}G9o|n%WB;^$y{hXr*KJ#rqj~~02R;4C{rKDe;U#|k;XnN+zB>(g z(`Po{5gf;bc<=#2fWUzQNDv%o@L)mzgbEKPY$)*ILw|@AD_V@m5TnM08zpAsXb}K_ zjvqZM&SFCKUw*8v+?OC~T-P%2A`E7RT5-XL97lmoIdl+#~eo%6mGmUDamu zl{crYK~OTizI?lwg{P zW{^Y%;AE6#zR6>kx}EfYC6GRC{J^8cj!+v0kvqO+C7>R zqZk5bpPac}`rf1vfmor3o_-2ysG?p8C#i9k8s@30n#$^^XQKM0hc3E`9j6M}Dq*L$ z>i?SSt|;M3p|8CT8!WMX@>*=N#|o?LhR7~!th2OEOD%#`K6UMXXPQ>Z?V;Xcs$Zs* zf|_l(=57lpxDXNgXS?sMOWu6)mPhZr_D)w3yTrM+?YH7qt1Z9+4@_{u1|N)Y!U`|U zaKjE0nBlY1KJ2N8Nog4;#&lYlYQ{;5sqvT}pE?r&8paAM$EcMYA=X|&2a|41~_OMl!nlRRI2bCM+RIjFl` z6Q{4El!mP+q&rC(sn}<$-4ohto82wA{mNY+$`s#?ciwvM&3E5^{|$KHf}b?^;Bo)| zd-%CytGhVZ#`%jVwu^&TZ{?q=XL)(=9#yX40bA;M=%SB*PI~F4pN@L!(*g@^vyey3 ztm?F}ZfI?{m7MnN72OtR;UMvTPF5RI2ZhZ9{A%Fd? z%wtb|rp`ORDw`9FFF?ynnLqydeX749`{kdX5c%hRe76V&T&wMIC~ z(Q$Mfluzzh#{lMWfM4rl9DkU`mc=hn;~V7opw%)&8nS$g3?v}|*+`S5kt36AV@4{u zAxUcTl94Q=CjmLcP)3iDbKK1zO13h>PpQgyW-^uYR3kk}c`SC~(^>kgq@Q59O2ip3Tp)t~XFXAA zPmQSapzA!PB^A0!h;nkG60ImDBYIJaX4Im858bFoFXB#$6mFsWlxIm9deBxH^rS2$ zsY@r)&NAkULj8nkNn@H%o7R-3I_)XvP+BWdiZelEd`&k2chqt!HK|M;s#803L83I( zhf@vXQ?H8EtZH?uTDBP*m=xONn;rR=C-Q;OJq9#*l5#Ux`N>)6O*bg`0ED^W%o*t)hfvxJ3f zXEl3QpssbVr1h*_ISbB;L{?$T9IIn<{swIV~+{QM*~5O1HUx)a9p7tJ~1&@-tWZ^lR*JYF+JSSFooQZ(}EW zUX4-~y^v*ZWjUH&i{`S5pi8cOp?hEFem0)qRjL`q+ur~$_qyT5u7LXrQqj&%sJ@*F zS|5~DPyu(G6He_?8BAduHW-Ooj4B#2Y~c!Dn8O<`v58NN;uNcR#Vl^Iiy=mTRSj?R z!KwxEh=-NPL+aS7pxkkedko|s3mK6__HmJeyx;PgmZh8OoKAlHT;~o}$#Gq;dgJR+ zE5o8RaGCSIy8JEt~aAd+Lql zntyoXAn*B(Yb|Nb;x^ZRFW&W8Eskx9V|?ivPkOO?`}CbV-Nq2Fy4A0a^{i`s>s)8J zw3Y7EYG)kmWH0%}StE9)mmTTFqBXqs)f&D!ROar*Xw7LZ@8jSc=8$_z+ME9Gs(9SO z%?^0sY1nl>8$9uhZ@l9l5BbPTe)89pxXq1@&A+ex?31JQO;=* zGU9#W>Q+#?_ah>{ik|SPF}tj#7bqC%5!L6h)_PtO0&)A;h zQ-prtV`KOR-+BLkh+m-!Mc97;_<#I2fB{H=G9-Y+cYwmQd=2P;4+wz~D1j50aF#bx zGNw(tS3s