Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0910cc5 authored by Daniel's avatar Daniel
Browse files

Collect autofill ids in credman request

When the credman request flows from autofill session, the autofill's
session_id and request_id will be propagated to the credman so that
credman can collect metrics on these ids.

Bug: 317819515
Test: m (build)
Change-Id: I071208a4a8acd2c3b4e4a4b82a07cc302a231613
parent d36ac754
Loading
Loading
Loading
Loading
+25 −10
Original line number Diff line number Diff line
@@ -69,7 +69,8 @@ class CredentialAutofillService : AutofillService() {
    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 @@ class CredentialAutofillService : AutofillService() {
        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")
@@ -503,12 +511,19 @@ class CredentialAutofillService : AutofillService() {
        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()
        }
+7 −4
Original line number Diff line number Diff line
@@ -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 @@ final class SecondaryProviderHandler implements RemoteFillService.FillServiceCal
        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 @@ final class SecondaryProviderHandler implements RemoteFillService.FillServiceCal
                    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;
    }

+7 −5
Original line number Diff line number Diff line
@@ -234,7 +234,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
            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 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
                        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 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
        }
    }

    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 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
                    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;
    }

+9 −0
Original line number Diff line number Diff line
@@ -517,6 +517,8 @@ public final class CredentialManagerService
                                    .map(CredentialOption::getType)
                                    .collect(Collectors.toList()));

            finalizeAndEmitInitialPhaseMetric(session);

            if (providerSessions.isEmpty()) {
                try {
                    callback.onError(
@@ -776,6 +778,13 @@ public final class CredentialManagerService
            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();
+22 −0
Original line number Diff line number Diff line
@@ -49,7 +49,12 @@ public class GetCandidateRequestSession extends RequestSession<GetCredentialRequ
        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 @@ public class GetCandidateRequestSession extends RequestSession<GetCredentialRequ
                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 @@ public class GetCandidateRequestSession extends RequestSession<GetCredentialRequ
        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;

    }
}