[PM-6702] Add fromEmail parameter from email URL AppLink

This commit is contained in:
André Bispo
2024-06-28 17:28:49 +01:00
parent 75c2f0e97e
commit 68eb8b716c
7 changed files with 27 additions and 11 deletions

View File

@@ -11,14 +11,16 @@ import com.x8bit.bitwarden.data.platform.repository.model.Environment
fun Intent.getCompleteRegistrationDataIntentOrNull(): CompleteRegistrationData? {
val uri = data ?: return null
val host = uri.host ?: return null
val email = uri?.getQueryParameter("email") ?: return null
val verificationToken = uri.getQueryParameter("verificationtoken") ?: return null
if (!host.contains("bitwarden.eu") && !host.contains("bitwarden.com")) return null
if (uri.path != "finish-signup") return null
val email = uri?.getQueryParameter("email") ?: return null
val verificationToken = uri.getQueryParameter("token") ?: return null
val fromEmail = uri.getBooleanQueryParameter("fromEmail", true)
val region = if (host.contains("bitwarden.eu")) Environment.Type.EU else Environment.Type.US
return CompleteRegistrationData(
email = email,
verificationToken = verificationToken,
fromEmail = fromEmail,
region = region
)
}

View File

@@ -14,5 +14,6 @@ import kotlinx.parcelize.Parcelize
data class CompleteRegistrationData(
val email: String,
val verificationToken: String,
val fromEmail: Boolean,
val region: Environment.Type
) : Parcelable

View File

@@ -57,10 +57,12 @@ fun NavGraphBuilder.authGraph(navController: NavHostController) {
)
startRegistrationDestination(
onNavigateBack = { navController.popBackStack() },
// TODO check necessary parameters
onNavigateToCompleteRegistration = { emailAddress, verificationToken ->
navController.navigateToCompleteRegistration(emailAddress= emailAddress,
verificationToken = verificationToken )
navController.navigateToCompleteRegistration(
emailAddress= emailAddress,
verificationToken = verificationToken,
fromEmail = false
)
},
onNavigateToCheckEmail = {emailAddress ->
navController.navigateToCheckEmail(emailAddress)

View File

@@ -13,8 +13,9 @@ import com.x8bit.bitwarden.ui.platform.base.util.composableWithSlideTransitions
private const val EMAIL_ADDRESS: String = "email_address"
private const val VERIFICATION_TOKEN: String = "verification_token"
private const val REGION: String = "region"
private const val FROM_EMAIL: String = "from_email"
private const val COMPLETE_REGISTRATION_PREFIX = "complete_registration"
private const val COMPLETE_REGISTRATION_ROUTE = "$COMPLETE_REGISTRATION_PREFIX/{$EMAIL_ADDRESS}/{$VERIFICATION_TOKEN}/{$REGION}"
private const val COMPLETE_REGISTRATION_ROUTE = "$COMPLETE_REGISTRATION_PREFIX/{$EMAIL_ADDRESS}/{$VERIFICATION_TOKEN}/{$FROM_EMAIL}/{$REGION}"
/**
* Class to retrieve login with device arguments from the [SavedStateHandle].
@@ -23,12 +24,14 @@ private const val COMPLETE_REGISTRATION_ROUTE = "$COMPLETE_REGISTRATION_PREFIX/{
data class CompleteRegistrationArgs(
val emailAddress: String,
val verificationToken: String,
val region: Environment.Type
val fromEmail: Boolean,
val region: Environment.Type?
) {
constructor(savedStateHandle: SavedStateHandle) : this(
emailAddress = checkNotNull(savedStateHandle.get<String>(EMAIL_ADDRESS)),
verificationToken = checkNotNull(savedStateHandle.get<String>(VERIFICATION_TOKEN)),
region = checkNotNull(savedStateHandle.get<Environment.Type>(REGION))
fromEmail = checkNotNull(savedStateHandle.get<Boolean>(FROM_EMAIL)),
region = savedStateHandle.get<Environment.Type>(REGION)
)
}
@@ -38,9 +41,10 @@ data class CompleteRegistrationArgs(
fun NavController.navigateToCompleteRegistration(
emailAddress: String,
verificationToken: String,
fromEmail: Boolean,
region: Environment.Type? = null,
navOptions: NavOptions? = null) {
this.navigate("$COMPLETE_REGISTRATION_PREFIX/$emailAddress/$verificationToken/$region", navOptions)
this.navigate("$COMPLETE_REGISTRATION_PREFIX/$emailAddress/$verificationToken/$fromEmail/$region", navOptions)
}
/**
@@ -55,6 +59,7 @@ fun NavGraphBuilder.completeRegistrationDestination(
arguments = listOf(
navArgument(EMAIL_ADDRESS) { type = NavType.StringType },
navArgument(VERIFICATION_TOKEN) { type = NavType.StringType },
navArgument(FROM_EMAIL) { type = NavType.BoolType },
navArgument(REGION) { type = NavType.EnumType(Environment.Type::class.java) },
),
) {

View File

@@ -60,6 +60,7 @@ class CompleteRegistrationViewModel @Inject constructor(
CompleteRegistrationState(
userEmail = args.emailAddress,
emailVerificationToken = args.verificationToken,
fromEmail = args.fromEmail,
region = args.region,
passwordInput = "",
confirmPasswordInput = "",
@@ -408,7 +409,8 @@ class CompleteRegistrationViewModel @Inject constructor(
data class CompleteRegistrationState(
val userEmail: String,
val emailVerificationToken: String,
val region: Environment.Type,
val fromEmail: Boolean,
val region: Environment.Type?,
val passwordInput: String,
val confirmPasswordInput: String,
val passwordHintInput: String,

View File

@@ -200,6 +200,7 @@ fun RootNavScreen(
navController.navigateToCompleteRegistration(
emailAddress = currentState.email,
verificationToken = currentState.verificationToken,
fromEmail = currentState.fromEmail,
region = currentState.region
)
}

View File

@@ -82,6 +82,7 @@ class RootNavViewModel @Inject constructor(
email = specialCircumstance.completeRegistrationData.email,
verificationToken = specialCircumstance.completeRegistrationData.verificationToken,
region = specialCircumstance.completeRegistrationData.region,
fromEmail = specialCircumstance.completeRegistrationData.fromEmail,
timestamp = specialCircumstance.timestamp
)
}
@@ -128,6 +129,7 @@ class RootNavViewModel @Inject constructor(
email = specialCircumstance.completeRegistrationData.email,
verificationToken = specialCircumstance.completeRegistrationData.verificationToken,
region = specialCircumstance.completeRegistrationData.region,
fromEmail = specialCircumstance.completeRegistrationData.fromEmail,
timestamp = specialCircumstance.timestamp
)
}
@@ -232,6 +234,7 @@ sealed class RootNavState : Parcelable {
data class CompleteOngoingRegistration (
val email: String,
val verificationToken: String,
val fromEmail: Boolean,
val region: Environment.Type,
val timestamp: Timestamp
) : RootNavState()