Dataset.java revision 640f30a7763b0a4b80c767acb84c740aac04768b
16d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme/*
26d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * Copyright (C) 2016 The Android Open Source Project
36d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme *
46d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * Licensed under the Apache License, Version 2.0 (the "License");
56d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * you may not use this file except in compliance with the License.
66d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * You may obtain a copy of the License at
76d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme *
86d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme *      http://www.apache.org/licenses/LICENSE-2.0
96d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme *
106d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * Unless required by applicable law or agreed to in writing, software
116d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * distributed under the License is distributed on an "AS IS" BASIS,
126d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * See the License for the specific language governing permissions and
146d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * limitations under the License.
156d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme */
166d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
17782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganovpackage android.service.autofill;
186d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
19d633f072552815301a559520a1f93eb7e79ba319Felipe Lemeimport static android.view.autofill.Helper.DEBUG;
20d633f072552815301a559520a1f93eb7e79ba319Felipe Leme
210f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganovimport android.annotation.NonNull;
22436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Lemeimport android.annotation.Nullable;
230f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganovimport android.content.IntentSender;
246d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Lemeimport android.os.Parcel;
256d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Lemeimport android.os.Parcelable;
26782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganovimport android.view.autofill.AutoFillId;
27782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganovimport android.view.autofill.AutoFillValue;
28640f30a7763b0a4b80c767acb84c740aac04768bFelipe Lemeimport android.view.autofill.AutofillId;
29640f30a7763b0a4b80c767acb84c740aac04768bFelipe Lemeimport android.view.autofill.AutofillValue;
3000c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganovimport android.widget.RemoteViews;
316d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Lemeimport com.android.internal.util.Preconditions;
326d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
336d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Lemeimport java.util.ArrayList;
346d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
356d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme/**
36640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme * A set of data that can be used to autofill an {@link android.app.Activity}.
376d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme *
386d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * <p>It contains:
396d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme *
406d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * <ol>
4100c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov *   <li>A list of values for input fields.
4200c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov *   <li>A presentation view to visualize.
4300c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov *   <li>An optional intent to authenticate.
446d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme * </ol>
456d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme *
46782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov * @see android.service.autofill.FillResponse for examples.
476d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme */
486d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Lemepublic final class Dataset implements Parcelable {
49782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov
50640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme    private final ArrayList<AutofillId> mFieldIds;
51640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme    private final ArrayList<AutofillValue> mFieldValues;
5200c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov    private final RemoteViews mPresentation;
530f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov    private final IntentSender mAuthentication;
546d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
550f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov    private Dataset(Builder builder) {
560f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        mFieldIds = builder.mFieldIds;
570f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        mFieldValues = builder.mFieldValues;
5800c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov        mPresentation = builder.mPresentation;
590f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        mAuthentication = builder.mAuthentication;
606d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    }
616d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
626d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    /** @hide */
63640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme    public @Nullable ArrayList<AutofillId> getFieldIds() {
640f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        return mFieldIds;
65436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme    }
66436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme
67436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme    /** @hide */
68640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme    public @Nullable ArrayList<AutofillValue> getFieldValues() {
690f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        return mFieldValues;
70436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme    }
71436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme
72436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme    /** @hide */
7300c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov    public @Nullable RemoteViews getPresentation() {
7400c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov        return mPresentation;
7500c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov    }
7600c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov
7700c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov    /** @hide */
780f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov    public @Nullable IntentSender getAuthentication() {
790f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        return mAuthentication;
80436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme    }
81436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme
82436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme    /** @hide */
830f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov    public boolean isEmpty() {
840f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        return mFieldIds == null || mFieldIds.isEmpty();
85436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme    }
86436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme
876d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    @Override
886d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    public String toString() {
896d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        if (!DEBUG) return super.toString();
906d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
9100c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov        return new StringBuilder("Dataset [")
920f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                .append(", fieldIds=").append(mFieldIds)
930f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                .append(", fieldValues=").append(mFieldValues)
9400c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov                .append(", hasPresentation=").append(mPresentation != null)
9500c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov                .append(", hasAuthentication=").append(mAuthentication != null)
9600c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov                .append(']').toString();
976d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    }
986d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
996d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    /**
1000f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov     * A builder for {@link Dataset} objects. You must to provide at least
1010f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov     * one value for a field or set an authentication intent.
1026d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme     */
1036d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    public static final class Builder {
104640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme        private ArrayList<AutofillId> mFieldIds;
105640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme        private ArrayList<AutofillValue> mFieldValues;
10600c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov        private RemoteViews mPresentation;
1070f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        private IntentSender mAuthentication;
1080f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        private boolean mDestroyed;
1090f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov
1106d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        /**
111eb49515abd2353f32e0eb7b3964847c6399986c9Svet Ganov         * Creates a new builder.
11200c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov         *
113eb49515abd2353f32e0eb7b3964847c6399986c9Svet Ganov         * @param presentation The presentation used to visualize this dataset.
1146d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme         */
115eb49515abd2353f32e0eb7b3964847c6399986c9Svet Ganov        public Builder(@NonNull RemoteViews presentation) {
116eb49515abd2353f32e0eb7b3964847c6399986c9Svet Ganov            Preconditions.checkNotNull(presentation, "presentation must be non-null");
11700c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov            mPresentation = presentation;
1186d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        }
1196d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
1206d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        /**
121640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme         * Requires a dataset authentication before autofilling the activity with this dataset.
122436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme         *
1230f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov         * <p>This method is called when you need to provide an authentication
124782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * UI for the data set. For example, when a data set contains credit card information
1250f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov         * (such as number, expiration date, and verification code), you can display UI
12600c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov         * asking for the verification code before filing in the data. Even if the
127782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * data set is completely populated the system will launch the specified authentication
128782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * intent and will need your approval to fill it in. Since the data set is "locked"
129782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * until the user authenticates it, typically this data set name is masked
130782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * (for example, "VISA....1234"). Typically you would want to store the data set
131782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * labels non-encrypted and the actual sensitive data encrypted and not in memory.
1320f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov         * This allows showing the labels in the UI while involving the user if one of
1330f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov         * the items with these labels is chosen. Note that if you use sensitive data as
134782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * a label, for example an email address, then it should also be encrypted.</p>
135436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme         *
136640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme         * <p>When a user triggers autofill, the system launches the provided intent
137782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * whose extras will have the {@link
138640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme         * android.view.autofill.AutofillManager#EXTRA_ASSIST_STRUCTURE screen content}. Once
139782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * you complete your authentication flow you should set the activity result to {@link
140782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * android.app.Activity#RESULT_OK} and provide the fully populated {@link Dataset
141782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * dataset} by setting it to the {@link
142640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme         * android.view.autofill.AutofillManager#EXTRA_AUTHENTICATION_RESULT} extra. For example,
14300c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov         * if you provided credit card information without the CVV for the data set in the
144782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * {@link FillResponse response} then the returned data set should contain the
145782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * CVV entry.</p>
146436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme         *
147782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * <p></><strong>Note:</strong> Do not make the provided pending intent
1480f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov         * immutable by using {@link android.app.PendingIntent#FLAG_IMMUTABLE} as the
1490f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov         * platform needs to fill in the authentication arguments.</p>
150436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme         *
151782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * @param authentication Intent to an activity with your authentication flow.
15200c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov         * @return This builder.
153436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme         *
154782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * @see android.app.PendingIntent
155436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme         */
1560f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        public @NonNull Builder setAuthentication(@Nullable IntentSender authentication) {
1570f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            throwIfDestroyed();
1580f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            mAuthentication = authentication;
159436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme            return this;
160436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme        }
161436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme
162436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme        /**
163640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme         * @hide
164640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme         * @deprecated TODO(b/35956626): remove once clients use other setValue()
165640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme         */
166640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme       @Deprecated
167640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme        public @NonNull Builder setValue(@NonNull AutoFillId id, @NonNull AutoFillValue value) {
168640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme            return setValue(id.getDaRealId(), value.getDaRealValue());
169640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme        }
170640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme        /**
1716d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme         * Sets the value of a field.
1726d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme         *
173782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov         * @param id id returned by {@link
174640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme         *         android.app.assist.AssistStructure.ViewNode#getAutofillId()}.
1756d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme         * @param value value to be auto filled.
17600c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov         * @return This builder.
1776d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme         */
178640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme        public @NonNull Builder setValue(@NonNull AutofillId id, @NonNull AutofillValue value) {
1790f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            throwIfDestroyed();
1800f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            Preconditions.checkNotNull(id, "id cannot be null");
1810f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            Preconditions.checkNotNull(value, "value cannot be null");
1820f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            if (mFieldIds != null) {
1830f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                final int existingIdx = mFieldIds.indexOf(id);
1840f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                if (existingIdx >= 0) {
1850f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                    mFieldValues.set(existingIdx, value);
1860f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                    return this;
1870f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                }
1880f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            } else {
1890f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                mFieldIds = new ArrayList<>();
1900f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                mFieldValues = new ArrayList<>();
1910f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            }
1920f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            mFieldIds.add(id);
1930f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            mFieldValues.add(value);
1946d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme            return this;
1956d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        }
1966d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
1976d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        /**
1980f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov         * Creates a new {@link Dataset} instance. You should not interact
19900c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov         * with this builder once this method is called. It is required
20000c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov         * that you specified at least one field. Also it is mandatory to
20100c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov         * provide a presentation view to visualize the data set in the UI.
20200c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov         *
20300c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov         * @return The built dataset.
2046d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme         */
2050f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        public @NonNull Dataset build() {
2060f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            throwIfDestroyed();
2070f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            mDestroyed = true;
20800c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov            if (mFieldIds == null) {
2090f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                throw new IllegalArgumentException(
21000c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov                        "at least one value must be set");
21100c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov            }
2120f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            return new Dataset(this);
2136d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        }
2146d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
2150f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        private void throwIfDestroyed() {
2160f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            if (mDestroyed) {
2170f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                throw new IllegalStateException("Already called #build()");
2180f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            }
2196d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        }
2206d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    }
2216d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
2226d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    /////////////////////////////////////
2236d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    //  Parcelable "contract" methods. //
2246d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    /////////////////////////////////////
2256d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
2266d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    @Override
2276d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    public int describeContents() {
2286d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        return 0;
2296d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    }
2306d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
2316d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    @Override
2326d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    public void writeToParcel(Parcel parcel, int flags) {
233eb49515abd2353f32e0eb7b3964847c6399986c9Svet Ganov        parcel.writeParcelable(mPresentation, flags);
23400c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov        parcel.writeTypedArrayList(mFieldIds, flags);
23500c771dc7d8242362f1491ae4ce3efd641235b36Svet Ganov        parcel.writeTypedArrayList(mFieldValues, flags);
2360f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        parcel.writeParcelable(mAuthentication, flags);
2376d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    }
2386d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
239782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov    public static final Creator<Dataset> CREATOR = new Creator<Dataset>() {
2406d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        @Override
2410f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        public Dataset createFromParcel(Parcel parcel) {
2420f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            // Always go through the builder to ensure the data ingested by
2430f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            // the system obeys the contract of the builder to avoid attacks
2440f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            // using specially crafted parcels.
245eb49515abd2353f32e0eb7b3964847c6399986c9Svet Ganov            final Builder builder = new Builder(parcel.readParcelable(null));
246640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme            final ArrayList<AutofillId> ids = parcel.readTypedArrayList(null);
247640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme            final ArrayList<AutofillValue> values = parcel.readTypedArrayList(null);
2480f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            final int idCount = (ids != null) ? ids.size() : 0;
2490f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            final int valueCount = (values != null) ? values.size() : 0;
2500f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            for (int i = 0; i < idCount; i++) {
251640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme                final AutofillId id = ids.get(i);
252640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme                final AutofillValue value = (valueCount > i) ? values.get(i) : null;
2530f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov                builder.setValue(id, value);
2540f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            }
2550f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            builder.setAuthentication(parcel.readParcelable(null));
2560f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov            return builder.build();
2576d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        }
2586d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
2596d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        @Override
2606d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        public Dataset[] newArray(int size) {
2616d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme            return new Dataset[size];
2626d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        }
2636d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    };
2646d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme}
265