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

Commit c4ee0b41 authored by Qinmei Du's avatar Qinmei Du
Browse files

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
parent 6356f9de
Loading
Loading
Loading
Loading
+4 −7
Original line number Diff line number Diff line
@@ -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(),
+9 −5
Original line number Diff line number Diff line
@@ -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),
      )
+33 −30
Original line number Diff line number Diff line
@@ -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 ->
                    sortedCreateOptionsPairs.forEach { entry ->
                        item {
                            MoreOptionsInfoRow(
                                requestDisplayInfo = requestDisplayInfo,
                                    providerInfo = enabledProviderInfo,
                                    createOptionInfo = createOptionInfo,
                                providerInfo = entry.second,
                                createOptionInfo = entry.first,
                                onOptionSelected = {
                                    onOptionSelected(
                                        ActiveEntry(
                                                enabledProviderInfo,
                                                createOptionInfo
                                            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,25 +414,25 @@ 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 ->
                        sortedCreateOptionsPairs.forEach { entry ->
                            item {
                                MoreOptionsInfoRow(
                                    requestDisplayInfo = requestDisplayInfo,
                                        providerInfo = enabledProviderInfo,
                                        createOptionInfo = createOptionInfo,
                                    providerInfo = entry.second,
                                    createOptionInfo = entry.first,
                                    onOptionSelected = {
                                        onOptionSelected(
                                            ActiveEntry(
                                                    enabledProviderInfo,
                                                    createOptionInfo
                                                entry.second,
                                                entry.first
                                            )
                                        )
                                    })
                            }
                        }
                        }
                        item {
                            MoreOptionsDisabledProvidersRow(
                                disabledProviders = disabledProviderList,
+5 −4
Original line number Diff line number Diff line
@@ -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)
  }

+1 −1
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import android.graphics.drawable.Drawable

open class ProviderInfo(
  val icon: Drawable,
  val name: String,
  val id: String,
  val displayName: String,
)