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