Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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,
Expand All @@ -79,27 +84,31 @@ fun AuthProviderButton(
enabled = enabled,
) {
Row(
verticalAlignment = Alignment.CenterVertically
modifier = modifier,
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Start
) {
val providerIcon = providerStyle.icon
if (providerIcon != null) {
val iconTint = providerStyle.iconTint
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,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
Expand Down
Original file line number Diff line number Diff line change
@@ -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<String, String>,
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
)
}
Loading