Move the presentation view to proper location.
Test: Auto-fill tests pass
bug:33550221
Change-Id: I041a084800e761859c67b962fb4aefafce8956d8
diff --git a/api/current.txt b/api/current.txt
index 67cdc9c..1838c33 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -36244,10 +36244,9 @@
}
public static final class Dataset.Builder {
- ctor public Dataset.Builder();
+ ctor public Dataset.Builder(android.widget.RemoteViews);
method public android.service.autofill.Dataset build();
method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
- method public android.service.autofill.Dataset.Builder setPresentation(android.widget.RemoteViews);
method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
}
@@ -36267,9 +36266,8 @@
method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset);
method public android.service.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
method public android.service.autofill.FillResponse build();
- method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender);
+ method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender, android.widget.RemoteViews);
method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
- method public android.service.autofill.FillResponse.Builder setPresentation(android.widget.RemoteViews);
}
public final class SaveCallback {
diff --git a/api/system-current.txt b/api/system-current.txt
index dcd2103..a0a9464 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -39361,10 +39361,9 @@
}
public static final class Dataset.Builder {
- ctor public Dataset.Builder();
+ ctor public Dataset.Builder(android.widget.RemoteViews);
method public android.service.autofill.Dataset build();
method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
- method public android.service.autofill.Dataset.Builder setPresentation(android.widget.RemoteViews);
method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
}
@@ -39384,9 +39383,8 @@
method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset);
method public android.service.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
method public android.service.autofill.FillResponse build();
- method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender);
+ method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender, android.widget.RemoteViews);
method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
- method public android.service.autofill.FillResponse.Builder setPresentation(android.widget.RemoteViews);
}
public final class SaveCallback {
diff --git a/api/test-current.txt b/api/test-current.txt
index 319d9f3..e4cb96f 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -36383,10 +36383,9 @@
}
public static final class Dataset.Builder {
- ctor public Dataset.Builder();
+ ctor public Dataset.Builder(android.widget.RemoteViews);
method public android.service.autofill.Dataset build();
method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
- method public android.service.autofill.Dataset.Builder setPresentation(android.widget.RemoteViews);
method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
}
@@ -36406,9 +36405,8 @@
method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset);
method public android.service.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
method public android.service.autofill.FillResponse build();
- method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender);
+ method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender, android.widget.RemoteViews);
method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
- method public android.service.autofill.FillResponse.Builder setPresentation(android.widget.RemoteViews);
}
public final class SaveCallback {
diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java
index 59b494c..d76d444 100644
--- a/core/java/android/service/autofill/Dataset.java
+++ b/core/java/android/service/autofill/Dataset.java
@@ -106,15 +106,13 @@
private boolean mDestroyed;
/**
- * Sets the presentation used to visualize this dataset.
+ * Creates a new builder.
*
- * @param presentation The presentation view.
- *
- * @return This builder.
+ * @param presentation The presentation used to visualize this dataset.
*/
- public @NonNull Builder setPresentation(@Nullable RemoteViews presentation) {
+ public Builder(@NonNull RemoteViews presentation) {
+ Preconditions.checkNotNull(presentation, "presentation must be non-null");
mPresentation = presentation;
- return this;
}
/**
@@ -201,9 +199,6 @@
throw new IllegalArgumentException(
"at least one value must be set");
}
- if (mPresentation == null) {
- throw new IllegalArgumentException("presentation must be set");
- }
return new Dataset(this);
}
@@ -225,9 +220,9 @@
@Override
public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeParcelable(mPresentation, flags);
parcel.writeTypedArrayList(mFieldIds, flags);
parcel.writeTypedArrayList(mFieldValues, flags);
- parcel.writeParcelable(mPresentation, flags);
parcel.writeParcelable(mAuthentication, flags);
}
@@ -237,7 +232,7 @@
// Always go through the builder to ensure the data ingested by
// the system obeys the contract of the builder to avoid attacks
// using specially crafted parcels.
- final Builder builder = new Builder();
+ final Builder builder = new Builder(parcel.readParcelable(null));
final ArrayList<AutoFillId> ids = parcel.readTypedArrayList(null);
final ArrayList<AutoFillValue> values = parcel.readTypedArrayList(null);
final int idCount = (ids != null) ? ids.size() : 0;
@@ -247,7 +242,6 @@
AutoFillValue value = (valueCount > i) ? values.get(i) : null;
builder.setValue(id, value);
}
- builder.setPresentation(parcel.readParcelable(null));
builder.setAuthentication(parcel.readParcelable(null));
return builder.build();
}
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index 86688d3..91c668e 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -45,8 +45,7 @@
*
* <pre class="prettyprint">
* new FillResponse.Builder()
- * .add(new Dataset.Builder()
- * .setPresentation(createPresentation())
+ * .add(new Dataset.Builder(createPresentation())
* .setTextFieldValue(id1, "homer")
* .setTextFieldValue(id2, "D'OH!")
* .build())
@@ -57,13 +56,11 @@
*
* <pre class="prettyprint">
* new FillResponse.Builder()
- * .add(new Dataset.Builder()
- * .setPresentation(createFirstPresentation())
+ * .add(new Dataset.Builder(createFirstPresentation())
* .setTextFieldValue(id1, "homer")
* .setTextFieldValue(id2, "D'OH!")
* .build())
- * .add(new Dataset.Builder()
- * .setPresentation(createSecondPresentation())
+ * .add(new Dataset.Builder(createSecondPresentation())
* .setTextFieldValue(id1, "elbarto")
* .setTextFieldValue(id2, "cowabonga")
* .build())
@@ -87,8 +84,7 @@
*
* <pre class="prettyprint">
* new FillResponse.Builder()
- * .add(new Dataset.Builder(")
- * .setPresentation(createPresentation())
+ * .add(new Dataset.Builder(createPresentation())
* .setTextFieldValue(id1, "Homer") // first name
* .setTextFieldValue(id2, "Simpson") // last name
* .setTextFieldValue(id3, "742 Evergreen Terrace") // street
@@ -116,13 +112,11 @@
*
* <pre class="prettyprint">
* new FillResponse.Builder()
- * .add(new Dataset.Builder()
- * .setPresentation(createFirstPresentation())
+ * .add(new Dataset.Builder(createFirstPresentation())
* .setTextFieldValue(id1, "Homer")
* .setTextFieldValue(id2, "Simpson")
* .build())
- * .add(new Dataset.Builder()
- * .setPresentation(createSecondPresentation())
+ * .add(new Dataset.Builder(createSecondPresentation())
* .setTextFieldValue(id1, "Bart")
* .setTextFieldValue(id2, "Simpson")
* .build())
@@ -134,13 +128,11 @@
*
* <pre class="prettyprint">
* new FillResponse.Builder()
- * .add(new Dataset.Builder()
- * .setPresentation(createThirdPresentation())
+ * .add(new Dataset.Builder(createThirdPresentation())
* .setTextFieldValue(id3, "742 Evergreen Terrace")
* .setTextFieldValue(id4, "Springfield")
* .build())
- * .add(new Dataset.Builder()
- * .setPresentation(createFourthPresentation())
+ * .add(new Dataset.Builder(createFourthPresentation())
* .setTextFieldValue(id3, "Springfield Power Plant")
* .setTextFieldValue(id4, "Springfield")
* .build())
@@ -217,23 +209,6 @@
private boolean mDestroyed;
/**
- * Sets the presentation used to visualize this response. You should
- * set this only if you need an authentication as this is the only
- * case the response needs to be presented to the user.
- *
- * @param presentation The presentation view.
- *
- * @return This builder.
- *
- * @see #setAuthentication(IntentSender)
- */
- public @NonNull
- FillResponse.Builder setPresentation(@Nullable RemoteViews presentation) {
- mPresentation = presentation;
- return this;
- }
-
- /**
* Requires a fill response authentication before auto-filling the activity with
* any data set in this response.
*
@@ -259,19 +234,29 @@
* available data sets some of which may need to be further authenticated, for
* example a credit card whose CVV needs to be entered.</p>
*
+ * <p>If you provide an authentication intent you must also provide a presentation
+ * which is used to visualize visualize the response for triggering the authentication
+ * flow.</p>
+ *
* <p></><strong>Note:</strong> Do not make the provided pending intent
* immutable by using {@link android.app.PendingIntent#FLAG_IMMUTABLE} as the
* platform needs to fill in the authentication arguments.</p>
*
* @param authentication Intent to an activity with your authentication flow.
+ * @param presentation The presentation to visualize the response.
* @return This builder.
*
* @see android.app.PendingIntent#getIntentSender()
- * @see #setPresentation(RemoteViews)
*/
- public @NonNull Builder setAuthentication(@Nullable IntentSender authentication) {
+ public @NonNull Builder setAuthentication(@Nullable IntentSender authentication,
+ @Nullable RemoteViews presentation) {
throwIfDestroyed();
+ if (authentication == null ^ presentation == null) {
+ throw new IllegalArgumentException("authentication and presentation"
+ + " must be both non-null or null");
+ }
mAuthentication = authentication;
+ mPresentation = presentation;
return this;
}
@@ -355,10 +340,6 @@
*/
public FillResponse build() {
throwIfDestroyed();
- if (mAuthentication == null ^ mPresentation == null) {
- throw new IllegalArgumentException("authentication and presentation"
- + " must be both non-null or null");
- }
if (mAuthentication == null && mDatasets == null && mSavableIds == null) {
throw new IllegalArgumentException("need to provide at least one"
+ " data set or savable ids or an authentication with a presentation");
@@ -403,8 +384,8 @@
parcel.writeTypedArrayList(mDatasets, flags);
parcel.writeTypedArraySet(mSavableIds, flags);
parcel.writeParcelable(mExtras, flags);
- parcel.writeParcelable(mPresentation, flags);
parcel.writeParcelable(mAuthentication, flags);
+ parcel.writeParcelable(mPresentation, flags);
}
public static final Parcelable.Creator<FillResponse> CREATOR =
@@ -426,8 +407,8 @@
builder.addSavableFields(fillIds.valueAt(i));
}
builder.setExtras(parcel.readParcelable(null));
- builder.setPresentation(parcel.readParcelable(null));
- builder.setAuthentication(parcel.readParcelable(null));
+ builder.setAuthentication(parcel.readParcelable(null),
+ parcel.readParcelable(null));
return builder.build();
}
diff --git a/core/java/android/view/autofill/AutoFillManager.java b/core/java/android/view/autofill/AutoFillManager.java
index d9003a6..2168444 100644
--- a/core/java/android/view/autofill/AutoFillManager.java
+++ b/core/java/android/view/autofill/AutoFillManager.java
@@ -179,8 +179,6 @@
* @param view view whose focus changed.
*/
public void valueChanged(View view) {
- ensureServiceClientAddedIfNeeded();
-
if (!mEnabled || !mHasSession) {
return;
}
@@ -199,8 +197,6 @@
* @param value new value of the child.
*/
public void virtualValueChanged(View parent, int childId, AutoFillValue value) {
- ensureServiceClientAddedIfNeeded();
-
if (!mEnabled || !mHasSession) {
return;
}
@@ -216,8 +212,6 @@
* call this method after the form is submitted and another page is rendered.
*/
public void reset() {
- ensureServiceClientAddedIfNeeded();
-
if (!mEnabled && !mHasSession) {
return;
}