From 388f9ab78c2dc2d37ee32bb1a65c94c0de17de1b Mon Sep 17 00:00:00 2001 From: Reema Bajwa Date: Fri, 12 Apr 2024 00:14:08 +0000 Subject: [PATCH] Direct connection btw Autofill & Credman sessions Before this change, a result reciever was added to each pinned dataset's associated intent, and then retrieved in the from the intent that starts the credman selector intent which then passed it to credman session. Now, autofill session constructs one resultreciever per FillRequest and adds it to client state, proxy service retrieves it from clientstate and adds it to the req top level bundle, which is then extracted by credman session and used to propagate the final response. Hence we remove the dependency on the selector passing the resultReciver to the credman session Test: Cts Bug: 333455221 Change-Id: Ic17091841edbcf0975d0ff238f2d8b72d8cd5593 --- .../credentials/CredentialManager.java | 7 +++ .../credentials/selection/Constants.java | 7 --- .../impl/CredentialManagerClientImpl.kt | 11 +--- .../credentialmanager/ktx/IntentKtx.kt | 6 -- .../mapper/RequestGetMapper.kt | 2 - .../credentialmanager/model/Request.kt | 6 +- .../CredentialManagerRepo.kt | 17 +---- .../CredentialSelectorActivity.kt | 7 +-- .../autofill/CredentialAutofillService.kt | 15 +++-- .../CredentialSelectorUiStateGetMapperTest.kt | 4 -- .../CredentialSelectorViewModelTest.kt | 2 - .../autofill/SecondaryProviderHandler.java | 29 +-------- .../com/android/server/autofill/Session.java | 62 +++++++------------ .../credentials/ClearRequestSession.java | 3 +- .../credentials/CreateRequestSession.java | 3 +- .../credentials/CredentialManagerUi.java | 19 ++---- .../GetCandidateRequestSession.java | 23 ++++--- .../server/credentials/GetRequestSession.java | 3 +- .../server/credentials/RequestSession.java | 10 +-- 19 files changed, 74 insertions(+), 162 deletions(-) diff --git a/core/java/android/credentials/CredentialManager.java b/core/java/android/credentials/CredentialManager.java index 93fa5d85796f..d19e61f1e532 100644 --- a/core/java/android/credentials/CredentialManager.java +++ b/core/java/android/credentials/CredentialManager.java @@ -131,6 +131,13 @@ public final class CredentialManager { private static final String DEVICE_CONFIG_ENABLE_CREDENTIAL_DESC_API = "enable_credential_description_api"; + /** + * @hide + */ + @Hide + public static final String EXTRA_AUTOFILL_RESULT_RECEIVER = + "android.credentials.AUTOFILL_RESULT_RECEIVER"; + /** * @hide instantiated by ContextImpl. */ diff --git a/core/java/android/credentials/selection/Constants.java b/core/java/android/credentials/selection/Constants.java index 2229f258a3a4..a620621fc3b1 100644 --- a/core/java/android/credentials/selection/Constants.java +++ b/core/java/android/credentials/selection/Constants.java @@ -28,12 +28,5 @@ public class Constants { */ public static final String EXTRA_RESULT_RECEIVER = "android.credentials.selection.extra.RESULT_RECEIVER"; - - /** - * The intent extra key for the final result receiver object - */ - public static final String EXTRA_FINAL_RESPONSE_RECEIVER = - "android.credentials.selection.extra.FINAL_RESPONSE_RECEIVER"; - private Constants() {} } diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/client/impl/CredentialManagerClientImpl.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/client/impl/CredentialManagerClientImpl.kt index ab70394057f3..694e27af5682 100644 --- a/packages/CredentialManager/shared/src/com/android/credentialmanager/client/impl/CredentialManagerClientImpl.kt +++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/client/impl/CredentialManagerClientImpl.kt @@ -21,7 +21,6 @@ import android.content.Context import android.content.Intent import android.credentials.selection.BaseDialogResult import android.credentials.selection.BaseDialogResult.RESULT_CODE_DIALOG_USER_CANCELED -import android.credentials.selection.Constants import android.credentials.selection.ProviderPendingIntentResponse import android.credentials.selection.UserSelectionDialogResult import android.os.Bundle @@ -117,21 +116,17 @@ class CredentialManagerClientImpl @Inject constructor( sendCancellationCode( cancelCode = cancelCode, requestToken = token, - resultReceiver = resultReceiver, - finalResponseReceiver = finalResponseReceiver + resultReceiver = resultReceiver ) } private fun sendCancellationCode( cancelCode: Int, requestToken: IBinder?, - resultReceiver: ResultReceiver?, - finalResponseReceiver: ResultReceiver? + resultReceiver: ResultReceiver? ) { if (requestToken != null && resultReceiver != null) { - val resultData = Bundle().apply { - putParcelable(Constants.EXTRA_FINAL_RESPONSE_RECEIVER, finalResponseReceiver) - } + val resultData = Bundle() BaseDialogResult.addToBundle(BaseDialogResult(requestToken), resultData) resultReceiver.send(cancelCode, resultData) } diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/IntentKtx.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/IntentKtx.kt index 786c441bb2e3..9242141cfd63 100644 --- a/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/IntentKtx.kt +++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/IntentKtx.kt @@ -54,9 +54,3 @@ val Intent.resultReceiver: ResultReceiver? Constants.EXTRA_RESULT_RECEIVER, ResultReceiver::class.java ) - -val Intent.finalResponseReceiver: ResultReceiver? - get() = this.getParcelableExtra( - Constants.EXTRA_FINAL_RESPONSE_RECEIVER, - ResultReceiver::class.java - ) diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/mapper/RequestGetMapper.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/mapper/RequestGetMapper.kt index 1683cc43eef1..f1f1f7ca842e 100644 --- a/packages/CredentialManager/shared/src/com/android/credentialmanager/mapper/RequestGetMapper.kt +++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/mapper/RequestGetMapper.kt @@ -20,7 +20,6 @@ import android.content.Context import android.content.Intent import com.android.credentialmanager.ktx.getCredentialProviderDataList import com.android.credentialmanager.ktx.requestInfo -import com.android.credentialmanager.ktx.finalResponseReceiver import com.android.credentialmanager.ktx.resultReceiver import com.android.credentialmanager.ktx.toProviderList import com.android.credentialmanager.model.Request @@ -29,7 +28,6 @@ fun Intent.toGet(context: Context): Request.Get { return Request.Get( token = requestInfo?.token, resultReceiver = resultReceiver, - finalResponseReceiver = finalResponseReceiver, providerInfos = getCredentialProviderDataList.toProviderList(context) ) } diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/Request.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/Request.kt index fd99275ebc8e..cb335fc229b2 100644 --- a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/Request.kt +++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/Request.kt @@ -25,8 +25,7 @@ import com.android.credentialmanager.model.get.ProviderInfo */ sealed class Request private constructor( open val token: IBinder?, - open val resultReceiver: ResultReceiver? = null, - open val finalResponseReceiver: ResultReceiver? = null, + open val resultReceiver: ResultReceiver? = null ) { /** @@ -51,9 +50,8 @@ sealed class Request private constructor( data class Get( override val token: IBinder?, override val resultReceiver: ResultReceiver?, - override val finalResponseReceiver: ResultReceiver?, val providerInfos: List, - ) : Request(token, resultReceiver, finalResponseReceiver) + ) : Request(token, resultReceiver) /** * Request to start the create credentials flow. */ diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt index b17a98b30eee..3683235ff049 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt @@ -58,7 +58,6 @@ class CredentialManagerRepo( private val providerEnabledList: List private val providerDisabledList: List? val resultReceiver: ResultReceiver? - val finalResponseReceiver: ResultReceiver? var initialUiState: UiState @@ -105,12 +104,6 @@ class CredentialManagerRepo( Constants.EXTRA_RESULT_RECEIVER, ResultReceiver::class.java ) - - finalResponseReceiver = intent.getParcelableExtra( - Constants.EXTRA_FINAL_RESPONSE_RECEIVER, - ResultReceiver::class.java - ) - isReqForAllOptions = requestInfo?.isShowAllOptionsRequested ?: false val cancellationRequest = getCancelUiRequest(intent) @@ -206,7 +199,7 @@ class CredentialManagerRepo( } fun onCancel(cancelCode: Int) { - sendCancellationCode(cancelCode, requestInfo?.token, resultReceiver, finalResponseReceiver) + sendCancellationCode(cancelCode, requestInfo?.token, resultReceiver) } fun onOptionSelected( @@ -226,9 +219,6 @@ class CredentialManagerRepo( val resultDataBundle = Bundle() UserSelectionDialogResult.addToBundle(userSelectionDialogResult, resultDataBundle) - resultDataBundle.putParcelable(Constants.EXTRA_FINAL_RESPONSE_RECEIVER, - finalResponseReceiver) - resultReceiver?.send( BaseDialogResult.RESULT_CODE_DIALOG_COMPLETE_WITH_SELECTION, resultDataBundle @@ -296,13 +286,10 @@ class CredentialManagerRepo( fun sendCancellationCode( cancelCode: Int, requestToken: IBinder?, - resultReceiver: ResultReceiver?, - finalResponseReceiver: ResultReceiver? + resultReceiver: ResultReceiver? ) { if (requestToken != null && resultReceiver != null) { val resultData = Bundle() - resultData.putParcelable(Constants.EXTRA_FINAL_RESPONSE_RECEIVER, - finalResponseReceiver) BaseDialogResult.addToBundle(BaseDialogResult(requestToken), resultData) resultReceiver.send(cancelCode, resultData) diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt index ec0da0986e45..a2f55cd50519 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt @@ -208,18 +208,13 @@ class CredentialSelectorActivity : ComponentActivity() { android.credentials.selection.Constants.EXTRA_RESULT_RECEIVER, ResultReceiver::class.java ) - val finalResponseResultReceiver = intent.getParcelableExtra( - android.credentials.selection.Constants.EXTRA_FINAL_RESPONSE_RECEIVER, - ResultReceiver::class.java - ) - val requestInfo = intent.extras?.getParcelable( RequestInfo.EXTRA_REQUEST_INFO, RequestInfo::class.java ) CredentialManagerRepo.sendCancellationCode( BaseDialogResult.RESULT_CODE_DATA_PARSING_FAILURE, - requestInfo?.token, resultReceiver, finalResponseResultReceiver + requestInfo?.token, resultReceiver ) this.finish() } diff --git a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt index 1253ce3a6c80..4109079e20a5 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt @@ -32,6 +32,7 @@ import android.graphics.drawable.Icon import android.os.Bundle import android.os.CancellationSignal import android.os.OutcomeReceiver +import android.os.ResultReceiver import android.service.autofill.AutofillService import android.service.autofill.Dataset import android.service.autofill.Field @@ -109,17 +110,19 @@ class CredentialAutofillService : AutofillService() { } val sessionId = clientState.getInt(SESSION_ID_KEY) val requestId = clientState.getInt(REQUEST_ID_KEY) + val resultReceiver = clientState.getParcelable( + CredentialManager.EXTRA_AUTOFILL_RESULT_RECEIVER, ResultReceiver::class.java) Log.i(TAG, "Autofill sessionId: $sessionId, autofill requestId: $requestId") - if (sessionId == 0 || requestId == 0) { - Log.i(TAG, "Session Id or request Id not found") - callback.onFailure("Session Id or request Id not found") + if (sessionId == 0 || requestId == 0 || resultReceiver == null) { + Log.i(TAG, "Session Id or request Id or resultReceiver not found") + callback.onFailure("Session Id or request Id or resultReceiver not found") return } val responseClientState = Bundle() responseClientState.putBoolean(WEBVIEW_REQUESTED_CREDENTIAL_KEY, false) val getCredRequest: GetCredentialRequest? = getCredManRequest(structure, sessionId, - requestId, responseClientState) + requestId, resultReceiver, responseClientState) // TODO(b/324635774): Use callback for validating. If the request is coming // directly from the view, there should be a corresponding callback, otherwise // we should fail fast, @@ -531,6 +534,7 @@ class CredentialAutofillService : AutofillService() { structure: AssistStructure, sessionId: Int, requestId: Int, + resultReceiver: ResultReceiver, responseClientState: Bundle ): GetCredentialRequest? { val credentialOptions: MutableList = mutableListOf() @@ -540,6 +544,9 @@ class CredentialAutofillService : AutofillService() { val dataBundle = Bundle() dataBundle.putInt(SESSION_ID_KEY, sessionId) dataBundle.putInt(REQUEST_ID_KEY, requestId) + dataBundle.putParcelable(CredentialManager.EXTRA_AUTOFILL_RESULT_RECEIVER, + resultReceiver) + return GetCredentialRequest.Builder(dataBundle) .setCredentialOptions(credentialOptions) .build() diff --git a/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorUiStateGetMapperTest.kt b/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorUiStateGetMapperTest.kt index 3422d3dc4d94..6a6a777091d2 100644 --- a/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorUiStateGetMapperTest.kt +++ b/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorUiStateGetMapperTest.kt @@ -100,7 +100,6 @@ class CredentialSelectorUiStateGetMapperTest { val getCredentialUiState = Request.Get( token = null, resultReceiver = null, - finalResponseReceiver = null, providerInfos = listOf(createProviderInfo(credentialList1))).toGet(isPrimary = true) assertThat(getCredentialUiState).isEqualTo( @@ -113,7 +112,6 @@ class CredentialSelectorUiStateGetMapperTest { val getCredentialUiState = Request.Get( token = null, resultReceiver = null, - finalResponseReceiver = null, providerInfos = listOf(createProviderInfo(listOf(passkeyCredentialEntryInfo, unknownCredentialEntryInfo)))).toGet(isPrimary = true) @@ -132,7 +130,6 @@ class CredentialSelectorUiStateGetMapperTest { val getCredentialUiState = Request.Get( token = null, resultReceiver = null, - finalResponseReceiver = null, providerInfos = listOf(createProviderInfo(credentialList1))).toGet(isPrimary = false) assertThat(getCredentialUiState).isEqualTo( @@ -151,7 +148,6 @@ class CredentialSelectorUiStateGetMapperTest { val getCredentialUiState = Request.Get( token = null, resultReceiver = null, - finalResponseReceiver = null, providerInfos = listOf(createProviderInfo(credentialList1), createProviderInfo(credentialList2))).toGet(isPrimary = false) diff --git a/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorViewModelTest.kt b/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorViewModelTest.kt index b79f34c54f51..cf839f83e689 100644 --- a/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorViewModelTest.kt +++ b/packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorViewModelTest.kt @@ -121,7 +121,6 @@ class CredentialSelectorViewModelTest { stateFlow.value = Request.Get( token = null, resultReceiver = null, - finalResponseReceiver = null, providerInfos = emptyList()) mViewModel.back() @@ -136,7 +135,6 @@ class CredentialSelectorViewModelTest { stateFlow.value = Request.Get( token = null, resultReceiver = null, - finalResponseReceiver = null, providerInfos = emptyList()) mViewModel.back() diff --git a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java index 450677968065..ce9d1803d764 100644 --- a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java +++ b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java @@ -16,21 +16,16 @@ package com.android.server.autofill; -import static com.android.server.autofill.Session.REQUEST_ID_KEY; -import static com.android.server.autofill.Session.SESSION_ID_KEY; - import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; import android.content.IntentSender; -import android.os.Bundle; import android.service.autofill.ConvertCredentialResponse; import android.service.autofill.FillRequest; import android.service.autofill.FillResponse; import android.util.Slog; import android.view.autofill.IAutoFillManagerClient; -import android.view.inputmethod.InlineSuggestionsRequest; /** * Requests autofill response from a Remote Autofill Service. This autofill service can be @@ -55,6 +50,7 @@ final class SecondaryProviderHandler implements RemoteFillService.FillServiceCal private final RemoteFillService mRemoteFillService; private final SecondaryProviderCallback mCallback; + private int mLastFlag; SecondaryProviderHandler( @@ -109,37 +105,18 @@ final class SecondaryProviderHandler implements RemoteFillService.FillServiceCal /** * Requests a new fill response. */ - public void onFillRequest(FillRequest pendingFillRequest, - InlineSuggestionsRequest pendingInlineSuggestionsRequest, int flag, int id, + public void onFillRequest(FillRequest pendingFillRequest, int flag, IAutoFillManagerClient client) { Slog.v(TAG, "Requesting fill response to secondary provider."); mLastFlag = flag; if (mRemoteFillService != null && mRemoteFillService.isCredentialAutofillService()) { Slog.v(TAG, "About to call CredAutofill service as secondary provider"); - FillRequest request = addSessionIdAndRequestIdToClientState(pendingFillRequest, - pendingInlineSuggestionsRequest, id); - mRemoteFillService.onFillCredentialRequest(request, client); + mRemoteFillService.onFillCredentialRequest(pendingFillRequest, client); } else { mRemoteFillService.onFillRequest(pendingFillRequest); } } - private FillRequest addSessionIdAndRequestIdToClientState(FillRequest pendingFillRequest, - InlineSuggestionsRequest pendingInlineSuggestionsRequest, int sessionId) { - if (pendingFillRequest.getClientState() == null) { - pendingFillRequest = new FillRequest(pendingFillRequest.getId(), - pendingFillRequest.getFillContexts(), - pendingFillRequest.getHints(), - new Bundle(), - pendingFillRequest.getFlags(), - pendingInlineSuggestionsRequest, - pendingFillRequest.getDelayedFillIntentSender()); - } - pendingFillRequest.getClientState().putInt(SESSION_ID_KEY, sessionId); - pendingFillRequest.getClientState().putInt(REQUEST_ID_KEY, pendingFillRequest.getId()); - return pendingFillRequest; - } - public void destroy() { mRemoteFillService.destroy(); } diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 0b68f5fd7b85..3f3ff4a46edf 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -117,6 +117,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.IntentSender; import android.content.pm.ServiceInfo; +import android.credentials.CredentialManager; import android.credentials.GetCredentialException; import android.credentials.GetCredentialResponse; import android.graphics.Bitmap; @@ -252,7 +253,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState private final AutofillManagerServiceImpl mService; private final Handler mHandler; private final AutoFillUI mUi; - /** * Context associated with the session, it has the same {@link Context#getDisplayId() displayId} * of the activity being autofilled. @@ -751,12 +751,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (shouldRequestSecondaryProvider(mPendingFillRequest.getFlags()) && mSecondaryProviderHandler != null) { Slog.v(TAG, "Requesting fill response to secondary provider."); + if (!mIsPrimaryCredential) { + mPendingFillRequest = addCredentialManagerDataToClientState( + mPendingFillRequest, + mPendingInlineSuggestionsRequest, id); + } mSecondaryProviderHandler.onFillRequest(mPendingFillRequest, - mPendingInlineSuggestionsRequest, - mPendingFillRequest.getFlags(), id, mClient); + mPendingFillRequest.getFlags(), mClient); } else if (mRemoteFillService != null) { if (mIsPrimaryCredential) { - mPendingFillRequest = addSessionIdAndRequestIdToClientState(mPendingFillRequest, + mPendingFillRequest = addCredentialManagerDataToClientState( + mPendingFillRequest, mPendingInlineSuggestionsRequest, id); mRemoteFillService.onFillCredentialRequest(mPendingFillRequest, mClient); } else { @@ -904,8 +909,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } - private FillRequest addSessionIdAndRequestIdToClientState(FillRequest pendingFillRequest, + private FillRequest addCredentialManagerDataToClientState(FillRequest pendingFillRequest, InlineSuggestionsRequest pendingInlineSuggestionsRequest, int sessionId) { + if (pendingFillRequest.getClientState() == null) { pendingFillRequest = new FillRequest(pendingFillRequest.getId(), pendingFillRequest.getFillContexts(), @@ -917,6 +923,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } pendingFillRequest.getClientState().putInt(SESSION_ID_KEY, sessionId); pendingFillRequest.getClientState().putInt(REQUEST_ID_KEY, pendingFillRequest.getId()); + ResultReceiver resultReceiver = constructCredentialManagerCallback( + pendingFillRequest.getId()); + pendingFillRequest.getClientState().putParcelable( + CredentialManager.EXTRA_AUTOFILL_RESULT_RECEIVER, resultReceiver); return pendingFillRequest; } @@ -4870,10 +4880,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } - if (isCredmanIntegrationActive(response)) { - addCredentialManagerCallback(response); - } - if (response.supportsInlineSuggestions()) { synchronized (mLock) { if (requestShowInlineSuggestionsLocked(response, filterText)) { @@ -5153,30 +5159,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState return mInlineSessionController.setInlineFillUiLocked(inlineFillUi); } - private void addCredentialManagerCallback(FillResponse response) { - if (response.getDatasets() == null) { - return; - } - for (Dataset dataset: response.getDatasets()) { - if (dataset.getId() != null - && dataset.getId().equals(AutofillManager.PINNED_DATASET_ID)) { - Slog.d(TAG, "Adding Credential Manager callback to a pinned entry"); - addCredentialManagerCallbackForDataset(dataset, response.getRequestId()); - } - } - } - - private void addCredentialManagerCallbackForDataset(Dataset dataset, int requestId) { - AutofillId autofillId = null; - if (dataset != null && dataset.getFieldIds().size() == 1) { - autofillId = dataset.getFieldIds().get(0); - } - final AutofillId finalAutofillId = autofillId; + private ResultReceiver constructCredentialManagerCallback(int requestId) { final ResultReceiver resultReceiver = new ResultReceiver(mHandler) { + final AutofillId mAutofillId = mCurrentViewId; @Override protected void onReceiveResult(int resultCode, Bundle resultData) { if (resultCode == SUCCESS_CREDMAN_SELECTOR) { - Slog.d(TAG, "onReceiveResult from Credential Manager bottom sheet"); + Slog.d(TAG, "onReceiveResult from Credential Manager " + + "bottom sheet with mCurrentViewId: " + mAutofillId); GetCredentialResponse getCredentialResponse = resultData.getParcelable( CredentialProviderService.EXTRA_GET_CREDENTIAL_RESPONSE, @@ -5184,7 +5174,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (Flags.autofillCredmanDevIntegration()) { sendCredentialManagerResponseToApp(getCredentialResponse, - /*exception=*/ null, finalAutofillId); + /*exception=*/ null, mAutofillId); } else { Dataset datasetFromCredential = getDatasetFromCredentialResponse( getCredentialResponse); @@ -5203,7 +5193,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState + exception[1]); sendCredentialManagerResponseToApp(/*response=*/ null, new GetCredentialException(exception[0], exception[1]), - finalAutofillId); + mAutofillId); } } else { Slog.d(TAG, "Unknown resultCode from credential " @@ -5214,15 +5204,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState ResultReceiver ipcFriendlyResultReceiver = toIpcFriendlyResultReceiver(resultReceiver); - Intent metadataIntent = dataset.getCredentialFillInIntent(); - if (metadataIntent == null) { - metadataIntent = new Intent(); - } - - metadataIntent.putExtra( - android.credentials.selection.Constants.EXTRA_FINAL_RESPONSE_RECEIVER, - ipcFriendlyResultReceiver); - dataset.setCredentialFillInIntent(metadataIntent); + return ipcFriendlyResultReceiver; } private ResultReceiver toIpcFriendlyResultReceiver(ResultReceiver resultReceiver) { diff --git a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java index f5ba50d7f079..b1349ea92a4f 100644 --- a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java @@ -27,7 +27,6 @@ import android.credentials.selection.ProviderData; import android.credentials.selection.RequestInfo; import android.os.CancellationSignal; import android.os.RemoteException; -import android.os.ResultReceiver; import android.service.credentials.CallingAppInfo; import android.util.Slog; @@ -150,7 +149,7 @@ public final class ClearRequestSession extends RequestSession implements CredentialManagerUi.Credential protected PendingIntent mPendingIntent; - @Nullable - protected ResultReceiver mFinalResponseReceiver; - @NonNull protected RequestSessionStatus mRequestSessionStatus = RequestSessionStatus.IN_PROGRESS; @@ -224,8 +219,7 @@ abstract class RequestSession implements CredentialManagerUi.Credential // UI callbacks @Override // from CredentialManagerUiCallbacks - public void onUiSelection(UserSelectionDialogResult selection, - ResultReceiver finalResponseReceiver) { + public void onUiSelection(UserSelectionDialogResult selection) { if (mRequestSessionStatus == RequestSessionStatus.COMPLETE) { Slog.w(TAG, "Request has already been completed. This is strange."); return; @@ -241,7 +235,7 @@ abstract class RequestSession implements CredentialManagerUi.Credential Slog.w(TAG, "providerSession not found in onUiSelection. This is strange."); return; } - mFinalResponseReceiver = finalResponseReceiver; + ProviderSessionMetric providerSessionMetric = providerSession.mProviderSessionMetric; int initialAuthMetricsProvider = providerSessionMetric.getBrowsedAuthenticationMetric() .size(); -- GitLab