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;
         }