diff --git a/core/java/android/service/autofill/FillEventHistory.java b/core/java/android/service/autofill/FillEventHistory.java index f7dc1c58ade1b..768e743612ed1 100644 --- a/core/java/android/service/autofill/FillEventHistory.java +++ b/core/java/android/service/autofill/FillEventHistory.java @@ -22,8 +22,7 @@ import android.content.IntentSender; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; -import android.view.autofill.AutofillId; -import android.widget.RemoteViews; +import android.view.autofill.AutofillManager; import com.android.internal.util.Preconditions; @@ -81,7 +80,7 @@ public final class FillEventHistory implements Parcelable { /** * Returns the client state set in the previous {@link FillResponse}. * - *
NOTE: the state is associated with the app that was autofilled in the previous + *
Note: the state is associated with the app that was autofilled in the previous * {@link AutofillService#onFillRequest(FillRequest, android.os.CancellationSignal, FillCallback)} * , which is not necessary the same app being autofilled now. */ @@ -148,6 +147,14 @@ public final class FillEventHistory implements Parcelable { public static final class Event { /** * A dataset was selected. The dataset selected can be read from {@link #getDatasetId()}. + * + *
Note: on Android {@link android.os.Build.VERSION_CODES#O}, this event was also + * incorrectly reported after a + * {@link Dataset.Builder#setAuthentication(IntentSender) dataset authentication} was + * selected and the service returned a dataset in the + * {@link AutofillManager#EXTRA_AUTHENTICATION_RESULT} of the activity launched from that + * {@link IntentSender}. This behavior was fixed on Android + * {@link android.os.Build.VERSION_CODES#O_MR1}. */ public static final int TYPE_DATASET_SELECTED = 0; @@ -158,8 +165,8 @@ public final class FillEventHistory implements Parcelable { public static final int TYPE_DATASET_AUTHENTICATION_SELECTED = 1; /** - * A {@link FillResponse.Builder#setAuthentication(AutofillId[], IntentSender, RemoteViews) - * fill response authentication} was selected. + * A {@link FillResponse.Builder#setAuthentication(android.view.autofill.AutofillId[], + * IntentSender, android.widget.RemoteViews) fill response authentication} was selected. */ public static final int TYPE_AUTHENTICATION_SELECTED = 2; diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index c4fbbabb68752..512e1288d861a 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -533,9 +533,9 @@ final class AutofillManagerServiceImpl { /** * Updates the last fill selection when an dataset authentication was selected. */ - void setDatasetAuthenticationSelected(@Nullable String selectedDataset, int sessionId) { + void logDatasetAuthenticationSelected(@Nullable String selectedDataset, int sessionId) { synchronized (mLock) { - if (isValidEventLocked("setDatasetAuthenticationSelected()", sessionId)) { + if (isValidEventLocked("logDatasetAuthenticationSelected()", sessionId)) { mEventHistory.addEvent( new Event(Event.TYPE_DATASET_AUTHENTICATION_SELECTED, selectedDataset)); } @@ -545,9 +545,9 @@ final class AutofillManagerServiceImpl { /** * Updates the last fill selection when an save Ui is shown. */ - void setSaveShown(int sessionId) { + void logSaveShown(int sessionId) { synchronized (mLock) { - if (isValidEventLocked("setSaveShown()", sessionId)) { + if (isValidEventLocked("logSaveShown()", sessionId)) { mEventHistory.addEvent(new Event(Event.TYPE_SAVE_SHOWN, null)); } } @@ -556,7 +556,7 @@ final class AutofillManagerServiceImpl { /** * Updates the last fill response when a dataset was selected. */ - void setDatasetSelected(@Nullable String selectedDataset, int sessionId) { + void logDatasetSelected(@Nullable String selectedDataset, int sessionId) { synchronized (mLock) { if (isValidEventLocked("setDatasetSelected()", sessionId)) { mEventHistory.addEvent(new Event(Event.TYPE_DATASET_SELECTED, selectedDataset)); diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index c684a42a64d14..e0e379f46309d 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -609,7 +609,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState return; } } - mHandlerCaller.getHandler().post(() -> autoFill(requestId, datasetIndex, dataset)); + mHandlerCaller.getHandler().post(() -> autoFill(requestId, datasetIndex, dataset, true)); } // AutoFillUiCallback @@ -747,7 +747,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (datasetIdx != AutofillManager.AUTHENTICATION_ID_DATASET_ID_UNDEFINED) { final Dataset dataset = (Dataset) result; authenticatedResponse.getDatasets().set(datasetIdx, dataset); - autoFill(requestId, datasetIdx, dataset); + autoFill(requestId, datasetIdx, dataset, false); } } else { if (result != null) { @@ -967,7 +967,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } if (sDebug) Slog.d(TAG, "Good news, everyone! All checks passed, show save UI!"); - mService.setSaveShown(id); + mService.logSaveShown(id); final IAutoFillManagerClient client = getClient(); mPendingSaveUi = new PendingUi(mActivityToken, id, client); getUiForShowing().showSaveUi(mService.getServiceLabel(), saveInfo, @@ -1536,7 +1536,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState return viewState; } - void autoFill(int requestId, int datasetIndex, Dataset dataset) { + void autoFill(int requestId, int datasetIndex, Dataset dataset, boolean generateEvent) { synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#autoFill() rejected - session: " @@ -1545,14 +1545,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } // Autofill it directly... if (dataset.getAuthentication() == null) { - mService.setDatasetSelected(dataset.getId(), id); + if (generateEvent) { + mService.logDatasetSelected(dataset.getId(), id); + } autoFillApp(dataset); return; } // ...or handle authentication. - mService.setDatasetAuthenticationSelected(dataset.getId(), id); + mService.logDatasetAuthenticationSelected(dataset.getId(), id); setViewStatesLocked(null, dataset, ViewState.STATE_WAITING_DATASET_AUTH, false); final Intent fillInIntent = createAuthFillInIntentLocked(requestId, mClientState);