From: Felipe Leme Date: Tue, 18 Jul 2017 15:58:50 +0000 (-0700) Subject: Don't show a custom description if any transformation fail. X-Git-Tag: android-x86-9.0-r1~1037^2~1 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=22101ca5a91e36f56b4d7cab2bb8517f679c6c86;p=android-x86%2Fframeworks-base.git Don't show a custom description if any transformation fail. That could result in an inconsistent, confusing UI. For example, if the successfully description for a credit card was "Exp. date: 04/20", one with a failure could be "Exp. date: /20" - it's better to not show a custom description in these cases. Test: CtsAutoFillServiceTestCases pass Test: CustomDescriptionTest.failFirstFailAll Test: CustomDescriptionTest.failSecondFailAll Bug: 62534917 Change-Id: I6554e3470ead2f84d7ef8715192d863c01ab1190 --- diff --git a/api/test-current.txt b/api/test-current.txt index da4f678646ed..d95f5fc1756f 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -37119,7 +37119,7 @@ package android.service.autofill { } public final class CharSequenceTransformation implements android.os.Parcelable android.service.autofill.Transformation { - method public void apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int); + method public void apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int) throws java.lang.Exception; method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; @@ -37217,7 +37217,7 @@ package android.service.autofill { } public final class ImageTransformation implements android.os.Parcelable android.service.autofill.Transformation { - method public void apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int); + method public void apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int) throws java.lang.Exception; method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; diff --git a/core/java/android/service/autofill/CharSequenceTransformation.java b/core/java/android/service/autofill/CharSequenceTransformation.java index 77555feb4d07..dfb30b9a38c4 100644 --- a/core/java/android/service/autofill/CharSequenceTransformation.java +++ b/core/java/android/service/autofill/CharSequenceTransformation.java @@ -70,13 +70,13 @@ public final class CharSequenceTransformation extends InternalTransformation imp @Override @TestApi public void apply(@NonNull ValueFinder finder, @NonNull RemoteViews parentTemplate, - int childViewId) { + int childViewId) throws Exception { final StringBuilder converted = new StringBuilder(); final int size = mFields.size(); if (sDebug) Log.d(TAG, size + " multiple fields on id " + childViewId); for (int i = 0; i < size; i++) { final AutofillId id = mFields.keyAt(i); - final Pair regex = mFields.valueAt(i); + final Pair field = mFields.valueAt(i); final String value = finder.findByAutofillId(id); if (value == null) { Log.w(TAG, "No value for id " + id); @@ -84,12 +84,13 @@ public final class CharSequenceTransformation extends InternalTransformation imp } try { // replaceAll throws an exception if the subst is invalid - final String convertedValue = regex.first.matcher(value).replaceAll(regex.second); + final String convertedValue = field.first.matcher(value).replaceAll(field.second); converted.append(convertedValue); } catch (Exception e) { - // Do not log full exception to avoid leaks - Log.w(TAG, "Cannot apply " + regex.first.pattern() + "->" + regex.second + " to " + // Do not log full exception to avoid PII leaking + Log.w(TAG, "Cannot apply " + field.first.pattern() + "->" + field.second + " to " + "field with autofill id" + id + ": " + e.getClass()); + throw e; } } parentTemplate.setCharSequence(childViewId, "setText", converted); diff --git a/core/java/android/service/autofill/CustomDescription.java b/core/java/android/service/autofill/CustomDescription.java index e97c364dd025..0edb154cbf9f 100644 --- a/core/java/android/service/autofill/CustomDescription.java +++ b/core/java/android/service/autofill/CustomDescription.java @@ -103,8 +103,10 @@ public final class CustomDescription implements Parcelable { try { transformation.apply(finder, mPresentation, id); } catch (Exception e) { - Log.e(TAG, "Could not apply transformation " + transformation + ". " + // Do not log full exception to avoid PII leaking + Log.e(TAG, "Could not apply transformation " + transformation + ": " + e.getClass()); + return null; } } } diff --git a/core/java/android/service/autofill/ImageTransformation.java b/core/java/android/service/autofill/ImageTransformation.java index 9eb52f6fbfd2..36271897b97c 100644 --- a/core/java/android/service/autofill/ImageTransformation.java +++ b/core/java/android/service/autofill/ImageTransformation.java @@ -70,7 +70,7 @@ public final class ImageTransformation extends InternalTransformation implements @TestApi @Override public void apply(@NonNull ValueFinder finder, @NonNull RemoteViews parentTemplate, - int childViewId) { + int childViewId) throws Exception { final String value = finder.findByAutofillId(mId); if (value == null) { Log.w(TAG, "No view for id " + mId); @@ -83,14 +83,22 @@ public final class ImageTransformation extends InternalTransformation implements } for (int i = 0; i < size; i++) { - Pair regex = mOptions.get(i); - if (regex.first.matcher(value).matches()) { - Log.d(TAG, "Found match at " + i + ": " + regex); - parentTemplate.setImageViewResource(childViewId, regex.second); - return; + final Pair option = mOptions.get(i); + try { + if (option.first.matcher(value).matches()) { + Log.d(TAG, "Found match at " + i + ": " + option); + parentTemplate.setImageViewResource(childViewId, option.second); + return; + } + } catch (Exception e) { + // Do not log full exception to avoid PII leaking + Log.w(TAG, "Error matching regex #" + i + "(" + option.first.pattern() + ") on id " + + option.second + ": " + e.getClass()); + throw e; + } } - Log.w(TAG, "No match for " + value); + if (sDebug) Log.d(TAG, "No match for " + value); } /** diff --git a/core/java/android/service/autofill/InternalTransformation.java b/core/java/android/service/autofill/InternalTransformation.java index e8ac14a40359..974397b3f048 100644 --- a/core/java/android/service/autofill/InternalTransformation.java +++ b/core/java/android/service/autofill/InternalTransformation.java @@ -38,5 +38,5 @@ abstract class InternalTransformation implements Transformation, Parcelable { * @hide */ abstract void apply(@NonNull ValueFinder finder, @NonNull RemoteViews template, - int childViewId); + int childViewId) throws Exception; }