Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
d16651b
[MS-1166] Initial implementation of the Skip Credential screen
alexandr-simprints Oct 8, 2025
8642b58
[MS-1166] Adding analytical reminder comment
alexandr-simprints Oct 9, 2025
261bec8
[MS-1189] Adding MFID-specific consent text
alexandr-simprints Oct 9, 2025
1b2d76c
Merge branch 'MS-1169-mf-id-implementation-enrol-last-credential-save…
alexandr-simprints Oct 9, 2025
cadde42
Merge branch 'MS-1166-mf-id-implementation-skip-screen' into MS-1189-…
alexandr-simprints Oct 9, 2025
5d37b57
Merge branch 'MS-1169-mf-id-implementation-enrol-last-credential-save…
alexandr-simprints Oct 9, 2025
97da10e
Merge branch 'MS-1166-mf-id-implementation-skip-screen' into MS-1189-…
alexandr-simprints Oct 9, 2025
86233e3
Merge branch 'MS-1169-mf-id-implementation-enrol-last-credential-save…
alexandr-simprints Oct 10, 2025
1f8510a
Merge branch 'MS-1166-mf-id-implementation-skip-screen' into MS-1189-…
alexandr-simprints Oct 10, 2025
11a28c3
Merge branch 'MS-1169-mf-id-implementation-enrol-last-credential-save…
alexandr-simprints Oct 15, 2025
927f18d
[MS-1166] Removing old tests, updating existing tests of ExternalCred…
alexandr-simprints Oct 15, 2025
74d89d7
Merge branch 'MS-1166-mf-id-implementation-skip-screen' into MS-1189-…
alexandr-simprints Oct 15, 2025
5d1e59e
[MS-1189] Adding test coverage for updated MFID consent wording
alexandr-simprints Oct 15, 2025
b562fb6
[MS-1189] Removing outdated comments
alexandr-simprints Oct 20, 2025
21193e0
Merge pull request #1409 from Simprints/MS-1189-md-id-consent-update
alexandr-simprints Oct 20, 2025
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 @@ -82,20 +82,23 @@ internal class ConsentViewModel @Inject constructor(
selectedTabIndex: Int,
): ConsentViewState {
val allowParentalConsent = projectConfig.consent.allowParentalConsent
val isMultiFactorIdEnabled = projectConfig.multifactorId?.allowedExternalCredentials?.isNotEmpty() ?: false

return ConsentViewState(
showLogo = projectConfig.consent.displaySimprintsLogo,
showParentalConsent = allowParentalConsent,
consentTextBuilder = GeneralConsentTextHelper(
projectConfig.consent,
projectConfig.general.modalities,
consentType,
config = projectConfig.consent,
modalities = projectConfig.general.modalities,
consentType = consentType,
isMultiFactorIdEnabled = isMultiFactorIdEnabled,
),
parentalTextBuilder = if (allowParentalConsent) {
ParentalConsentTextHelper(
projectConfig.consent,
projectConfig.general.modalities,
consentType,
config = projectConfig.consent,
modalities = projectConfig.general.modalities,
consentType = consentType,
isMultiFactorIdEnabled = isMultiFactorIdEnabled,
)
} else {
null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,21 @@ internal data class GeneralConsentTextHelper(
private val config: ConsentConfiguration,
private val modalities: List<Modality>,
private val consentType: ConsentType,
private val isMultiFactorIdEnabled: Boolean,
) {
// TODO All the `getString(id).format(arg,arg)` calls should be `getString(id,arg,arg)` one strings are fixed

// First argument in consent text should always be program name, second is modality specific access/use case text
fun assembleText(context: Context) = StringBuilder()
.apply {
val modalityUseCase = getModalitySpecificUseCaseText(context, modalities)
val modalityAccess = getModalitySpecificAccessText(context, modalities)
val modalityAccess =
getModalitySpecificAccessText(context, modalities) + getMultiFactorIdAccessText(context, isMultiFactorIdEnabled)

filterAppRequestForConsent(context, consentType, config, modalityUseCase)
filterForDataSharingOptions(context, config, modalityUseCase, modalityAccess)
val requestModalityUseCase = modalityUseCase + getMultiFactorIdUseCaseText(context, isMultiFactorIdEnabled)
val dataSharingModalityUseCase = modalityUseCase + getMultiFactorIdSharingText(context, isMultiFactorIdEnabled)

filterAppRequestForConsent(context, consentType, config, requestModalityUseCase)
filterForDataSharingOptions(context, config, dataSharingModalityUseCase, modalityAccess)
}.toString()

private fun StringBuilder.filterAppRequestForConsent(
Expand Down Expand Up @@ -134,4 +138,42 @@ internal data class GeneralConsentTextHelper(
Modality.FACE -> context.getString(R.string.consent_biometrics_access_face)
Modality.FINGERPRINT -> context.getString(R.string.consent_biometrics_access_fingerprint)
}

private fun getMultiFactorIdUseCaseText(
context: Context,
isMultiFactorIdEnabled: Boolean,
): String = if (isMultiFactorIdEnabled) {
listOf(
",",
context.getString(R.string.consent_biometric_concat_modalities),
context.getString(R.string.consent_credentials_general),
).joinToString(separator = " ")
} else {
""
}

private fun getMultiFactorIdAccessText(
context: Context,
isMultiFactorIdEnabled: Boolean,
): String = if (isMultiFactorIdEnabled) {
listOf(
",",
context.getString(R.string.consent_credentials_access),
).joinToString(separator = " ")
} else {
""
}

private fun getMultiFactorIdSharingText(
context: Context,
isMultiFactorIdEnabled: Boolean,
): String = if (isMultiFactorIdEnabled) {
listOf(
",",
context.getString(R.string.consent_biometric_concat_modalities),
context.getString(R.string.consent_credentials_your_id),
).joinToString(separator = " ")
} else {
""
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,20 @@ internal data class ParentalConsentTextHelper(
private val config: ConsentConfiguration,
private val modalities: List<Modality>,
private val consentType: ConsentType,
private val isMultiFactorIdEnabled: Boolean,
) {
// TODO All the `getString(id).format(arg,arg)` calls should be `getString(id,arg,arg)` one strings are fixed

// First argument in consent text should always be program name, second is modality specific access/use case text
fun assembleText(context: Context): String = StringBuilder()
.apply {
val modalityUseCase = getModalitySpecificUseCaseText(context, modalities)
val modalityAccess = getModalitySpecificAccessText(context, modalities)
val modalityAccess =
getModalitySpecificAccessText(context, modalities) + getMultiFactorIdAccessText(context, isMultiFactorIdEnabled)

filterAppRequestForParentalConsent(context, consentType, config, modalityUseCase)
extractDataSharingOptions(context, config, modalityUseCase, modalityAccess)
val requestModalityUseCase = modalityUseCase + getMultiFactorIdUseCaseText(context, isMultiFactorIdEnabled)
val dataSharingModalityUseCase = modalityUseCase + getMultiFactorIdSharingText(context, isMultiFactorIdEnabled)
filterAppRequestForParentalConsent(context, consentType, config, requestModalityUseCase)
extractDataSharingOptions(context, config, dataSharingModalityUseCase, modalityAccess)
}.toString()

private fun StringBuilder.filterAppRequestForParentalConsent(
Expand Down Expand Up @@ -136,4 +139,42 @@ internal data class ParentalConsentTextHelper(
Modality.FINGERPRINT -> context.getString(R.string.consent_biometrics_access_fingerprint)
else -> ""
}

private fun getMultiFactorIdAccessText(
context: Context,
isMultiFactorIdEnabled: Boolean,
): String = if (isMultiFactorIdEnabled) {
listOf(
",",
context.getString(R.string.consent_credentials_parental_access),
).joinToString(separator = " ")
} else {
""
}

private fun getMultiFactorIdUseCaseText(
context: Context,
isMultiFactorIdEnabled: Boolean,
): String = if (isMultiFactorIdEnabled) {
listOf(
",",
context.getString(R.string.consent_biometric_concat_modalities),
context.getString(R.string.consent_credentials_parental_general),
).joinToString(separator = " ")
} else {
""
}

private fun getMultiFactorIdSharingText(
context: Context,
isMultiFactorIdEnabled: Boolean,
): String = if (isMultiFactorIdEnabled) {
listOf(
",",
context.getString(R.string.consent_biometric_concat_modalities),
context.getString(R.string.consent_credentials_parental_your_id),
).joinToString(separator = " ")
} else {
""
}
}
Loading