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

Commit 78b592c2 authored by Qinmei Du's avatar Qinmei Du
Browse files

Enable intent when click disabled providers to open settings

Screencast: https://drive.google.com/file/d/1aEfj5WmwWrMyPvejUs2bOJLbWxRIDVG5/view?usp=sharing&resourcekey=0-Jj6lwYlYjwjYj63NRTpBEg
Test: deployed locally

Bug: 264414153
Change-Id: I7a446386288f4092543129883cfeb5721f86f758
parent b72d65fd
Loading
Loading
Loading
Loading
+20 −11
Original line number Diff line number Diff line
@@ -16,7 +16,9 @@

package com.android.credentialmanager

import android.content.Intent
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
@@ -26,7 +28,7 @@ import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.viewmodel.compose.viewModel
import com.android.credentialmanager.common.DialogType
import com.android.credentialmanager.common.DialogResult
@@ -37,6 +39,7 @@ import com.android.credentialmanager.createflow.CreateCredentialViewModel
import com.android.credentialmanager.getflow.GetCredentialScreen
import com.android.credentialmanager.getflow.GetCredentialViewModel
import com.android.credentialmanager.ui.theme.CredentialSelectorTheme
import kotlinx.coroutines.launch

@ExperimentalMaterialApi
class CredentialSelectorActivity : ComponentActivity() {
@@ -64,10 +67,11 @@ class CredentialSelectorActivity : ComponentActivity() {
    when (dialogType) {
      DialogType.CREATE_PASSKEY -> {
        val viewModel: CreateCredentialViewModel = viewModel()
        viewModel.observeDialogResult().observe(
          this@CredentialSelectorActivity,
          onCancel
        )
        lifecycleScope.launch {
          viewModel.observeDialogResult().collect{ dialogResult ->
            onCancel(dialogResult)
          }
        }
        providerActivityResult.value?.let {
          viewModel.onProviderActivityResult(it)
          providerActivityResult.value = null
@@ -76,10 +80,11 @@ class CredentialSelectorActivity : ComponentActivity() {
      }
      DialogType.GET_CREDENTIALS -> {
        val viewModel: GetCredentialViewModel = viewModel()
        viewModel.observeDialogResult().observe(
          this@CredentialSelectorActivity,
          onCancel
        )
        lifecycleScope.launch {
          viewModel.observeDialogResult().collect{ dialogResult ->
            onCancel(dialogResult)
          }
        }
        providerActivityResult.value?.let {
          viewModel.onProviderActivityResult(it)
          providerActivityResult.value = null
@@ -93,8 +98,12 @@ class CredentialSelectorActivity : ComponentActivity() {
    }
  }

  private val onCancel = Observer<DialogResult> {
    if (it.resultState == ResultState.COMPLETE || it.resultState == ResultState.CANCELED) {
  private fun onCancel(dialogResut: DialogResult) {
    if (dialogResut.resultState == ResultState
        .COMPLETE || dialogResut.resultState == ResultState.NORMAL_CANCELED) {
      this@CredentialSelectorActivity.finish()
    } else if (dialogResut.resultState == ResultState.LAUNCH_SETTING_CANCELED) {
      this@CredentialSelectorActivity.startActivity(Intent(Settings.ACTION_SYNC_SETTINGS))
      this@CredentialSelectorActivity.finish()
    }
  }
+2 −1
Original line number Diff line number Diff line
@@ -18,7 +18,8 @@ package com.android.credentialmanager.common

enum class ResultState {
  COMPLETE,
  CANCELED,
  NORMAL_CANCELED,
  LAUNCH_SETTING_CANCELED
}

data class DialogResult(
+10 −12
Original line number Diff line number Diff line
@@ -78,8 +78,7 @@ fun CreateCredentialScreen(
                        disabledProviderList = uiState.disabledProviders,
                        sortedCreateOptionsPairs = uiState.sortedCreateOptionsPairs,
                        onOptionSelected = viewModel::onEntrySelectedFromFirstUseScreen,
                        onDisabledPasswordManagerSelected =
                        viewModel::onDisabledPasswordManagerSelected,
                        onDisabledProvidersSelected = viewModel::onDisabledProvidersSelected,
                        onMoreOptionsSelected = viewModel::onMoreOptionsSelectedOnProviderSelection,
                    )
                    CreateScreenState.CREATION_OPTION_SELECTION -> CreationSelectionCard(
@@ -103,8 +102,7 @@ fun CreateCredentialScreen(
                        onBackCreationSelectionButtonSelected =
                        viewModel::onBackCreationSelectionButtonSelected,
                        onOptionSelected = viewModel::onEntrySelectedFromMoreOptionScreen,
                        onDisabledPasswordManagerSelected =
                        viewModel::onDisabledPasswordManagerSelected,
                        onDisabledProvidersSelected = viewModel::onDisabledProvidersSelected,
                        onRemoteEntrySelected = viewModel::onEntrySelected,
                    )
                    CreateScreenState.MORE_OPTIONS_ROW_INTRO -> MoreOptionsRowIntroCard(
@@ -250,7 +248,7 @@ fun ProviderSelectionCard(
    disabledProviderList: List<DisabledProviderInfo>?,
    sortedCreateOptionsPairs: List<Pair<CreateOptionInfo, EnabledProviderInfo>>,
    onOptionSelected: (ActiveEntry) -> Unit,
    onDisabledPasswordManagerSelected: () -> Unit,
    onDisabledProvidersSelected: () -> Unit,
    onMoreOptionsSelected: () -> Unit,
) {
    ContainerCard() {
@@ -318,8 +316,8 @@ fun ProviderSelectionCard(
                    item {
                        MoreOptionsDisabledProvidersRow(
                            disabledProviders = disabledProviderList,
                            onDisabledPasswordManagerSelected =
                            onDisabledPasswordManagerSelected,
                            onDisabledProvidersSelected =
                            onDisabledProvidersSelected,
                        )
                    }
                }
@@ -363,7 +361,7 @@ fun MoreOptionsSelectionCard(
    onBackProviderSelectionButtonSelected: () -> Unit,
    onBackCreationSelectionButtonSelected: () -> Unit,
    onOptionSelected: (ActiveEntry) -> Unit,
    onDisabledPasswordManagerSelected: () -> Unit,
    onDisabledProvidersSelected: () -> Unit,
    onRemoteEntrySelected: (EntryInfo) -> Unit,
) {
    ContainerCard() {
@@ -436,8 +434,8 @@ fun MoreOptionsSelectionCard(
                        item {
                            MoreOptionsDisabledProvidersRow(
                                disabledProviders = disabledProviderList,
                                onDisabledPasswordManagerSelected =
                                onDisabledPasswordManagerSelected,
                                onDisabledProvidersSelected =
                                onDisabledProvidersSelected,
                            )
                        }
                    }
@@ -891,11 +889,11 @@ fun MoreOptionsInfoRow(
@Composable
fun MoreOptionsDisabledProvidersRow(
    disabledProviders: List<ProviderInfo>?,
    onDisabledPasswordManagerSelected: () -> Unit,
    onDisabledProvidersSelected: () -> Unit,
) {
    if (disabledProviders != null && disabledProviders.isNotEmpty()) {
        Entry(
            onClick = onDisabledPasswordManagerSelected,
            onClick = onDisabledProvidersSelected,
            icon = {
                Icon(
                    Icons.Filled.Add,
+14 −18
Original line number Diff line number Diff line
@@ -24,8 +24,6 @@ import androidx.activity.result.IntentSenderRequest
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.android.credentialmanager.CreateFlowUtils
import com.android.credentialmanager.CredentialManagerRepo
@@ -33,6 +31,9 @@ import com.android.credentialmanager.UserConfigRepo
import com.android.credentialmanager.common.DialogResult
import com.android.credentialmanager.common.ProviderActivityResult
import com.android.credentialmanager.common.ResultState
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow

data class CreateCredentialUiState(
  val enabledProviders: List<EnabledProviderInfo>,
@@ -75,11 +76,11 @@ class CreateCredentialViewModel(
      isPasskeyFirstUse))
    private set

  val dialogResult: MutableLiveData<DialogResult> by lazy {
    MutableLiveData<DialogResult>()
  }
  val dialogResult: MutableSharedFlow<DialogResult> =
    MutableSharedFlow(replay = 0, extraBufferCapacity = 1,
      onBufferOverflow = BufferOverflow.DROP_OLDEST)

  fun observeDialogResult(): LiveData<DialogResult> {
  fun observeDialogResult(): SharedFlow<DialogResult> {
    return dialogResult
  }

@@ -138,13 +139,14 @@ class CreateCredentialViewModel(
    onDefaultChanged(providerId)
  }

  fun onDisabledPasswordManagerSelected() {
    // TODO: Complete this function
  fun onDisabledProvidersSelected() {
    CredentialManagerRepo.getInstance().onCancel()
    dialogResult.tryEmit(DialogResult(ResultState.LAUNCH_SETTING_CANCELED))
  }

  fun onCancel() {
    CredentialManagerRepo.getInstance().onCancel()
    dialogResult.value = DialogResult(ResultState.CANCELED)
    dialogResult.tryEmit(DialogResult(ResultState.NORMAL_CANCELED))
  }

  fun onChangeDefaultSelected() {
@@ -190,9 +192,7 @@ class CreateCredentialViewModel(
        entryKey,
        entrySubkey
      )
      dialogResult.value = DialogResult(
        ResultState.COMPLETE,
      )
      dialogResult.tryEmit(DialogResult(ResultState.COMPLETE))
    }
  }

@@ -219,9 +219,7 @@ class CreateCredentialViewModel(
    } else {
      Log.w("Account Selector",
        "Illegal state: confirm is pressed but activeEntry isn't set.")
      dialogResult.value = DialogResult(
        ResultState.COMPLETE,
      )
      dialogResult.tryEmit(DialogResult(ResultState.COMPLETE))
    }
  }

@@ -250,9 +248,7 @@ class CreateCredentialViewModel(
        Log.w("Account Selector",
          "Illegal state: received a provider result but found no matching entry.")
      }
      dialogResult.value = DialogResult(
        ResultState.COMPLETE,
      )
      dialogResult.tryEmit(DialogResult(ResultState.COMPLETE))
    }
  }
}
+10 −9
Original line number Diff line number Diff line
@@ -24,8 +24,6 @@ import androidx.activity.result.IntentSenderRequest
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.android.credentialmanager.CredentialManagerRepo
import com.android.credentialmanager.common.DialogResult
@@ -33,6 +31,9 @@ import com.android.credentialmanager.common.ProviderActivityResult
import com.android.credentialmanager.common.ResultState
import com.android.credentialmanager.jetpack.developer.PublicKeyCredential
import com.android.internal.util.Preconditions
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow

data class GetCredentialUiState(
  val providerInfoList: List<ProviderInfo>,
@@ -52,11 +53,11 @@ class GetCredentialViewModel(
  var uiState by mutableStateOf(credManRepo.getCredentialInitialUiState())
      private set

  val dialogResult: MutableLiveData<DialogResult> by lazy {
    MutableLiveData<DialogResult>()
  }
  val dialogResult: MutableSharedFlow<DialogResult> =
    MutableSharedFlow(replay = 0, extraBufferCapacity = 1,
      onBufferOverflow = BufferOverflow.DROP_OLDEST)

  fun observeDialogResult(): LiveData<DialogResult> {
  fun observeDialogResult(): SharedFlow<DialogResult> {
    return dialogResult
  }

@@ -72,7 +73,7 @@ class GetCredentialViewModel(
      CredentialManagerRepo.getInstance().onOptionSelected(
        entry.providerId, entry.entryKey, entry.entrySubkey,
      )
      dialogResult.value = DialogResult(ResultState.COMPLETE)
      dialogResult.tryEmit(DialogResult(ResultState.COMPLETE))
    }
  }

@@ -117,7 +118,7 @@ class GetCredentialViewModel(
        Log.w("Account Selector",
          "Illegal state: received a provider result but found no matching entry.")
      }
      dialogResult.value = DialogResult(ResultState.COMPLETE)
      dialogResult.tryEmit(DialogResult(ResultState.COMPLETE))
    }
  }

@@ -144,7 +145,7 @@ class GetCredentialViewModel(

  fun onCancel() {
    CredentialManagerRepo.getInstance().onCancel()
    dialogResult.value = DialogResult(ResultState.CANCELED)
    dialogResult.tryEmit(DialogResult(ResultState.NORMAL_CANCELED))
  }
}