diff options
Diffstat (limited to 'android/service/autofill/InternalTransformation.java')
-rw-r--r-- | android/service/autofill/InternalTransformation.java | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/android/service/autofill/InternalTransformation.java b/android/service/autofill/InternalTransformation.java index 974397b3..c9864a0e 100644 --- a/android/service/autofill/InternalTransformation.java +++ b/android/service/autofill/InternalTransformation.java @@ -15,17 +15,27 @@ */ package android.service.autofill; +import static android.view.autofill.Helper.sDebug; + import android.annotation.NonNull; +import android.annotation.TestApi; import android.os.Parcelable; +import android.util.Log; +import android.util.Pair; import android.widget.RemoteViews; +import java.util.ArrayList; + /** * 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 { +@TestApi +public abstract class InternalTransformation implements Transformation, Parcelable { + + private static final String TAG = "InternalTransformation"; /** * Applies this transformation to a child view of a {@link android.widget.RemoteViews @@ -39,4 +49,37 @@ abstract class InternalTransformation implements Transformation, Parcelable { */ abstract void apply(@NonNull ValueFinder finder, @NonNull RemoteViews template, int childViewId) throws Exception; + + /** + * Applies multiple transformations to the children views 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}. + * @param transformations map of resource id of the child view inside the template to + * transformation. + * + * @hide + */ + public static boolean batchApply(@NonNull ValueFinder finder, @NonNull RemoteViews template, + @NonNull ArrayList<Pair<Integer, InternalTransformation>> transformations) { + final int size = transformations.size(); + if (sDebug) Log.d(TAG, "getPresentation(): applying " + size + " transformations"); + for (int i = 0; i < size; i++) { + final Pair<Integer, InternalTransformation> pair = transformations.get(i); + final int id = pair.first; + final InternalTransformation transformation = pair.second; + if (sDebug) Log.d(TAG, "#" + i + ": " + transformation); + + try { + transformation.apply(finder, template, id); + } catch (Exception e) { + // Do not log full exception to avoid PII leaking + Log.e(TAG, "Could not apply transformation " + transformation + ": " + + e.getClass()); + return false; + } + } + return true; + } } |