Skip to content
Open

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,25 @@ import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.animation.slideInHorizontally
import androidx.compose.animation.slideOutHorizontally
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.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.PlainTooltip
import androidx.compose.material3.ShapeDefaults
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TooltipAnchorPosition
import androidx.compose.material3.TooltipBox
import androidx.compose.material3.TooltipDefaults
import androidx.compose.material3.rememberTooltipState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
Expand All @@ -24,6 +33,7 @@ import androidx.compose.ui.unit.dp
import com.firebase.ui.auth.AuthException
import com.firebase.ui.auth.AuthState
import com.firebase.ui.auth.FirebaseAuthUI
import com.firebase.ui.auth.configuration.AuthUITransitions
import com.firebase.ui.auth.configuration.PasswordRule
import com.firebase.ui.auth.configuration.authUIConfiguration
import com.firebase.ui.auth.configuration.auth_provider.AuthProvider
Expand All @@ -42,12 +52,24 @@ class HighLevelApiDemoActivity : ComponentActivity() {
val authUI = FirebaseAuthUI.getInstance()
val emailLink = intent.getStringExtra(EmailLinkConstants.EXTRA_EMAIL_LINK)

val customTheme = AuthUITheme.Default.copy(
providerButtonShape = ShapeDefaults.ExtraLarge
)

val configuration = authUIConfiguration {
context = applicationContext
theme = customTheme
logo = AuthUIAsset.Resource(R.drawable.firebase_auth)
tosUrl = "https://policies.google.com/terms"
privacyPolicyUrl = "https://policies.google.com/privacy"
isAnonymousUpgradeEnabled = false
isMfaEnabled = false
transitions = AuthUITransitions(
enterTransition = { slideInHorizontally { it } },
exitTransition = { slideOutHorizontally { -it } },
popEnterTransition = { slideInHorizontally { -it } },
popExitTransition = { slideOutHorizontally { it } }
)
providers {
provider(AuthProvider.Anonymous)
provider(
Expand Down Expand Up @@ -178,12 +200,14 @@ class HighLevelApiDemoActivity : ComponentActivity() {
}
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun AppAuthenticatedContent(
state: AuthState,
uiContext: AuthSuccessUiContext
) {
val stringProvider = uiContext.stringProvider
val configuration = uiContext.configuration
when (state) {
is AuthState.Success -> {
val user = uiContext.authUI.getCurrentUser()
Expand Down Expand Up @@ -211,8 +235,25 @@ private fun AppAuthenticatedContent(
textAlign = TextAlign.Center
)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = uiContext.onManageMfa) {
Text(stringProvider.manageMfaAction)
TooltipBox(
positionProvider = TooltipDefaults.rememberTooltipPositionProvider(
TooltipAnchorPosition.Above
),
tooltip = {
PlainTooltip {
Text(stringProvider.mfaDisabledTooltip)
}
},
state = rememberTooltipState(
initialIsVisible = !configuration.isMfaEnabled
)
) {
Button(
onClick = uiContext.onManageMfa,
enabled = configuration.isMfaEnabled
) {
Text(stringProvider.manageMfaAction)
}
}
Spacer(modifier = Modifier.height(8.dp))
Button(onClick = uiContext.onSignOut) {
Expand Down
35 changes: 32 additions & 3 deletions app/src/main/java/com/firebaseui/android/demo/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ class MainActivity : ComponentActivity() {
},
onCustomSlotsClick = {
startActivity(Intent(this, CustomSlotsThemingDemoActivity::class.java))
}
},
isEmulatorMode = USE_AUTH_EMULATOR
)
}
}
Expand All @@ -105,7 +106,8 @@ class MainActivity : ComponentActivity() {
fun ChooserScreen(
onHighLevelApiClick: () -> Unit,
onLowLevelApiClick: () -> Unit,
onCustomSlotsClick: () -> Unit
onCustomSlotsClick: () -> Unit,
isEmulatorMode: Boolean = false
) {
val scrollState = rememberScrollState()

Expand Down Expand Up @@ -133,7 +135,34 @@ fun ChooserScreen(
color = MaterialTheme.colorScheme.onSurfaceVariant
)

Spacer(modifier = Modifier.height(32.dp))
// Emulator Mode Warning
if (isEmulatorMode) {
Card(
modifier = Modifier.fillMaxWidth(),
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.errorContainer
)
) {
Column(
modifier = Modifier.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
Text(
text = "⚠️ Emulator Mode",
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onErrorContainer
)
Text(
text = "Running with Firebase Auth Emulator. Some features like third-party" +
" OAuth providers (Facebook, Twitter, LINE etc.) may not work correctly." +
" Disable Firebase Auth Emulator using" +
" MainActivity.USE_AUTH_EMULATOR = false",
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onErrorContainer
)
}
}
}

// High-Level API Card
Card(
Expand Down
8 changes: 4 additions & 4 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<resources>
<string name="app_name">FirebaseUI Demo</string>

<string name="firebase_web_host" translatable="false">flutterfire-e2e-tests.firebaseapp.com</string>
<string name="firebase_web_host" translatable="false">CHANGE-HERE</string>

<!-- Facebook SDK Configuration -->
<string name="facebook_application_id" translatable="false">128693022464535</string>
<string name="facebook_login_protocol_scheme" translatable="false">fb128693022464535</string>
<string name="facebook_client_token" translatable="false">16dbbdf0cfb309034a6ad98ac2a21688</string>
<string name="facebook_application_id" translatable="false">APP-ID</string>
<string name="facebook_login_protocol_scheme" translatable="false">fbAPP-ID</string>
<string name="facebook_client_token" translatable="false">CHANGE-HERE</string>
</resources>
Loading