Fix the sorting for more options in create flow

before: Provider1[sorted entries inside this provider], Provider2[sorted entries inside this provider]... but no sorting within those providers, so the result is entries inside one provider is always group together and the order of the providers are just defined by the order of the test data providers list
after: sorted entries by lastUsed from all providers

screencast: https://drive.google.com/file/d/18fxaGGOfKYDzvShq8bBEdAFGhTRdjS1C/view?usp=sharing&resourcekey=0-JbBhLEEkFhoZaniIay-Y_w

Test: deployed locally

Bug: 261060321
Change-Id: I936f5d9e8bc2f28ac0b97d36fa21e6567ce7b301
This commit is contained in:
Qinmei Du
2022-12-22 03:12:01 +00:00
parent 6356f9dee8
commit c4ee0b415c
5 changed files with 52 additions and 47 deletions

View File

@@ -140,9 +140,6 @@ class CredentialManagerRepo(
val providerEnabledList = CreateFlowUtils.toEnabledProviderList(
// Handle runtime cast error
providerEnabledList as List<CreateCredentialProviderData>, context)
providerEnabledList.forEach{providerInfo -> providerInfo.createOptions =
providerInfo.createOptions.sortedWith(compareBy { it.lastUsedTimeMillis }).reversed()
}
return providerEnabledList
}
@@ -180,9 +177,9 @@ class CredentialManagerRepo(
.setSaveEntries(
listOf<Entry>(
newCreateEntry("key1", "subkey-1", "elisa.beckett@gmail.com",
20, 7, 27, 10000),
20, 7, 27, 10L),
newCreateEntry("key1", "subkey-2", "elisa.work@google.com",
20, 7, 27, 11000),
20, 7, 27, 12L),
)
)
.setRemoteEntry(
@@ -194,9 +191,9 @@ class CredentialManagerRepo(
.setSaveEntries(
listOf<Entry>(
newCreateEntry("key1", "subkey-3", "elisa.beckett@dashlane.com",
20, 7, 27, 30000),
20, 7, 27, 11L),
newCreateEntry("key1", "subkey-4", "elisa.work@dashlane.com",
20, 7, 27, 31000),
20, 7, 27, 14L),
)
)
.build(),

View File

