Loading packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt +25 −10 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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") Loading Loading @@ -515,12 +523,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() } Loading services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java +7 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(), Loading @@ -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; } Loading services/autofill/java/com/android/server/autofill/Session.java +7 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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(), Loading @@ -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; } Loading services/credentials/java/com/android/server/credentials/CredentialManagerService.java +9 −0 Original line number Diff line number Diff line Loading @@ -517,6 +517,8 @@ public final class CredentialManagerService .map(CredentialOption::getType) .collect(Collectors.toList())); finalizeAndEmitInitialPhaseMetric(session); if (providerSessions.isEmpty()) { try { callback.onError( Loading Loading @@ -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(); Loading services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java +22 −0 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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); } /** Loading Loading @@ -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; } } Loading
packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt +25 −10 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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") Loading Loading @@ -515,12 +523,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() } Loading
services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java +7 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(), Loading @@ -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; } Loading
services/autofill/java/com/android/server/autofill/Session.java +7 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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(), Loading @@ -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; } Loading
services/credentials/java/com/android/server/credentials/CredentialManagerService.java +9 −0 Original line number Diff line number Diff line Loading @@ -517,6 +517,8 @@ public final class CredentialManagerService .map(CredentialOption::getType) .collect(Collectors.toList())); finalizeAndEmitInitialPhaseMetric(session); if (providerSessions.isEmpty()) { try { callback.onError( Loading Loading @@ -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(); Loading
services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java +22 −0 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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); } /** Loading Loading @@ -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; } }