Use SIWG display name in single and multiple credential screens
https://hsv.googleplex.com/6128614297829376
https://hsv.googleplex.com/4768216021729280
Flag: EXEMPT bugfix
Bug:355488245, 356049400, 355437670
Test: CredentialSelectorUiStateGetMapperTest
Change-Id: Ib51f95208b2a0a8550b7ff5d11540ec467b5d7f0
diff --git a/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorUiStateGetMapperTest.kt b/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorUiStateGetMapperTest.kt
index c6013e2..ef4416e 100644
--- a/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorUiStateGetMapperTest.kt
+++ b/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorUiStateGetMapperTest.kt
@@ -30,7 +30,7 @@
import com.google.common.truth.Truth.assertThat
import com.android.credentialmanager.ui.mappers.toGet
import com.android.credentialmanager.model.get.ProviderInfo
-import com.android.credentialmanager.CredentialSelectorUiState.Get.MultipleEntry.PerUserNameEntries
+import com.android.credentialmanager.CredentialSelectorUiState.Get.MultipleEntry.PerNameEntries
/** Unit tests for [CredentialSelectorUiStateGetMapper]. */
@SmallTest
@@ -108,7 +108,7 @@
}
@Test
- fun `On primary screen, multiple accounts returns SingleEntryPerAccount`() {
+ fun `On primary screen, multiple accounts returns MultipleEntryPrimaryScreen`() {
val getCredentialUiState = Request.Get(
token = null,
resultReceiver = null,
@@ -135,7 +135,7 @@
assertThat(getCredentialUiState).isEqualTo(
CredentialSelectorUiState.Get.MultipleEntry(
- listOf(PerUserNameEntries("userName", listOf(
+ listOf(PerNameEntries("userName", listOf(
passkeyCredentialEntryInfo,
passwordCredentialEntryInfo))
),
@@ -155,7 +155,7 @@
assertThat(getCredentialUiState).isEqualTo(
CredentialSelectorUiState.Get.MultipleEntry(
listOf(
- PerUserNameEntries("userName",
+ PerNameEntries("userName",
listOf(
recentlyUsedPasskeyCredential, // from provider 2
passkeyCredentialEntryInfo, // from provider 1 or 2
@@ -164,7 +164,7 @@
passwordCredentialEntryInfo, // from provider 1 or 2
passwordCredentialEntryInfo, // from provider 1 or 2
)),
- PerUserNameEntries("userName2", listOf(unknownCredentialEntryInfo)),
+ PerNameEntries("userName2", listOf(unknownCredentialEntryInfo)),
),
listOf(actionEntryInfo, actionEntryInfo),
listOf(authenticationEntryInfo, authenticationEntryInfo)
@@ -172,8 +172,44 @@
)
}
+ @Test
+ fun `Returned multiple entry is grouped by display name if present`() {
+ val testCred1 = createCredentialEntryInfo(displayName = "testDisplayName",
+ userName = "testUserName", credentialType = CredentialType.PASSWORD)
+ val testCred2 = createCredentialEntryInfo(displayName = "testDisplayName",
+ userName = "testUserName", credentialType = CredentialType.PASSKEY)
+ val getCredentialUiState = Request.Get(
+ token = null,
+ resultReceiver = null,
+ providerInfos = listOf(createProviderInfo(credentialList1),
+ createProviderInfo(credentialList2),
+ createProviderInfo(listOf(testCred1, testCred2))))
+ .toGet(isPrimary = false)
+
+ assertThat(getCredentialUiState).isEqualTo(
+ CredentialSelectorUiState.Get.MultipleEntry(
+ listOf(
+ PerNameEntries("userName",
+ listOf(
+ recentlyUsedPasskeyCredential, // from provider 2
+ passkeyCredentialEntryInfo, // from provider 1 or 2
+ passkeyCredentialEntryInfo, // from provider 1 or 2
+ recentlyUsedPasswordCredential, // from provider 2
+ passwordCredentialEntryInfo, // from provider 1 or 2
+ passwordCredentialEntryInfo, // from provider 1 or 2
+ )),
+ PerNameEntries("userName2", listOf(unknownCredentialEntryInfo)),
+ PerNameEntries("testDisplayName", listOf(testCred2, testCred1)),
+ ),
+ listOf(actionEntryInfo, actionEntryInfo, actionEntryInfo),
+ listOf(authenticationEntryInfo, authenticationEntryInfo, authenticationEntryInfo)
+ )
+ )
+ }
+
fun createCredentialEntryInfo(
userName: String,
+ displayName: String? = null,
credentialType: CredentialType = CredentialType.PASSKEY,
lastUsedTimeMillis: Long = 0L
): CredentialEntryInfo =
@@ -188,7 +224,7 @@
credentialTypeDisplayName = "",
providerDisplayName = "",
userName = userName,
- displayName = "",
+ displayName = displayName,
icon = mDrawable,
shouldTintIcon = false,
lastUsedTimeMillis = Instant.ofEpochMilli(lastUsedTimeMillis),
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt
index b2f55c1..2f5ec72 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt
@@ -81,12 +81,12 @@
) : Get()
/** Getting credential UI state on secondary screen when there are multiple accounts available. */
data class MultipleEntry(
- val accounts: List<PerUserNameEntries>,
+ val accounts: List<PerNameEntries>,
val actionEntryList: List<ActionEntryInfo>,
val authenticationEntryList: List<AuthenticationEntryInfo>,
) : Get() {
- data class PerUserNameEntries(
- val userName: String,
+ data class PerNameEntries(
+ val name: String,
val sortedCredentialEntryList: List<CredentialEntryInfo>,
)
}
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt
index 2656275..7dfe742e 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt
@@ -19,15 +19,18 @@
import android.graphics.drawable.Drawable
import com.android.credentialmanager.model.Request
import com.android.credentialmanager.CredentialSelectorUiState
-import com.android.credentialmanager.CredentialSelectorUiState.Get.MultipleEntry.PerUserNameEntries
+import com.android.credentialmanager.CredentialSelectorUiState.Get.MultipleEntry.PerNameEntries
import com.android.credentialmanager.model.CredentialType
import com.android.credentialmanager.model.get.CredentialEntryInfo
import java.time.Instant
fun Request.Get.toGet(isPrimary: Boolean): CredentialSelectorUiState.Get {
+
val accounts = providerInfos
.flatMap { it.credentialEntryList }
- .groupBy { it.userName}
+ .groupBy {
+ if (it.displayName.isNullOrBlank()) it.userName else checkNotNull(it.displayName)
+ }
.entries
.toList()
@@ -56,7 +59,7 @@
}
} else {
CredentialSelectorUiState.Get.MultipleEntry(
- accounts = accounts.map { PerUserNameEntries(
+ accounts = accounts.map { PerNameEntries(
it.key,
it.value.sortedWith(comparator)
)
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/multiple/MultiCredentialsFlattenScreen.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/multiple/MultiCredentialsFlattenScreen.kt
index 2af5be8..ef32c94 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/multiple/MultiCredentialsFlattenScreen.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/multiple/MultiCredentialsFlattenScreen.kt
@@ -79,7 +79,7 @@
Row {
Spacer(Modifier.weight(0.0624f)) // 6.24% side margin
WearSecondaryLabel(
- text = userNameEntries.userName,
+ text = userNameEntries.name,
modifier = Modifier.padding(
top = 12.dp,
bottom = 4.dp,
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/signInWithProvider/SignInWithProviderScreen.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/signInWithProvider/SignInWithProviderScreen.kt
index fd0fc8c..14cc9bf 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/signInWithProvider/SignInWithProviderScreen.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/signInWithProvider/SignInWithProviderScreen.kt
@@ -55,15 +55,15 @@
},
accountContent = {
val displayName = entry.displayName
- if (displayName == null ||
+ if (displayName.isNullOrBlank() ||
entry.displayName.equals(entry.userName, ignoreCase = true)) {
AccountRow(
primaryText = entry.userName,
)
} else {
AccountRow(
- primaryText = displayName,
- secondaryText = entry.userName,
+ primaryText = entry.userName,
+ secondaryText = displayName,
)
}
},