Merge "Fix race condition between provider ui launching and credman ui update."

This commit is contained in:
Helen Qin
2022-12-06 07:58:55 +00:00
committed by Android (Google) Code Review
5 changed files with 42 additions and 33 deletions

View File

@@ -69,6 +69,7 @@ class CredentialSelectorActivity : ComponentActivity() {
)
providerActivityResult.value?.let {
viewModel.onProviderActivityResult(it)
providerActivityResult.value = null
}
CreateCredentialScreen(viewModel = viewModel, providerActivityLauncher = launcher)
}
@@ -80,6 +81,7 @@ class CredentialSelectorActivity : ComponentActivity() {
)
providerActivityResult.value?.let {
viewModel.onProviderActivityResult(it)
providerActivityResult.value = null
}
GetCredentialScreen(viewModel = viewModel, providerActivityLauncher = launcher)
}

View File

@@ -60,12 +60,6 @@ fun CreateCredentialScreen(
viewModel: CreateCredentialViewModel,
providerActivityLauncher: ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>
) {
val selectEntryCallback: (EntryInfo) -> Unit = {
viewModel.onEntrySelected(it, providerActivityLauncher)
}
val confirmEntryCallback: () -> Unit = {
viewModel.onConfirmEntrySelected(providerActivityLauncher)
}
val state = rememberModalBottomSheetState(
initialValue = ModalBottomSheetValue.Expanded,
skipHalfExpanded = true
@@ -89,7 +83,7 @@ fun CreateCredentialScreen(
onOptionSelected = viewModel::onEntrySelectedFromFirstUseScreen,
onDisabledPasswordManagerSelected =
viewModel::onDisabledPasswordManagerSelected,
onRemoteEntrySelected = selectEntryCallback,
onRemoteEntrySelected = viewModel::onEntrySelected,
)
CreateScreenState.CREATION_OPTION_SELECTION -> CreationSelectionCard(
requestDisplayInfo = uiState.requestDisplayInfo,
@@ -97,8 +91,8 @@ fun CreateCredentialScreen(
providerInfo = uiState.activeEntry?.activeProvider!!,
createOptionInfo = uiState.activeEntry.activeEntryInfo as CreateOptionInfo,
showActiveEntryOnly = uiState.showActiveEntryOnly,
onOptionSelected = selectEntryCallback,
onConfirm = confirmEntryCallback,
onOptionSelected = viewModel::onEntrySelected,
onConfirm = viewModel::onConfirmEntrySelected,
onCancel = viewModel::onCancel,
onMoreOptionsSelected = viewModel::onMoreOptionsSelected,
)
@@ -110,7 +104,7 @@ fun CreateCredentialScreen(
onOptionSelected = viewModel::onEntrySelectedFromMoreOptionScreen,
onDisabledPasswordManagerSelected =
viewModel::onDisabledPasswordManagerSelected,
onRemoteEntrySelected = selectEntryCallback,
onRemoteEntrySelected = viewModel::onEntrySelected,
)
CreateScreenState.MORE_OPTIONS_ROW_INTRO -> MoreOptionsRowIntroCard(
providerInfo = uiState.activeEntry?.activeProvider!!,
@@ -119,11 +113,13 @@ fun CreateCredentialScreen(
CreateScreenState.EXTERNAL_ONLY_SELECTION -> ExternalOnlySelectionCard(
requestDisplayInfo = uiState.requestDisplayInfo,
activeRemoteEntry = uiState.activeEntry?.activeEntryInfo!!,
onOptionSelected = selectEntryCallback,
onConfirm = confirmEntryCallback,
onOptionSelected = viewModel::onEntrySelected,
onConfirm = viewModel::onConfirmEntrySelected,
onCancel = viewModel::onCancel,
)
}
} else if (uiState.hidden && uiState.selectedEntry != null) {
viewModel.launchProviderUi(providerActivityLauncher)
}
},
scrimColor = MaterialTheme.colorScheme.scrim.copy(alpha = 0.8f),

View File

@@ -130,10 +130,7 @@ class CreateCredentialViewModel(
// TODO: implement the if choose as default or not logic later
}
fun onEntrySelected(
selectedEntry: EntryInfo,
launcher: ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>
) {
fun onEntrySelected(selectedEntry: EntryInfo) {
val providerId = selectedEntry.providerId
val entryKey = selectedEntry.entryKey
val entrySubkey = selectedEntry.entrySubkey
@@ -145,9 +142,6 @@ class CreateCredentialViewModel(
selectedEntry = selectedEntry,
hidden = true,
)
val intentSenderRequest = IntentSenderRequest.Builder(selectedEntry.pendingIntent)
.setFillInIntent(selectedEntry.fillInIntent).build()
launcher.launch(intentSenderRequest)
} else {
CredentialManagerRepo.getInstance().onOptionSelected(
providerId,
@@ -160,12 +154,23 @@ class CreateCredentialViewModel(
}
}
fun onConfirmEntrySelected(
fun launchProviderUi(
launcher: ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>
) {
val entry = uiState.selectedEntry
if (entry != null && entry.pendingIntent != null) {
val intentSenderRequest = IntentSenderRequest.Builder(entry.pendingIntent)
.setFillInIntent(entry.fillInIntent).build()
launcher.launch(intentSenderRequest)
} else {
Log.w("Account Selector", "No provider UI to launch")
}
}
fun onConfirmEntrySelected() {
val selectedEntry = uiState.activeEntry?.activeEntryInfo
if (selectedEntry != null) {
onEntrySelected(selectedEntry, launcher)
onEntrySelected(selectedEntry)
} else {
Log.w("Account Selector",
"Illegal state: confirm is pressed but activeEntry isn't set.")

View File

@@ -71,9 +71,6 @@ fun GetCredentialScreen(
viewModel: GetCredentialViewModel,
providerActivityLauncher: ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>
) {
val entrySelectionCallback: (EntryInfo) -> Unit = {
viewModel.onEntrySelected(it, providerActivityLauncher)
}
val state = rememberModalBottomSheetState(
initialValue = ModalBottomSheetValue.Expanded,
skipHalfExpanded = true
@@ -89,17 +86,19 @@ fun GetCredentialScreen(
GetScreenState.PRIMARY_SELECTION -> PrimarySelectionCard(
requestDisplayInfo = uiState.requestDisplayInfo,
providerDisplayInfo = uiState.providerDisplayInfo,
onEntrySelected = entrySelectionCallback,
onEntrySelected = viewModel::onEntrySelected,
onCancel = viewModel::onCancel,
onMoreOptionSelected = viewModel::onMoreOptionSelected,
)
GetScreenState.ALL_SIGN_IN_OPTIONS -> AllSignInOptionCard(
providerInfoList = uiState.providerInfoList,
providerDisplayInfo = uiState.providerDisplayInfo,
onEntrySelected = entrySelectionCallback,
onEntrySelected = viewModel::onEntrySelected,
onBackButtonClicked = viewModel::onBackToPrimarySelectionScreen,
)
}
} else if (uiState.hidden && uiState.selectedEntry != null) {
viewModel.launchProviderUi(providerActivityLauncher)
}
},
scrimColor = MaterialTheme.colorScheme.scrim.copy(alpha = 0.8f),

View File

@@ -58,10 +58,7 @@ class GetCredentialViewModel(
return dialogResult
}
fun onEntrySelected(
entry: EntryInfo,
launcher: ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>
) {
fun onEntrySelected(entry: EntryInfo) {
Log.d("Account Selector", "credential selected:" +
" {provider=${entry.providerId}, key=${entry.entryKey}, subkey=${entry.entrySubkey}}")
if (entry.pendingIntent != null) {
@@ -69,9 +66,6 @@ class GetCredentialViewModel(
selectedEntry = entry,
hidden = true,
)
val intentSenderRequest = IntentSenderRequest.Builder(entry.pendingIntent)
.setFillInIntent(entry.fillInIntent).build()
launcher.launch(intentSenderRequest)
} else {
CredentialManagerRepo.getInstance().onOptionSelected(
entry.providerId, entry.entryKey, entry.entrySubkey,
@@ -80,6 +74,19 @@ class GetCredentialViewModel(
}
}
fun launchProviderUi(
launcher: ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>
) {
val entry = uiState.selectedEntry
if (entry != null && entry.pendingIntent != null) {
val intentSenderRequest = IntentSenderRequest.Builder(entry.pendingIntent)
.setFillInIntent(entry.fillInIntent).build()
launcher.launch(intentSenderRequest)
} else {
Log.w("Account Selector", "No provider UI to launch")
}
}
fun onProviderActivityResult(providerActivityResult: ProviderActivityResult) {
val entry = uiState.selectedEntry
val resultCode = providerActivityResult.resultCode