Navigate directly to second page from pinned entry
Bug: 318503000
Test: Deployed and tested locally
Change-Id: I57e2bb6c1dbb76468b04d255ecb9f0be697c51c2
diff --git a/core/java/android/credentials/ui/Constants.java b/core/java/android/credentials/ui/Constants.java
index 7092f29..37f850b 100644
--- a/core/java/android/credentials/ui/Constants.java
+++ b/core/java/android/credentials/ui/Constants.java
@@ -29,6 +29,13 @@
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 5e8372d..49321d5 100644
--- a/core/java/android/credentials/ui/IntentFactory.java
+++ b/core/java/android/credentials/ui/IntentFactory.java
@@ -35,6 +35,31 @@
*/
@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 a78509d..c0d7149 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
@@ -53,6 +53,7 @@
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 @@
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 @@
)
}
RequestInfo.TYPE_GET -> {
- val getCredentialInitialUiState = getCredentialInitialUiState(originName)!!
+ val getCredentialInitialUiState = getCredentialInitialUiState(originName,
+ isReqForAllOptions)!!
val autoSelectEntry =
findAutoSelectEntry(getCredentialInitialUiState.providerDisplayInfo)
UiState(
@@ -216,14 +223,18 @@
}
// 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 46bebc4..a291f59 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.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 toGetScreenState(
- providerDisplayInfo: ProviderDisplayInfo
+ providerDisplayInfo: ProviderDisplayInfo,
+ isRequestForAllOptions: Boolean
): GetScreenState {
return if (providerDisplayInfo.sortedUserNameToCredentialEntryList.isEmpty() &&
providerDisplayInfo.remoteEntry == null &&
@@ -194,6 +197,8 @@
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 6899ad4..31409ab 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 @@
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 3c190bf..f092dcc 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 @@
*
* @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 @@
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 ca5600e..d165171 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 @@
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 c9e691e..3f57c80 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 @@
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 f447c1f..fbfc9ca 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 @@
mRequestId, mClientRequest, mClientAppInfo.getPackageName(),
PermissionUtils.hasPermission(mContext, mClientAppInfo.getPackageName(),
Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS)),
- providerDataList);
+ providerDataList, /*isRequestForAllOptions=*/ false);
} else {
return null;
}