diff options
| author | 2017-07-12 22:29:10 +0000 | |
|---|---|---|
| committer | 2017-07-12 22:29:10 +0000 | |
| commit | d16aeddbd197701b387dcedf2719b7cd09455bfc (patch) | |
| tree | 75d9c7d92354384294b9f4e56ed31b96c01b5e18 | |
| parent | 72c323964cd60cd8a7013d3ce9c1cc1bed0b603f (diff) | |
| parent | 3858aa67365ad574ee474edc68e2e82d4d8c6081 (diff) | |
Merge "Make CustomDescription safe against crashes"
| -rw-r--r-- | api/current.txt | 4 | ||||
| -rw-r--r-- | api/system-current.txt | 4 | ||||
| -rw-r--r-- | api/test-current.txt | 4 | ||||
| -rw-r--r-- | core/java/android/service/autofill/CharSequenceTransformation.java | 3 | ||||
| -rw-r--r-- | core/java/android/service/autofill/CustomDescription.java | 10 | ||||
| -rw-r--r-- | core/java/android/service/autofill/ImageTransformation.java | 3 | ||||
| -rw-r--r-- | core/java/android/service/autofill/InternalTransformation.java | 10 | ||||
| -rw-r--r-- | core/java/android/service/autofill/Transformation.java | 4 | ||||
| -rw-r--r-- | services/autofill/java/com/android/server/autofill/ui/SaveUi.java | 14 |
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"); } |