summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Reema Bajwa <reemabajwa@google.com> 2024-04-12 17:51:01 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-04-12 17:51:01 +0000
commite2846f475fbeab4688d4ed3ff04012f23bccfb8c (patch)
tree552c5a94f1530ee5f3a8557f88005112e29dc680
parent68c98a6eaf29e20c7aba79857ff98ee2a3720011 (diff)
parent388f9ab78c2dc2d37ee32bb1a65c94c0de17de1b (diff)
Merge "Direct connection btw Autofill & Credman sessions" into main
-rw-r--r--core/java/android/credentials/CredentialManager.java7
-rw-r--r--core/java/android/credentials/selection/Constants.java7
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/client/impl/CredentialManagerClientImpl.kt11
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/IntentKtx.kt6
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/mapper/RequestGetMapper.kt2
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/model/Request.kt6
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt17
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt7
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt15
-rw-r--r--packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorUiStateGetMapperTest.kt4
-rw-r--r--packages/CredentialManager/wear/robotests/src/com/android/credentialmanager/CredentialSelectorViewModelTest.kt2
-rw-r--r--services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java29
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java62
-rw-r--r--services/credentials/java/com/android/server/credentials/ClearRequestSession.java3
-rw-r--r--services/credentials/java/com/android/server/credentials/CreateRequestSession.java3
-rw-r--r--services/credentials/java/com/android/server/credentials/CredentialManagerUi.java19
-rw-r--r--services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java22
-rw-r--r--services/credentials/java/com/android/server/credentials/GetRequestSession.java3
-rw-r--r--services/credentials/java/com/android/server/credentials/RequestSession.java10
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();