Loading core/java/android/service/autofill/SaveRequest.java +8 −4 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package android.service.autofill; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Parcel; import android.os.Parcelable; Loading Loading @@ -60,9 +59,14 @@ public final class SaveRequest implements Parcelable { } /** * Gets the extra client state returned from the last {@link * AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback)} * fill request}. * Gets the latest client state extra returned from the service. * * <p><b>Note:</b> Prior to Android {@link android.os.Build.VERSION_CODES#P}, only client state * bundles set by {@link FillResponse.Builder#setClientState(Bundle)} where considered. On * Android {@link android.os.Build.VERSION_CODES#P} and higher, bundles set in the result of * an authenticated request through the * {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE} extra are * also considered (and take precedence when set). * * @return The client state. */ Loading core/java/android/view/autofill/AutofillManager.java +10 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,12 @@ public final class AutofillManager { * service authentication will contain the Bundle set by * {@link android.service.autofill.FillResponse.Builder#setClientState(Bundle)} on this extra. * * <p>On Android {@link android.os.Build.VERSION_CODES#P} and higher, the autofill service * can also add this bundle to the {@link Intent} set as the * {@link android.app.Activity#setResult(int, Intent) result} for an authentication request, * so the bundle can be recovered later on * {@link android.service.autofill.SaveRequest#getClientState()}. * * <p> * Type: {@link android.os.Bundle} */ Loading Loading @@ -959,6 +965,10 @@ public final class AutofillManager { final Parcelable result = data.getParcelableExtra(EXTRA_AUTHENTICATION_RESULT); final Bundle responseData = new Bundle(); responseData.putParcelable(EXTRA_AUTHENTICATION_RESULT, result); final Bundle newClientState = data.getBundleExtra(EXTRA_CLIENT_STATE); if (newClientState != null) { responseData.putBundle(EXTRA_CLIENT_STATE, newClientState); } try { mService.setAuthenticationResult(responseData, mSessionId, authenticationId, mContext.getUserId()); Loading services/autofill/java/com/android/server/autofill/Session.java +18 −8 Original line number Diff line number Diff line Loading @@ -495,7 +495,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState notifyUnavailableToClient(false); } synchronized (mLock) { processResponseLocked(response, requestFlags); processResponseLocked(response, null, requestFlags); } final LogMaker log = newLogMaker(MetricsEvent.AUTOFILL_REQUEST, servicePackageName) Loading Loading @@ -762,13 +762,21 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } final Parcelable result = data.getParcelable(AutofillManager.EXTRA_AUTHENTICATION_RESULT); if (sDebug) Slog.d(TAG, "setAuthenticationResultLocked(): result=" + result); final Bundle newClientState = data.getBundle(AutofillManager.EXTRA_CLIENT_STATE); if (sDebug) { Slog.d(TAG, "setAuthenticationResultLocked(): result=" + result + ", clientState=" + newClientState); } if (result instanceof FillResponse) { writeLog(MetricsEvent.AUTOFILL_AUTHENTICATED); replaceResponseLocked(authenticatedResponse, (FillResponse) result); replaceResponseLocked(authenticatedResponse, (FillResponse) result, newClientState); } else if (result instanceof Dataset) { if (datasetIdx != AutofillManager.AUTHENTICATION_ID_DATASET_ID_UNDEFINED) { writeLog(MetricsEvent.AUTOFILL_DATASET_AUTHENTICATED); if (newClientState != null) { if (sDebug) Slog.d(TAG, "Updating client state from auth dataset"); mClientState = newClientState; } final Dataset dataset = (Dataset) result; authenticatedResponse.getDatasets().set(datasetIdx, dataset); autoFill(requestId, datasetIdx, dataset, false); Loading Loading @@ -1543,7 +1551,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } private void replaceResponseLocked(@NonNull FillResponse oldResponse, @NonNull FillResponse newResponse) { @NonNull FillResponse newResponse, @Nullable Bundle newClientState) { // Disassociate view states with the old response setViewStatesLocked(oldResponse, ViewState.STATE_INITIAL, true); // Move over the id Loading @@ -1551,7 +1559,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Replace the old response mResponses.put(newResponse.getRequestId(), newResponse); // Now process the new response processResponseLocked(newResponse, 0); processResponseLocked(newResponse, newClientState, 0); } private void processNullResponseLocked(int flags) { Loading @@ -1565,7 +1573,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState removeSelf(); } private void processResponseLocked(@NonNull FillResponse newResponse, int flags) { private void processResponseLocked(@NonNull FillResponse newResponse, @Nullable Bundle newClientState, int flags) { // Make sure we are hiding the UI which will be shown // only if handling the current response requires it. mUi.hideAll(this); Loading @@ -1573,14 +1582,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState final int requestId = newResponse.getRequestId(); if (sVerbose) { Slog.v(TAG, "processResponseLocked(): mCurrentViewId=" + mCurrentViewId + ",flags=" + flags + ", reqId=" + requestId + ", resp=" + newResponse); + ",flags=" + flags + ", reqId=" + requestId + ", resp=" + newResponse + ",newClientState=" + newClientState); } if (mResponses == null) { mResponses = new SparseArray<>(4); } mResponses.put(requestId, newResponse); mClientState = newResponse.getClientState(); mClientState = newClientState != null ? newClientState : newResponse.getClientState(); setViewStatesLocked(newResponse, ViewState.STATE_FILLABLE, false); updateTrackedIdsLocked(); Loading Loading
core/java/android/service/autofill/SaveRequest.java +8 −4 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package android.service.autofill; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Parcel; import android.os.Parcelable; Loading Loading @@ -60,9 +59,14 @@ public final class SaveRequest implements Parcelable { } /** * Gets the extra client state returned from the last {@link * AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback)} * fill request}. * Gets the latest client state extra returned from the service. * * <p><b>Note:</b> Prior to Android {@link android.os.Build.VERSION_CODES#P}, only client state * bundles set by {@link FillResponse.Builder#setClientState(Bundle)} where considered. On * Android {@link android.os.Build.VERSION_CODES#P} and higher, bundles set in the result of * an authenticated request through the * {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE} extra are * also considered (and take precedence when set). * * @return The client state. */ Loading
core/java/android/view/autofill/AutofillManager.java +10 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,12 @@ public final class AutofillManager { * service authentication will contain the Bundle set by * {@link android.service.autofill.FillResponse.Builder#setClientState(Bundle)} on this extra. * * <p>On Android {@link android.os.Build.VERSION_CODES#P} and higher, the autofill service * can also add this bundle to the {@link Intent} set as the * {@link android.app.Activity#setResult(int, Intent) result} for an authentication request, * so the bundle can be recovered later on * {@link android.service.autofill.SaveRequest#getClientState()}. * * <p> * Type: {@link android.os.Bundle} */ Loading Loading @@ -959,6 +965,10 @@ public final class AutofillManager { final Parcelable result = data.getParcelableExtra(EXTRA_AUTHENTICATION_RESULT); final Bundle responseData = new Bundle(); responseData.putParcelable(EXTRA_AUTHENTICATION_RESULT, result); final Bundle newClientState = data.getBundleExtra(EXTRA_CLIENT_STATE); if (newClientState != null) { responseData.putBundle(EXTRA_CLIENT_STATE, newClientState); } try { mService.setAuthenticationResult(responseData, mSessionId, authenticationId, mContext.getUserId()); Loading
services/autofill/java/com/android/server/autofill/Session.java +18 −8 Original line number Diff line number Diff line Loading @@ -495,7 +495,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState notifyUnavailableToClient(false); } synchronized (mLock) { processResponseLocked(response, requestFlags); processResponseLocked(response, null, requestFlags); } final LogMaker log = newLogMaker(MetricsEvent.AUTOFILL_REQUEST, servicePackageName) Loading Loading @@ -762,13 +762,21 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } final Parcelable result = data.getParcelable(AutofillManager.EXTRA_AUTHENTICATION_RESULT); if (sDebug) Slog.d(TAG, "setAuthenticationResultLocked(): result=" + result); final Bundle newClientState = data.getBundle(AutofillManager.EXTRA_CLIENT_STATE); if (sDebug) { Slog.d(TAG, "setAuthenticationResultLocked(): result=" + result + ", clientState=" + newClientState); } if (result instanceof FillResponse) { writeLog(MetricsEvent.AUTOFILL_AUTHENTICATED); replaceResponseLocked(authenticatedResponse, (FillResponse) result); replaceResponseLocked(authenticatedResponse, (FillResponse) result, newClientState); } else if (result instanceof Dataset) { if (datasetIdx != AutofillManager.AUTHENTICATION_ID_DATASET_ID_UNDEFINED) { writeLog(MetricsEvent.AUTOFILL_DATASET_AUTHENTICATED); if (newClientState != null) { if (sDebug) Slog.d(TAG, "Updating client state from auth dataset"); mClientState = newClientState; } final Dataset dataset = (Dataset) result; authenticatedResponse.getDatasets().set(datasetIdx, dataset); autoFill(requestId, datasetIdx, dataset, false); Loading Loading @@ -1543,7 +1551,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } private void replaceResponseLocked(@NonNull FillResponse oldResponse, @NonNull FillResponse newResponse) { @NonNull FillResponse newResponse, @Nullable Bundle newClientState) { // Disassociate view states with the old response setViewStatesLocked(oldResponse, ViewState.STATE_INITIAL, true); // Move over the id Loading @@ -1551,7 +1559,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Replace the old response mResponses.put(newResponse.getRequestId(), newResponse); // Now process the new response processResponseLocked(newResponse, 0); processResponseLocked(newResponse, newClientState, 0); } private void processNullResponseLocked(int flags) { Loading @@ -1565,7 +1573,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState removeSelf(); } private void processResponseLocked(@NonNull FillResponse newResponse, int flags) { private void processResponseLocked(@NonNull FillResponse newResponse, @Nullable Bundle newClientState, int flags) { // Make sure we are hiding the UI which will be shown // only if handling the current response requires it. mUi.hideAll(this); Loading @@ -1573,14 +1582,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState final int requestId = newResponse.getRequestId(); if (sVerbose) { Slog.v(TAG, "processResponseLocked(): mCurrentViewId=" + mCurrentViewId + ",flags=" + flags + ", reqId=" + requestId + ", resp=" + newResponse); + ",flags=" + flags + ", reqId=" + requestId + ", resp=" + newResponse + ",newClientState=" + newClientState); } if (mResponses == null) { mResponses = new SparseArray<>(4); } mResponses.put(requestId, newResponse); mClientState = newResponse.getClientState(); mClientState = newClientState != null ? newClientState : newResponse.getClientState(); setViewStatesLocked(newResponse, ViewState.STATE_FILLABLE, false); updateTrackedIdsLocked(); Loading