diff --git a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java index bbebbf2383f58..5c77aa22ece8a 100644 --- a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java @@ -30,6 +30,7 @@ import android.service.credentials.CallingAppInfo; import android.util.Log; import java.util.ArrayList; +import java.util.Set; /** * Central session for a single clearCredentialState request. This class listens to the @@ -43,11 +44,12 @@ public final class ClearRequestSession extends RequestSession enabledProviders, + CancellationSignal cancellationSignal, long startedTimestamp) { super(context, sessionCallback, lock, userId, callingUid, request, callback, RequestInfo.TYPE_UNDEFINED, - callingAppInfo, cancellationSignal, startedTimestamp); + callingAppInfo, enabledProviders, cancellationSignal, startedTimestamp); } /** diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java index 4c456a88b00b9..02aaf867fa7ba 100644 --- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java @@ -38,6 +38,7 @@ import android.util.Log; import com.android.server.credentials.metrics.ProviderStatusForMetrics; import java.util.ArrayList; +import java.util.Set; /** * Central session for a single {@link CredentialManager#createCredential} request. @@ -54,11 +55,12 @@ public final class CreateRequestSession extends RequestSession enabledProviders, CancellationSignal cancellationSignal, long startedTimestamp) { super(context, sessionCallback, lock, userId, callingUid, request, callback, RequestInfo.TYPE_CREATE, - callingAppInfo, cancellationSignal, startedTimestamp); + callingAppInfo, enabledProviders, cancellationSignal, startedTimestamp); } /** diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java index 90f30b5670236..9320dd2473800 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java @@ -458,6 +458,7 @@ public final class CredentialManagerService callback, request, constructCallingAppInfo(callingPackage, userId, request.getOrigin()), + getEnabledProviders(), CancellationSignal.fromTransport(cancelTransport), timestampBegan); addSessionLocked(userId, session); @@ -512,6 +513,7 @@ public final class CredentialManagerService getCredentialCallback, request, constructCallingAppInfo(callingPackage, userId, request.getOrigin()), + getEnabledProviders(), CancellationSignal.fromTransport(cancelTransport), timestampBegan, prepareGetCredentialCallback); @@ -629,6 +631,7 @@ public final class CredentialManagerService request, callback, constructCallingAppInfo(callingPackage, userId, request.getOrigin()), + getEnabledProviders(), CancellationSignal.fromTransport(cancelTransport), timestampBegan); addSessionLocked(userId, session); @@ -846,6 +849,7 @@ public final class CredentialManagerService callback, request, constructCallingAppInfo(callingPackage, userId, null), + getEnabledProviders(), CancellationSignal.fromTransport(cancelTransport), timestampBegan); addSessionLocked(userId, session); diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java index e16d48e0a6800..87509067f9932 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java @@ -20,7 +20,6 @@ import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.ServiceInfo; import android.credentials.CredentialManager; import android.credentials.CredentialProviderInfo; import android.credentials.ui.DisabledProviderData; @@ -38,34 +37,32 @@ import android.util.Log; import android.util.Slog; import java.util.ArrayList; -import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; /** Initiates the Credential Manager UI and receives results. */ public class CredentialManagerUi { private static final String TAG = "CredentialManagerUi"; @NonNull private final CredentialManagerUiCallback mCallbacks; - @NonNull private final Context mContext; + @NonNull + private final Context mContext; // TODO : Use for starting the activity for this user private final int mUserId; private UiStatus mStatus; - /** Creates intent that is ot be invoked to cancel an in-progress UI session. */ - public Intent createCancelIntent(IBinder requestId, String packageName) { - return IntentFactory.createCancelUiIntent(requestId, /*shouldShowCancellationUi=*/ true, - packageName); - } + private final Set mEnabledProviders; enum UiStatus { IN_PROGRESS, USER_INTERACTION, NOT_STARTED, TERMINATED } - @NonNull private final ResultReceiver mResultReceiver = new ResultReceiver( + + @NonNull + private final ResultReceiver mResultReceiver = new ResultReceiver( new Handler(Looper.getMainLooper())) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { @@ -105,24 +102,33 @@ public class CredentialManagerUi { } } + /** Creates intent that is ot be invoked to cancel an in-progress UI session. */ + public Intent createCancelIntent(IBinder requestId, String packageName) { + return IntentFactory.createCancelUiIntent(requestId, /*shouldShowCancellationUi=*/ true, + packageName); + } + /** * Interface to be implemented by any class that wishes to get callbacks from the UI. */ public interface CredentialManagerUiCallback { /** Called when the user makes a selection. */ void onUiSelection(UserSelectionDialogResult selection); + /** Called when the UI is canceled without a successful provider result. */ void onUiCancellation(boolean isUserCancellation); /** Called when the selector UI fails to come up (mostly due to parsing issue today). */ void onUiSelectorInvocationFailure(); } + public CredentialManagerUi(Context context, int userId, - CredentialManagerUiCallback callbacks) { + CredentialManagerUiCallback callbacks, Set enabledProviders) { Log.i(TAG, "In CredentialManagerUi constructor"); mContext = context; mUserId = userId; mCallbacks = callbacks; + mEnabledProviders = enabledProviders; mStatus = UiStatus.IN_PROGRESS; } @@ -139,37 +145,28 @@ public class CredentialManagerUi { /** * Creates a {@link PendingIntent} to be used to invoke the credential manager selector UI, * by the calling app process. - * @param requestInfo the information about the request + * + * @param requestInfo the information about the request * @param providerDataList the list of provider data from remote providers */ public PendingIntent createPendingIntent( RequestInfo requestInfo, ArrayList providerDataList) { Log.i(TAG, "In createPendingIntent"); - ArrayList disabledProviderDataList = new ArrayList<>(); - Set enabledProviders = providerDataList.stream() - .map(ProviderData::getProviderFlattenedComponentName) - .collect(Collectors.toUnmodifiableSet()); - Set allProviders = + List allProviders = CredentialProviderInfoFactory.getCredentialProviderServices( - mContext, - mUserId, - CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY, - new HashSet<>()) - .stream() - .map(CredentialProviderInfo::getServiceInfo) - .map(ServiceInfo::getComponentName) - .map(ComponentName::flattenToString) - .collect(Collectors.toUnmodifiableSet()); + mContext, + mUserId, + CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY, + mEnabledProviders); - for (String provider: allProviders) { - if (!enabledProviders.contains(provider)) { - disabledProviderDataList.add(new DisabledProviderData(provider)); - } - } + List disabledProviderDataList = allProviders.stream() + .filter(provider -> !provider.isEnabled()) + .map(disabledProvider -> new DisabledProviderData( + disabledProvider.getComponentName().flattenToString())).toList(); Intent intent = IntentFactory.createCredentialSelectorIntent(requestInfo, providerDataList, - disabledProviderDataList, mResultReceiver) + new ArrayList<>(disabledProviderDataList), mResultReceiver) .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/GetRequestSession.java b/services/credentials/java/com/android/server/credentials/GetRequestSession.java index 2548bd888b9de..c44e665ba699d 100644 --- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java @@ -35,6 +35,7 @@ import android.util.Log; import com.android.server.credentials.metrics.ProviderStatusForMetrics; import java.util.ArrayList; +import java.util.Set; import java.util.stream.Collectors; /** @@ -45,22 +46,26 @@ public class GetRequestSession extends RequestSession implements ProviderSession.ProviderInternalCallback { private static final String TAG = "GetRequestSession"; + public GetRequestSession(Context context, RequestSession.SessionLifetime sessionCallback, Object lock, int userId, int callingUid, IGetCredentialCallback callback, GetCredentialRequest request, - CallingAppInfo callingAppInfo, CancellationSignal cancellationSignal, + CallingAppInfo callingAppInfo, Set enabledProviders, + CancellationSignal cancellationSignal, long startedTimestamp) { super(context, sessionCallback, lock, userId, callingUid, request, callback, - RequestInfo.TYPE_GET, callingAppInfo, cancellationSignal, startedTimestamp); + RequestInfo.TYPE_GET, callingAppInfo, enabledProviders, cancellationSignal, + startedTimestamp); int numTypes = (request.getCredentialOptions().stream() .map(CredentialOption::getType).collect( - Collectors.toSet())).size(); // Dedupe type strings + Collectors.toSet())).size(); // Dedupe type strings mRequestSessionMetric.collectGetFlowInitialMetricInfo(numTypes); } /** * Creates a new provider session, and adds it list of providers that are contributing to * this session. + * * @return the provider session created within this request session, for the given provider * info. */ @@ -149,7 +154,7 @@ public class GetRequestSession extends RequestSession enabledProviders, + CancellationSignal cancellationSignal, long startedTimestamp, + IPrepareGetCredentialCallback prepareGetCredentialCallback) { super(context, sessionCallback, lock, userId, callingUid, getCredCallback, request, - callingAppInfo, cancellationSignal, startedTimestamp); + callingAppInfo, enabledProviders, cancellationSignal, startedTimestamp); int numTypes = (request.getCredentialOptions().stream() .map(CredentialOption::getType).collect( Collectors.toSet())).size(); // Dedupe type strings diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java index ed175ed9601f0..e98c5241ae002 100644 --- a/services/credentials/java/com/android/server/credentials/RequestSession.java +++ b/services/credentials/java/com/android/server/credentials/RequestSession.java @@ -43,6 +43,7 @@ import com.android.server.credentials.metrics.RequestSessionMetric; import java.util.ArrayList; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** @@ -88,6 +89,8 @@ abstract class RequestSession implements CredentialManagerUi.Credential protected final SessionLifetime mSessionCallback; + private final Set mEnabledProviders; + @NonNull protected RequestSessionStatus mRequestSessionStatus = RequestSessionStatus.IN_PROGRESS; @@ -108,6 +111,7 @@ abstract class RequestSession implements CredentialManagerUi.Credential @NonNull T clientRequest, U clientCallback, @NonNull String requestType, CallingAppInfo callingAppInfo, + Set enabledProviders, CancellationSignal cancellationSignal, long timestampStarted) { mContext = context; mLock = lock; @@ -118,11 +122,12 @@ abstract class RequestSession implements CredentialManagerUi.Credential mClientCallback = clientCallback; mRequestType = requestType; mClientAppInfo = callingAppInfo; + mEnabledProviders = enabledProviders; mCancellationSignal = cancellationSignal; mHandler = new Handler(Looper.getMainLooper(), null, true); mRequestId = new Binder(); mCredentialManagerUi = new CredentialManagerUi(mContext, - mUserId, this); + mUserId, this, mEnabledProviders); mHybridService = context.getResources().getString( R.string.config_defaultCredentialManagerHybridService); mRequestSessionMetric.collectInitialPhaseMetricInfo(timestampStarted, mRequestId, @@ -306,7 +311,7 @@ abstract class RequestSession implements CredentialManagerUi.Credential * Allows subclasses to directly finalize the call and set closing metrics on error completion. * * @param errorType the type of error given back in the flow - * @param errorMsg the error message given back in the flow + * @param errorMsg the error message given back in the flow */ protected void respondToClientWithErrorAndFinish(String errorType, String errorMsg) { mRequestSessionMetric.collectFinalPhaseProviderMetricStatus(