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
This commit is contained in:
Qinmei Du
2023-01-04 17:17:16 +00:00
parent b72d65fd30
commit 78b592c214
5 changed files with 56 additions and 51 deletions

View File

@@ -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()
}
}

View File

@@ -18,7 +18,8 @@ package com.android.credentialmanager.common
enum class ResultState {
COMPLETE,
CANCELED,
NORMAL_CANCELED,
LAUNCH_SETTING_CANCELED
}
data class DialogResult(

View File

@@ -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,

View File

@@ -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))
}
}
}

View File

@@ -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))
}
}