summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt1
-rw-r--r--api/system-current.txt1
-rw-r--r--api/test-current.txt1
-rw-r--r--core/java/android/os/Parcel.java3
-rw-r--r--core/java/android/service/autofill/Dataset.java19
-rw-r--r--core/java/android/service/autofill/FillEventHistory.java5
-rw-r--r--core/java/android/service/autofill/SaveRequest.java16
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java16
8 files changed, 50 insertions, 12 deletions
diff --git a/api/current.txt b/api/current.txt
index 87295c8acb64..ecba8e0d8130 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -37193,6 +37193,7 @@ package android.service.autofill {
public final class SaveRequest implements android.os.Parcelable {
method public int describeContents();
method public android.os.Bundle getClientState();
+ method public java.util.List<java.lang.String> getDatasetIds();
method public java.util.List<android.service.autofill.FillContext> getFillContexts();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR;
diff --git a/api/system-current.txt b/api/system-current.txt
index 4e05661d8f19..406da4fc5861 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -40284,6 +40284,7 @@ package android.service.autofill {
public final class SaveRequest implements android.os.Parcelable {
method public int describeContents();
method public android.os.Bundle getClientState();
+ method public java.util.List<java.lang.String> getDatasetIds();
method public java.util.List<android.service.autofill.FillContext> getFillContexts();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR;
diff --git a/api/test-current.txt b/api/test-current.txt
index 8f48a9fe0d8b..995c354a1f30 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -37414,6 +37414,7 @@ package android.service.autofill {
public final class SaveRequest implements android.os.Parcelable {
method public int describeContents();
method public android.os.Bundle getClientState();
+ method public java.util.List<java.lang.String> getDatasetIds();
method public java.util.List<android.service.autofill.FillContext> getFillContexts();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR;
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index fae9d5310f8e..031ca91c3eaa 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -2555,9 +2555,6 @@ public final class Parcel {
* Read into the given List items String objects that were written with
* {@link #writeStringList} at the current dataPosition().
*
- * @return A newly created ArrayList containing strings with the same data
- * as those that were previously written.
- *
* @see #writeStringList
*/
public final void readStringList(List<String> list) {
diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java
index 65b0efcbe032..cb341b1d7828 100644
--- a/core/java/android/service/autofill/Dataset.java
+++ b/core/java/android/service/autofill/Dataset.java
@@ -198,15 +198,22 @@ public final class Dataset implements Parcelable {
}
/**
- * Sets the id for the dataset so its usage history can be retrieved later.
+ * Sets the id for the dataset so its usage can be tracked.
*
- * <p>The id of the last selected dataset can be read from
- * {@link AutofillService#getFillEventHistory()}. If the id is not set it will not be clear
- * if a dataset was selected as {@link AutofillService#getFillEventHistory()} uses
- * {@code null} to indicate that no dataset was selected.
+ * <p>Dataset usage can be tracked for 2 purposes:
+ *
+ * <ul>
+ * <li>For statistical purposes, the service can call
+ * {@link AutofillService#getFillEventHistory()} when handling {@link
+ * AutofillService#onFillRequest(FillRequest, android.os.CancellationSignal, FillCallback)}
+ * calls.
+ * <li>For normal autofill workflow, the service can call
+ * {@link SaveRequest#getDatasetIds()} when handling
+ * {@link AutofillService#onSaveRequest(SaveRequest, SaveCallback)} calls.
+ * </ul>
*
* @param id id for this dataset or {@code null} to unset.
-
+ *
* @return This builder.
*/
public @NonNull Builder setId(@Nullable String id) {
diff --git a/core/java/android/service/autofill/FillEventHistory.java b/core/java/android/service/autofill/FillEventHistory.java
index 60c1c9a7e87a..ae4fd2b47096 100644
--- a/core/java/android/service/autofill/FillEventHistory.java
+++ b/core/java/android/service/autofill/FillEventHistory.java
@@ -228,6 +228,11 @@ public final class FillEventHistory implements Parcelable {
mDatasetId = datasetId;
mClientState = clientState;
}
+
+ @Override
+ public String toString() {
+ return "FillEvent [datasetId=" + mDatasetId + ", type=" + mEventType + "]";
+ }
}
public static final Parcelable.Creator<FillEventHistory> CREATOR =
diff --git a/core/java/android/service/autofill/SaveRequest.java b/core/java/android/service/autofill/SaveRequest.java
index 9de931542cb9..1a6c5b0bcc08 100644
--- a/core/java/android/service/autofill/SaveRequest.java
+++ b/core/java/android/service/autofill/SaveRequest.java
@@ -22,6 +22,7 @@ import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.Parcel;
import android.os.Parcelable;
+
import com.android.internal.util.Preconditions;
import java.util.ArrayList;
@@ -36,16 +37,18 @@ import java.util.List;
public final class SaveRequest implements Parcelable {
private final @NonNull ArrayList<FillContext> mFillContexts;
private final @Nullable Bundle mClientState;
+ private final @Nullable ArrayList<String> mDatasetIds;
/** @hide */
public SaveRequest(@NonNull ArrayList<FillContext> fillContexts,
- @Nullable Bundle clientState) {
+ @Nullable Bundle clientState, @Nullable ArrayList<String> datasetIds) {
mFillContexts = Preconditions.checkNotNull(fillContexts, "fillContexts");
mClientState = clientState;
+ mDatasetIds = datasetIds;
}
private SaveRequest(@NonNull Parcel parcel) {
- this(parcel.readTypedArrayList(null), parcel.readBundle());
+ this(parcel.readTypedArrayList(null), parcel.readBundle(), parcel.createStringArrayList());
}
/**
@@ -66,6 +69,14 @@ public final class SaveRequest implements Parcelable {
return mClientState;
}
+ /**
+ * Gets the ids of the datasets selected by the user, in the order in which they were selected.
+ */
+ @Nullable
+ public List<String> getDatasetIds() {
+ return mDatasetIds;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -75,6 +86,7 @@ public final class SaveRequest implements Parcelable {
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeTypedArrayList(mFillContexts, flags);
parcel.writeBundle(mClientState);
+ parcel.writeStringList(mDatasetIds);
}
public static final Creator<SaveRequest> CREATOR =
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 8d9f0aa2f49b..a44f2c0d62aa 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -177,6 +177,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
private PendingUi mPendingSaveUi;
/**
+ * List of dataset ids selected by the user.
+ */
+ @GuardedBy("mLock")
+ private ArrayList<String> mSelectedDatasetIds;
+
+ /**
* Receiver of assist data from the app's {@link Activity}.
*/
private final IResultReceiver mAssistReceiver = new IResultReceiver.Stub() {
@@ -1098,7 +1104,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// until the dispatch happens. The items in the list don't need to be cloned
// since we don't hold on them anywhere else. The client state is not touched
// by us, so no need to copy.
- final SaveRequest saveRequest = new SaveRequest(new ArrayList<>(mContexts), mClientState);
+ final SaveRequest saveRequest = new SaveRequest(new ArrayList<>(mContexts), mClientState,
+ mSelectedDatasetIds);
mRemoteFillService.onSaveRequest(saveRequest);
}
@@ -1626,6 +1633,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
pw.print(prefix); pw.print("mHasCallback: "); pw.println(mHasCallback);
pw.print(prefix); pw.print("mClientState: "); pw.println(
Helper.bundleToString(mClientState));
+ pw.print(prefix); pw.print("mSelectedDatasetIds: "); pw.println(mSelectedDatasetIds);
mRemoteFillService.dump(prefix, pw);
}
@@ -1666,6 +1674,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (sDebug) Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
mClient.autofill(id, ids, values);
+ if (dataset.getId() != null) {
+ if (mSelectedDatasetIds == null) {
+ mSelectedDatasetIds = new ArrayList<>();
+ }
+ mSelectedDatasetIds.add(dataset.getId());
+ }
setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED, false);
}
} catch (RemoteException e) {