From bc42ccdae1a8246f4895aeac6e3a7080d14e0b0a Mon Sep 17 00:00:00 2001 From: Helen Qin Date: Wed, 7 Dec 2022 06:49:27 +0000 Subject: [PATCH] Fix another race condition for provider ui launching. Make sure that once a provider ui is launched, we don't relaunch it until that pending ui has finished. Test: verified locally Fix: 261676445 Change-Id: I2424f919bdabf0facf2d727f439235e7586953cf --- .../createflow/CreateCredentialComponents.kt | 2 +- .../createflow/CreateCredentialViewModel.kt | 5 +++++ .../credentialmanager/getflow/GetCredentialComponents.kt | 2 +- .../credentialmanager/getflow/GetCredentialViewModel.kt | 5 +++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt index 5d22bfd68d0b7..b417b385ada76 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt @@ -118,7 +118,7 @@ fun CreateCredentialScreen( onCancel = viewModel::onCancel, ) } - } else if (uiState.hidden && uiState.selectedEntry != null) { + } else if (uiState.selectedEntry != null && !uiState.providerActivityPending) { viewModel.launchProviderUi(providerActivityLauncher) } }, diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialViewModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialViewModel.kt index 3d23f5d424a51..518aaee5ea9bf 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialViewModel.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialViewModel.kt @@ -42,6 +42,7 @@ data class CreateCredentialUiState( val activeEntry: ActiveEntry? = null, val selectedEntry: EntryInfo? = null, val hidden: Boolean = false, + val providerActivityPending: Boolean = false, ) class CreateCredentialViewModel( @@ -162,6 +163,9 @@ class CreateCredentialViewModel( ) { val entry = uiState.selectedEntry if (entry != null && entry.pendingIntent != null) { + uiState = uiState.copy( + providerActivityPending = true, + ) val intentSenderRequest = IntentSenderRequest.Builder(entry.pendingIntent) .setFillInIntent(entry.fillInIntent).build() launcher.launch(intentSenderRequest) @@ -192,6 +196,7 @@ class CreateCredentialViewModel( uiState = uiState.copy( selectedEntry = null, hidden = false, + providerActivityPending = false, ) } else { if (entry != null) { diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt index 21342a15aca58..d6d71220e943f 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt @@ -97,7 +97,7 @@ fun GetCredentialScreen( onBackButtonClicked = viewModel::onBackToPrimarySelectionScreen, ) } - } else if (uiState.hidden && uiState.selectedEntry != null) { + } else if (uiState.selectedEntry != null && !uiState.providerActivityPending) { viewModel.launchProviderUi(providerActivityLauncher) } }, diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialViewModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialViewModel.kt index 33e7021033893..7b80124d618c8 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialViewModel.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialViewModel.kt @@ -41,6 +41,7 @@ data class GetCredentialUiState( val providerDisplayInfo: ProviderDisplayInfo = toProviderDisplayInfo(providerInfoList), val selectedEntry: EntryInfo? = null, val hidden: Boolean = false, + val providerActivityPending: Boolean = false, ) class GetCredentialViewModel( @@ -79,6 +80,9 @@ class GetCredentialViewModel( ) { val entry = uiState.selectedEntry if (entry != null && entry.pendingIntent != null) { + uiState = uiState.copy( + providerActivityPending = true, + ) val intentSenderRequest = IntentSenderRequest.Builder(entry.pendingIntent) .setFillInIntent(entry.fillInIntent).build() launcher.launch(intentSenderRequest) @@ -96,6 +100,7 @@ class GetCredentialViewModel( uiState = uiState.copy( selectedEntry = null, hidden = false, + providerActivityPending = false, ) } else { if (entry != null) {