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

Commit 42ec75d8 authored by harinirajan's avatar harinirajan Committed by Harini Rajan
Browse files

Icon for multi credentials same provider screen

Bug: 323607982
Test: Unit tests, Manual
Change-Id: Iaf6ff1b0150e235b57b36a29eb97c230ffb52ff7
parent dcf1da58
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -65,29 +65,29 @@ class CredentialSelectorUiStateGetMapperTest {
            isLastUnlocked = true
        )

    val passkeyCredentialEntryInfo =
    private val passkeyCredentialEntryInfo =
        createCredentialEntryInfo(credentialType = CredentialType.PASSKEY, userName = "userName")

    val unknownCredentialEntryInfo =
    private val unknownCredentialEntryInfo =
        createCredentialEntryInfo(credentialType = CredentialType.UNKNOWN, userName = "userName2")

    val passwordCredentialEntryInfo =
    private val passwordCredentialEntryInfo =
        createCredentialEntryInfo(credentialType = CredentialType.PASSWORD, userName = "userName")

    val recentlyUsedPasskeyCredential =
    private val recentlyUsedPasskeyCredential =
        createCredentialEntryInfo(credentialType =
    CredentialType.PASSKEY, lastUsedTimeMillis = 2L, userName = "userName")

    val recentlyUsedPasswordCredential =
    private val recentlyUsedPasswordCredential =
        createCredentialEntryInfo(credentialType =
    CredentialType.PASSWORD, lastUsedTimeMillis = 2L, userName = "userName")

    val credentialList1 = listOf(
    private val credentialList1 = listOf(
        passkeyCredentialEntryInfo,
        passwordCredentialEntryInfo
    )

    val credentialList2 = listOf(
    private val credentialList2 = listOf(
        passkeyCredentialEntryInfo,
        passwordCredentialEntryInfo,
        recentlyUsedPasskeyCredential,
@@ -118,11 +118,12 @@ class CredentialSelectorUiStateGetMapperTest {
                unknownCredentialEntryInfo)))).toGet(isPrimary = true)

        assertThat(getCredentialUiState).isEqualTo(
            CredentialSelectorUiState.Get.SingleEntryPerAccount(
            CredentialSelectorUiState.Get.MultipleEntryPrimaryScreen(
                sortedEntries = listOf(
                    passkeyCredentialEntryInfo, // userName
                    unknownCredentialEntryInfo // userName2
                ),
                icon = mDrawable,
                authenticationEntryList = listOf(authenticationEntryInfo)
            )) // prefer passkey from account 1, then unknown from account 2
    }
+1 −1
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ class CredentialSelectorViewModel @Inject constructor(
        when (uiState.value) {
            is Get.MultipleEntry -> isPrimaryScreen.value = true
            is Create, Close, is Cancel, Idle -> shouldClose.value = true
            is Get.SingleEntry, is Get.SingleEntryPerAccount -> cancel()
            is Get.SingleEntry, is Get.MultipleEntryPrimaryScreen -> cancel()
        }
    }

+5 −4
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.credentialmanager

import android.content.Intent
import android.graphics.drawable.Drawable
import androidx.activity.result.IntentSenderRequest
import androidx.compose.runtime.Composable
import com.android.credentialmanager.model.EntryInfo
@@ -71,14 +72,14 @@ sealed class CredentialSelectorUiState {
        /** Getting credential UI state when there is only one credential available. */
        data class SingleEntry(val entry: CredentialEntryInfo) : Get()
        /**
         * Getting credential UI state when there is only one account while with multiple
         * credentials, with different types(eg, passkey vs password) or providers.
         * Getting credential UI state on primary screen when there is are multiple accounts.
         */
        data class SingleEntryPerAccount(
        data class MultipleEntryPrimaryScreen(
            val icon: Drawable?,
            val sortedEntries: List<CredentialEntryInfo>,
            val authenticationEntryList: List<AuthenticationEntryInfo>,
            ) : Get()
        /** Getting credential UI state when there are multiple accounts available. */
        /** Getting credential UI state on secondary screen when there are multiple accounts available. */
        data class MultipleEntry(
            val accounts: List<PerUserNameEntries>,
            val actionEntryList: List<ActionEntryInfo>,
+3 −3
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ import androidx.wear.compose.foundation.rememberSwipeToDismissBoxState
import androidx.wear.compose.navigation.rememberSwipeDismissableNavController
import androidx.wear.compose.navigation.rememberSwipeDismissableNavHostState
import com.android.credentialmanager.CredentialSelectorUiState
import com.android.credentialmanager.CredentialSelectorUiState.Get.SingleEntryPerAccount
import com.android.credentialmanager.CredentialSelectorUiState.Get.MultipleEntryPrimaryScreen
import com.android.credentialmanager.CredentialSelectorUiState.Get.SingleEntry
import com.android.credentialmanager.CredentialSelectorUiState.Get.MultipleEntry
import com.android.credentialmanager.FlowEngine
@@ -95,7 +95,7 @@ fun WearApp(

        scrollable(Screen.MultipleCredentialsScreenFold.route) {
            MultiCredentialsFoldScreen(
                credentialSelectorUiState = (remember { uiState } as SingleEntryPerAccount),
                credentialSelectorUiState = (remember { uiState } as MultipleEntryPrimaryScreen),
                columnState = it.columnState,
                flowEngine = flowEngine,
            )
@@ -169,7 +169,7 @@ private fun handleGetNavigation(
            }
        }

            is SingleEntryPerAccount -> {
            is MultipleEntryPrimaryScreen -> {
                navController.navigateToMultipleCredentialsFoldScreen()
            }

+14 −4
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

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
@@ -35,10 +36,19 @@ fun Request.Get.toGet(isPrimary: Boolean): CredentialSelectorUiState.Get {
                entry = accounts[0].value.minWith(comparator)
            )
        } else {
            CredentialSelectorUiState.Get.SingleEntryPerAccount(
                sortedEntries = accounts.map {
            val sortedEntries = accounts.map {
                it.value.minWith(comparator)
                }.sortedWith(comparator),
            }.sortedWith(comparator)

            var icon: Drawable? = null
            // provide icon if all entries have the same provider
            if (sortedEntries.all {it.providerId == sortedEntries[0].providerId}) {
                icon = providerInfos[0].icon
            }

            CredentialSelectorUiState.Get.MultipleEntryPrimaryScreen(
                sortedEntries = sortedEntries,
                icon = icon,
                authenticationEntryList = providerInfos.flatMap { it.authenticationEntryList }
            )
        }
Loading