diff options
author | 2024-01-04 00:28:42 +0000 | |
---|---|---|
committer | 2024-01-04 00:28:42 +0000 | |
commit | 2e11589a397c4a64a43f3606d2d33c1d7e19898b (patch) | |
tree | 8b5b500c7284e9422de51b6d6c3ce9268890265c | |
parent | b0d99d8ff22f601748af3c353f1d3944bfd15110 (diff) | |
parent | 3fedc79ff91fd6076e0db0bac4066c53b9fa8313 (diff) |
Merge "Navigate directly to second page from pinned entry" into main
9 files changed, 81 insertions, 25 deletions
diff --git a/core/java/android/credentials/ui/Constants.java b/core/java/android/credentials/ui/Constants.java index 7092f291eea5..37f850bc46c5 100644 --- a/core/java/android/credentials/ui/Constants.java +++ b/core/java/android/credentials/ui/Constants.java @@ -29,6 +29,13 @@ public class Constants { public static final String EXTRA_RESULT_RECEIVER = "android.credentials.ui.extra.RESULT_RECEIVER"; + /** + * The intent extra key for indicating whether the bottom sheet should be started directly + * on the 'All Options' screen. + */ + public static final String EXTRA_REQ_FOR_ALL_OPTIONS = + "android.credentials.ui.extra.REQ_FOR_ALL_OPTIONS"; + /** The intent action for when the enabled Credential Manager providers has been updated. */ public static final String CREDMAN_ENABLED_PROVIDERS_UPDATED = "android.credentials.ui.action.CREDMAN_ENABLED_PROVIDERS_UPDATED"; diff --git a/core/java/android/credentials/ui/IntentFactory.java b/core/java/android/credentials/ui/IntentFactory.java index 5e8372d68eb2..49321d514128 100644 --- a/core/java/android/credentials/ui/IntentFactory.java +++ b/core/java/android/credentials/ui/IntentFactory.java @@ -35,6 +35,31 @@ import java.util.ArrayList; */ @TestApi public class IntentFactory { + + /** + * Generate a new launch intent to the Credential Selector UI. + * + * @hide + */ + @NonNull + public static Intent createCredentialSelectorIntent( + @NonNull RequestInfo requestInfo, + @SuppressLint("ConcreteCollection") // Concrete collection needed for marshalling. + @NonNull + ArrayList<ProviderData> enabledProviderDataList, + @SuppressLint("ConcreteCollection") // Concrete collection needed for marshalling. + @NonNull + ArrayList<DisabledProviderData> disabledProviderDataList, + @NonNull ResultReceiver resultReceiver, + boolean isRequestForAllOptions) { + + Intent intent = createCredentialSelectorIntent(requestInfo, enabledProviderDataList, + disabledProviderDataList, resultReceiver); + intent.putExtra(Constants.EXTRA_REQ_FOR_ALL_OPTIONS, isRequestForAllOptions); + + return intent; + } + /** Generate a new launch intent to the Credential Selector UI. */ @NonNull public static Intent createCredentialSelectorIntent( diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt index a78509d897aa..c0d71494e020 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt @@ -53,6 +53,7 @@ class CredentialManagerRepo( isNewActivity: Boolean, ) { val requestInfo: RequestInfo? + var isReqForAllOptions: Boolean = false private val providerEnabledList: List<ProviderData> private val providerDisabledList: List<DisabledProviderData>? val resultReceiver: ResultReceiver? @@ -102,6 +103,11 @@ class CredentialManagerRepo( ResultReceiver::class.java ) + isReqForAllOptions = intent.getBooleanExtra( + Constants.EXTRA_REQ_FOR_ALL_OPTIONS, + /*defaultValue=*/ false + ) + val cancellationRequest = getCancelUiRequest(intent) val cancelUiRequestState = cancellationRequest?.let { CancelUiRequestState(getAppLabel(context.getPackageManager(), it.appPackageName)) @@ -141,7 +147,8 @@ class CredentialManagerRepo( ) } RequestInfo.TYPE_GET -> { - val getCredentialInitialUiState = getCredentialInitialUiState(originName)!! + val getCredentialInitialUiState = getCredentialInitialUiState(originName, + isReqForAllOptions)!! val autoSelectEntry = findAutoSelectEntry(getCredentialInitialUiState.providerDisplayInfo) UiState( @@ -216,14 +223,18 @@ class CredentialManagerRepo( } // IMPORTANT: new invocation should be mindful that this method can throw. - private fun getCredentialInitialUiState(originName: String?): GetCredentialUiState? { + private fun getCredentialInitialUiState( + originName: String?, + isReqForAllOptions: Boolean + ): GetCredentialUiState? { val providerEnabledList = GetFlowUtils.toProviderList( providerEnabledList as List<GetCredentialProviderData>, context ) val requestDisplayInfo = GetFlowUtils.toRequestDisplayInfo(requestInfo, context, originName) return GetCredentialUiState( - providerEnabledList, - requestDisplayInfo ?: return null, + isReqForAllOptions, + providerEnabledList, + requestDisplayInfo ?: return null ) } diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt index 46bebc4073ab..a291f59021f0 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt @@ -26,10 +26,12 @@ import com.android.credentialmanager.model.get.RemoteEntryInfo import com.android.internal.util.Preconditions data class GetCredentialUiState( + val isRequestForAllOptions: Boolean, val providerInfoList: List<ProviderInfo>, val requestDisplayInfo: RequestDisplayInfo, val providerDisplayInfo: ProviderDisplayInfo = toProviderDisplayInfo(providerInfoList), - val currentScreenState: GetScreenState = toGetScreenState(providerDisplayInfo), + val currentScreenState: GetScreenState = toGetScreenState( + providerDisplayInfo, isRequestForAllOptions), val activeEntry: EntryInfo? = toActiveEntry(providerDisplayInfo), val isNoAccount: Boolean = false, ) @@ -184,7 +186,8 @@ private fun toActiveEntry( } private fun toGetScreenState( - providerDisplayInfo: ProviderDisplayInfo + providerDisplayInfo: ProviderDisplayInfo, + isRequestForAllOptions: Boolean ): GetScreenState { return if (providerDisplayInfo.sortedUserNameToCredentialEntryList.isEmpty() && providerDisplayInfo.remoteEntry == null && @@ -194,6 +197,8 @@ private fun toGetScreenState( providerDisplayInfo.authenticationEntryList.isEmpty() && providerDisplayInfo.remoteEntry != null) GetScreenState.REMOTE_ONLY + else if (isRequestForAllOptions) + GetScreenState.ALL_SIGN_IN_OPTIONS else GetScreenState.PRIMARY_SELECTION } diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java index 6899ad48b813..31409ab1de4b 100644 --- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java @@ -109,7 +109,7 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR PermissionUtils.hasPermission(mContext, mClientAppInfo.getPackageName(), Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS), /*defaultProviderId=*/flattenedPrimaryProviders), - providerDataList); + providerDataList, /*isRequestForAllOptions=*/ false); mClientCallback.onPendingIntent(mPendingIntent); } catch (RemoteException e) { mRequestSessionMetric.collectUiReturnedFinalPhase(/*uiReturned=*/ false); diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java index 3c190bf7ad11..f092dccbcfd1 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java @@ -150,9 +150,12 @@ public class CredentialManagerUi { * * @param requestInfo the information about the request * @param providerDataList the list of provider data from remote providers + * @param isRequestForAllOptions whether the bottom sheet should directly navigate to the + * all options page */ public PendingIntent createPendingIntent( - RequestInfo requestInfo, ArrayList<ProviderData> providerDataList) { + RequestInfo requestInfo, ArrayList<ProviderData> providerDataList, + boolean isRequestForAllOptions) { List<CredentialProviderInfo> allProviders = CredentialProviderInfoFactory.getCredentialProviderServices( mContext, @@ -168,7 +171,8 @@ public class CredentialManagerUi { disabledProvider.getComponentName().flattenToString())).toList(); Intent intent = IntentFactory.createCredentialSelectorIntent(requestInfo, providerDataList, - new ArrayList<>(disabledProviderDataList), mResultReceiver) + new ArrayList<>(disabledProviderDataList), mResultReceiver, + isRequestForAllOptions) .setAction(UUID.randomUUID().toString()); //TODO: Create unique pending intent using request code and cancel any pre-existing pending // intents diff --git a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java index ca5600e2049a..d1651713fe03 100644 --- a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java @@ -106,7 +106,8 @@ public class GetCandidateRequestSession extends RequestSession<GetCredentialRequ mRequestId, mClientRequest, mClientAppInfo.getPackageName(), PermissionUtils.hasPermission(mContext, mClientAppInfo.getPackageName(), Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS)), - providerDataList); + providerDataList, + /*isRequestForAllOptions=*/ true); List<GetCredentialProviderData> candidateProviderDataList = new ArrayList<>(); for (ProviderData providerData : providerDataList) { diff --git a/services/credentials/java/com/android/server/credentials/GetRequestSession.java b/services/credentials/java/com/android/server/credentials/GetRequestSession.java index c9e691e199c7..3f57c804cba0 100644 --- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java @@ -99,21 +99,24 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest, protected void launchUiWithProviderData(ArrayList<ProviderData> providerDataList) { mRequestSessionMetric.collectUiCallStartTime(System.nanoTime()); mCredentialManagerUi.setStatus(CredentialManagerUi.UiStatus.USER_INTERACTION); - Binder.withCleanCallingIdentity(()-> { - try { + Binder.withCleanCallingIdentity(() -> { + try { cancelExistingPendingIntent(); - mPendingIntent = mCredentialManagerUi.createPendingIntent( - RequestInfo.newGetRequestInfo( - mRequestId, mClientRequest, mClientAppInfo.getPackageName(), - PermissionUtils.hasPermission(mContext, mClientAppInfo.getPackageName(), - Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS)), - providerDataList); - mClientCallback.onPendingIntent(mPendingIntent); - } catch (RemoteException e) { - mRequestSessionMetric.collectUiReturnedFinalPhase(/*uiReturned=*/ false); - mCredentialManagerUi.setStatus(CredentialManagerUi.UiStatus.TERMINATED); - String exception = GetCredentialException.TYPE_UNKNOWN; - mRequestSessionMetric.collectFrameworkException(exception); + mPendingIntent = mCredentialManagerUi.createPendingIntent( + RequestInfo.newGetRequestInfo( + mRequestId, mClientRequest, mClientAppInfo.getPackageName(), + PermissionUtils.hasPermission(mContext, + mClientAppInfo.getPackageName(), + Manifest.permission + .CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS)), + providerDataList, + /*isRequestForAllOptions=*/ false); + mClientCallback.onPendingIntent(mPendingIntent); + } catch (RemoteException e) { + mRequestSessionMetric.collectUiReturnedFinalPhase(/*uiReturned=*/ false); + mCredentialManagerUi.setStatus(CredentialManagerUi.UiStatus.TERMINATED); + String exception = GetCredentialException.TYPE_UNKNOWN; + mRequestSessionMetric.collectFrameworkException(exception); respondToClientWithErrorAndFinish(exception, "Unable to instantiate selector"); } }); diff --git a/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java b/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java index f447c1fd277e..fbfc9caf0205 100644 --- a/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java @@ -192,7 +192,7 @@ public class PrepareGetRequestSession extends GetRequestSession { mRequestId, mClientRequest, mClientAppInfo.getPackageName(), PermissionUtils.hasPermission(mContext, mClientAppInfo.getPackageName(), Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS)), - providerDataList); + providerDataList, /*isRequestForAllOptions=*/ false); } else { return null; } |