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

Commit 91fddc70 authored by Qinmei Du's avatar Qinmei Du
Browse files

Update the first time create flow(change the logic when there's no...

Update the first time create flow(change the logic when there's no createOptions, delete the textButton on creation screen, add the remote textButton on provider selection screen)

screencast: https://screencast.googleplex.com/cast/NjM5Njc4NzMwOTkzNjY0MHw3YzcwMmQ4YS0zNQ

Test: deployed locally

Bug: 253157231
Change-Id: I28ca4d6756d1d980f48015f6de7f2398240714e2
parent 626f905f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
  <string name="string_create_in_another_place">Create in another place</string>
  <string name="string_save_to_another_place">Save to another place</string>
  <string name="string_use_another_device">Use another device</string>
  <string name="string_save_to_another_device">Save to another device</string>
  <string name="string_no_thanks">No thanks</string>
  <string name="passkey_creation_intro_title">A simple way to sign in safely</string>
  <string name="passkey_creation_intro_body">Use your fingerprint, face or screen lock to sign in with a unique passkey that can’t be forgotten or stolen. Learn more</string>
+1 −0
Original line number Diff line number Diff line
@@ -172,6 +172,7 @@ class CredentialManagerRepo(
        {CreateScreenState.PASSKEY_INTRO} else {CreateScreenState.PROVIDER_SELECTION}
      } else {CreateScreenState.CREATION_OPTION_SELECTION},
      requestDisplayInfo,
      false,
      if (hasDefault) {
        ActiveEntry(defaultProvider, defaultProvider.createOptions.first())
      } else null
+61 −42
Original line number Diff line number Diff line
@@ -80,14 +80,16 @@ fun CreateCredentialScreen(
          enabledProviderList = uiState.enabledProviders,
          disabledProviderList = uiState.disabledProviders,
          onCancel = viewModel::onCancel,
          onOptionSelected = viewModel::onMoreOptionsRowSelectedForFirstUse,
          onOptionSelected = viewModel::onEntrySelectedFromFirstUseScreen,
          onDisabledPasswordManagerSelected = viewModel::onDisabledPasswordManagerSelected,
          onRemoteEntrySelected = selectEntryCallback,
        )
        CreateScreenState.CREATION_OPTION_SELECTION -> CreationSelectionCard(
          requestDisplayInfo = uiState.requestDisplayInfo,
          enabledProviderList = uiState.enabledProviders,
          providerInfo = uiState.activeEntry?.activeProvider!!,
          createOptionInfo = uiState.activeEntry.activeEntryInfo as CreateOptionInfo,
          showActiveEntryOnly = uiState.showActiveEntryOnly,
          onOptionSelected = selectEntryCallback,
          onConfirm = confirmEntryCallback,
          onCancel = viewModel::onCancel,
@@ -98,7 +100,7 @@ fun CreateCredentialScreen(
          enabledProviderList = uiState.enabledProviders,
          disabledProviderList = uiState.disabledProviders,
          onBackButtonSelected = viewModel::onBackButtonSelected,
          onOptionSelected = viewModel::onMoreOptionsRowSelected,
          onOptionSelected = viewModel::onEntrySelectedFromMoreOptionScreen,
          onDisabledPasswordManagerSelected = viewModel::onDisabledPasswordManagerSelected,
          onRemoteEntrySelected = selectEntryCallback,
        )
@@ -184,7 +186,8 @@ fun ProviderSelectionCard(
  disabledProviderList: List<DisabledProviderInfo>?,
  onOptionSelected: (ActiveEntry) -> Unit,
  onDisabledPasswordManagerSelected: () -> Unit,
  onCancel: () -> Unit
  onCancel: () -> Unit,
  onRemoteEntrySelected: (EntryInfo) -> Unit,
) {
  Card() {
    Column() {
@@ -254,10 +257,23 @@ fun ProviderSelectionCard(
          }
        }
      }
      Divider(
        thickness = 24.dp,
        color = Color.Transparent
      // TODO: handle the error situation that if multiple remoteInfos exists
      enabledProviderList.forEach { enabledProvider ->
        if (enabledProvider.remoteEntry != null) {
          TextButton(
            onClick = {
              onRemoteEntrySelected(enabledProvider.remoteEntry!!) },
            modifier = Modifier
              .padding(horizontal = 24.dp)
              .align(alignment = Alignment.CenterHorizontally)
          ) {
            Text(
              text = stringResource(R.string.string_save_to_another_device),
              textAlign = TextAlign.Center,
            )
          }
        }
      }
      Row(
        horizontalArrangement = Arrangement.Start,
        modifier = Modifier.fillMaxWidth().padding(horizontal = 24.dp)
@@ -416,6 +432,7 @@ fun CreationSelectionCard(
  enabledProviderList: List<EnabledProviderInfo>,
  providerInfo: EnabledProviderInfo,
  createOptionInfo: CreateOptionInfo,
  showActiveEntryOnly: Boolean,
  onOptionSelected: (EntryInfo) -> Unit,
  onConfirm: () -> Unit,
  onCancel: () -> Unit,
@@ -473,6 +490,7 @@ fun CreationSelectionCard(
          onOptionSelected = onOptionSelected
        )
      }
      if (!showActiveEntryOnly) {
        var createOptionsSize = 0
        enabledProviderList.forEach{
          enabledProvider -> createOptionsSize += enabledProvider.createOptions.size}
@@ -512,6 +530,7 @@ fun CreationSelectionCard(
            }
          }
        }
      }
      Divider(
        thickness = 24.dp,
        color = Color.Transparent
+15 −7
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ data class CreateCredentialUiState(
  val disabledProviders: List<DisabledProviderInfo>? = null,
  val currentScreenState: CreateScreenState,
  val requestDisplayInfo: RequestDisplayInfo,
  val showActiveEntryOnly: Boolean,
  val activeEntry: ActiveEntry? = null,
  val selectedEntry: EntryInfo? = null,
)
@@ -56,13 +57,18 @@ class CreateCredentialViewModel(
  }

  fun onConfirmIntro() {
    if (uiState.enabledProviders.size > 1) {
      uiState = uiState.copy(
        currentScreenState = CreateScreenState.PROVIDER_SELECTION
    var createOptionSize = 0
    uiState.enabledProviders.forEach {
      enabledProvider -> createOptionSize += enabledProvider.createOptions.size}
    uiState = if (createOptionSize > 1) {
      uiState.copy(
        currentScreenState = CreateScreenState.PROVIDER_SELECTION,
        showActiveEntryOnly = true
      )
    } else if (uiState.enabledProviders.size == 1){
      uiState = uiState.copy(
    } else if (createOptionSize == 1){
      uiState.copy(
        currentScreenState = CreateScreenState.CREATION_OPTION_SELECTION,
        showActiveEntryOnly = false,
        activeEntry = ActiveEntry(uiState.enabledProviders.first(),
          uiState.enabledProviders.first().createOptions.first()
        )
@@ -90,16 +96,18 @@ class CreateCredentialViewModel(
    )
  }

  fun onMoreOptionsRowSelected(activeEntry: ActiveEntry) {
  fun onEntrySelectedFromMoreOptionScreen(activeEntry: ActiveEntry) {
    uiState = uiState.copy(
      currentScreenState = CreateScreenState.MORE_OPTIONS_ROW_INTRO,
      showActiveEntryOnly = false,
      activeEntry = activeEntry
    )
  }

  fun onMoreOptionsRowSelectedForFirstUse(activeEntry: ActiveEntry) {
  fun onEntrySelectedFromFirstUseScreen(activeEntry: ActiveEntry) {
    uiState = uiState.copy(
      currentScreenState = CreateScreenState.CREATION_OPTION_SELECTION,
      showActiveEntryOnly = true,
      activeEntry = activeEntry
    )
  }