@@ -304,20 +304,23 @@ class CreateFlowUtils {
isOnPasskeyIntroStateAlready: Boolean,
isPasskeyFirstUse: Boolean,
): CreateCredentialUiState {
var createOptionSize = 0
var lastSeenProviderWithNonEmptyCreateOptions: EnabledProviderInfo? = null
var remoteEntry: RemoteInfo? = null
var defaultProvider: EnabledProviderInfo? = null
var createOptionsPairs:
MutableList<Pair<CreateOptionInfo, EnabledProviderInfo>> = mutableListOf()
enabledProviders.forEach {
enabledProvider ->
if (defaultProviderId != null) {
if (enabledProvider.name == defaultProviderId) {
if (enabledProvider.id == defaultProviderId) {
defaultProvider = enabledProvider
}
}
if (enabledProvider.createOptions.isNotEmpty()) {
createOptionSize += enabledProvider.createOptions.size
lastSeenProviderWithNonEmptyCreateOptions = enabledProvider
enabledProvider.createOptions.forEach {
createOptionsPairs.add(Pair(it, enabledProvider))
}
}
if (enabledProvider.remoteEntry != null) {
remoteEntry = enabledProvider.remoteEntry!!
@@ -327,16 +330,17 @@ class CreateFlowUtils {
enabledProviders = enabledProviders,
disabledProviders = disabledProviders,
toCreateScreenState(
/*createOptionSize=*/createOptionSize,
/*createOptionSize=*/createOptionsPairs.size,
/*isOnPasskeyIntroStateAlready=*/isOnPasskeyIntroStateAlready,
/*requestDisplayInfo=*/requestDisplayInfo,
/*defaultProvider=*/defaultProvider, /*remoteEntry=*/remoteEntry,
/*isPasskeyFirstUse=*/isPasskeyFirstUse),
requestDisplayInfo,
createOptionsPairs.sortedWith(compareByDescending{ it.first.lastUsedTimeMillis }),
defaultProvider != null,
toActiveEntry(
/*defaultProvider=*/defaultProvider,
/*createOptionSize=*/createOptionSize,
/*createOptionSize=*/createOptionsPairs.size,
/*lastSeenProviderWithNonEmptyCreateOptions=*/lastSeenProviderWithNonEmptyCreateOptions,
/*remoteEntry=*/remoteEntry),
)

View File

@@ -76,6 +76,7 @@ fun CreateCredentialScreen(
requestDisplayInfo = uiState.requestDisplayInfo,
enabledProviderList = uiState.enabledProviders,
disabledProviderList = uiState.disabledProviders,
sortedCreateOptionsPairs = uiState.sortedCreateOptionsPairs,
onOptionSelected = viewModel::onEntrySelectedFromFirstUseScreen,
onDisabledPasswordManagerSelected =
viewModel::onDisabledPasswordManagerSelected,
@@ -94,6 +95,7 @@ fun CreateCredentialScreen(
requestDisplayInfo = uiState.requestDisplayInfo,
enabledProviderList = uiState.enabledProviders,
disabledProviderList = uiState.disabledProviders,
sortedCreateOptionsPairs = uiState.sortedCreateOptionsPairs,
hasDefaultProvider = uiState.hasDefaultProvider,
isFromProviderSelection = uiState.isFromProviderSelection!!,
onBackProviderSelectionButtonSelected =
@@ -246,6 +248,7 @@ fun ProviderSelectionCard(
requestDisplayInfo: RequestDisplayInfo,
enabledProviderList: List<EnabledProviderInfo>,
disabledProviderList: List<DisabledProviderInfo>?,
sortedCreateOptionsPairs: List<Pair<CreateOptionInfo, EnabledProviderInfo>>,
onOptionSelected: (ActiveEntry) -> Unit,
onDisabledPasswordManagerSelected: () -> Unit,
onMoreOptionsSelected: () -> Unit,
@@ -295,22 +298,21 @@ fun ProviderSelectionCard(
LazyColumn(
verticalArrangement = Arrangement.spacedBy(2.dp)
) {
enabledProviderList.forEach { enabledProviderInfo ->
enabledProviderInfo.createOptions.forEach { createOptionInfo ->
item {
MoreOptionsInfoRow(
requestDisplayInfo = requestDisplayInfo,
providerInfo = enabledProviderInfo,
createOptionInfo = createOptionInfo,
onOptionSelected = {
onOptionSelected(
ActiveEntry(
enabledProviderInfo,
createOptionInfo
)
sortedCreateOptionsPairs.forEach { entry ->
item {
MoreOptionsInfoRow(
requestDisplayInfo = requestDisplayInfo,
providerInfo = entry.second,
createOptionInfo = entry.first,
onOptionSelected = {
onOptionSelected(
ActiveEntry(
entry.second,
entry.first
)
})
}
)
}
)
}
}
item {
@@ -355,6 +357,7 @@ fun MoreOptionsSelectionCard(
requestDisplayInfo: RequestDisplayInfo,
enabledProviderList: List<EnabledProviderInfo>,
disabledProviderList: List<DisabledProviderInfo>?,
sortedCreateOptionsPairs: List<Pair<CreateOptionInfo, EnabledProviderInfo>>,
hasDefaultProvider: Boolean,
isFromProviderSelection: Boolean,
onBackProviderSelectionButtonSelected: () -> Unit,
@@ -411,23 +414,23 @@ fun MoreOptionsSelectionCard(
LazyColumn(
verticalArrangement = Arrangement.spacedBy(2.dp)
) {
// Only in the flows with default provider(not first time use) we can show the
// createOptions here, or they will be shown on ProviderSelectionCard
if (hasDefaultProvider) {
enabledProviderList.forEach { enabledProviderInfo ->
enabledProviderInfo.createOptions.forEach { createOptionInfo ->
item {
MoreOptionsInfoRow(
requestDisplayInfo = requestDisplayInfo,
providerInfo = enabledProviderInfo,
createOptionInfo = createOptionInfo,
onOptionSelected = {
onOptionSelected(
ActiveEntry(
enabledProviderInfo,
createOptionInfo
)
sortedCreateOptionsPairs.forEach { entry ->
item {
MoreOptionsInfoRow(
requestDisplayInfo = requestDisplayInfo,
providerInfo = entry.second,
createOptionInfo = entry.first,
onOptionSelected = {
onOptionSelected(
ActiveEntry(
entry.second,
entry.first
)
})
}
)
})
}
}
item {

View File

@@ -39,6 +39,7 @@ data class CreateCredentialUiState(
val disabledProviders: List<DisabledProviderInfo>? = null,
val currentScreenState: CreateScreenState,
val requestDisplayInfo: RequestDisplayInfo,
val sortedCreateOptionsPairs: List<Pair<CreateOptionInfo, EnabledProviderInfo>>,
// Should not change with the real time update of default provider, only determine whether we're
// showing provider selection page at the beginning
val hasDefaultProvider: Boolean,
@@ -89,9 +90,9 @@ class CreateCredentialViewModel(
UserConfigRepo.getInstance().setIsPasskeyFirstUse(false)
}
fun getProviderInfoByName(providerName: String): EnabledProviderInfo {
fun getProviderInfoByName(providerId: String): EnabledProviderInfo {
return uiState.enabledProviders.single {
it.name == providerName
it.id == providerId
}
}
@@ -133,7 +134,7 @@ class CreateCredentialViewModel(
currentScreenState = CreateScreenState.CREATION_OPTION_SELECTION,
activeEntry = activeEntry
)
val providerId = uiState.activeEntry?.activeProvider?.name
val providerId = uiState.activeEntry?.activeProvider?.id
onDefaultChanged(providerId)
}
@@ -150,7 +151,7 @@ class CreateCredentialViewModel(
uiState = uiState.copy(
currentScreenState = CreateScreenState.CREATION_OPTION_SELECTION,
)
val providerId = uiState.activeEntry?.activeProvider?.name
val providerId = uiState.activeEntry?.activeProvider?.id
onDefaultChanged(providerId)
}

View File

@@ -22,7 +22,7 @@ import android.graphics.drawable.Drawable
open class ProviderInfo(
val icon: Drawable,
val name: String,
val id: String,
val displayName: String,
)