From 3bba8518f181686bdff922a3ac3362ac2de6abd5 Mon Sep 17 00:00:00 2001 From: Reema Bajwa Date: Mon, 19 Dec 2022 01:43:09 +0000 Subject: [PATCH] Propagate disabled providers to the credential manager UI app Test: Built locally Change-Id: I006c74531e9cca71e3b83b8f57d549d632ed0943 --- .../credentials/CredentialManagerUi.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java index 33c5ec9088384..64a5152803ce6 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java @@ -17,8 +17,11 @@ package com.android.server.credentials; import android.annotation.NonNull; import android.app.PendingIntent; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ServiceInfo; +import android.credentials.ui.DisabledProviderData; import android.credentials.ui.IntentFactory; import android.credentials.ui.ProviderData; import android.credentials.ui.RequestInfo; @@ -27,11 +30,14 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.ResultReceiver; +import android.service.credentials.CredentialProviderInfo; import android.util.Log; import android.util.Slog; import java.util.ArrayList; +import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; /** Initiates the Credential Manager UI and receives results. */ public class CredentialManagerUi { @@ -89,8 +95,27 @@ public class CredentialManagerUi { public PendingIntent createPendingIntent( RequestInfo requestInfo, ArrayList providerDataList) { Log.i(TAG, "In createPendingIntent"); - Intent intent = IntentFactory.newIntent(requestInfo, providerDataList, new ArrayList<>(), - mResultReceiver) + + ArrayList disabledProviderDataList = new ArrayList<>(); + Set enabledProviders = providerDataList.stream() + .map(ProviderData::getProviderFlattenedComponentName) + .collect(Collectors.toUnmodifiableSet()); + // TODO("Filter out non user configurable providers") + Set allProviders = + CredentialProviderInfo.getAvailableServices(mContext, mUserId).stream() + .map(CredentialProviderInfo::getServiceInfo) + .map(ServiceInfo::getComponentName) + .map(ComponentName::flattenToString) + .collect(Collectors.toUnmodifiableSet()); + + for (String provider: allProviders) { + if (!enabledProviders.contains(provider)) { + disabledProviderDataList.add(new DisabledProviderData(provider)); + } + } + + Intent intent = IntentFactory.newIntent(requestInfo, providerDataList, + disabledProviderDataList, mResultReceiver) .setAction(UUID.randomUUID().toString()); //TODO: Create unique pending intent using request code and cancel any pre-existing pending // intents