diff options
| author | Felipe Leme <felipeal@google.com> | 2018-08-17 12:48:05 -0700 |
|---|---|---|
| committer | Felipe Leme <felipeal@google.com> | 2018-08-17 13:00:30 -0700 |
| commit | 725bc91c26c5727c9b85aa08cfec8d7adbc2b513 (patch) | |
| tree | 86f900d2c3ac53ef5f75f78b68870d1295a8e7ab /core/java/android | |
| parent | 7c6ceb23dbbd6c6e8be4d593ed22ff1b491648cf (diff) | |
Allow multiple categories per value on FieldClassification's UserData.
This is useful in cases such as using an email address as either email or
username.
Test: atest UserDataTest FieldsClassificationTest
Fixes: 111437231
Change-Id: I04c84cc635497ab89464c2e5795f87b9f5ae1995
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/service/autofill/UserData.java | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/core/java/android/service/autofill/UserData.java b/core/java/android/service/autofill/UserData.java index 55aecddf8365..fccb85b957fa 100644 --- a/core/java/android/service/autofill/UserData.java +++ b/core/java/android/service/autofill/UserData.java @@ -145,6 +145,9 @@ public final class UserData implements Parcelable { // Non-persistent array used to limit the number of unique ids. private final ArraySet<String> mUniqueCategoryIds; + // Non-persistent array used to ignore duplaicated value/category pairs. + private final ArraySet<String> mUniqueValueCategoryPairs; + /** * Creates a new builder for the user data used for <a href="#FieldClassification">field @@ -185,6 +188,7 @@ public final class UserData implements Parcelable { final int maxUserDataSize = getMaxUserDataSize(); mCategoryIds = new ArrayList<>(maxUserDataSize); mValues = new ArrayList<>(maxUserDataSize); + mUniqueValueCategoryPairs = new ArraySet<>(maxUserDataSize); mUniqueCategoryIds = new ArraySet<>(getMaxCategoryCount()); addMapping(value, categoryId); @@ -222,7 +226,8 @@ public final class UserData implements Parcelable { * @throws IllegalStateException if: * <ul> * <li>{@link #build()} already called</li> - * <li>the {@code value} has already been added</li> + * <li>the {@code value} has already been added (<b>Note: </b> this restriction was + * lifted on Android {@link android.os.Build.VERSION_CODES#Q} and later)</li> * <li>the number of unique {@code categoryId} values added so far is more than * {@link UserData#getMaxCategoryCount()}</li> * <li>the number of {@code values} added so far is is more than @@ -248,12 +253,8 @@ public final class UserData implements Parcelable { // New category - check size Preconditions.checkState(mUniqueCategoryIds.size() < getMaxCategoryCount(), "already added " + mUniqueCategoryIds.size() + " unique category ids"); - } - Preconditions.checkState(!mValues.contains(value), - // Don't include value on message because it could contain PII - "already has entry with same value"); Preconditions.checkState(mValues.size() < getMaxUserDataSize(), "already added " + mValues.size() + " elements"); addMapping(value, categoryId); @@ -262,9 +263,16 @@ public final class UserData implements Parcelable { } private void addMapping(@NonNull String value, @NonNull String categoryId) { + final String pair = value + ":" + categoryId; + if (mUniqueValueCategoryPairs.contains(pair)) { + // Don't include value on message because it could contain PII + Log.w(TAG, "Ignoring entry with same value / category"); + return; + } mCategoryIds.add(categoryId); mValues.add(value); mUniqueCategoryIds.add(categoryId); + mUniqueValueCategoryPairs.add(pair); } private String checkNotEmpty(@NonNull String name, @Nullable String value) { |
