Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 13ac9002 authored by harinirajan's avatar harinirajan Committed by Harini Rajan
Browse files

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
parent c81e5cd7
Loading
Loading
Loading
Loading
+42 −6
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ import com.android.credentialmanager.model.CredentialType
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 @@ class CredentialSelectorUiStateGetMapperTest {
    }

    @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 @@ class CredentialSelectorUiStateGetMapperTest {

        assertThat(getCredentialUiState).isEqualTo(
            CredentialSelectorUiState.Get.MultipleEntry(
                listOf(PerUserNameEntries("userName", listOf(
                listOf(PerNameEntries("userName", listOf(
                    passkeyCredentialEntryInfo,
                    passwordCredentialEntryInfo))
                ),
@@ -155,7 +155,7 @@ class CredentialSelectorUiStateGetMapperTest {
        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 @@ class CredentialSelectorUiStateGetMapperTest {
                            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 @@ class CredentialSelectorUiStateGetMapperTest {
        )
    }

    @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 @@ class CredentialSelectorUiStateGetMapperTest {
            credentialTypeDisplayName = "",
            providerDisplayName = "",
            userName = userName,
            displayName = "",
            displayName = displayName,
            icon = mDrawable,
            shouldTintIcon = false,
            lastUsedTimeMillis = Instant.ofEpochMilli(lastUsedTimeMillis),
+3 −3
Original line number Diff line number Diff line
@@ -81,12 +81,12 @@ sealed class CredentialSelectorUiState {
            ) : 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>,
            )
        }
+6 −3
Original line number Diff line number Diff line
@@ -19,15 +19,18 @@ package com.android.credentialmanager.ui.mappers
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 @@ fun Request.Get.toGet(isPrimary: Boolean): CredentialSelectorUiState.Get {
        }
    } else {
        CredentialSelectorUiState.Get.MultipleEntry(
            accounts = accounts.map { PerUserNameEntries(
            accounts = accounts.map { PerNameEntries(
                it.key,
                it.value.sortedWith(comparator)
            )
+1 −1
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ fun MultiCredentialsFlattenScreen(
                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,
+3 −3
Original line number Diff line number Diff line
@@ -55,15 +55,15 @@ fun SignInWithProviderScreen(
        },
        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,
                )
            }
        },