From df0f3bce7ef4568c8408204b01e61e4166d07a97 Mon Sep 17 00:00:00 2001 From: Mark Renouf Date: Mon, 16 Sep 2019 14:04:38 -0400 Subject: [PATCH] Adds a Builder to SyncRtSurfaceTransactionApplier.Params This allows applying only those values provided. Since NULL can be passed for several of these params, the builder keeps track of fields that have been specified using flags instead. Test: nope Change-Id: I1483df7f796d11f1ebb5eda57d4aa10787cfb5de --- .../view/SyncRtSurfaceTransactionApplier.java | 166 ++++++++++++++++-- 1 file changed, 147 insertions(+), 19 deletions(-) diff --git a/core/java/android/view/SyncRtSurfaceTransactionApplier.java b/core/java/android/view/SyncRtSurfaceTransactionApplier.java index 85457cb48218a..1b6c5752217e7 100644 --- a/core/java/android/view/SyncRtSurfaceTransactionApplier.java +++ b/core/java/android/view/SyncRtSurfaceTransactionApplier.java @@ -30,6 +30,14 @@ import java.util.function.Consumer; */ public class SyncRtSurfaceTransactionApplier { + public static final int FLAG_ALL = 0xffffffff; + public static final int FLAG_ALPHA = 1; + public static final int FLAG_MATRIX = 1 << 1; + public static final int FLAG_WINDOW_CROP = 1 << 2; + public static final int FLAG_LAYER = 1 << 3; + public static final int FLAG_CORNER_RADIUS = 1 << 4; + public static final int FLAG_VISIBILITY = 1 << 5; + private final Surface mTargetSurface; private final ViewRootImpl mTargetViewRootImpl; private final float[] mTmpFloat9 = new float[9]; @@ -72,15 +80,27 @@ public class SyncRtSurfaceTransactionApplier { } public static void applyParams(Transaction t, SurfaceParams params, float[] tmpFloat9) { - t.setMatrix(params.surface, params.matrix, tmpFloat9); - t.setWindowCrop(params.surface, params.windowCrop); - t.setAlpha(params.surface, params.alpha); - t.setLayer(params.surface, params.layer); - t.setCornerRadius(params.surface, params.cornerRadius); - if (params.visible) { - t.show(params.surface); - } else { - t.hide(params.surface); + if ((params.flags & FLAG_MATRIX) != 0) { + t.setMatrix(params.surface, params.matrix, tmpFloat9); + } + if ((params.flags & FLAG_WINDOW_CROP) != 0) { + t.setWindowCrop(params.surface, params.windowCrop); + } + if ((params.flags & FLAG_ALPHA) != 0) { + t.setAlpha(params.surface, params.alpha); + } + if ((params.flags & FLAG_LAYER) != 0) { + t.setLayer(params.surface, params.layer); + } + if ((params.flags & FLAG_CORNER_RADIUS) != 0) { + t.setCornerRadius(params.surface, params.cornerRadius); + } + if ((params.flags & FLAG_VISIBILITY) != 0) { + if (params.visible) { + t.show(params.surface); + } else { + t.hide(params.surface); + } } } @@ -115,17 +135,95 @@ public class SyncRtSurfaceTransactionApplier { public static class SurfaceParams { - /** - * Constructs surface parameters to be applied when the current view state gets pushed to - * RenderThread. - * - * @param surface The surface to modify. - * @param alpha Alpha to apply. - * @param matrix Matrix to apply. - * @param windowCrop Crop to apply. - */ - public SurfaceParams(SurfaceControl surface, float alpha, Matrix matrix, + public static class Builder { + final SurfaceControl surface; + int flags; + float alpha; + float cornerRadius; + Matrix matrix; + Rect windowCrop; + int layer; + boolean visible; + + /** + * @param surface The surface to modify. + */ + public Builder(SurfaceControl surface) { + this.surface = surface; + } + + /** + * @param alpha The alpha value to apply to the surface. + * @return this Builder + */ + public Builder withAlpha(float alpha) { + this.alpha = alpha; + flags |= FLAG_ALPHA; + return this; + } + + /** + * @param matrix The matrix to apply to the surface. + * @return this Builder + */ + public Builder withMatrix(Matrix matrix) { + this.matrix = matrix; + flags |= FLAG_MATRIX; + return this; + } + + /** + * @param windowCrop The window crop to apply to the surface. + * @return this Builder + */ + public Builder withWindowCrop(Rect windowCrop) { + this.windowCrop = windowCrop; + flags |= FLAG_WINDOW_CROP; + return this; + } + + /** + * @param layer The layer to assign the surface. + * @return this Builder + */ + public Builder withLayer(int layer) { + this.layer = layer; + flags |= FLAG_LAYER; + return this; + } + + /** + * @param radius the Radius for rounded corners to apply to the surface. + * @return this Builder + */ + public Builder withCornerRadius(float radius) { + this.cornerRadius = radius; + flags |= FLAG_CORNER_RADIUS; + return this; + } + + /** + * @param visible The visibility to apply to the surface. + * @return this Builder + */ + public Builder withVisibility(boolean visible) { + this.visible = visible; + flags |= FLAG_VISIBILITY; + return this; + } + + /** + * @return a new SurfaceParams instance + */ + public SurfaceParams build() { + return new SurfaceParams(surface, flags, alpha, matrix, windowCrop, layer, + cornerRadius, visible); + } + } + + private SurfaceParams(SurfaceControl surface, int params, float alpha, Matrix matrix, Rect windowCrop, int layer, float cornerRadius, boolean visible) { + this.flags = params; this.surface = surface; this.alpha = alpha; this.matrix = new Matrix(matrix); @@ -135,6 +233,36 @@ public class SyncRtSurfaceTransactionApplier { this.visible = visible; } + + /** + * Constructs surface parameters to be applied when the current view state gets pushed to + * RenderThread. + * + * @param surface The surface to modify. + * @param alpha Alpha to apply. + * @param matrix Matrix to apply. + * @param windowCrop Crop to apply. + * @param layer The layer to apply. + * @param cornerRadius The corner radius to apply. + * @param visible The visibility to apply. + * + * @deprecated Use {@link SurfaceParams.Builder} to create an instance. + */ + @Deprecated + public SurfaceParams(SurfaceControl surface, float alpha, Matrix matrix, + Rect windowCrop, int layer, float cornerRadius, boolean visible) { + this.flags = FLAG_ALL; + this.surface = surface; + this.alpha = alpha; + this.matrix = new Matrix(matrix); + this.windowCrop = new Rect(windowCrop); + this.layer = layer; + this.cornerRadius = cornerRadius; + this.visible = visible; + } + + private final int flags; + @VisibleForTesting public final SurfaceControl surface;