Merge changes from topic "credman_metric_autofill" into main
* changes:
Collect autofill ids in credman request
Update MetricUtil apis with autofill apis
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
index 8ac364e7..b2c23a4 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
@@ -69,7 +69,8 @@
companion object {
private const val TAG = "CredAutofill"
- private const val SESSION_ID_KEY = "session_id"
+ private const val SESSION_ID_KEY = "autofill_session_id"
+ private const val REQUEST_ID_KEY = "autofill_request_id"
private const val CRED_HINT_PREFIX = "credential="
private const val REQUEST_DATA_KEY = "requestData"
private const val CANDIDATE_DATA_KEY = "candidateQueryData"
@@ -97,16 +98,23 @@
val callingPackage = structure.activityComponent.packageName
Log.i(TAG, "onFillCredentialRequest called for $callingPackage")
- var sessionId = request.clientState?.getInt(SESSION_ID_KEY)
-
- Log.i(TAG, "Autofill sessionId: " + sessionId)
- if (sessionId == null) {
- Log.i(TAG, "Session Id not found")
- callback.onFailure("Session Id not found")
+ val clientState = request.clientState
+ if (clientState == null) {
+ Log.i(TAG, "Client state not found")
+ callback.onFailure("Client state not found")
+ return
+ }
+ val sessionId = clientState.getInt(SESSION_ID_KEY)
+ val requestId = clientState.getInt(REQUEST_ID_KEY)
+ 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")
return
}
- val getCredRequest: GetCredentialRequest? = getCredManRequest(structure)
+ val getCredRequest: GetCredentialRequest? = getCredManRequest(structure, sessionId,
+ requestId)
if (getCredRequest == null) {
Log.i(TAG, "No credential manager request found")
callback.onFailure("No credential manager request found")
@@ -515,12 +523,19 @@
TODO("Not yet implemented")
}
- private fun getCredManRequest(structure: AssistStructure): GetCredentialRequest? {
+ private fun getCredManRequest(
+ structure: AssistStructure,
+ sessionId: Int,
+ requestId: Int
+ ): GetCredentialRequest? {
val credentialOptions: MutableList<CredentialOption> = mutableListOf()
traverseStructure(structure, credentialOptions)
if (credentialOptions.isNotEmpty()) {
- return GetCredentialRequest.Builder(Bundle.EMPTY)
+ val dataBundle = Bundle()
+ dataBundle.putInt(SESSION_ID_KEY, sessionId)
+ dataBundle.putInt(REQUEST_ID_KEY, requestId)
+ return GetCredentialRequest.Builder(dataBundle)
.setCredentialOptions(credentialOptions)
.build()
}
diff --git a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
index 553ba12..7fc1738 100644
--- a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
+++ b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
@@ -16,6 +16,7 @@
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;
@@ -107,15 +108,16 @@
mLastFlag = flag;
if (mRemoteFillService != null && mRemoteFillService.isCredentialAutofillService()) {
Slog.v(TAG, "About to call CredAutofill service as secondary provider");
- addSessionIdToClientState(pendingFillRequest, pendingInlineSuggestionsRequest, id);
+ addSessionIdAndRequestIdToClientState(pendingFillRequest,
+ pendingInlineSuggestionsRequest, id);
mRemoteFillService.onFillCredentialRequest(pendingFillRequest, client);
} else {
mRemoteFillService.onFillRequest(pendingFillRequest);
}
}
- private FillRequest addSessionIdToClientState(FillRequest pendingFillRequest,
- InlineSuggestionsRequest pendingInlineSuggestionsRequest, int id) {
+ private FillRequest addSessionIdAndRequestIdToClientState(FillRequest pendingFillRequest,
+ InlineSuggestionsRequest pendingInlineSuggestionsRequest, int sessionId) {
if (pendingFillRequest.getClientState() == null) {
pendingFillRequest = new FillRequest(pendingFillRequest.getId(),
pendingFillRequest.getFillContexts(),
@@ -125,7 +127,8 @@
pendingInlineSuggestionsRequest,
pendingFillRequest.getDelayedFillIntentSender());
}
- pendingFillRequest.getClientState().putInt(SESSION_ID_KEY, id);
+ pendingFillRequest.getClientState().putInt(SESSION_ID_KEY, sessionId);
+ pendingFillRequest.getClientState().putInt(REQUEST_ID_KEY, pendingFillRequest.getId());
return pendingFillRequest;
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 007be05..6a81425 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -234,7 +234,8 @@
new ComponentName("com.android.credentialmanager",
"com.android.credentialmanager.autofill.CredentialAutofillService");
- static final String SESSION_ID_KEY = "session_id";
+ static final String SESSION_ID_KEY = "autofill_session_id";
+ static final String REQUEST_ID_KEY = "autofill_request_id";
final Object mLock;
@@ -729,7 +730,7 @@
mPendingFillRequest.getFlags(), id, mClient);
} else if (mRemoteFillService != null) {
if (mIsPrimaryCredential) {
- mPendingFillRequest = addSessionIdToClientState(mPendingFillRequest,
+ mPendingFillRequest = addSessionIdAndRequestIdToClientState(mPendingFillRequest,
mPendingInlineSuggestionsRequest, id);
mRemoteFillService.onFillCredentialRequest(mPendingFillRequest, mClient);
} else {
@@ -877,8 +878,8 @@
}
}
- private FillRequest addSessionIdToClientState(FillRequest pendingFillRequest,
- InlineSuggestionsRequest pendingInlineSuggestionsRequest, int id) {
+ private FillRequest addSessionIdAndRequestIdToClientState(FillRequest pendingFillRequest,
+ InlineSuggestionsRequest pendingInlineSuggestionsRequest, int sessionId) {
if (pendingFillRequest.getClientState() == null) {
pendingFillRequest = new FillRequest(pendingFillRequest.getId(),
pendingFillRequest.getFillContexts(),
@@ -888,7 +889,8 @@
pendingInlineSuggestionsRequest,
pendingFillRequest.getDelayedFillIntentSender());
}
- pendingFillRequest.getClientState().putInt(SESSION_ID_KEY, id);
+ pendingFillRequest.getClientState().putInt(SESSION_ID_KEY, sessionId);
+ pendingFillRequest.getClientState().putInt(REQUEST_ID_KEY, pendingFillRequest.getId());
return pendingFillRequest;
}
diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
index dfb5a57..fb0729f 100644
--- a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
+++ b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
@@ -517,6 +517,8 @@
.map(CredentialOption::getType)
.collect(Collectors.toList()));
+ finalizeAndEmitInitialPhaseMetric(session);
+
if (providerSessions.isEmpty()) {
try {
callback.onError(
@@ -776,6 +778,13 @@
providerSessions.forEach(ProviderSession::invokeSession);
}
+ private void finalizeAndEmitInitialPhaseMetric(GetCandidateRequestSession session) {
+ var initMetric = session.mRequestSessionMetric.getInitialPhaseMetric();
+ initMetric.setAutofillSessionId(session.getAutofillSessionId());
+ initMetric.setAutofillRequestId(session.getAutofillRequestId());
+ finalizeAndEmitInitialPhaseMetric((RequestSession) session);
+ }
+
private void finalizeAndEmitInitialPhaseMetric(RequestSession session) {
try {
var initMetric = session.mRequestSessionMetric.getInitialPhaseMetric();
diff --git a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java
index d165171..0f914c3 100644
--- a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java
@@ -49,7 +49,12 @@
implements ProviderSession.ProviderInternalCallback<GetCredentialResponse> {
private static final String TAG = "GetCandidateRequestSession";
+ private static final String SESSION_ID_KEY = "autofill_session_id";
+ private static final String REQUEST_ID_KEY = "autofill_request_id";
+
private final IAutoFillManagerClient mAutoFillCallback;
+ private final int mAutofillSessionId;
+ private final int mAutofillRequestId;
public GetCandidateRequestSession(
Context context, SessionLifetime sessionCallback,
@@ -62,6 +67,8 @@
RequestInfo.TYPE_GET, callingAppInfo, enabledProviders,
cancellationSignal, 0L);
mAutoFillCallback = autoFillCallback;
+ mAutofillSessionId = request.getData().getInt(SESSION_ID_KEY, -1);
+ mAutofillRequestId = request.getData().getInt(REQUEST_ID_KEY, -1);
}
/**
@@ -177,4 +184,19 @@
Slog.d(TAG, "onFinalResponseReceived");
respondToClientWithResponseAndFinish(new GetCandidateCredentialsResponse(response));
}
+
+ /**
+ * Returns autofill session id. Returns -1 if unavailable.
+ */
+ public int getAutofillSessionId() {
+ return mAutofillSessionId;
+ }
+
+ /**
+ * Returns autofill request id. Returns -1 if unavailable.
+ */
+ public int getAutofillRequestId() {
+ return mAutofillRequestId;
+
+ }
}
diff --git a/services/credentials/java/com/android/server/credentials/MetricUtilities.java b/services/credentials/java/com/android/server/credentials/MetricUtilities.java
index b36de0b..23aa374 100644
--- a/services/credentials/java/com/android/server/credentials/MetricUtilities.java
+++ b/services/credentials/java/com/android/server/credentials/MetricUtilities.java
@@ -426,7 +426,11 @@
/* per_classtype_counts */
initialPhaseMetric.getUniqueRequestCounts(),
/* origin_specified */
- initialPhaseMetric.isOriginSpecified()
+ initialPhaseMetric.isOriginSpecified(),
+ /* autofill_session_id */
+ initialPhaseMetric.getAutofillSessionId(),
+ /* autofill_request_id */
+ initialPhaseMetric.getAutofillRequestId()
);
} catch (Exception e) {
Slog.w(TAG, "Unexpected error during initial metric emit: " + e);
diff --git a/services/credentials/java/com/android/server/credentials/metrics/InitialPhaseMetric.java b/services/credentials/java/com/android/server/credentials/metrics/InitialPhaseMetric.java
index 8e965e3..8a4e86c 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/InitialPhaseMetric.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/InitialPhaseMetric.java
@@ -49,6 +49,12 @@
// Stores the deduped request information, particularly {"req":5}
private Map<String, Integer> mRequestCounts = new LinkedHashMap<>();
+ // The session id of autofill if the request is from autofill, defaults to -1
+ private int mAutofillSessionId = -1;
+
+ // The request id of autofill if the request is from autofill, defaults to -1
+ private int mAutofillRequestId = -1;
+
public InitialPhaseMetric(int sessionIdTrackOne) {
mSessionIdCaller = sessionIdTrackOne;
@@ -126,6 +132,24 @@
return mOriginSpecified;
}
+ /* ------ Autofill Integration ------ */
+
+ public void setAutofillSessionId(int autofillSessionId) {
+ mAutofillSessionId = autofillSessionId;
+ }
+
+ public int getAutofillSessionId() {
+ return mAutofillSessionId;
+ }
+
+ public void setAutofillRequestId(int autofillRequestId) {
+ mAutofillRequestId = autofillRequestId;
+ }
+
+ public int getAutofillRequestId() {
+ return mAutofillRequestId;
+ }
+
/* ------ Unique Request Counts Map Information ------ */
public void setRequestCounts(Map<String, Integer> requestCounts) {