diff options
author | 2024-04-12 17:51:01 +0000 | |
---|---|---|
committer | 2024-04-12 17:51:01 +0000 | |
commit | e2846f475fbeab4688d4ed3ff04012f23bccfb8c (patch) | |
tree | 552c5a94f1530ee5f3a8557f88005112e29dc680 | |
parent | 68c98a6eaf29e20c7aba79857ff98ee2a3720011 (diff) | |
parent | 388f9ab78c2dc2d37ee32bb1a65c94c0de17de1b (diff) |
Merge "Direct connection btw Autofill & Credman sessions" into main
19 files changed, 73 insertions, 162 deletions
diff --git a/core/java/android/credentials/CredentialManager.java b/core/java/android/credentials/CredentialManager.java index eb7afb8ea82c..481ff2e5d3b7 100644 --- a/core/java/android/credentials/CredentialManager.java +++ b/core/java/android/credentials/CredentialManager.java @@ -134,6 +134,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 6c145631a39e..c6013e2ffae6 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) @@ -133,7 +131,6 @@ class CredentialSelectorUiStateGetMapperTest { val getCredentialUiState = Request.Get( token = null, resultReceiver = null, - finalResponseReceiver = null, providerInfos = listOf(createProviderInfo(credentialList1))).toGet(isPrimary = false) assertThat(getCredentialUiState).isEqualTo( @@ -152,7 +149,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 bb46c44c56c4..73e53e2334ee 100644 --- a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java @@ -28,7 +28,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; @@ -151,7 +150,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 3513cb54c9bd..9781fb9a1830 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 bfa2d6138f04..e73dacbed9a3 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; @@ -82,25 +80,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; @@ -124,10 +115,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 69d32a0f8825..dedb687cff22 100644 --- a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java @@ -64,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, @@ -77,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); } @@ -155,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) { @@ -168,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()); } @@ -219,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 c26229b75300..be36b6c5690b 100644 --- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java @@ -32,7 +32,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; @@ -166,7 +165,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 054ba2bca71b..c0bc8e094a39 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; @@ -35,7 +34,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; @@ -104,9 +102,6 @@ abstract class RequestSession<T, U, V> implements CredentialManagerUi.Credential protected PendingIntent mPendingIntent; - @Nullable - protected ResultReceiver mFinalResponseReceiver; - @NonNull protected RequestSessionStatus mRequestSessionStatus = RequestSessionStatus.IN_PROGRESS; @@ -225,8 +220,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; @@ -242,7 +236,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(); |