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
diff --git a/core/java/android/credentials/CredentialManager.java b/core/java/android/credentials/CredentialManager.java
index 93fa5d8..d19e61f 100644
--- a/core/java/android/credentials/CredentialManager.java
+++ b/core/java/android/credentials/CredentialManager.java
@@ -132,6 +132,13 @@
"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 2229f25..a620621 100644
--- a/core/java/android/credentials/selection/Constants.java
+++ b/core/java/android/credentials/selection/Constants.java
@@ -28,12 +28,5 @@
*/
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 ab70394..694e27a 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.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 @@
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 786c441..9242141 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 @@
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 1683cc4..f1f1f7c 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.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 @@
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 fd99275..cb335fc 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 @@
*/
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 @@
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 b17a98b..3683235 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
@@ -58,7 +58,6 @@
private val providerEnabledList: List<ProviderData>
private val providerDisabledList: List<DisabledProviderData>?
val resultReceiver: ResultReceiver?
- val finalResponseReceiver: ResultReceiver?
var initialUiState: UiState
@@ -105,12 +104,6 @@
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 @@
}
fun onCancel(cancelCode: Int) {
- sendCancellationCode(cancelCode, requestInfo?.token, resultReceiver, finalResponseReceiver)
+ sendCancellationCode(cancelCode, requestInfo?.token, resultReceiver)
}
fun onOptionSelected(
@@ -226,9 +219,6 @@
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 @@
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 ec0da09..a2f55cd 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt
@@ -208,18 +208,13 @@
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 1253ce3..4109079 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.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 @@
}
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 @@
structure: AssistStructure,
sessionId: Int,
requestId: Int,
+ resultReceiver: ResultReceiver,
responseClientState: Bundle
): GetCredentialRequest? {
val credentialOptions: MutableList<CredentialOption> = mutableListOf()
@@ -540,6 +544,9 @@
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 3422d3d..6a6a7770 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 @@
val getCredentialUiState = Request.Get(
token = null,
resultReceiver = null,
- finalResponseReceiver = null,
providerInfos = listOf(createProviderInfo(credentialList1))).toGet(isPrimary = true)
assertThat(getCredentialUiState).isEqualTo(
@@ -113,7 +112,6 @@
val getCredentialUiState = Request.Get(
token = null,
resultReceiver = null,
- finalResponseReceiver = null,
providerInfos = listOf(createProviderInfo(listOf(passkeyCredentialEntryInfo,
unknownCredentialEntryInfo)))).toGet(isPrimary = true)
@@ -132,7 +130,6 @@
val getCredentialUiState = Request.Get(
token = null,
resultReceiver = null,
- finalResponseReceiver = null,
providerInfos = listOf(createProviderInfo(credentialList1))).toGet(isPrimary = false)
assertThat(getCredentialUiState).isEqualTo(
@@ -151,7 +148,6 @@
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 b79f34c..cf839f8 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 @@
stateFlow.value = Request.Get(
token = null,
resultReceiver = null,
- finalResponseReceiver = null,
providerInfos = emptyList())
mViewModel.back()
@@ -136,7 +135,6 @@
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 4506779..ce9d180 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 @@
private final RemoteFillService mRemoteFillService;
private final SecondaryProviderCallback mCallback;
+
private int mLastFlag;
SecondaryProviderHandler(
@@ -109,37 +105,18 @@
/**
* 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 0b68f5f..3f3ff4a 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.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 @@
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 @@
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 @@
}
}
- 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 @@
}
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 @@
}
- if (isCredmanIntegrationActive(response)) {
- addCredentialManagerCallback(response);
- }
-
if (response.supportsInlineSuggestions()) {
synchronized (mLock) {
if (requestShowInlineSuggestionsLocked(response, filterText)) {
@@ -5153,30 +5159,14 @@
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 @@
if (Flags.autofillCredmanDevIntegration()) {
sendCredentialManagerResponseToApp(getCredentialResponse,
- /*exception=*/ null, finalAutofillId);
+ /*exception=*/ null, mAutofillId);
} else {
Dataset datasetFromCredential = getDatasetFromCredentialResponse(
getCredentialResponse);
@@ -5203,7 +5193,7 @@
+ 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 @@
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 f5ba50d..b1349ea 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.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 @@
}
@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 cac42b1..ba73a0b 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.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 @@
}
@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 24f6697..67025b6 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 @@
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 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 fd2a9a2..5a9c88a 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.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 @@
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 @@
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 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 @@
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 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 d55d8ef..9e9c99b 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.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 @@
}
@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 a5b9aa6..f789471 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.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 @@
protected PendingIntent mPendingIntent;
- @Nullable
- protected ResultReceiver mFinalResponseReceiver;
-
@NonNull
protected RequestSessionStatus mRequestSessionStatus =
RequestSessionStatus.IN_PROGRESS;
@@ -224,8 +219,7 @@
// 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 @@
Slog.w(TAG, "providerSession not found in onUiSelection. This is strange.");
return;
}
- mFinalResponseReceiver = finalResponseReceiver;
+
ProviderSessionMetric providerSessionMetric = providerSession.mProviderSessionMetric;
int initialAuthMetricsProvider = providerSessionMetric.getBrowsedAuthenticationMetric()
.size();