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

Commit f6f83051 authored by Harini Rajan's avatar Harini Rajan Committed by Android (Google) Code Review
Browse files

Merge "Use SIWG display name in single and multiple credential screens" into main

parents e7e89b79 13ac9002
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,
                )
            }
        },