summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorFelipe Leme <felipeal@google.com>2018-08-17 12:48:05 -0700
committerFelipe Leme <felipeal@google.com>2018-08-17 13:00:30 -0700
commit725bc91c26c5727c9b85aa08cfec8d7adbc2b513 (patch)
tree86f900d2c3ac53ef5f75f78b68870d1295a8e7ab /core/java/android
parent7c6ceb23dbbd6c6e8be4d593ed22ff1b491648cf (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.java18
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) {