From 65a9b5c423ab805e7fff6b902503cdbccdef0581 Mon Sep 17 00:00:00 2001 From: Reema Bajwa Date: Thu, 17 Nov 2022 21:24:45 +0000 Subject: Invoke Credential Manager UI from the apps process through a pending intent generated by the framework Test: Locally built & deployed Bug: 253155429 Change-Id: I26b5ef385eb4997aafb1e8b321a658e4c09725a0 --- .../server/credentials/CreateRequestSession.java | 12 +++++++++--- .../android/server/credentials/CredentialManagerUi.java | 17 +++++++++++------ .../android/server/credentials/GetRequestSession.java | 12 +++++++++--- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java index 06d8e6280bef..3d337b896bb7 100644 --- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java @@ -72,9 +72,15 @@ public final class CreateRequestSession extends RequestSession providerDataList) { - mHandler.post(() -> mCredentialManagerUi.show(RequestInfo.newCreateRequestInfo( - mRequestId, mClientRequest, mIsFirstUiTurn, mClientCallingPackage), - providerDataList)); + try { + mClientCallback.onPendingIntent(mCredentialManagerUi.createPendingIntent( + RequestInfo.newCreateRequestInfo( + mRequestId, mClientRequest, mIsFirstUiTurn, mClientCallingPackage), + providerDataList)); + } catch (RemoteException e) { + Log.i(TAG, "Issue with invoking pending intent: " + e.getMessage()); + // TODO: Propagate failure + } } private void respondToClientAndFinish(CreateCredentialResponse response) { diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java index e889594ff857..7408f9ceb97d 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java @@ -16,6 +16,7 @@ package com.android.server.credentials; import android.annotation.NonNull; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.credentials.ui.IntentFactory; @@ -79,14 +80,18 @@ public class CredentialManagerUi { } /** - * Surfaces the Credential Manager bottom sheet UI. + * 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 providerDataList the list of provider data from remote providers */ - public void show(RequestInfo requestInfo, ArrayList providerDataList) { - Log.i(TAG, "In show"); + public PendingIntent createPendingIntent( + RequestInfo requestInfo, ArrayList providerDataList) { + Log.i(TAG, "In createPendingIntent"); Intent intent = IntentFactory.newIntent(requestInfo, providerDataList, new ArrayList<>(), - mResultReceiver); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(intent); + mResultReceiver).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //TODO: Determine if a specific request code is needed + return PendingIntent.getActivity( + mContext, /*requestCode=*/0, intent, PendingIntent.FLAG_IMMUTABLE); } } diff --git a/services/credentials/java/com/android/server/credentials/GetRequestSession.java b/services/credentials/java/com/android/server/credentials/GetRequestSession.java index 8a698cab92a1..c092b3af9699 100644 --- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java @@ -68,9 +68,15 @@ public final class GetRequestSession extends RequestSession providerDataList) { - mHandler.post(() -> mCredentialManagerUi.show(RequestInfo.newGetRequestInfo( - mRequestId, null, mIsFirstUiTurn, ""), - providerDataList)); + try { + mClientCallback.onPendingIntent(mCredentialManagerUi.createPendingIntent( + RequestInfo.newGetRequestInfo( + mRequestId, null, mIsFirstUiTurn, ""), + providerDataList)); + } catch (RemoteException e) { + Log.i(TAG, "Issue with invoking pending intent: " + e.getMessage()); + // TODO: Propagate failure + } } @Override // from provider session -- cgit v1.2.3-59-g8ed1b