diff options
4 files changed, 36 insertions, 7 deletions
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt index e2857f96cdf2..83490b899eb0 100644 --- a/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt +++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt @@ -134,6 +134,8 @@ private fun getCredentialOptionInfoList( isAutoSelectable = credentialEntry.isAutoSelectAllowed && credentialEntry.isAutoSelectAllowedFromOption, entryGroupId = credentialEntry.entryGroupId.toString(), + isDefaultIconPreferredAsSingleProvider = + credentialEntry.isDefaultIconPreferredAsSingleProvider, ) ) } @@ -158,6 +160,8 @@ private fun getCredentialOptionInfoList( isAutoSelectable = credentialEntry.isAutoSelectAllowed && credentialEntry.isAutoSelectAllowedFromOption, entryGroupId = credentialEntry.entryGroupId.toString(), + isDefaultIconPreferredAsSingleProvider = + credentialEntry.isDefaultIconPreferredAsSingleProvider, ) ) } @@ -181,6 +185,8 @@ private fun getCredentialOptionInfoList( isAutoSelectable = credentialEntry.isAutoSelectAllowed && credentialEntry.isAutoSelectAllowedFromOption, entryGroupId = credentialEntry.entryGroupId.toString(), + isDefaultIconPreferredAsSingleProvider = + credentialEntry.isDefaultIconPreferredAsSingleProvider, ) ) } diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/CredentialEntryInfo.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/CredentialEntryInfo.kt index a5d4730967a3..9f360965fcf9 100644 --- a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/CredentialEntryInfo.kt +++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/CredentialEntryInfo.kt @@ -42,6 +42,7 @@ class CredentialEntryInfo( val isAutoSelectable: Boolean, val entryGroupId: String, // Used for deduplication, and displayed as the grouping title // "For <value-of-entryGroupId>" on the more-option screen. + val isDefaultIconPreferredAsSingleProvider: Boolean, ) : EntryInfo( providerId, entryKey, diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt index 660db7007224..1fef5226188f 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt @@ -41,6 +41,7 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextLayoutResult @@ -399,6 +400,10 @@ fun PrimarySelectionCardVImpl( ) SheetContainerCard { val preferTopBrandingContent = requestDisplayInfo.preferTopBrandingContent + val singleProviderId = findSingleProviderIdForPrimaryPage( + primaryPageCredentialEntryList, + primaryPageLockedEntryList + ) if (preferTopBrandingContent != null) { item { HeadlineProviderIconAndName( @@ -409,10 +414,6 @@ fun PrimarySelectionCardVImpl( } else { // When only one provider's entries will be displayed on the primary page, display that // provider's icon + name up top. - val singleProviderId = findSingleProviderIdForPrimaryPage( - primaryPageCredentialEntryList, - primaryPageLockedEntryList - ) if (singleProviderId != null) { // First should always work but just to be safe. val providerInfo = providerInfoList.firstOrNull { it.id == singleProviderId } @@ -479,14 +480,17 @@ fun PrimarySelectionCardVImpl( CredentialContainerCard { Column(verticalArrangement = Arrangement.spacedBy(2.dp)) { primaryPageCredentialEntryList.forEach { + val entry = it.sortedCredentialEntryList.first() CredentialEntryRow( - credentialEntryInfo = it.sortedCredentialEntryList.first(), + credentialEntryInfo = entry, onEntrySelected = onEntrySelected, enforceOneLine = true, onTextLayout = { showMoreForTruncatedEntry.value = it.hasVisualOverflow }, hasSingleEntry = hasSingleEntry, + shouldOverrideIcon = entry.isDefaultIconPreferredAsSingleProvider && + (singleProviderId != null), ) } primaryPageLockedEntryList.forEach { @@ -750,18 +754,35 @@ fun CredentialEntryRow( onTextLayout: (TextLayoutResult) -> Unit = {}, // Make optional since the secondary page doesn't care about this value. hasSingleEntry: Boolean? = null, + // For primary page only, if all display entries come from the same provider AND if that + // provider has opted in via isDefaultIconPreferredAsSingleProvider, then we override the + // display icon to the default icon for the given credential type. + shouldOverrideIcon: Boolean = false, ) { val (username, displayName) = if (credentialEntryInfo.credentialType == CredentialType.PASSKEY) userAndDisplayNameForPasskey( credentialEntryInfo.userName, credentialEntryInfo.displayName ?: "") else Pair(credentialEntryInfo.userName, credentialEntryInfo.displayName) + + // For primary page, if + val overrideIcon: Painter? = + if (shouldOverrideIcon) { + when (credentialEntryInfo.credentialType) { + CredentialType.PASSKEY -> painterResource(R.drawable.ic_passkey_24) + CredentialType.PASSWORD -> painterResource(R.drawable.ic_password_24) + else -> painterResource(R.drawable.ic_other_sign_in_24) + } + } else null + Entry( onClick = { onEntrySelected(credentialEntryInfo) }, - iconImageBitmap = credentialEntryInfo.icon?.toBitmap()?.asImageBitmap(), + iconImageBitmap = + if (overrideIcon == null) credentialEntryInfo.icon?.toBitmap()?.asImageBitmap() else null, shouldApplyIconImageBitmapTint = credentialEntryInfo.shouldTintIcon, // Fall back to iconPainter if iconImageBitmap isn't available iconPainter = - if (credentialEntryInfo.icon == null) painterResource(R.drawable.ic_other_sign_in_24) + if (overrideIcon != null) overrideIcon + else if (credentialEntryInfo.icon == null) painterResource(R.drawable.ic_other_sign_in_24) else null, entryHeadlineText = username, entrySecondLineText = diff --git a/packages/CredentialManager/tests/robotests/screenshot/src/com/android/credentialmanager/GetCredScreenshotTest.kt b/packages/CredentialManager/tests/robotests/screenshot/src/com/android/credentialmanager/GetCredScreenshotTest.kt index d9ba36e1cdfc..94217d0c00c3 100644 --- a/packages/CredentialManager/tests/robotests/screenshot/src/com/android/credentialmanager/GetCredScreenshotTest.kt +++ b/packages/CredentialManager/tests/robotests/screenshot/src/com/android/credentialmanager/GetCredScreenshotTest.kt @@ -148,6 +148,7 @@ class GetCredScreenshotTest(emulationSpec: DeviceEmulationSpec) { lastUsedTimeMillis = null, isAutoSelectable = false, entryGroupId = "username", + isDefaultIconPreferredAsSingleProvider = false, ) ), authenticationEntryList = emptyList(), |