summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-01-04 00:28:42 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-01-04 00:28:42 +0000
commit2e11589a397c4a64a43f3606d2d33c1d7e19898b (patch)
tree8b5b500c7284e9422de51b6d6c3ce9268890265c
parentb0d99d8ff22f601748af3c353f1d3944bfd15110 (diff)
parent3fedc79ff91fd6076e0db0bac4066c53b9fa8313 (diff)
Merge "Navigate directly to second page from pinned entry" into main
-rw-r--r--core/java/android/credentials/ui/Constants.java7
-rw-r--r--core/java/android/credentials/ui/IntentFactory.java25
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt19
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt9
-rw-r--r--services/credentials/java/com/android/server/credentials/CreateRequestSession.java2
-rw-r--r--services/credentials/java/com/android/server/credentials/CredentialManagerUi.java8
-rw-r--r--services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java3
-rw-r--r--services/credentials/java/com/android/server/credentials/GetRequestSession.java31
-rw-r--r--services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java2
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;
}