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,
                 )
             }
         },