diff options
author | 2024-04-12 00:14:08 +0000 | |
---|---|---|
committer | 2024-04-12 05:39:08 +0000 | |
commit | 388f9ab78c2dc2d37ee32bb1a65c94c0de17de1b (patch) | |
tree | bf1130f35fc2eb18ec9c74ca976d3cd8f567bea7 | |
parent | 760a44e462c8ee7b2e9d6c782d0ce15d5127449b (diff) |
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
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 @@ -132,6 +132,13 @@ public final class CredentialManager { "enable_credential_description_api"; /** + * @hide + */ + @Hide + public static final String EXTRA_AUTOFILL_RESULT_RECEIVER = + "android.credentials.AUTOFILL_RESULT_RECEIVER"; + + /** * @hide instantiated by ContextImpl. */ public CredentialManager(Context context, ICredentialManager service) { 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<ProviderInfo>, - ) : 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<ProviderData> private val providerDisabledList: List<DisabledProviderData>? 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<CredentialOption> = 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<ClearCredentialSta } @Override - public void onUiCancellation(boolean isUserCancellation, ResultReceiver resultReceiver) { + public void onUiCancellation(boolean isUserCancellation) { // Not needed since UI is not involved } diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java index cac42b17553a..ba73a0b4f235 100644 --- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java @@ -31,7 +31,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.service.credentials.PermissionUtils; import android.util.Slog; @@ -164,7 +163,7 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR } @Override - public void onUiCancellation(boolean isUserCancellation, ResultReceiver resultReceiver) { + public void onUiCancellation(boolean isUserCancellation) { String exception = CreateCredentialException.TYPE_USER_CANCELED; String message = "User cancelled the selector"; if (!isUserCancellation) { diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java index 24f66977ee90..67025b67c05a 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java @@ -15,8 +15,6 @@ */ package com.android.server.credentials; -import static android.credentials.selection.Constants.EXTRA_FINAL_RESPONSE_RECEIVER; - import android.annotation.NonNull; import android.app.PendingIntent; import android.content.ComponentName; @@ -83,25 +81,18 @@ public class CredentialManagerUi { UserSelectionDialogResult selection = UserSelectionDialogResult .fromResultData(resultData); if (selection != null) { - ResultReceiver resultReceiver = resultData.getParcelable( - EXTRA_FINAL_RESPONSE_RECEIVER, - ResultReceiver.class); - mCallbacks.onUiSelection(selection, resultReceiver); + mCallbacks.onUiSelection(selection); } break; case UserSelectionDialogResult.RESULT_CODE_DIALOG_USER_CANCELED: mStatus = UiStatus.TERMINATED; - mCallbacks.onUiCancellation(/* isUserCancellation= */ true, - resultData.getParcelable(EXTRA_FINAL_RESPONSE_RECEIVER, - ResultReceiver.class)); + mCallbacks.onUiCancellation(/* isUserCancellation= */ true); break; case UserSelectionDialogResult.RESULT_CODE_CANCELED_AND_LAUNCHED_SETTINGS: mStatus = UiStatus.TERMINATED; - mCallbacks.onUiCancellation(/* isUserCancellation= */ false, - resultData.getParcelable(EXTRA_FINAL_RESPONSE_RECEIVER, - ResultReceiver.class)); + mCallbacks.onUiCancellation(/* isUserCancellation= */ false); break; case UserSelectionDialogResult.RESULT_CODE_DATA_PARSING_FAILURE: mStatus = UiStatus.TERMINATED; @@ -125,10 +116,10 @@ public class CredentialManagerUi { */ public interface CredentialManagerUiCallback { /** Called when the user makes a selection. */ - void onUiSelection(UserSelectionDialogResult selection, ResultReceiver resultReceiver); + void onUiSelection(UserSelectionDialogResult selection); /** Called when the UI is canceled without a successful provider result. */ - void onUiCancellation(boolean isUserCancellation, ResultReceiver resultReceiver); + void onUiCancellation(boolean isUserCancellation); /** Called when the selector UI fails to come up (mostly due to parsing issue today). */ void onUiSelectorInvocationFailure(); diff --git a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java index fd2a9a20640b..5a9c88ac1098 100644 --- a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java @@ -22,6 +22,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.credentials.Constants; +import android.credentials.CredentialManager; import android.credentials.CredentialProviderInfo; import android.credentials.GetCandidateCredentialsException; import android.credentials.GetCandidateCredentialsResponse; @@ -63,6 +64,8 @@ public class GetCandidateRequestSession extends RequestSession<GetCredentialRequ private final int mAutofillSessionId; private final int mAutofillRequestId; + private final ResultReceiver mAutofillCallback; + public GetCandidateRequestSession( Context context, SessionLifetime sessionCallback, Object lock, int userId, int callingUid, @@ -76,6 +79,8 @@ public class GetCandidateRequestSession extends RequestSession<GetCredentialRequ mClientBinder = clientBinder; mAutofillSessionId = request.getData().getInt(SESSION_ID_KEY, -1); mAutofillRequestId = request.getData().getInt(REQUEST_ID_KEY, -1); + mAutofillCallback = request.getData().getParcelable( + CredentialManager.EXTRA_AUTOFILL_RESULT_RECEIVER, ResultReceiver.class); if (mClientBinder != null) { setUpClientCallbackListener(mClientBinder); } @@ -154,12 +159,11 @@ public class GetCandidateRequestSession extends RequestSession<GetCredentialRequ public void onFinalErrorReceived(ComponentName componentName, String errorType, String message) { Slog.d(TAG, "onFinalErrorReceived"); - respondToFinalReceiverWithFailureAndFinish(this.mFinalResponseReceiver, errorType, message); + respondToFinalReceiverWithFailureAndFinish(errorType, message); } @Override - public void onUiCancellation(boolean isUserCancellation, - @Nullable ResultReceiver finalResponseReceiver) { + public void onUiCancellation(boolean isUserCancellation) { String exception = GetCandidateCredentialsException.TYPE_USER_CANCELED; String message = "User cancelled the selector"; if (!isUserCancellation) { @@ -167,21 +171,20 @@ public class GetCandidateRequestSession extends RequestSession<GetCredentialRequ message = "The UI was interrupted - please try again."; } mRequestSessionMetric.collectFrameworkException(exception); - respondToFinalReceiverWithFailureAndFinish(finalResponseReceiver, exception, message); + respondToFinalReceiverWithFailureAndFinish(exception, message); } private void respondToFinalReceiverWithFailureAndFinish( - ResultReceiver finalResponseReceiver, String exception, String message ) { - if (finalResponseReceiver != null) { + if (mAutofillCallback != null) { Bundle resultData = new Bundle(); resultData.putStringArray( CredentialProviderService.EXTRA_GET_CREDENTIAL_EXCEPTION, new String[] {exception, message}); - finalResponseReceiver.send(Constants.FAILURE_CREDMAN_SELECTOR, resultData); + mAutofillCallback.send(Constants.FAILURE_CREDMAN_SELECTOR, resultData); } else { - Slog.w(TAG, "onUiCancellation called but finalResponseReceiver not found"); + Slog.w(TAG, "onUiCancellation called but mAutofillCallback not found"); } finishSession(/*propagateCancellation=*/false, ApiStatus.FAILURE.getMetricCode()); } @@ -218,12 +221,12 @@ public class GetCandidateRequestSession extends RequestSession<GetCredentialRequ public void onFinalResponseReceived(ComponentName componentName, GetCredentialResponse response) { Slog.d(TAG, "onFinalResponseReceived"); - if (this.mFinalResponseReceiver != null) { + if (this.mAutofillCallback != null) { Slog.d(TAG, "onFinalResponseReceived sending through final receiver"); Bundle resultData = new Bundle(); resultData.putParcelable( CredentialProviderService.EXTRA_GET_CREDENTIAL_RESPONSE, response); - mFinalResponseReceiver.send(Constants.SUCCESS_CREDMAN_SELECTOR, resultData); + mAutofillCallback.send(Constants.SUCCESS_CREDMAN_SELECTOR, resultData); finishSession(/*propagateCancellation=*/ false, ApiStatus.SUCCESS.getMetricCode()); } else { Slog.w(TAG, "onFinalResponseReceived result receiver not found for pinned entry"); diff --git a/services/credentials/java/com/android/server/credentials/GetRequestSession.java b/services/credentials/java/com/android/server/credentials/GetRequestSession.java index d55d8effd381..9e9c99b5c9ea 100644 --- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java @@ -31,7 +31,6 @@ import android.credentials.selection.RequestInfo; import android.os.Binder; import android.os.CancellationSignal; import android.os.RemoteException; -import android.os.ResultReceiver; import android.service.credentials.CallingAppInfo; import android.service.credentials.PermissionUtils; import android.util.Slog; @@ -165,7 +164,7 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest, } @Override - public void onUiCancellation(boolean isUserCancellation, ResultReceiver resultReceiver) { + public void onUiCancellation(boolean isUserCancellation) { String exception = GetCredentialException.TYPE_USER_CANCELED; String message = "User cancelled the selector"; if (!isUserCancellation) { diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java index a5b9aa68b22e..f789471bdb0e 100644 --- a/services/credentials/java/com/android/server/credentials/RequestSession.java +++ b/services/credentials/java/com/android/server/credentials/RequestSession.java @@ -17,7 +17,6 @@ package com.android.server.credentials; import android.annotation.NonNull; -import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.PendingIntent; import android.content.ComponentName; @@ -34,7 +33,6 @@ import android.os.IBinder; import android.os.IInterface; import android.os.Looper; import android.os.RemoteException; -import android.os.ResultReceiver; import android.os.UserHandle; import android.service.credentials.CallingAppInfo; import android.util.Slog; @@ -103,9 +101,6 @@ abstract class RequestSession<T, U, V> implements CredentialManagerUi.Credential protected PendingIntent mPendingIntent; - @Nullable - protected ResultReceiver mFinalResponseReceiver; - @NonNull protected RequestSessionStatus mRequestSessionStatus = RequestSessionStatus.IN_PROGRESS; @@ -224,8 +219,7 @@ abstract class RequestSession<T, U, V> 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<T, U, V> 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(); |