Loading packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorUiStateGetMapperTest.kt +42 −6 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, Loading @@ -135,7 +135,7 @@ class CredentialSelectorUiStateGetMapperTest { assertThat(getCredentialUiState).isEqualTo( CredentialSelectorUiState.Get.MultipleEntry( listOf(PerUserNameEntries("userName", listOf( listOf(PerNameEntries("userName", listOf( passkeyCredentialEntryInfo, passwordCredentialEntryInfo)) ), Loading @@ -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 Loading @@ -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) Loading @@ -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 = Loading @@ -188,7 +224,7 @@ class CredentialSelectorUiStateGetMapperTest { credentialTypeDisplayName = "", providerDisplayName = "", userName = userName, displayName = "", displayName = displayName, icon = mDrawable, shouldTintIcon = false, lastUsedTimeMillis = Instant.ofEpochMilli(lastUsedTimeMillis), Loading packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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>, ) } Loading packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt +6 −3 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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) ) Loading packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/multiple/MultiCredentialsFlattenScreen.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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, Loading packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/signInWithProvider/SignInWithProviderScreen.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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, ) } }, Loading Loading
packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorUiStateGetMapperTest.kt +42 −6 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, Loading @@ -135,7 +135,7 @@ class CredentialSelectorUiStateGetMapperTest { assertThat(getCredentialUiState).isEqualTo( CredentialSelectorUiState.Get.MultipleEntry( listOf(PerUserNameEntries("userName", listOf( listOf(PerNameEntries("userName", listOf( passkeyCredentialEntryInfo, passwordCredentialEntryInfo)) ), Loading @@ -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 Loading @@ -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) Loading @@ -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 = Loading @@ -188,7 +224,7 @@ class CredentialSelectorUiStateGetMapperTest { credentialTypeDisplayName = "", providerDisplayName = "", userName = userName, displayName = "", displayName = displayName, icon = mDrawable, shouldTintIcon = false, lastUsedTimeMillis = Instant.ofEpochMilli(lastUsedTimeMillis), Loading
packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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>, ) } Loading
packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt +6 −3 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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) ) Loading
packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/multiple/MultiCredentialsFlattenScreen.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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, Loading
packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/signInWithProvider/SignInWithProviderScreen.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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, ) } }, Loading