From 3f3724a53b459e6352320e0fb3c7b2f753e5761c Mon Sep 17 00:00:00 2001 From: Helen Qin Date: Thu, 17 Nov 2022 07:51:47 +0000 Subject: [PATCH] Launch the CredentialManager UI from the app context. This is a temporary version that does not impact public apis. A follow-up change will be sent out that adds the api changes and properly launches the UI using an app activity, not just the context. Test: deployed locally. Bug: 246564035 Bug: 253156924 Bug: 253156958 Change-Id: I3f43fb7332d58f2baffab7a80c4550d95c67854e --- .../credentials/CredentialManager.java | 42 ++++++++++++++++--- .../ICreateCredentialCallback.aidl | 2 + .../credentials/IGetCredentialCallback.aidl | 2 + .../CredentialManager/AndroidManifest.xml | 2 - 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/core/java/android/credentials/CredentialManager.java b/core/java/android/credentials/CredentialManager.java index c9a0626341b7a..04d57ad8993fd 100644 --- a/core/java/android/credentials/CredentialManager.java +++ b/core/java/android/credentials/CredentialManager.java @@ -22,7 +22,9 @@ import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemService; +import android.app.PendingIntent; import android.content.Context; +import android.content.IntentSender; import android.os.CancellationSignal; import android.os.ICancellationSignal; import android.os.OutcomeReceiver; @@ -84,8 +86,11 @@ public final class CredentialManager { ICancellationSignal cancelRemote = null; try { - cancelRemote = mService.executeGetCredential(request, - new GetCredentialTransport(executor, callback), mContext.getOpPackageName()); + cancelRemote = mService.executeGetCredential( + request, + // TODO: use a real activity instead of context. + new GetCredentialTransport(mContext, executor, callback), + mContext.getOpPackageName()); } catch (RemoteException e) { e.rethrowFromSystemServer(); } @@ -124,7 +129,8 @@ public final class CredentialManager { ICancellationSignal cancelRemote = null; try { cancelRemote = mService.executeCreateCredential(request, - new CreateCredentialTransport(executor, callback), + // TODO: use a real activity instead of context. + new CreateCredentialTransport(mContext, executor, callback), mContext.getOpPackageName()); } catch (RemoteException e) { e.rethrowFromSystemServer(); @@ -176,16 +182,29 @@ public final class CredentialManager { private static class GetCredentialTransport extends IGetCredentialCallback.Stub { // TODO: listen for cancellation to release callback. + private final Context mActivityContext; private final Executor mExecutor; private final OutcomeReceiver< GetCredentialResponse, CredentialManagerException> mCallback; - private GetCredentialTransport(Executor executor, + private GetCredentialTransport(Context activityContext, Executor executor, OutcomeReceiver callback) { + mActivityContext = activityContext; mExecutor = executor; mCallback = callback; } + @Override + public void onPendingIntent(PendingIntent pendingIntent) { + try { + mActivityContext.startIntentSender(pendingIntent.getIntentSender(), null, 0, 0, 0); + } catch (IntentSender.SendIntentException e) { + Log.e(TAG, "startIntentSender() failed for intent:" + + pendingIntent.getIntentSender(), e); + // TODO: propagate the error. + } + } + @Override public void onResponse(GetCredentialResponse response) { mExecutor.execute(() -> mCallback.onResult(response)); @@ -201,16 +220,29 @@ public final class CredentialManager { private static class CreateCredentialTransport extends ICreateCredentialCallback.Stub { // TODO: listen for cancellation to release callback. + private final Context mActivityContext; private final Executor mExecutor; private final OutcomeReceiver< CreateCredentialResponse, CredentialManagerException> mCallback; - private CreateCredentialTransport(Executor executor, + private CreateCredentialTransport(Context activityContext, Executor executor, OutcomeReceiver callback) { + mActivityContext = activityContext; mExecutor = executor; mCallback = callback; } + @Override + public void onPendingIntent(PendingIntent pendingIntent) { + try { + mActivityContext.startIntentSender(pendingIntent.getIntentSender(), null, 0, 0, 0); + } catch (IntentSender.SendIntentException e) { + Log.e(TAG, "startIntentSender() failed for intent:" + + pendingIntent.getIntentSender(), e); + // TODO: propagate the error. + } + } + @Override public void onResponse(CreateCredentialResponse response) { mExecutor.execute(() -> mCallback.onResult(response)); diff --git a/core/java/android/credentials/ICreateCredentialCallback.aidl b/core/java/android/credentials/ICreateCredentialCallback.aidl index 75620faf04fdf..87fd36fe78f42 100644 --- a/core/java/android/credentials/ICreateCredentialCallback.aidl +++ b/core/java/android/credentials/ICreateCredentialCallback.aidl @@ -16,6 +16,7 @@ package android.credentials; +import android.app.PendingIntent; import android.credentials.CreateCredentialResponse; /** @@ -24,6 +25,7 @@ import android.credentials.CreateCredentialResponse; * @hide */ interface ICreateCredentialCallback { + oneway void onPendingIntent(in PendingIntent pendingIntent); oneway void onResponse(in CreateCredentialResponse response); oneway void onError(int errorCode, String message); } \ No newline at end of file diff --git a/core/java/android/credentials/IGetCredentialCallback.aidl b/core/java/android/credentials/IGetCredentialCallback.aidl index 92e585142a468..da152bad2da9b 100644 --- a/core/java/android/credentials/IGetCredentialCallback.aidl +++ b/core/java/android/credentials/IGetCredentialCallback.aidl @@ -16,6 +16,7 @@ package android.credentials; +import android.app.PendingIntent; import android.credentials.GetCredentialResponse; /** @@ -24,6 +25,7 @@ import android.credentials.GetCredentialResponse; * @hide */ interface IGetCredentialCallback { + oneway void onPendingIntent(in PendingIntent pendingIntent); oneway void onResponse(in GetCredentialResponse response); oneway void onError(int errorCode, String message); } \ No newline at end of file diff --git a/packages/CredentialManager/AndroidManifest.xml b/packages/CredentialManager/AndroidManifest.xml index 586ef86f26f68..bd27dab28da34 100644 --- a/packages/CredentialManager/AndroidManifest.xml +++ b/packages/CredentialManager/AndroidManifest.xml @@ -36,8 +36,6 @@ android:name=".CredentialSelectorActivity" android:exported="true" android:label="@string/app_name" - android:launchMode="singleInstance" - android:noHistory="true" android:excludeFromRecents="true" android:theme="@style/Theme.CredentialSelector">