diff options
4 files changed, 45 insertions, 19 deletions
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt index e53e956c317c..a9bee039264e 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt @@ -107,7 +107,7 @@ class CredentialManagerRepo( initialUiState = when (requestInfo?.type) { RequestInfo.TYPE_CREATE -> { - val defaultProviderId = userConfigRepo.getDefaultProviderId() + val defaultProviderIdSetByUser = userConfigRepo.getDefaultProviderId() val isPasskeyFirstUse = userConfigRepo.getIsPasskeyFirstUse() val providerEnableListUiState = getCreateProviderEnableListInitialUiState() val providerDisableListUiState = getCreateProviderDisableListInitialUiState() @@ -115,12 +115,14 @@ class CredentialManagerRepo( getCreateRequestDisplayInfoInitialUiState(originName)!! UiState( createCredentialUiState = CreateFlowUtils.toCreateCredentialUiState( - providerEnableListUiState, - providerDisableListUiState, - defaultProviderId, - requestDisplayInfoUiState, + enabledProviders = providerEnableListUiState, + disabledProviders = providerDisableListUiState, + defaultProviderIdPreferredByApp = + requestDisplayInfoUiState.appPreferredDefaultProviderId, + defaultProviderIdSetByUser = defaultProviderIdSetByUser, + requestDisplayInfo = requestDisplayInfoUiState, isOnPasskeyIntroStateAlready = false, - isPasskeyFirstUse + isPasskeyFirstUse = isPasskeyFirstUse, )!!, getCredentialUiState = null, cancelRequestState = cancelUiRequestState diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt index 29ec970966d6..4d2bb4c6016a 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt @@ -250,9 +250,15 @@ class CredentialSelectorViewModel( return } val newUiState = CreateFlowUtils.toCreateCredentialUiState( - prevUiState.enabledProviders, prevUiState.disabledProviders, - userConfigRepo.getDefaultProviderId(), prevUiState.requestDisplayInfo, true, - userConfigRepo.getIsPasskeyFirstUse()) + enabledProviders = prevUiState.enabledProviders, + disabledProviders = prevUiState.disabledProviders, + defaultProviderIdPreferredByApp = + prevUiState.requestDisplayInfo.appPreferredDefaultProviderId, + defaultProviderIdSetByUser = userConfigRepo.getDefaultProviderId(), + requestDisplayInfo = prevUiState.requestDisplayInfo, + isOnPasskeyIntroStateAlready = true, + isPasskeyFirstUse = userConfigRepo.getIsPasskeyFirstUse() + ) if (newUiState == null) { Log.d(Constants.LOG_TAG, "Unable to update create ui state") onInternalError() diff --git a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt index 64addf237f9b..e8d3b1f45be3 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt @@ -464,6 +464,9 @@ class CreateFlowUtils { createCredentialRequest.candidateQueryData, createCredentialRequest.isSystemProviderRequired ) + val appPreferredDefaultProviderId: String? = + if (!requestInfo.hasPermissionToOverrideDefault()) null + else createCredentialRequestJetpack?.displayInfo?.preferDefaultProvider return when (createCredentialRequestJetpack) { is CreatePasswordRequest -> RequestDisplayInfo( createCredentialRequestJetpack.id, @@ -472,6 +475,7 @@ class CreateFlowUtils { appLabel, context.getDrawable(R.drawable.ic_password_24) ?: return null, preferImmediatelyAvailableCredentials = false, + appPreferredDefaultProviderId = appPreferredDefaultProviderId, ) is CreatePublicKeyCredentialRequest -> { newRequestDisplayInfoFromPasskeyJson( @@ -480,6 +484,7 @@ class CreateFlowUtils { context = context, preferImmediatelyAvailableCredentials = createCredentialRequestJetpack.preferImmediatelyAvailableCredentials, + appPreferredDefaultProviderId = appPreferredDefaultProviderId, ) } is CreateCustomCredentialRequest -> { @@ -495,6 +500,7 @@ class CreateFlowUtils { typeIcon = displayInfo.credentialTypeIcon?.loadDrawable(context) ?: context.getDrawable(R.drawable.ic_other_sign_in_24) ?: return null, preferImmediatelyAvailableCredentials = false, + appPreferredDefaultProviderId = appPreferredDefaultProviderId, ) } else -> null @@ -504,20 +510,27 @@ class CreateFlowUtils { fun toCreateCredentialUiState( enabledProviders: List<EnabledProviderInfo>, disabledProviders: List<DisabledProviderInfo>?, - defaultProviderId: String?, + defaultProviderIdPreferredByApp: String?, + defaultProviderIdSetByUser: String?, requestDisplayInfo: RequestDisplayInfo, isOnPasskeyIntroStateAlready: Boolean, isPasskeyFirstUse: Boolean, ): CreateCredentialUiState? { var lastSeenProviderWithNonEmptyCreateOptions: EnabledProviderInfo? = null var remoteEntry: RemoteInfo? = null - var defaultProvider: EnabledProviderInfo? = null + var defaultProviderPreferredByApp: EnabledProviderInfo? = null + var defaultProviderSetByUser: EnabledProviderInfo? = null var createOptionsPairs: MutableList<Pair<CreateOptionInfo, EnabledProviderInfo>> = mutableListOf() enabledProviders.forEach { enabledProvider -> - if (defaultProviderId != null) { - if (enabledProvider.id == defaultProviderId) { - defaultProvider = enabledProvider + if (defaultProviderIdPreferredByApp != null) { + if (enabledProvider.id == defaultProviderIdPreferredByApp) { + defaultProviderPreferredByApp = enabledProvider + } + } + if (defaultProviderIdSetByUser != null) { + if (enabledProvider.id == defaultProviderIdSetByUser) { + defaultProviderSetByUser = enabledProvider } } if (enabledProvider.createOptions.isNotEmpty()) { @@ -536,12 +549,14 @@ class CreateFlowUtils { remoteEntry = currRemoteEntry } } + val defaultProvider = defaultProviderPreferredByApp ?: defaultProviderSetByUser val initialScreenState = toCreateScreenState( - /*createOptionSize=*/createOptionsPairs.size, - /*isOnPasskeyIntroStateAlready=*/isOnPasskeyIntroStateAlready, - /*requestDisplayInfo=*/requestDisplayInfo, - /*defaultProvider=*/defaultProvider, /*remoteEntry=*/remoteEntry, - /*isPasskeyFirstUse=*/isPasskeyFirstUse + createOptionSize = createOptionsPairs.size, + isOnPasskeyIntroStateAlready = isOnPasskeyIntroStateAlready, + requestDisplayInfo = requestDisplayInfo, + defaultProvider = defaultProvider, + remoteEntry = remoteEntry, + isPasskeyFirstUse = isPasskeyFirstUse ) ?: return null return CreateCredentialUiState( enabledProviders = enabledProviders, @@ -667,6 +682,7 @@ class CreateFlowUtils { appLabel: String, context: Context, preferImmediatelyAvailableCredentials: Boolean, + appPreferredDefaultProviderId: String?, ): RequestDisplayInfo? { val json = JSONObject(requestJson) var passkeyUsername = "" @@ -687,6 +703,7 @@ class CreateFlowUtils { appLabel, context.getDrawable(R.drawable.ic_passkey_24) ?: return null, preferImmediatelyAvailableCredentials, + appPreferredDefaultProviderId, ) } } diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt index 4332fb34ce79..12bb6298b282 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt @@ -107,6 +107,7 @@ data class RequestDisplayInfo( val appName: String, val typeIcon: Drawable, val preferImmediatelyAvailableCredentials: Boolean, + val appPreferredDefaultProviderId: String?, ) /** |