summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2017-07-12 22:29:10 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-07-12 22:29:10 +0000
commitd16aeddbd197701b387dcedf2719b7cd09455bfc (patch)
tree75d9c7d92354384294b9f4e56ed31b96c01b5e18
parent72c323964cd60cd8a7013d3ce9c1cc1bed0b603f (diff)
parent3858aa67365ad574ee474edc68e2e82d4d8c6081 (diff)
Merge "Make CustomDescription safe against crashes"
-rw-r--r--api/current.txt4
-rw-r--r--api/system-current.txt4
-rw-r--r--api/test-current.txt4
-rw-r--r--core/java/android/service/autofill/CharSequenceTransformation.java3
-rw-r--r--core/java/android/service/autofill/CustomDescription.java10
-rw-r--r--core/java/android/service/autofill/ImageTransformation.java3
-rw-r--r--core/java/android/service/autofill/InternalTransformation.java10
-rw-r--r--core/java/android/service/autofill/Transformation.java4
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/SaveUi.java14
9 files changed, 36 insertions, 20 deletions
diff --git a/api/current.txt b/api/current.txt
index 34143ad97ffc..f1fa6786d362 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -36950,7 +36950,7 @@ package android.service.autofill {
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
- public final class CharSequenceTransformation implements android.os.Parcelable {
+ public final class CharSequenceTransformation implements android.os.Parcelable android.service.autofill.Transformation {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.CharSequenceTransformation> CREATOR;
@@ -37047,7 +37047,7 @@ package android.service.autofill {
method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
- public final class ImageTransformation implements android.os.Parcelable {
+ public final class ImageTransformation implements android.os.Parcelable android.service.autofill.Transformation {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.ImageTransformation> CREATOR;
diff --git a/api/system-current.txt b/api/system-current.txt
index 203ee403a9fd..cc414bca05b0 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -40031,7 +40031,7 @@ package android.service.autofill {
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
- public final class CharSequenceTransformation implements android.os.Parcelable {
+ public final class CharSequenceTransformation implements android.os.Parcelable android.service.autofill.Transformation {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.CharSequenceTransformation> CREATOR;
@@ -40128,7 +40128,7 @@ package android.service.autofill {
method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
- public final class ImageTransformation implements android.os.Parcelable {
+ public final class ImageTransformation implements android.os.Parcelable android.service.autofill.Transformation {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.ImageTransformation> CREATOR;
diff --git a/api/test-current.txt b/api/test-current.txt
index 450b5fc1961b..c1116dabfe2b 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -37123,7 +37123,7 @@ package android.service.autofill {
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
- public final class CharSequenceTransformation implements android.os.Parcelable {
+ 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 int describeContents();
method public void writeToParcel(android.os.Parcel, int);
@@ -37221,7 +37221,7 @@ package android.service.autofill {
method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
- public final class ImageTransformation implements android.os.Parcelable {
+ 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 int describeContents();
method public void writeToParcel(android.os.Parcel, int);
diff --git a/core/java/android/service/autofill/CharSequenceTransformation.java b/core/java/android/service/autofill/CharSequenceTransformation.java
index 9d8345ce7b3f..3ff36aa5ef84 100644
--- a/core/java/android/service/autofill/CharSequenceTransformation.java
+++ b/core/java/android/service/autofill/CharSequenceTransformation.java
@@ -55,7 +55,8 @@ import java.util.regex.Pattern;
* .addField(ccExpYearId, "^(\\d\\d\\d\\d)$", " / $1");
* </pre>
*/
-public final class CharSequenceTransformation extends InternalTransformation implements Parcelable {
+public final class CharSequenceTransformation extends InternalTransformation implements
+ Transformation, Parcelable {
private static final String TAG = "CharSequenceTransformation";
@NonNull private final ArrayMap<AutofillId, Pair<Pattern, String>> mFields;
diff --git a/core/java/android/service/autofill/CustomDescription.java b/core/java/android/service/autofill/CustomDescription.java
index 51530d61c9f5..e97c364dd025 100644
--- a/core/java/android/service/autofill/CustomDescription.java
+++ b/core/java/android/service/autofill/CustomDescription.java
@@ -78,7 +78,6 @@ import com.android.internal.util.Preconditions;
* <p>See {@link ImageTransformation}, {@link CharSequenceTransformation} for more info about these
* transformations.
*/
-// TODO(b/62534917): add integration tests
public final class CustomDescription implements Parcelable {
private static final String TAG = "CustomDescription";
@@ -93,7 +92,6 @@ public final class CustomDescription implements Parcelable {
/** @hide */
public RemoteViews getPresentation(ValueFinder finder) {
- // TODO(b/62534917): need to handler errors, like not finding the ID
if (mTransformations != null) {
final int size = mTransformations.size();
if (sDebug) Log.d(TAG, "getPresentation(): applying " + size + " transformations");
@@ -101,7 +99,13 @@ public final class CustomDescription implements Parcelable {
final int id = mTransformations.keyAt(i);
final InternalTransformation transformation = mTransformations.valueAt(i);
if (sDebug) Log.d(TAG, "#" + i + ": " + transformation);
- transformation.apply(finder, mPresentation, id);
+
+ try {
+ transformation.apply(finder, mPresentation, id);
+ } catch (Exception e) {
+ Log.e(TAG, "Could not apply transformation " + transformation + ". "
+ + e.getClass());
+ }
}
}
return mPresentation;
diff --git a/core/java/android/service/autofill/ImageTransformation.java b/core/java/android/service/autofill/ImageTransformation.java
index 52412cd4ae79..4c04e175a217 100644
--- a/core/java/android/service/autofill/ImageTransformation.java
+++ b/core/java/android/service/autofill/ImageTransformation.java
@@ -51,7 +51,8 @@ import java.util.regex.Pattern;
* <p>There is no imposed limit in the number of options, but keep in mind that regexs are
* expensive to evaluate, so use the minimum number of regexs.
*/
-public final class ImageTransformation extends InternalTransformation implements Parcelable {
+public final class ImageTransformation extends InternalTransformation implements Transformation,
+ Parcelable {
private static final String TAG = "ImageTransformation";
private final AutofillId mId;
diff --git a/core/java/android/service/autofill/InternalTransformation.java b/core/java/android/service/autofill/InternalTransformation.java
index 3e51f87c7280..e8ac14a40359 100644
--- a/core/java/android/service/autofill/InternalTransformation.java
+++ b/core/java/android/service/autofill/InternalTransformation.java
@@ -19,11 +19,17 @@ import android.annotation.NonNull;
import android.os.Parcelable;
import android.widget.RemoteViews;
-/** @hide */
+/**
+ * Superclass of all transformation the system understands. As this is not public all
+ * subclasses have to implement {@link Transformation} again.
+ *
+ * @hide
+ */
abstract class InternalTransformation implements Transformation, Parcelable {
/**
- * Applies this transformation to a child view of a {@link RemoteViews presentation template}.
+ * Applies this transformation to a child view of a {@link android.widget.RemoteViews
+ * presentation template}.
*
* @param finder object used to find the value of a field in the screen.
* @param template the {@link RemoteViews presentation template}.
diff --git a/core/java/android/service/autofill/Transformation.java b/core/java/android/service/autofill/Transformation.java
index 63b679d87259..4cef261dd389 100644
--- a/core/java/android/service/autofill/Transformation.java
+++ b/core/java/android/service/autofill/Transformation.java
@@ -16,8 +16,8 @@
package android.service.autofill;
/**
- * Helper class used to change a child view of a {@link RemoteViews presentation template} at
- * runtime, using the values of fields contained in the screen.
+ * Helper class used to change a child view of a {@link android.widget.RemoteViews presentation
+ * template} at runtime, using the values of fields contained in the screen.
*
* <p>Typically used by {@link CustomDescription} to provide a customized Save UI affordance.
*/
diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
index e8dc3c1aea06..750943b18f1a 100644
--- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
@@ -144,15 +144,19 @@ final class SaveUi {
final CustomDescription customDescription = info.getCustomDescription();
if (customDescription != null) {
- // TODO(b/62534917): add CTS test
if (sDebug) Slog.d(TAG, "Using custom description");
final RemoteViews presentation = customDescription.getPresentation(valueFinder);
if (presentation != null) {
- final View remote = presentation.apply(context, null);
- final LinearLayout layout = view.findViewById(R.id.autofill_save_custom_subtitle);
- layout.addView(remote);
- layout.setVisibility(View.VISIBLE);
+ try {
+ final View remote = presentation.apply(context, null);
+ final LinearLayout layout = view.findViewById(
+ R.id.autofill_save_custom_subtitle);
+ layout.addView(remote);
+ layout.setVisibility(View.VISIBLE);
+ } catch (Exception e) {
+ Slog.e(TAG, "Could not inflate custom description. ", e);
+ }
} else {
Slog.w(TAG, "could not create remote presentation for custom title");
}