| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.example.android.autofillframework.multidatasetservice; |
| |
| import android.service.autofill.SaveInfo; |
| import android.util.Log; |
| import android.view.View; |
| |
| import com.example.android.autofillframework.multidatasetservice.model.FilledAutofillField; |
| import com.example.android.autofillframework.multidatasetservice.model.FilledAutofillFieldCollection; |
| import com.google.common.collect.ImmutableMap; |
| |
| import java.util.Calendar; |
| |
| import static com.example.android.autofillframework.CommonUtil.TAG; |
| |
| public final class AutofillHints { |
| public static final int PARTITION_OTHER = 0; |
| public static final int PARTITION_ADDRESS = 1; |
| public static final int PARTITION_EMAIL = 2; |
| public static final int PARTITION_CREDIT_CARD = 3; |
| public static final int[] PARTITIONS = { |
| PARTITION_OTHER, PARTITION_ADDRESS, PARTITION_EMAIL, PARTITION_CREDIT_CARD |
| }; |
| /* TODO: finish building fake data for all hints. */ |
| private static final ImmutableMap<String, AutofillHintProperties> sValidHints = |
| new ImmutableMap.Builder<String, AutofillHintProperties>() |
| .put(View.AUTOFILL_HINT_EMAIL_ADDRESS, new AutofillHintProperties( |
| View.AUTOFILL_HINT_EMAIL_ADDRESS, SaveInfo.SAVE_DATA_TYPE_EMAIL_ADDRESS, |
| PARTITION_EMAIL, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(View.AUTOFILL_HINT_EMAIL_ADDRESS); |
| filledAutofillField.setTextValue("email" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(View.AUTOFILL_HINT_NAME, new AutofillHintProperties( |
| View.AUTOFILL_HINT_NAME, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(View.AUTOFILL_HINT_NAME); |
| filledAutofillField.setTextValue("name" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(View.AUTOFILL_HINT_USERNAME, new AutofillHintProperties( |
| View.AUTOFILL_HINT_USERNAME, SaveInfo.SAVE_DATA_TYPE_USERNAME, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(View.AUTOFILL_HINT_USERNAME); |
| filledAutofillField.setTextValue("login" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(View.AUTOFILL_HINT_PASSWORD, new AutofillHintProperties( |
| View.AUTOFILL_HINT_PASSWORD, SaveInfo.SAVE_DATA_TYPE_PASSWORD, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(View.AUTOFILL_HINT_PASSWORD); |
| filledAutofillField.setTextValue("login" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(View.AUTOFILL_HINT_PHONE, new AutofillHintProperties( |
| View.AUTOFILL_HINT_PHONE, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(View.AUTOFILL_HINT_PHONE); |
| filledAutofillField.setTextValue("" + seed + "2345678910"); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(View.AUTOFILL_HINT_POSTAL_ADDRESS, new AutofillHintProperties( |
| View.AUTOFILL_HINT_POSTAL_ADDRESS, SaveInfo.SAVE_DATA_TYPE_ADDRESS, |
| PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(View.AUTOFILL_HINT_POSTAL_ADDRESS); |
| filledAutofillField.setTextValue( |
| "" + seed + " Fake Ln, Fake, FA, FAA 10001"); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(View.AUTOFILL_HINT_POSTAL_CODE, new AutofillHintProperties( |
| View.AUTOFILL_HINT_POSTAL_CODE, SaveInfo.SAVE_DATA_TYPE_ADDRESS, |
| PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(View.AUTOFILL_HINT_POSTAL_CODE); |
| filledAutofillField.setTextValue("1000" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(View.AUTOFILL_HINT_CREDIT_CARD_NUMBER, new AutofillHintProperties( |
| View.AUTOFILL_HINT_CREDIT_CARD_NUMBER, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, |
| PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = new FilledAutofillField( |
| View.AUTOFILL_HINT_CREDIT_CARD_NUMBER); |
| filledAutofillField.setTextValue("" + seed + "234567"); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(View.AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE, new AutofillHintProperties( |
| View.AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, |
| PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = new FilledAutofillField( |
| View.AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE); |
| filledAutofillField.setTextValue("" + seed + seed + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE, |
| new AutofillHintProperties( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = new FilledAutofillField( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE); |
| Calendar calendar = Calendar.getInstance(); |
| calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + seed); |
| filledAutofillField.setDateValue(calendar.getTimeInMillis()); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_DATE)) |
| .put(View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH, |
| new AutofillHintProperties( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD, |
| (seed) -> { |
| CharSequence[] months = monthRange(); |
| int month = seed % months.length; |
| Calendar calendar = Calendar.getInstance(); |
| calendar.set(Calendar.MONTH, month); |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH); |
| filledAutofillField.setListValue(months, month); |
| filledAutofillField.setTextValue(Integer.toString(month)); |
| filledAutofillField.setDateValue(calendar.getTimeInMillis()); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST, |
| View.AUTOFILL_TYPE_DATE)) |
| .put(View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR, new AutofillHintProperties( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = new FilledAutofillField( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR); |
| Calendar calendar = Calendar.getInstance(); |
| int expYear = calendar.get(Calendar.YEAR) + seed; |
| calendar.set(Calendar.YEAR, expYear); |
| filledAutofillField.setDateValue(calendar.getTimeInMillis()); |
| filledAutofillField.setTextValue(Integer.toString(expYear)); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST, |
| View.AUTOFILL_TYPE_DATE)) |
| .put(View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY, new AutofillHintProperties( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD, |
| (seed) -> { |
| CharSequence[] days = dayRange(); |
| int day = seed % days.length; |
| FilledAutofillField filledAutofillField = new FilledAutofillField( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY); |
| Calendar calendar = Calendar.getInstance(); |
| calendar.set(Calendar.DATE, day); |
| filledAutofillField.setListValue(days, day); |
| filledAutofillField.setTextValue(Integer.toString(day)); |
| filledAutofillField.setDateValue(calendar.getTimeInMillis()); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST, |
| View.AUTOFILL_TYPE_DATE)) |
| .put(W3cHints.HONORIFIC_PREFIX, new AutofillHintProperties( |
| W3cHints.HONORIFIC_PREFIX, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = new FilledAutofillField( |
| W3cHints.HONORIFIC_PREFIX); |
| CharSequence[] examplePrefixes = {"Miss", "Ms.", "Mr.", "Mx.", |
| "Sr.", "Dr.", "Lady", "Lord"}; |
| filledAutofillField.setListValue(examplePrefixes, |
| seed % examplePrefixes.length); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.GIVEN_NAME, new AutofillHintProperties(W3cHints.GIVEN_NAME, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.GIVEN_NAME); |
| filledAutofillField.setTextValue("name" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.ADDITIONAL_NAME, new AutofillHintProperties( |
| W3cHints.ADDITIONAL_NAME, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.ADDITIONAL_NAME); |
| filledAutofillField.setTextValue("addtlname" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.FAMILY_NAME, new AutofillHintProperties( |
| W3cHints.FAMILY_NAME, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.FAMILY_NAME); |
| filledAutofillField.setTextValue("famname" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.HONORIFIC_SUFFIX, new AutofillHintProperties( |
| W3cHints.HONORIFIC_SUFFIX, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.HONORIFIC_SUFFIX); |
| CharSequence[] exampleSuffixes = {"san", "kun", "chan", "sama"}; |
| filledAutofillField.setListValue(exampleSuffixes, |
| seed % exampleSuffixes.length); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.NEW_PASSWORD, new AutofillHintProperties( |
| W3cHints.NEW_PASSWORD, SaveInfo.SAVE_DATA_TYPE_PASSWORD, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.NEW_PASSWORD); |
| filledAutofillField.setTextValue("login" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.CURRENT_PASSWORD, new AutofillHintProperties( |
| View.AUTOFILL_HINT_PASSWORD, SaveInfo.SAVE_DATA_TYPE_PASSWORD, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(View.AUTOFILL_HINT_PASSWORD); |
| filledAutofillField.setTextValue("login" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.ORGANIZATION_TITLE, new AutofillHintProperties( |
| W3cHints.ORGANIZATION_TITLE, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.ORGANIZATION_TITLE); |
| filledAutofillField.setTextValue("org" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.ORGANIZATION, new AutofillHintProperties(W3cHints.ORGANIZATION, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.ORGANIZATION); |
| filledAutofillField.setTextValue("org" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.STREET_ADDRESS, new AutofillHintProperties( |
| W3cHints.STREET_ADDRESS, SaveInfo.SAVE_DATA_TYPE_ADDRESS, |
| PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.STREET_ADDRESS); |
| filledAutofillField.setTextValue( |
| "" + seed + " Fake Ln, Fake, FA, FAA 10001"); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.ADDRESS_LINE1, new AutofillHintProperties(W3cHints.ADDRESS_LINE1, |
| SaveInfo.SAVE_DATA_TYPE_ADDRESS, |
| PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.ADDRESS_LINE1); |
| filledAutofillField.setTextValue("" + seed + " Fake Ln"); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.ADDRESS_LINE2, new AutofillHintProperties(W3cHints.ADDRESS_LINE2, |
| SaveInfo.SAVE_DATA_TYPE_ADDRESS, PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.ADDRESS_LINE2); |
| filledAutofillField.setTextValue("Apt. " + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.ADDRESS_LINE3, new AutofillHintProperties(W3cHints.ADDRESS_LINE3, |
| SaveInfo.SAVE_DATA_TYPE_ADDRESS, PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.ADDRESS_LINE3); |
| filledAutofillField.setTextValue("FA" + seed + ", FA, FAA"); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.ADDRESS_LEVEL4, new AutofillHintProperties( |
| W3cHints.ADDRESS_LEVEL4, SaveInfo.SAVE_DATA_TYPE_ADDRESS, |
| PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.ADDRESS_LEVEL4); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.ADDRESS_LEVEL3, new AutofillHintProperties( |
| W3cHints.ADDRESS_LEVEL3, SaveInfo.SAVE_DATA_TYPE_ADDRESS, |
| PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.ADDRESS_LEVEL3); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.ADDRESS_LEVEL2, new AutofillHintProperties( |
| W3cHints.ADDRESS_LEVEL2, SaveInfo.SAVE_DATA_TYPE_ADDRESS, |
| PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.ADDRESS_LEVEL2); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.ADDRESS_LEVEL1, new AutofillHintProperties( |
| W3cHints.ADDRESS_LEVEL1, SaveInfo.SAVE_DATA_TYPE_ADDRESS, |
| PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.ADDRESS_LEVEL1); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.COUNTRY, new AutofillHintProperties(W3cHints.COUNTRY, |
| SaveInfo.SAVE_DATA_TYPE_ADDRESS, PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.COUNTRY); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.COUNTRY_NAME, new AutofillHintProperties(W3cHints.COUNTRY_NAME, |
| SaveInfo.SAVE_DATA_TYPE_ADDRESS, PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.COUNTRY_NAME); |
| CharSequence[] exampleCountries = {"USA", "Mexico", "Canada"}; |
| filledAutofillField.setListValue(exampleCountries, |
| seed % exampleCountries.length); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.POSTAL_CODE, new AutofillHintProperties( |
| View.AUTOFILL_HINT_POSTAL_CODE, SaveInfo.SAVE_DATA_TYPE_ADDRESS, |
| PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(View.AUTOFILL_HINT_POSTAL_CODE); |
| filledAutofillField.setTextValue("" + seed + seed + seed + seed + |
| seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.CC_NAME, new AutofillHintProperties(W3cHints.CC_NAME, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, |
| PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.CC_NAME); |
| filledAutofillField.setTextValue("firstname" + seed + "lastname" + |
| seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.CC_GIVEN_NAME, new AutofillHintProperties(W3cHints.CC_GIVEN_NAME, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.CC_GIVEN_NAME); |
| filledAutofillField.setTextValue("givenname" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.CC_ADDITIONAL_NAME, new AutofillHintProperties( |
| W3cHints.CC_ADDITIONAL_NAME, SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, |
| PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.CC_ADDITIONAL_NAME); |
| filledAutofillField.setTextValue("addtlname" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.CC_FAMILY_NAME, new AutofillHintProperties( |
| W3cHints.CC_FAMILY_NAME, SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, |
| PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.CC_FAMILY_NAME); |
| filledAutofillField.setTextValue("familyname" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.CC_NUMBER, new AutofillHintProperties( |
| View.AUTOFILL_HINT_CREDIT_CARD_NUMBER, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = new FilledAutofillField( |
| View.AUTOFILL_HINT_CREDIT_CARD_NUMBER); |
| filledAutofillField.setTextValue("" + seed + "234567"); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.CC_EXPIRATION, new AutofillHintProperties( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = new FilledAutofillField( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE); |
| Calendar calendar = Calendar.getInstance(); |
| calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + seed); |
| filledAutofillField.setDateValue(calendar.getTimeInMillis()); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_DATE)) |
| .put(W3cHints.CC_EXPIRATION_MONTH, new AutofillHintProperties( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = new FilledAutofillField( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH); |
| CharSequence[] months = monthRange(); |
| filledAutofillField.setListValue(months, |
| seed % months.length); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.CC_EXPIRATION_YEAR, new AutofillHintProperties( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = new FilledAutofillField( |
| View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR); |
| Calendar calendar = Calendar.getInstance(); |
| int expYear = calendar.get(Calendar.YEAR) + seed; |
| calendar.set(Calendar.YEAR, expYear); |
| filledAutofillField.setDateValue(calendar.getTimeInMillis()); |
| filledAutofillField.setTextValue("" + expYear); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.CC_CSC, new AutofillHintProperties( |
| View.AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = new FilledAutofillField( |
| View.AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE); |
| filledAutofillField.setTextValue("" + seed + seed + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.CC_TYPE, new AutofillHintProperties(W3cHints.CC_TYPE, |
| SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD, PARTITION_CREDIT_CARD, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.CC_TYPE); |
| filledAutofillField.setTextValue("type" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.TRANSACTION_CURRENCY, new AutofillHintProperties( |
| W3cHints.TRANSACTION_CURRENCY, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.TRANSACTION_CURRENCY); |
| CharSequence[] exampleCurrencies = {"USD", "CAD", "KYD", "CRC"}; |
| filledAutofillField.setListValue(exampleCurrencies, |
| seed % exampleCurrencies.length); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.TRANSACTION_AMOUNT, new AutofillHintProperties( |
| W3cHints.TRANSACTION_AMOUNT, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.TRANSACTION_AMOUNT); |
| filledAutofillField.setTextValue("" + seed * 100); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.LANGUAGE, new AutofillHintProperties(W3cHints.LANGUAGE, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.LANGUAGE); |
| CharSequence[] exampleLanguages = {"Bulgarian", "Croatian", "Czech", |
| "Danish", "Dutch", "English", "Estonian"}; |
| filledAutofillField.setListValue(exampleLanguages, |
| seed % exampleLanguages.length); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.BDAY, new AutofillHintProperties(W3cHints.BDAY, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.BDAY); |
| Calendar calendar = Calendar.getInstance(); |
| calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - seed * 10); |
| calendar.set(Calendar.MONTH, seed % 12); |
| calendar.set(Calendar.DATE, seed % 27); |
| filledAutofillField.setDateValue(calendar.getTimeInMillis()); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_DATE)) |
| .put(W3cHints.BDAY_DAY, new AutofillHintProperties(W3cHints.BDAY_DAY, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.BDAY_DAY); |
| filledAutofillField.setTextValue("" + seed % 27); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.BDAY_MONTH, new AutofillHintProperties(W3cHints.BDAY_MONTH, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.BDAY_MONTH); |
| filledAutofillField.setTextValue("" + seed % 12); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.BDAY_YEAR, new AutofillHintProperties(W3cHints.BDAY_YEAR, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.BDAY_YEAR); |
| int year = Calendar.getInstance().get(Calendar.YEAR) - seed * 10; |
| filledAutofillField.setTextValue("" + year); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.SEX, new AutofillHintProperties(W3cHints.SEX, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.SEX); |
| filledAutofillField.setTextValue("Other"); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.URL, new AutofillHintProperties(W3cHints.URL, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.URL); |
| filledAutofillField.setTextValue("http://google.com"); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.PHOTO, new AutofillHintProperties(W3cHints.PHOTO, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.PHOTO); |
| filledAutofillField.setTextValue("photo" + seed + ".jpg"); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.PREFIX_SECTION, new AutofillHintProperties( |
| W3cHints.PREFIX_SECTION, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.PREFIX_SECTION); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.SHIPPING, new AutofillHintProperties(W3cHints.SHIPPING, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.SHIPPING); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.BILLING, new AutofillHintProperties(W3cHints.BILLING, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_ADDRESS, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.BILLING); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.PREFIX_HOME, new AutofillHintProperties(W3cHints.PREFIX_HOME, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.PREFIX_HOME); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.PREFIX_WORK, new AutofillHintProperties(W3cHints.PREFIX_WORK, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.PREFIX_WORK); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.PREFIX_FAX, new AutofillHintProperties(W3cHints.PREFIX_FAX, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.PREFIX_FAX); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.PREFIX_PAGER, new AutofillHintProperties(W3cHints.PREFIX_PAGER, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.PREFIX_PAGER); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.TEL, new AutofillHintProperties(W3cHints.TEL, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.TEL); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.TEL_COUNTRY_CODE, new AutofillHintProperties( |
| W3cHints.TEL_COUNTRY_CODE, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.TEL_COUNTRY_CODE); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.TEL_NATIONAL, new AutofillHintProperties(W3cHints.TEL_NATIONAL, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.TEL_NATIONAL); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.TEL_AREA_CODE, new AutofillHintProperties( |
| W3cHints.TEL_AREA_CODE, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.TEL_AREA_CODE); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.TEL_LOCAL, new AutofillHintProperties( |
| W3cHints.TEL_LOCAL, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.TEL_LOCAL); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.TEL_LOCAL_PREFIX, new AutofillHintProperties( |
| W3cHints.TEL_LOCAL_PREFIX, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.TEL_LOCAL_PREFIX); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.TEL_LOCAL_SUFFIX, new AutofillHintProperties( |
| W3cHints.TEL_LOCAL_SUFFIX, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.TEL_LOCAL_SUFFIX); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.TEL_EXTENSION, new AutofillHintProperties(W3cHints.TEL_EXTENSION, |
| SaveInfo.SAVE_DATA_TYPE_GENERIC, PARTITION_OTHER, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.TEL_EXTENSION); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .put(W3cHints.EMAIL, new AutofillHintProperties( |
| View.AUTOFILL_HINT_EMAIL_ADDRESS, SaveInfo.SAVE_DATA_TYPE_GENERIC, |
| PARTITION_EMAIL, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(View.AUTOFILL_HINT_EMAIL_ADDRESS); |
| filledAutofillField.setTextValue("email" + seed); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT)) |
| .put(W3cHints.IMPP, new AutofillHintProperties(W3cHints.IMPP, |
| SaveInfo.SAVE_DATA_TYPE_EMAIL_ADDRESS, PARTITION_EMAIL, |
| (seed) -> { |
| FilledAutofillField filledAutofillField = |
| new FilledAutofillField(W3cHints.IMPP); |
| return filledAutofillField; |
| }, View.AUTOFILL_TYPE_TEXT, View.AUTOFILL_TYPE_LIST)) |
| .build(); |
| |
| private AutofillHints() { |
| } |
| |
| public static boolean isValidTypeForHints(String[] hints, int type) { |
| if (hints != null) { |
| for (String hint : hints) { |
| if (hint != null && sValidHints.containsKey(hint)) { |
| boolean valid = sValidHints.get(hint).isValidType(type); |
| if (valid) { |
| return true; |
| } |
| } |
| } |
| } |
| return false; |
| } |
| |
| public static boolean isValidHint(String hint) { |
| return sValidHints.containsKey(hint); |
| } |
| |
| public static int getSaveTypeForHints(String[] hints) { |
| int saveType = 0; |
| if (hints != null) { |
| for (String hint : hints) { |
| if (hint != null && sValidHints.containsKey(hint)) { |
| saveType |= sValidHints.get(hint).getSaveType(); |
| } |
| } |
| } |
| return saveType; |
| } |
| |
| public static FilledAutofillField getFakeField(String hint, int seed) { |
| return sValidHints.get(hint).generateFakeField(seed); |
| } |
| |
| public static FilledAutofillFieldCollection getFakeFieldCollection(int partition, int seed) { |
| FilledAutofillFieldCollection filledAutofillFieldCollection = |
| new FilledAutofillFieldCollection(); |
| for (String hint : sValidHints.keySet()) { |
| if (hint != null && sValidHints.get(hint).getPartition() == partition) { |
| FilledAutofillField fakeField = getFakeField(hint, seed); |
| filledAutofillFieldCollection.add(fakeField); |
| } |
| } |
| return filledAutofillFieldCollection; |
| } |
| |
| private static String getStoredHintName(String hint) { |
| return sValidHints.get(hint).getAutofillHint(); |
| } |
| |
| public static void convertToStoredHintNames(String[] hints) { |
| for (int i = 0; i < hints.length; i++) { |
| hints[i] = getStoredHintName(hints[i]); |
| } |
| } |
| |
| private static CharSequence[] dayRange() { |
| CharSequence[] days = new CharSequence[27]; |
| for (int i = 0; i < days.length; i++) { |
| days[i] = Integer.toString(i); |
| } |
| return days; |
| } |
| |
| private static CharSequence[] monthRange() { |
| CharSequence[] months = new CharSequence[12]; |
| for (int i = 0; i < months.length; i++) { |
| months[i] = Integer.toString(i); |
| } |
| return months; |
| } |
| |
| public static String[] filterForSupportedHints(String[] hints) { |
| String[] filteredHints = new String[hints.length]; |
| int i = 0; |
| for (String hint : hints) { |
| if (AutofillHints.isValidHint(hint)) { |
| filteredHints[i++] = hint; |
| } else { |
| Log.d(TAG, "Invalid autofill hint: " + hint); |
| } |
| } |
| if (i == 0) { |
| return null; |
| } |
| String[] finalFilteredHints = new String[i]; |
| System.arraycopy(filteredHints, 0, finalFilteredHints, 0, i); |
| return finalFilteredHints; |
| } |
| } |