diff options
| author | 2025-02-27 08:48:26 +0000 | |
|---|---|---|
| committer | 2025-02-27 08:23:17 -0800 | |
| commit | 9ec1c55146f5884b6fa51a754c3e073df0aacff5 (patch) | |
| tree | d2d1256d4af65111775d9a11b288fd84e922e0ff | |
| parent | 56c3534e05b81e72f044d3f5f0e1c50ba14c5b7b (diff) | |
Update to ToT RemoteCompose
Bug: 339721781
Flag: EXEMPT External Libraries
Test: in GoB
Change-Id: If821c6c14022f824645a6c6bc5f42e0b611f316b
124 files changed, 1363 insertions, 288 deletions
diff --git a/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java b/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java index b8503da2c09b..796ea8d1538f 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java +++ b/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java @@ -65,7 +65,7 @@ public class CoreDocument implements Serializable { // We also keep a more fine-grained BUILD number, exposed as // ID_API_LEVEL = DOCUMENT_API_LEVEL + BUILD - static final float BUILD = 0.2f; + static final float BUILD = 0.3f; @NonNull ArrayList<Operation> mOperations = new ArrayList<>(); @@ -411,7 +411,7 @@ public class CoreDocument implements Serializable { @Override public void serialize(MapSerializer serializer) { serializer - .add("type", "CoreDocument") + .addType("CoreDocument") .add("width", mWidth) .add("height", mHeight) .add("operations", mOperations); diff --git a/core/java/com/android/internal/widget/remotecompose/core/Operations.java b/core/java/com/android/internal/widget/remotecompose/core/Operations.java index 09ec40271f4d..9cbafab07a43 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/Operations.java +++ b/core/java/com/android/internal/widget/remotecompose/core/Operations.java @@ -100,6 +100,7 @@ import com.android.internal.widget.remotecompose.core.operations.layout.managers import com.android.internal.widget.remotecompose.core.operations.layout.managers.CollapsibleColumnLayout; import com.android.internal.widget.remotecompose.core.operations.layout.managers.CollapsibleRowLayout; import com.android.internal.widget.remotecompose.core.operations.layout.managers.ColumnLayout; +import com.android.internal.widget.remotecompose.core.operations.layout.managers.FitBoxLayout; import com.android.internal.widget.remotecompose.core.operations.layout.managers.RowLayout; import com.android.internal.widget.remotecompose.core.operations.layout.managers.StateLayout; import com.android.internal.widget.remotecompose.core.operations.layout.managers.TextLayout; @@ -231,6 +232,7 @@ public class Operations { public static final int LAYOUT_ROOT = 200; public static final int LAYOUT_CONTENT = 201; public static final int LAYOUT_BOX = 202; + public static final int LAYOUT_FIT_BOX = 176; public static final int LAYOUT_ROW = 203; public static final int LAYOUT_COLLAPSIBLE_ROW = 230; public static final int LAYOUT_COLUMN = 204; @@ -391,6 +393,7 @@ public class Operations { map.put(LAYOUT_ROOT, RootLayoutComponent::read); map.put(LAYOUT_CONTENT, LayoutComponentContent::read); map.put(LAYOUT_BOX, BoxLayout::read); + map.put(LAYOUT_FIT_BOX, FitBoxLayout::read); map.put(LAYOUT_COLUMN, ColumnLayout::read); map.put(LAYOUT_COLLAPSIBLE_COLUMN, CollapsibleColumnLayout::read); map.put(LAYOUT_ROW, RowLayout::read); diff --git a/core/java/com/android/internal/widget/remotecompose/core/PaintOperation.java b/core/java/com/android/internal/widget/remotecompose/core/PaintOperation.java index f355676be63e..c27ee3284b9c 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/PaintOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/PaintOperation.java @@ -17,11 +17,13 @@ package com.android.internal.widget.remotecompose.core; import android.annotation.NonNull; +import com.android.internal.widget.remotecompose.core.serialize.Serializable; + /** * PaintOperation interface, used for operations aimed at painting (while any operation _can_ paint, * this make it a little more explicit) */ -public abstract class PaintOperation extends Operation { +public abstract class PaintOperation extends Operation implements Serializable { @Override public void apply(@NonNull RemoteContext context) { diff --git a/core/java/com/android/internal/widget/remotecompose/core/Platform.java b/core/java/com/android/internal/widget/remotecompose/core/Platform.java index 6073de662cdb..3fff86c38b2e 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/Platform.java +++ b/core/java/com/android/internal/widget/remotecompose/core/Platform.java @@ -47,6 +47,14 @@ public interface Platform { int getImageHeight(@NonNull Object image); /** + * Returns true if the platform-specific image object has format ALPHA_8 + * + * @param image platform-specific image object + * @return whether or not the platform-specific image object has format ALPHA_8 + */ + boolean isAlpha8Image(@NonNull Object image); + + /** * Converts a platform-specific path object into a platform-independent float buffer * * @param path @@ -110,6 +118,11 @@ public interface Platform { } @Override + public boolean isAlpha8Image(@NonNull Object image) { + throw new UnsupportedOperationException(); + } + + @Override public float[] pathToFloatArray(@NonNull Object path) { throw new UnsupportedOperationException(); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java b/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java index e75bd30b381d..c249adf5bd58 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java +++ b/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java @@ -98,6 +98,7 @@ import com.android.internal.widget.remotecompose.core.operations.layout.managers import com.android.internal.widget.remotecompose.core.operations.layout.managers.CollapsibleColumnLayout; import com.android.internal.widget.remotecompose.core.operations.layout.managers.CollapsibleRowLayout; import com.android.internal.widget.remotecompose.core.operations.layout.managers.ColumnLayout; +import com.android.internal.widget.remotecompose.core.operations.layout.managers.FitBoxLayout; import com.android.internal.widget.remotecompose.core.operations.layout.managers.RowLayout; import com.android.internal.widget.remotecompose.core.operations.layout.managers.StateLayout; import com.android.internal.widget.remotecompose.core.operations.layout.managers.TextLayout; @@ -281,13 +282,7 @@ public class RemoteComposeBuffer { int dstRight, int dstBottom, @Nullable String contentDescription) { - int imageId = mRemoteComposeState.dataGetId(image); - if (imageId == -1) { - imageId = mRemoteComposeState.cacheData(image); - byte[] data = mPlatform.imageToByteArray(image); // todo: potential npe - BitmapData.apply( - mBuffer, imageId, imageWidth, imageHeight, data); // todo: potential npe - } + int imageId = storeBitmap(image); int contentDescriptionId = 0; if (contentDescription != null) { contentDescriptionId = addText(contentDescription); @@ -443,16 +438,7 @@ public class RemoteComposeBuffer { float right, float bottom, @Nullable String contentDescription) { - int imageId = mRemoteComposeState.dataGetId(image); - if (imageId == -1) { - imageId = mRemoteComposeState.cacheData(image); - byte[] data = mPlatform.imageToByteArray(image); // todo: potential npe - int imageWidth = mPlatform.getImageWidth(image); - int imageHeight = mPlatform.getImageHeight(image); - - BitmapData.apply( - mBuffer, imageId, imageWidth, imageHeight, data); // todo: potential npe - } + int imageId = storeBitmap(image); addDrawBitmap(imageId, left, top, right, bottom, contentDescription); } @@ -523,15 +509,7 @@ public class RemoteComposeBuffer { int scaleType, float scaleFactor, @Nullable String contentDescription) { - int imageId = mRemoteComposeState.dataGetId(image); - if (imageId == -1) { - imageId = mRemoteComposeState.cacheData(image); - byte[] data = mPlatform.imageToByteArray(image); // todo: potential npe - int imageWidth = mPlatform.getImageWidth(image); - int imageHeight = mPlatform.getImageHeight(image); - - BitmapData.apply(mBuffer, imageId, imageWidth, imageHeight, data); // todo: potential pe - } + int imageId = storeBitmap(image); int contentDescriptionId = 0; if (contentDescription != null) { contentDescriptionId = addText(contentDescription); @@ -559,16 +537,7 @@ public class RemoteComposeBuffer { * @return id of the image useful with */ public int addBitmap(@NonNull Object image) { - int imageId = mRemoteComposeState.dataGetId(image); - if (imageId == -1) { - imageId = mRemoteComposeState.cacheData(image); - byte[] data = mPlatform.imageToByteArray(image); // tODO: potential npe - int imageWidth = mPlatform.getImageWidth(image); - int imageHeight = mPlatform.getImageHeight(image); - - BitmapData.apply(mBuffer, imageId, imageWidth, imageHeight, data); - } - return imageId; + return storeBitmap(image); } /** @@ -578,18 +547,7 @@ public class RemoteComposeBuffer { * @return id of the image useful with */ public int addBitmap(@NonNull Object image, @NonNull String name) { - int imageId = mRemoteComposeState.dataGetId(image); - if (imageId == -1) { - imageId = mRemoteComposeState.cacheData(image); - byte[] data = mPlatform.imageToByteArray(image); // todo: potential npe - int imageWidth = mPlatform.getImageWidth(image); - int imageHeight = mPlatform.getImageHeight(image); - - BitmapData.apply(mBuffer, imageId, imageWidth, imageHeight, data); - setBitmapName(imageId, name); - } - - return imageId; + return storeBitmap(image); } /** @@ -1393,7 +1351,7 @@ public class RemoteComposeBuffer { * @return the id of the command representing long */ public int addLong(long value) { - int id = mRemoteComposeState.cacheData(value); + int id = mRemoteComposeState.nextId(); LongConstant.apply(mBuffer, id, value); return id; } @@ -1405,7 +1363,7 @@ public class RemoteComposeBuffer { * @return the id */ public int addBoolean(boolean value) { - int id = mRemoteComposeState.cacheData(value); + int id = mRemoteComposeState.nextId(); BooleanConstant.apply(mBuffer, id, value); return id; } @@ -1821,33 +1779,14 @@ public class RemoteComposeBuffer { } /** - * This defines the name of the color given the id. - * - * @param id of the color - * @param name Name of the color - */ - public void setColorName(int id, @NonNull String name) { - NamedVariable.apply(mBuffer, id, NamedVariable.COLOR_TYPE, name); - } - - /** - * This defines the name of the string given the id - * - * @param id of the string - * @param name name of the string - */ - public void setStringName(int id, @NonNull String name) { - NamedVariable.apply(mBuffer, id, NamedVariable.STRING_TYPE, name); - } - - /** - * This defines the name of the float given the id + * This defines the name of a type of given object * * @param id of the float * @param name name of the float + * @param type the type of variable NamedVariable.COLOR_TYPE, STRING_TYPE, etc */ - public void setFloatName(int id, String name) { - NamedVariable.apply(mBuffer, id, NamedVariable.FLOAT_TYPE, name); + public void setNamedVariable(int id, @NonNull String name, int type) { + NamedVariable.apply(mBuffer, id, type, name); } /** @@ -2139,6 +2078,19 @@ public class RemoteComposeBuffer { } /** + * Add a fitbox start tag + * + * @param componentId component id + * @param animationId animation id + * @param horizontal horizontal alignment + * @param vertical vertical alignment + */ + public void addFitBoxStart(int componentId, int animationId, int horizontal, int vertical) { + mLastComponentId = getComponentId(componentId); + FitBoxLayout.apply(mBuffer, mLastComponentId, animationId, horizontal, vertical); + } + + /** * Add a row start tag * * @param componentId component id @@ -2439,4 +2391,35 @@ public class RemoteComposeBuffer { public void drawComponentContent() { DrawContent.apply(mBuffer); } + + /** + * Ensures the bitmap is stored. + * + * @param image the bitbap to store + * @return the id of the bitmap + */ + private int storeBitmap(Object image) { + int imageId = mRemoteComposeState.dataGetId(image); + if (imageId == -1) { + imageId = mRemoteComposeState.cacheData(image); + byte[] data = mPlatform.imageToByteArray(image); // todo: potential npe + short imageWidth = (short) mPlatform.getImageWidth(image); + short imageHeight = (short) mPlatform.getImageHeight(image); + if (mPlatform.isAlpha8Image(image)) { + BitmapData.apply( + mBuffer, + imageId, + BitmapData.TYPE_PNG_ALPHA_8, + imageWidth, + BitmapData.ENCODING_INLINE, + imageHeight, + data); // todo: potential npe + } else { + BitmapData.apply( + mBuffer, imageId, imageWidth, imageHeight, data); // todo: potential npe + } + } + + return imageId; + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeState.java b/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeState.java index 363b82bdf70c..83c06197db9c 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeState.java +++ b/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeState.java @@ -27,6 +27,7 @@ import com.android.internal.widget.remotecompose.core.operations.utilities.IntMa import com.android.internal.widget.remotecompose.core.operations.utilities.NanMap; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; /** @@ -36,7 +37,7 @@ import java.util.HashMap; public class RemoteComposeState implements CollectionsAccess { public static final int START_ID = 42; // private static final int MAX_FLOATS = 500; - private static final int MAX_COLORS = 200; + private static int sMaxColors = 200; private static final int MAX_DATA = 1000; private final IntMap<Object> mIntDataMap = new IntMap<>(); @@ -52,7 +53,7 @@ public class RemoteComposeState implements CollectionsAccess { private final IntMap<Object> mPathMap = new IntMap<>(); private final IntMap<float[]> mPathData = new IntMap<>(); - private final boolean[] mColorOverride = new boolean[MAX_COLORS]; + private boolean[] mColorOverride = new boolean[sMaxColors]; @NonNull private final IntMap<ArrayAccess> mCollectionMap = new IntMap<>(); private final boolean[] mDataOverride = new boolean[MAX_DATA]; @@ -318,7 +319,7 @@ public class RemoteComposeState implements CollectionsAccess { * @param color */ public void updateColor(int id, int color) { - if (mColorOverride[id]) { + if (id < sMaxColors && mColorOverride[id]) { return; } mColorMap.put(id, color); @@ -342,6 +343,10 @@ public class RemoteComposeState implements CollectionsAccess { * @param color */ public void overrideColor(int id, int color) { + if (id >= sMaxColors) { + sMaxColors *= 2; + mColorOverride = Arrays.copyOf(mColorOverride, sMaxColors); + } mColorOverride[id] = true; mColorMap.put(id, color); updateListeners(id); diff --git a/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java b/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java index 622f0c8d12b7..c6b17e4116d6 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java +++ b/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java @@ -211,6 +211,14 @@ public abstract class RemoteContext { public abstract void clearNamedFloatOverride(String floatName); /** + * Set the value of a named long. This modifies the content of a LongConstant + * + * @param name the name of the float to override + * @param value Override the default float + */ + public abstract void setNamedLong(String name, long value); + + /** * Set the value of a named Object. This overrides the Object in the document * * @param dataName the name of the Object to override diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapData.java index 13e6f3859933..255d7a46e49e 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapData.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapData.java @@ -72,6 +72,9 @@ public class BitmapData extends Operation implements SerializableToString, Seria /** The data is encoded as RAW 8888 bit */ public static final short TYPE_RAW8888 = 3; + /** The data is encoded as PNG_8888 but decoded as ALPHA_8 */ + public static final short TYPE_PNG_ALPHA_8 = 4; + /** * create a bitmap structure * @@ -136,6 +139,15 @@ public class BitmapData extends Operation implements SerializableToString, Seria } /** + * The type of the image + * + * @return the type of the image + */ + public int getType() { + return mType; + } + + /** * Add the image to the document * * @param buffer document to write to @@ -195,6 +207,21 @@ public class BitmapData extends Operation implements SerializableToString, Seria int imageId = buffer.readInt(); int width = buffer.readInt(); int height = buffer.readInt(); + int type; + if (width > 0xffff) { + type = width >> 16; + width = width & 0xffff; + } else { + type = TYPE_PNG_8888; + } + + int encoding; + if (height > 0xffff) { + encoding = height >> 16; + height = height & 0xffff; + } else { + encoding = ENCODING_INLINE; + } if (width < 1 || height < 1 || height > MAX_IMAGE_DIMENSION @@ -202,7 +229,10 @@ public class BitmapData extends Operation implements SerializableToString, Seria throw new RuntimeException("Dimension of image is invalid " + width + "x" + height); } byte[] bitmap = buffer.readBuffer(); - operations.add(new BitmapData(imageId, width, height, bitmap)); + BitmapData bitmapData = new BitmapData(imageId, width, height, bitmap); + bitmapData.mType = (short) type; + bitmapData.mEncoding = (short) encoding; + operations.add(bitmapData); } /** @@ -244,7 +274,7 @@ public class BitmapData extends Operation implements SerializableToString, Seria @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("imageId", mImageId) .add("imageWidth", mImageWidth) .add("imageHeight", mImageHeight) @@ -275,6 +305,8 @@ public class BitmapData extends Operation implements SerializableToString, Seria return "TYPE_RAW8"; case TYPE_RAW8888: return "TYPE_RAW8888"; + case TYPE_PNG_ALPHA_8: + return "TYPE_PNG_ALPHA_8"; default: return "TYPE_INVALID"; } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapFontData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapFontData.java index 078ce981d243..70bda6d1c0fa 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapFontData.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/BitmapFontData.java @@ -221,6 +221,6 @@ public class BitmapFontData extends Operation implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("id", mId); + serializer.addType(CLASS_NAME).add("id", mId); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ClickArea.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ClickArea.java index 00ac9c28f362..7a8373bf7c7d 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/ClickArea.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ClickArea.java @@ -237,7 +237,7 @@ public class ClickArea extends Operation @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("id", mId) .add("contentDescriptionId", mContentDescription) .add("left", mLeft, mOutLeft) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ClipPath.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ClipPath.java index e7dc405b542e..03bdb70a9289 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/ClipPath.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ClipPath.java @@ -133,7 +133,7 @@ public class ClipPath extends PaintOperation implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("id", mId).add("regionOp", regionOpToString()); + serializer.addType(CLASS_NAME).add("id", mId).add("regionOp", regionOpToString()); } String regionOpToString() { diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ClipRect.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ClipRect.java index 1646146bd21d..8b1e96a691a6 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/ClipRect.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ClipRect.java @@ -118,6 +118,6 @@ public class ClipRect extends DrawBase4 { @Override public void serialize(MapSerializer serializer) { - serialize(serializer, "left", "top", "right", "bottom").add("type", CLASS_NAME); + serialize(serializer, "left", "top", "right", "bottom").addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ColorConstant.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ColorConstant.java index 333ffaae8289..7b12f4a9cf15 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/ColorConstant.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ColorConstant.java @@ -133,7 +133,7 @@ public class ColorConstant extends Operation implements Serializable { @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("color", Utils.colorInt(mColor)) .add("colorId", mColorId); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java index d5af7914607a..25323a8a818d 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java @@ -507,7 +507,7 @@ public class ColorExpression extends Operation implements VariableSupport, Seria @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("id", mId); + serializer.addType(CLASS_NAME).add("id", mId); switch (mMode) { case COLOR_COLOR_INTERPOLATE: case ID_COLOR_INTERPOLATE: diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ComponentValue.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ComponentValue.java index cd13d2534266..5335e4fa76ca 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/ComponentValue.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ComponentValue.java @@ -171,7 +171,7 @@ public class ComponentValue extends Operation implements SerializableToString, S @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("valueId", mValueId) .add("componentValueType", typeToString(mType)) .add("componentId", mComponentID); diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DataListFloat.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListFloat.java index fb3abdbb0626..20bebaa1ddb2 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DataListFloat.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListFloat.java @@ -148,8 +148,9 @@ public class DataListFloat extends Operation implements VariableSupport, ArrayAc return mValues.length; } + @SuppressWarnings("JdkImmutableCollections") @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("id", mId).add("values", List.of(mValues)); + serializer.addType(CLASS_NAME).add("id", mId).add("values", List.of(mValues)); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DataListIds.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListIds.java index 58fd74fdcf3e..af660f3d42c9 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DataListIds.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListIds.java @@ -150,8 +150,9 @@ public class DataListIds extends Operation implements VariableSupport, ArrayAcce return 0; } + @SuppressWarnings("JdkImmutableCollections") @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("id", mId).add("ids", List.of(mIds)); + serializer.addType(CLASS_NAME).add("id", mId).add("ids", List.of(mIds)); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawArc.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawArc.java index a427836b6c5f..5024164651f5 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawArc.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawArc.java @@ -141,6 +141,6 @@ public class DrawArc extends DrawBase6 { @Override public void serialize(MapSerializer serializer) { serialize(serializer, "left", "top", "right", "bottom", "startAngle", "sweepAngle") - .add("type", CLASS_NAME); + .addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmap.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmap.java index 40d3bede0912..e3b53a125a63 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmap.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmap.java @@ -28,6 +28,7 @@ import com.android.internal.widget.remotecompose.core.RemoteContext; import com.android.internal.widget.remotecompose.core.VariableSupport; import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import java.util.List; @@ -185,4 +186,16 @@ public class DrawBitmap extends PaintOperation implements VariableSupport { public void paint(@NonNull PaintContext context) { context.drawBitmap(mId, mOutputLeft, mOutputTop, mOutputRight, mOutputBottom); } + + @Override + public void serialize(MapSerializer serializer) { + serializer + .addType(CLASS_NAME) + .add("imageId", mId) + .add("contentDescriptionId", mDescriptionId) + .add("left", mLeft, mOutputLeft) + .add("top", mTop, mOutputTop) + .add("right", mRight, mOutputRight) + .add("bottom", mBottom, mOutputBottom); + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapFontText.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapFontText.java index 258988e8b00a..bff87fda2fd9 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapFontText.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapFontText.java @@ -28,6 +28,7 @@ import com.android.internal.widget.remotecompose.core.VariableSupport; import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder; import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import java.util.List; @@ -229,4 +230,16 @@ public class DrawBitmapFontText extends PaintOperation implements VariableSuppor xPos = xPos2 + glyph.mMarginRight; } } + + @Override + public void serialize(MapSerializer serializer) { + serializer + .addType(CLASS_NAME) + .add("textId", mTextID) + .add("bitmapFontId", mBitmapFontID) + .add("start", mStart) + .add("end", mEnd) + .add("x", mX, mOutX) + .add("y", mY, mOutY); + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapInt.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapInt.java index 013dd1ae9db8..39d85af900ee 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapInt.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapInt.java @@ -25,6 +25,7 @@ import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder; import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation; import com.android.internal.widget.remotecompose.core.semantics.AccessibleComponent; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import java.util.List; @@ -230,4 +231,20 @@ public class DrawBitmapInt extends PaintOperation implements AccessibleComponent mDstBottom, mContentDescId); } + + @Override + public void serialize(MapSerializer serializer) { + serializer + .addType(CLASS_NAME) + .add("imageId", mImageId) + .add("contentDescriptionId", mContentDescId) + .add("srcLeft", mSrcLeft) + .add("srcTop", mSrcTop) + .add("srcRight", mSrcRight) + .add("srcBottom", mSrcBottom) + .add("dstLeft", mDstLeft) + .add("dstTop", mDstTop) + .add("dstRight", mDstRight) + .add("dstBottom", mDstBottom); + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapScaled.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapScaled.java index e1070f97d5aa..827e5692e132 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapScaled.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmapScaled.java @@ -28,6 +28,7 @@ import com.android.internal.widget.remotecompose.core.documentation.Documentatio import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation; import com.android.internal.widget.remotecompose.core.operations.utilities.ImageScaling; import com.android.internal.widget.remotecompose.core.semantics.AccessibleComponent; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import java.util.List; @@ -374,4 +375,46 @@ public class DrawBitmapScaled extends PaintOperation mContentDescId); context.restore(); } + + @Override + public void serialize(MapSerializer serializer) { + serializer + .addType(CLASS_NAME) + .add("imageId", mImageId) + .add("contentDescriptionId", mContentDescId) + .add("scaleType", getScaleTypeString()) + .add("mode", mMode) + .add("scaleFactor", mScaleFactor, mOutScaleFactor) + .add("srcLeft", mSrcLeft, mOutSrcLeft) + .add("srcTop", mSrcTop, mOutSrcTop) + .add("srcRight", mSrcRight, mOutSrcRight) + .add("srcBottom", mSrcBottom, mOutSrcBottom) + .add("dstLeft", mDstLeft, mOutDstLeft) + .add("dstTop", mDstTop, mOutDstTop) + .add("dstRight", mDstRight, mOutDstRight) + .add("dstBottom", mDstBottom, mOutDstBottom); + } + + private String getScaleTypeString() { + switch (mScaleType) { + case SCALE_NONE: + return "SCALE_NONE"; + case SCALE_INSIDE: + return "SCALE_INSIDE"; + case SCALE_FILL_WIDTH: + return "SCALE_FILL_WIDTH"; + case SCALE_FILL_HEIGHT: + return "SCALE_FILL_HEIGHT"; + case SCALE_FIT: + return "SCALE_FIT"; + case SCALE_CROP: + return "SCALE_CROP"; + case SCALE_FILL_BOUNDS: + return "SCALE_FILL_BOUNDS"; + case SCALE_FIXED_SCALE: + return "SCALE_FIXED_SCALE"; + default: + return "INVALID_SCALE_TYPE"; + } + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawCircle.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawCircle.java index dfc89b12de1e..538cbaf97a06 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawCircle.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawCircle.java @@ -112,6 +112,6 @@ public class DrawCircle extends DrawBase3 { @Override public void serialize(MapSerializer serializer) { - serialize(serializer, "cx", "cy", "radius").add("type", CLASS_NAME); + serialize(serializer, "cx", "cy", "radius").addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawContent.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawContent.java index e2e22acbeb8f..4d2a939eb948 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawContent.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawContent.java @@ -114,6 +114,6 @@ public class DrawContent extends PaintOperation implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME); + serializer.addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawLine.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawLine.java index 461dece02625..97e5057fb950 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawLine.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawLine.java @@ -140,6 +140,6 @@ public class DrawLine extends DrawBase4 implements SerializableToString { @Override public void serialize(MapSerializer serializer) { - serialize(serializer, "startX", "startY", "endX", "endY").add("type", CLASS_NAME); + serialize(serializer, "startX", "startY", "endX", "endY").addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawOval.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawOval.java index d0a5adc0e737..5d619baa1328 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawOval.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawOval.java @@ -110,6 +110,6 @@ public class DrawOval extends DrawBase4 { @Override public void serialize(MapSerializer serializer) { - serialize(serializer, "left", "top", "right", "bottom").add("type", CLASS_NAME); + serialize(serializer, "left", "top", "right", "bottom").addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawPath.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawPath.java index 3fd8bb440d82..6e299275fb24 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawPath.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawPath.java @@ -112,6 +112,6 @@ public class DrawPath extends PaintOperation implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("id", mId).add("start", mStart).add("end", mEnd); + serializer.addType(CLASS_NAME).add("id", mId).add("start", mStart).add("end", mEnd); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRect.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRect.java index f6aa30f5b5dd..15f3ced74652 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRect.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRect.java @@ -106,6 +106,6 @@ public class DrawRect extends DrawBase4 { @Override public void serialize(MapSerializer serializer) { - serialize(serializer, "left", "top", "right", "bottom").add("type", CLASS_NAME); + serialize(serializer, "left", "top", "right", "bottom").addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRoundRect.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRoundRect.java index 67338c14a101..31d9b6ac124d 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRoundRect.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRoundRect.java @@ -127,6 +127,6 @@ public class DrawRoundRect extends DrawBase6 { @Override public void serialize(MapSerializer serializer) { serialize(serializer, "left", "top", "right", "bottom", "rx", "sweepAngle") - .add("type", CLASS_NAME); + .addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawSector.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawSector.java index 78f64a5bcd44..19f16239b9f2 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawSector.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawSector.java @@ -128,6 +128,6 @@ public class DrawSector extends DrawBase6 { @Override public void serialize(MapSerializer serializer) { serialize(serializer, "left", "top", "right", "bottom", "startAngle", "sweepAngle") - .add("type", CLASS_NAME); + .addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawText.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawText.java index 8adba1d2616a..ee1689c21fe3 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawText.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawText.java @@ -28,6 +28,7 @@ import com.android.internal.widget.remotecompose.core.VariableSupport; import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder; import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import java.util.List; @@ -205,4 +206,17 @@ public class DrawText extends PaintOperation implements VariableSupport { public void paint(@NonNull PaintContext context) { context.drawTextRun(mTextID, mStart, mEnd, mContextStart, mContextEnd, mOutX, mOutY, mRtl); } + + @Override + public void serialize(MapSerializer serializer) { + serializer + .addType(CLASS_NAME) + .add("start", mStart) + .add("end", mEnd) + .add("contextStart", mContextStart) + .add("contextEnd", mContextEnd) + .add("x", mX, mOutX) + .add("y", mY, mOutY) + .add("rtl", mRtl); + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java index 92469d1834ba..1d917d565331 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java @@ -244,7 +244,7 @@ public class DrawTextAnchored extends PaintOperation implements VariableSupport, @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("textId", mTextID) .add("x", mX, mOutX) .add("y", mY, mOutY) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java index 1f7910ede4b5..f382440360ed 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java @@ -159,7 +159,7 @@ public class DrawTextOnPath extends PaintOperation implements VariableSupport, S @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("pathId", mPathId) .add("textId", mTextId) .add("vOffset", mVOffset, mOutVOffset) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTweenPath.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTweenPath.java index e2883949022c..4ca995b59f1f 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTweenPath.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTweenPath.java @@ -28,6 +28,7 @@ import com.android.internal.widget.remotecompose.core.VariableSupport; import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder; import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import java.util.List; @@ -171,4 +172,15 @@ public class DrawTweenPath extends PaintOperation implements VariableSupport { public void paint(@NonNull PaintContext context) { context.drawTweenPath(mPath1Id, mPath2Id, mOutTween, mOutStart, mOutStop); } + + @Override + public void serialize(MapSerializer serializer) { + serializer + .addType(CLASS_NAME) + .add("path1Id", mPath1Id) + .add("path2Id", mPath2Id) + .add("tween", mTween, mOutTween) + .add("start", mStart, mOutStart) + .add("stop", mStop, mOutStop); + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java index 7f3c3ed6bcff..233e246d3868 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java @@ -123,6 +123,6 @@ public class FloatConstant extends Operation implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("id", mId).add("value", mValue); + serializer.addType(CLASS_NAME).add("id", mId).add("value", mValue); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java index c1fa898ec619..eba201bfb216 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java @@ -160,6 +160,9 @@ public class FloatExpression extends Operation implements VariableSupport, Seria mLastAnimatedValue = lastComputedValue; context.loadFloat(mId, lastComputedValue); context.needsRepaint(); + if (mFloatAnimation.isPropagate()) { + markDirty(); + } } } else if (mSpring != null) { float lastComputedValue = mSpring.get(t - mLastChange); @@ -169,8 +172,12 @@ public class FloatExpression extends Operation implements VariableSupport, Seria context.needsRepaint(); } } else { - float v = - mExp.eval(context.getCollectionsAccess(), mPreCalcValue, mPreCalcValue.length); + float v = 0; + try { + v = mExp.eval(context.getCollectionsAccess(), mPreCalcValue, mPreCalcValue.length); + } catch (Exception e) { + throw new RuntimeException(this.toString() + " len = " + mPreCalcValue.length, e); + } if (mFloatAnimation != null) { mFloatAnimation.setTargetValue(v); } @@ -344,7 +351,7 @@ public class FloatExpression extends Operation implements VariableSupport, Seria public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.EXPRESSION) - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("id", mId) .addFloatExpressionSrc("srcValues", mSrcValue) .add("animation", mFloatAnimation); diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatFunctionCall.java b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatFunctionCall.java index eccc00a18308..85592948438f 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatFunctionCall.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatFunctionCall.java @@ -32,8 +32,10 @@ import com.android.internal.widget.remotecompose.core.documentation.Documentatio import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation; import com.android.internal.widget.remotecompose.core.operations.utilities.AnimatedFloatExpression; import com.android.internal.widget.remotecompose.core.operations.utilities.NanMap; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** This provides the command to call a floatfunction defined in floatfunction */ @@ -182,4 +184,13 @@ public class FloatFunctionCall extends PaintOperation implements VariableSupport } mFunction.execute(remoteContext); } + + @Override + public void serialize(MapSerializer serializer) { + serializer + .addType(CLASS_NAME) + .add("id", mId) + .add("args", Collections.singletonList(mArgs)) + .add("outArgs", Collections.singletonList(mOutArgs)); + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ImageAttribute.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ImageAttribute.java index fb4a5e4848c2..9ef1b3b1ad6a 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/ImageAttribute.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ImageAttribute.java @@ -26,7 +26,9 @@ import com.android.internal.widget.remotecompose.core.PaintContext; import com.android.internal.widget.remotecompose.core.PaintOperation; import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; +import java.util.Collections; import java.util.List; /** Operation to extract meta Attributes from image data objects */ @@ -162,4 +164,25 @@ public class ImageAttribute extends PaintOperation { break; } } + + @Override + public void serialize(MapSerializer serializer) { + serializer + .addType(CLASS_NAME) + .add("id", mId) + .add("imageId", mImageId) + .add("args", Collections.singletonList(mArgs)) + .addType(typeToString()); + } + + private String typeToString() { + switch (mType) { + case IMAGE_WIDTH: + return "IMAGE_WIDTH"; + case IMAGE_HEIGHT: + return "IMAGE_HEIGHT"; + default: + return "INVALID_TYPE"; + } + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java index 2a5260c0c9b1..53b3c89f3aa8 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java @@ -233,7 +233,7 @@ public class IntegerExpression extends Operation implements VariableSupport, Ser public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.EXPRESSION) - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("id", mId) .add("mask", mId) .addIntExpressionSrc("srcValues", mSrcValue, mMask); diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRestore.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRestore.java index 64df19d8a04f..d2b38f42e966 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRestore.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRestore.java @@ -102,6 +102,6 @@ public class MatrixRestore extends PaintOperation implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME); + serializer.addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRotate.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRotate.java index 9c4df0b54d60..5990b4bdfad7 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRotate.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRotate.java @@ -114,6 +114,6 @@ public class MatrixRotate extends DrawBase3 { @Override public void serialize(MapSerializer serializer) { - serialize(serializer, "rotate", "pivotX", "pivotY").add("type", CLASS_NAME); + serialize(serializer, "rotate", "pivotX", "pivotY").addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSave.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSave.java index 0e6de0db3b28..06da1565bf3a 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSave.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSave.java @@ -100,6 +100,6 @@ public class MatrixSave extends PaintOperation implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME); + serializer.addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixScale.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixScale.java index b6e5cbcf388a..20d406569223 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixScale.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixScale.java @@ -106,6 +106,6 @@ public class MatrixScale extends DrawBase4 { @Override public void serialize(MapSerializer serializer) { - serialize(serializer, "scaleX", "scaleY", "pivotX", "pivotY").add("type", CLASS_NAME); + serialize(serializer, "scaleX", "scaleY", "pivotX", "pivotY").addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSkew.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSkew.java index f9a589c598aa..6d1c503c3284 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSkew.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSkew.java @@ -103,6 +103,6 @@ public class MatrixSkew extends DrawBase2 { @Override public void serialize(MapSerializer serializer) { - serialize(serializer, "skewX", "skewY").add("type", CLASS_NAME); + serialize(serializer, "skewX", "skewY").addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixTranslate.java b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixTranslate.java index de783bfc7ae8..e21f13355679 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixTranslate.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixTranslate.java @@ -102,6 +102,6 @@ public class MatrixTranslate extends DrawBase2 { @Override public void serialize(MapSerializer serializer) { - serialize(serializer, "dx", "dy").add("type", CLASS_NAME); + serialize(serializer, "dx", "dy").addType(CLASS_NAME); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java b/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java index 96628fd51225..9a880858b5a5 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java @@ -25,7 +25,6 @@ import com.android.internal.widget.remotecompose.core.Operations; import com.android.internal.widget.remotecompose.core.RemoteContext; import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder; -import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation; import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import com.android.internal.widget.remotecompose.core.serialize.Serializable; @@ -43,6 +42,8 @@ public class NamedVariable extends Operation implements Serializable { public static final int FLOAT_TYPE = 1; public static final int STRING_TYPE = 0; public static final int IMAGE_TYPE = 3; + public static final int INT_TYPE = 4; + public static final int LONG_TYPE = 5; public NamedVariable(int varId, int varType, @NonNull String name) { this.mVarId = varId; @@ -122,7 +123,7 @@ public class NamedVariable extends Operation implements Serializable { public static void documentation(@NonNull DocumentationBuilder doc) { doc.operation("Data Operations", OP_CODE, CLASS_NAME) .description("Add a string name for an ID") - .field(DocumentedOperation.INT, "varId", "id to label") + .field(INT, "varId", "id to label") .field(INT, "varType", "The type of variable") .field(UTF8, "name", "String"); } @@ -141,7 +142,7 @@ public class NamedVariable extends Operation implements Serializable { @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("varId", mVarId) .add("varName", mVarName) .add("varType", typeToString()); @@ -157,6 +158,8 @@ public class NamedVariable extends Operation implements Serializable { return "STRING_TYPE"; case IMAGE_TYPE: return "IMAGE_TYPE"; + case INT_TYPE: + return "INT_TYPE"; default: return "INVALID_TYPE"; } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java index 8389aa707ee6..70197c6d085d 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java @@ -131,6 +131,6 @@ public class PaintData extends PaintOperation implements VariableSupport, Serial @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("paintBundle", mPaintData); + serializer.addType(CLASS_NAME).add("paintBundle", mPaintData); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ParticlesLoop.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ParticlesLoop.java index 8d19c94df604..f9fdfdf09e35 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/ParticlesLoop.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ParticlesLoop.java @@ -33,6 +33,7 @@ import com.android.internal.widget.remotecompose.core.documentation.DocumentedOp import com.android.internal.widget.remotecompose.core.operations.layout.Container; import com.android.internal.widget.remotecompose.core.operations.utilities.AnimatedFloatExpression; import com.android.internal.widget.remotecompose.core.operations.utilities.NanMap; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import java.util.ArrayList; import java.util.List; @@ -292,4 +293,9 @@ public class ParticlesLoop extends PaintOperation implements VariableSupport, Co } } } + + @Override + public void serialize(MapSerializer serializer) { + serializer.addType(CLASS_NAME).add("id", mId); + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/PathAppend.java b/core/java/com/android/internal/widget/remotecompose/core/operations/PathAppend.java index 8f353ce4a26b..8a747e134897 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/PathAppend.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PathAppend.java @@ -258,9 +258,6 @@ public class PathAppend extends PaintOperation implements VariableSupport, Seria @Override public void serialize(MapSerializer serializer) { - serializer - .add("type", CLASS_NAME) - .add("id", mInstanceId) - .add("path", pathString(mFloatPath)); + serializer.addType(CLASS_NAME).add("id", mInstanceId).add("path", pathString(mFloatPath)); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/PathCreate.java b/core/java/com/android/internal/widget/remotecompose/core/operations/PathCreate.java index 7aa3390b53ee..78e3b9eac110 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/PathCreate.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PathCreate.java @@ -242,9 +242,6 @@ public class PathCreate extends PaintOperation implements VariableSupport, Seria @Override public void serialize(MapSerializer serializer) { - serializer - .add("type", CLASS_NAME) - .add("id", mInstanceId) - .add("path", pathString(mFloatPath)); + serializer.addType(CLASS_NAME).add("id", mInstanceId).add("path", pathString(mFloatPath)); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/PathData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/PathData.java index 9564f15209c7..cedc4f3b0e45 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/PathData.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PathData.java @@ -243,9 +243,6 @@ public class PathData extends Operation implements VariableSupport, Serializable @Override public void serialize(MapSerializer serializer) { - serializer - .add("type", CLASS_NAME) - .add("id", mInstanceId) - .add("path", pathString(mFloatPath)); + serializer.addType(CLASS_NAME).add("id", mInstanceId).add("path", pathString(mFloatPath)); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/PathTween.java b/core/java/com/android/internal/widget/remotecompose/core/operations/PathTween.java index c5add57d4dd0..09b29e8c5e5c 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/PathTween.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PathTween.java @@ -161,7 +161,7 @@ public class PathTween extends PaintOperation implements VariableSupport, Serial @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("outId", mOutId) .add("pathId1", mPathId1) .add("pathId2", mPathId2) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java b/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java index a6a8a810d2ad..214d240a39fd 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java @@ -133,6 +133,6 @@ public class RootContentDescription extends Operation @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("contentDescriptionId", mContentDescription); + serializer.addType(CLASS_NAME).add("contentDescriptionId", mContentDescription); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java index 5f6162b68e9e..013b6f64b91a 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java @@ -390,7 +390,7 @@ public class ShaderData extends Operation implements VariableSupport, Serializab @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("shaderTextId", mShaderTextId) .add("shaderID", mShaderID) .add("uniformRawFloatMap", mUniformRawFloatMap) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextAttribute.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextAttribute.java index 3e72995de9db..36f25c6ce944 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextAttribute.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextAttribute.java @@ -173,7 +173,7 @@ public class TextAttribute extends PaintOperation implements Serializable { @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("id", mId) .add("textId", mTextId) .add("measureType", typeToString()); diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java index 419e6d074479..67773d1d6187 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java @@ -136,6 +136,6 @@ public class TextData extends Operation implements SerializableToString, Seriali @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("textId", mTextId).add("text", mText); + serializer.addType(CLASS_NAME).add("textId", mTextId).add("text", mText); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java index 6b2f49be76f0..f22369f51ce9 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java @@ -215,7 +215,7 @@ public class TextFromFloat extends Operation implements VariableSupport, Seriali @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("textId", mTextId) .add("value", mValue, mOutValue) .add("digitsBefore", mDigitsBefore) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookup.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookup.java index e8865c26db12..fa44bf165cd7 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookup.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookup.java @@ -156,7 +156,7 @@ public class TextLookup extends Operation implements VariableSupport, Serializab @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("textId", mTextId) .add("dataSetId", mDataSetId) .add("indexId", mIndex, mOutIndex); diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookupInt.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookupInt.java index de2025569d46..5ec3290c445d 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookupInt.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookupInt.java @@ -149,7 +149,7 @@ public class TextLookupInt extends Operation implements VariableSupport, Seriali @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("textId", mTextId) .add("dataSetId", mDataSetId) .add("indexId", mIndex, mOutIndex); diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextMeasure.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextMeasure.java index 58cd68e2a5db..3559d1dbe53b 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextMeasure.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextMeasure.java @@ -27,6 +27,7 @@ import com.android.internal.widget.remotecompose.core.PaintContext; import com.android.internal.widget.remotecompose.core.PaintOperation; import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import java.util.List; @@ -161,4 +162,33 @@ public class TextMeasure extends PaintOperation { break; } } + + @Override + public void serialize(MapSerializer serializer) { + serializer + .addType(CLASS_NAME) + .add("id", mId) + .add("textId", mTextId) + .add("measureType", typeToString()); + } + + private String typeToString() { + int val = mType & 255; + switch (val) { + case MEASURE_WIDTH: + return "MEASURE_WIDTH"; + case MEASURE_HEIGHT: + return "MEASURE_HEIGHT"; + case MEASURE_LEFT: + return "MEASURE_LEFT"; + case MEASURE_TOP: + return "MEASURE_TOP"; + case MEASURE_RIGHT: + return "MEASURE_RIGHT"; + case MEASURE_BOTTOM: + return "MEASURE_BOTTOM"; + default: + return "INVALID_TYPE"; + } + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java index 262916dd9d0c..1239b5648446 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java @@ -132,7 +132,7 @@ public class TextMerge extends Operation implements Serializable { @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("id", mTextId) .add("leftId", mSrcId1) .add("rightId", mSrcId2); diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TimeAttribute.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TimeAttribute.java index afb84b56d7b0..fd9a2bf5e435 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/TimeAttribute.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TimeAttribute.java @@ -27,12 +27,14 @@ import com.android.internal.widget.remotecompose.core.PaintOperation; import com.android.internal.widget.remotecompose.core.RemoteContext; import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import com.android.internal.widget.remotecompose.core.types.LongConstant; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.Arrays; +import java.util.Collections; import java.util.List; /** Operation to perform time related calculation */ @@ -292,4 +294,48 @@ public class TimeAttribute extends PaintOperation { break; } } + + @Override + public void serialize(MapSerializer serializer) { + serializer + .addType(CLASS_NAME) + .add("id", mId) + .add("timeId", mTimeId) + .addType(getTypeString()) + .add("args", Collections.singletonList(mArgs)); + } + + private String getTypeString() { + int val = mType & 255; + switch (val) { + case TIME_FROM_NOW_SEC: + return "TIME_FROM_NOW_SEC"; + case TIME_FROM_NOW_MIN: + return "TIME_FROM_NOW_MIN"; + case TIME_FROM_NOW_HR: + return "TIME_FROM_NOW_HR"; + case TIME_FROM_ARG_SEC: + return "TIME_FROM_ARG_SEC"; + case TIME_FROM_ARG_MIN: + return "TIME_FROM_ARG_MIN"; + case TIME_FROM_ARG_HR: + return "TIME_FROM_ARG_HR"; + case TIME_IN_SEC: + return "TIME_IN_SEC"; + case TIME_IN_MIN: + return "TIME_IN_MIN"; + case TIME_IN_HR: + return "TIME_IN_HR"; + case TIME_DAY_OF_MONTH: + return "TIME_DAY_OF_MONTH"; + case TIME_MONTH_VALUE: + return "TIME_MONTH_VALUE"; + case TIME_DAY_OF_WEEK: + return "TIME_DAY_OF_WEEK"; + case TIME_YEAR: + return "TIME_YEAR"; + default: + return "INVALID_TIME_TYPE"; + } + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TouchExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TouchExpression.java index 2591a4c39778..f24672922367 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/TouchExpression.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TouchExpression.java @@ -716,9 +716,9 @@ public class TouchExpression extends Operation @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("id", mId) - .add("mDefValue", mDefValue, mOutDefValue) + .add("defValue", mDefValue, mOutDefValue) .add("min", mMin, mOutMin) .add("max", mMax, mOutMax) .add("mode", mMode) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/AnimatableValue.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/AnimatableValue.java index 9dc2a49d26ef..b98a017addb3 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/AnimatableValue.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/AnimatableValue.java @@ -129,6 +129,6 @@ public class AnimatableValue implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", "AnimatableValue").add("id", mId); + serializer.addType("AnimatableValue").add("id", mId); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/CanvasOperations.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/CanvasOperations.java index 3e7f1d304315..25a10ab7dbeb 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/CanvasOperations.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/CanvasOperations.java @@ -156,7 +156,7 @@ public class CanvasOperations extends PaintOperation @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("list", mList); + serializer.addType(CLASS_NAME).add("list", mList); } /** diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ClickModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ClickModifierOperation.java index 8b13c13a3333..7ee14903ced5 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ClickModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ClickModifierOperation.java @@ -253,6 +253,6 @@ public class ClickModifierOperation extends PaintOperation @Override public void serialize(MapSerializer serializer) { - serializer.addTags(SerializeTags.MODIFIER).add("type", "ClickModifierOperation"); + serializer.addTags(SerializeTags.MODIFIER).addType("ClickModifierOperation"); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java index c73643682b55..b30dade828a7 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java @@ -57,8 +57,8 @@ public class Component extends PaintOperation protected float mHeight; @Nullable protected Component mParent; protected int mAnimationId = -1; - @NonNull public Visibility mVisibility = Visibility.VISIBLE; - @NonNull public Visibility mScheduledVisibility = Visibility.VISIBLE; + public int mVisibility = Visibility.VISIBLE; + public int mScheduledVisibility = Visibility.VISIBLE; @NonNull public ArrayList<Operation> mList = new ArrayList<>(); public PaintOperation mPreTranslate; // todo, can we initialize this here and make it NonNull? public boolean mNeedsMeasure = true; @@ -288,22 +288,42 @@ public class Component extends PaintOperation } /** - * Returns the intrinsic width of the layout + * Returns the min intrinsic width of the layout * * @param context * @return the width in pixels */ - public float intrinsicWidth(@Nullable RemoteContext context) { + public float minIntrinsicWidth(@Nullable RemoteContext context) { return getWidth(); } /** - * Returns the intrinsic height of the layout + * Returns the max intrinsic width of the layout + * + * @param context + * @return the width in pixels + */ + public float maxIntrinsicWidth(@Nullable RemoteContext context) { + return getWidth(); + } + + /** + * Returns the min intrinsic height of the layout + * + * @param context + * @return the height in pixels + */ + public float minIntrinsicHeight(@Nullable RemoteContext context) { + return getHeight(); + } + + /** + * Returns the max intrinsic height of the layout * * @param context * @return the height in pixels */ - public float intrinsicHeight(@Nullable RemoteContext context) { + public float maxIntrinsicHeight(@Nullable RemoteContext context) { return getHeight(); } @@ -338,10 +358,119 @@ public class Component extends PaintOperation // Nothing here } - public enum Visibility { - GONE, - VISIBLE, - INVISIBLE + public static class Visibility { + + public static final int GONE = 0; + public static final int VISIBLE = 1; + public static final int INVISIBLE = 2; + public static final int OVERRIDE_GONE = 16; + public static final int OVERRIDE_VISIBLE = 32; + public static final int OVERRIDE_INVISIBLE = 64; + public static final int CLEAR_OVERRIDE = 128; + + /** + * Returns a string representation of the field + * + * @param value + * @return + */ + public static String toString(int value) { + switch (value) { + case GONE: + return "GONE"; + case VISIBLE: + return "VISIBLE"; + case INVISIBLE: + return "INVISIBLE"; + } + if ((value >> 4) > 0) { + if ((value & OVERRIDE_GONE) == OVERRIDE_GONE) { + return "OVERRIDE_GONE"; + } + if ((value & OVERRIDE_VISIBLE) == OVERRIDE_VISIBLE) { + return "OVERRIDE_VISIBLE"; + } + if ((value & OVERRIDE_INVISIBLE) == OVERRIDE_INVISIBLE) { + return "OVERRIDE_INVISIBLE"; + } + } + return "" + value; + } + + /** + * Returns true if gone + * + * @param value + * @return + */ + public static boolean isGone(int value) { + if ((value >> 4) > 0) { + return (value & OVERRIDE_GONE) == OVERRIDE_GONE; + } + return value == GONE; + } + + /** + * Returns true if visible + * + * @param value + * @return + */ + public static boolean isVisible(int value) { + if ((value >> 4) > 0) { + return (value & OVERRIDE_VISIBLE) == OVERRIDE_VISIBLE; + } + return value == VISIBLE; + } + + /** + * Returns true if invisible + * + * @param value + * @return + */ + public static boolean isInvisible(int value) { + if ((value >> 4) > 0) { + return (value & OVERRIDE_INVISIBLE) == OVERRIDE_INVISIBLE; + } + return value == INVISIBLE; + } + + /** + * Returns true if the field has an override + * + * @param value + * @return + */ + public static boolean hasOverride(int value) { + return (value >> 4) > 0; + } + + /** + * Clear the override values + * + * @param value + * @return + */ + public static int clearOverride(int value) { + return value & 15; + } + + /** + * Add an override value + * + * @param value + * @param visibility + * @return + */ + public static int add(int value, int visibility) { + int v = value & 15; + v += visibility; + if ((v & CLEAR_OVERRIDE) == CLEAR_OVERRIDE) { + v = v & 15; + } + return v; + } } /** @@ -350,13 +479,28 @@ public class Component extends PaintOperation * @return */ public boolean isVisible() { - if (mVisibility != Visibility.VISIBLE || mParent == null) { - return mVisibility == Visibility.VISIBLE; - } - if (mParent != null) { // TODO: this is always true -- bbade@ - return mParent.isVisible(); + if (mParent == null || !Visibility.isVisible(mVisibility)) { + return Visibility.isVisible(mVisibility); } - return true; + return mParent.isVisible(); + } + + /** + * Returns true if the component is gone + * + * @return + */ + public boolean isGone() { + return Visibility.isGone(mVisibility); + } + + /** + * Returns true if the component is invisible + * + * @return + */ + public boolean isInvisible() { + return Visibility.isInvisible(mVisibility); } /** @@ -364,7 +508,7 @@ public class Component extends PaintOperation * * @param visibility can be VISIBLE, INVISIBLE or GONE */ - public void setVisibility(@NonNull Visibility visibility) { + public void setVisibility(int visibility) { if (visibility != mVisibility || visibility != mScheduledVisibility) { mScheduledVisibility = visibility; invalidateMeasure(); @@ -705,7 +849,7 @@ public class Component extends PaintOperation + "] " + textContent() + " Visibility (" - + mVisibility + + Visibility.toString(mVisibility) + ") "; } @@ -732,7 +876,7 @@ public class Component extends PaintOperation + ", " + mHeight + "] " - + mVisibility; + + Visibility.toString(mVisibility); // + " [" + mNeedsMeasure + ", " + mNeedsRepaint + "]" serializer.append(indent, content); } @@ -966,7 +1110,7 @@ public class Component extends PaintOperation if (applyAnimationAsNeeded(context)) { return; } - if (mVisibility == Visibility.GONE || mVisibility == Visibility.INVISIBLE) { + if (isGone() || isInvisible()) { return; } paintingComponent(context); @@ -1071,13 +1215,13 @@ public class Component extends PaintOperation @Override public void serialize(MapSerializer serializer) { serializer.addTags(SerializeTags.COMPONENT); - serializer.add("type", getSerializedName()); + serializer.addType(getSerializedName()); serializer.add("id", mComponentId); serializer.add("x", mX); serializer.add("y", mY); serializer.add("width", mWidth); serializer.add("height", mHeight); - serializer.add("visibility", mVisibility); + serializer.add("visibility", Visibility.toString(mVisibility)); serializer.add("list", mList); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseOperation.java index e277d49325be..0e629c5d2448 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseOperation.java @@ -27,6 +27,7 @@ import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder; import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation; import com.android.internal.widget.remotecompose.core.operations.Utils; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; import java.util.ArrayList; import java.util.List; @@ -228,4 +229,12 @@ public class ImpulseOperation extends PaintOperation implements VariableSupport, public void setProcess(ImpulseProcess impulseProcess) { mProcess = impulseProcess; } + + @Override + public void serialize(MapSerializer serializer) { + serializer + .addType(CLASS_NAME) + .add("duration", mDuration, mOutDuration) + .add("startAt", mStartAt, mOutStartAt); + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseProcess.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseProcess.java index 8c9dd76c9ed5..83d4d38be66e 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseProcess.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseProcess.java @@ -157,6 +157,6 @@ public class ImpulseProcess extends PaintOperation @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("list", mList); + serializer.addType(CLASS_NAME).add("list", mList); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LoopOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LoopOperation.java index 2b63cf246555..dda328f57a3b 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LoopOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LoopOperation.java @@ -206,12 +206,12 @@ public class LoopOperation extends PaintOperation @Override public void serialize(MapSerializer serializer) { serializer - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("indexVariableId", mIndexVariableId) .add("until", mUntil, mUntilOut) .add("from", mFrom, mFromOut) .add("step", mStep, mStepOut) - .add("mUntilOut", mUntilOut) + .add("untilOut", mUntilOut) .add("list", mList); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/RootLayoutComponent.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/RootLayoutComponent.java index f2503b26513e..77d3dae74558 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/RootLayoutComponent.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/RootLayoutComponent.java @@ -77,7 +77,7 @@ public class RootLayoutComponent extends Component { + " x " + mHeight + ") " - + mVisibility; + + Visibility.toString(mVisibility); } @Override @@ -97,7 +97,7 @@ public class RootLayoutComponent extends Component { + ", " + mHeight + "] " - + mVisibility); + + Visibility.toString(mVisibility)); } /** @@ -282,6 +282,6 @@ public class RootLayoutComponent extends Component { public void serialize(MapSerializer serializer) { super.serialize(serializer); serializer.addTags(SerializeTags.COMPONENT); - serializer.add("type", "RootLayoutComponent"); + serializer.addType("RootLayoutComponent"); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchCancelModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchCancelModifierOperation.java index 62b1b6cf9615..283bc7a45f85 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchCancelModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchCancelModifierOperation.java @@ -129,6 +129,6 @@ public class TouchCancelModifierOperation extends ListActionsOperation implement @Override public void serialize(MapSerializer serializer) { super.serialize(serializer); - serializer.add("type", "TouchCancelModifierOperation"); + serializer.addType("TouchCancelModifierOperation"); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchDownModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchDownModifierOperation.java index 5289fda2c74b..b010c148d122 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchDownModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchDownModifierOperation.java @@ -131,6 +131,6 @@ public class TouchDownModifierOperation extends ListActionsOperation implements @Override public void serialize(MapSerializer serializer) { super.serialize(serializer); - serializer.add("type", "TouchDownModifierOperation"); + serializer.addType("TouchDownModifierOperation"); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchUpModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchUpModifierOperation.java index 576c5e9281a4..bc5c10b86c96 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchUpModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/TouchUpModifierOperation.java @@ -129,6 +129,6 @@ public class TouchUpModifierOperation extends ListActionsOperation implements To @Override public void serialize(MapSerializer serializer) { super.serialize(serializer); - serializer.add("type", "TouchUpModifierOperation"); + serializer.addType("TouchUpModifierOperation"); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimateMeasure.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimateMeasure.java index e5cd485967e8..1a60451ddd3b 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimateMeasure.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimateMeasure.java @@ -143,7 +143,7 @@ public class AnimateMeasure { */ public void paint(@NonNull PaintContext context) { if (mOriginal.getVisibility() != mTarget.getVisibility()) { - if (mTarget.getVisibility() == Component.Visibility.GONE) { + if (mTarget.isGone()) { switch (mExitAnimation) { case PARTICLE: // particleAnimation(context, component, original, target, vp) @@ -229,8 +229,7 @@ public class AnimateMeasure { mParticleAnimation.animate(context, mComponent, mOriginal, mTarget, mVp); break; } - } else if (mOriginal.getVisibility() == Component.Visibility.GONE - && mTarget.getVisibility() == Component.Visibility.VISIBLE) { + } else if (mOriginal.isGone() && mTarget.isVisible()) { switch (mEnterAnimation) { case ROTATE: float px = mTarget.getX() + mTarget.getW() / 2f; @@ -323,7 +322,7 @@ public class AnimateMeasure { } else { mComponent.paintingComponent(context); } - } else if (mTarget.getVisibility() == Component.Visibility.VISIBLE) { + } else if (mTarget.isVisible()) { mComponent.paintingComponent(context); } @@ -360,7 +359,7 @@ public class AnimateMeasure { public float getVisibility() { if (mOriginal.getVisibility() == mTarget.getVisibility()) { return 1f; - } else if (mTarget.getVisibility() == Component.Visibility.VISIBLE) { + } else if (mTarget.isVisible()) { return mVp; } else { return 1 - mVp; @@ -382,7 +381,7 @@ public class AnimateMeasure { float targetY = mTarget.getY(); float targetW = mTarget.getW(); float targetH = mTarget.getH(); - Component.Visibility targetVisibility = mTarget.getVisibility(); + int targetVisibility = mTarget.getVisibility(); if (targetX != measure.getX() || targetY != measure.getY() || targetW != measure.getW() @@ -393,7 +392,13 @@ public class AnimateMeasure { mTarget.setW(measure.getW()); mTarget.setH(measure.getH()); mTarget.setVisibility(measure.getVisibility()); - mStartTime = currentTime; + // We shouldn't reset the leftover animation time here + // 1/ if we are eg fading out a component, and an updateTarget comes on, we don't want + // to restart the full animation time + // 2/ if no visibility change but quick updates come in (eg live resize) it seems + // better as well to not restart the animation time and only allows the original + // time to wrap up + // mStartTime = currentTime; } } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimationSpec.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimationSpec.java index 91348f5810a1..c87bbdc9809d 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimationSpec.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/animation/AnimationSpec.java @@ -129,7 +129,7 @@ public class AnimationSpec extends Operation implements ModifierOperation { @Override public void serialize(MapSerializer serializer) { serializer - .add("type", "AnimationSpec") + .addType("AnimationSpec") .add("motionDuration", getMotionDuration()) .add("motionEasingType", Easing.getString(getMotionEasingType())) .add("visibilityDuration", getVisibilityDuration()) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/BoxLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/BoxLayout.java index 35d639e65385..6ee18bbbd7e0 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/BoxLayout.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/BoxLayout.java @@ -115,8 +115,10 @@ public class BoxLayout extends LayoutManager { for (Component c : mChildrenComponents) { c.measure(context, 0f, maxWidth, 0f, maxHeight, measure); ComponentMeasure m = measure.get(c); - size.setWidth(Math.max(size.getWidth(), m.getW())); - size.setHeight(Math.max(size.getHeight(), m.getH())); + if (!m.isGone()) { + size.setWidth(Math.max(size.getWidth(), m.getW())); + size.setHeight(Math.max(size.getHeight(), m.getH())); + } } // add padding size.setWidth(Math.max(size.getWidth(), computeModifierDefinedWidth(context.getContext()))); diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CanvasLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CanvasLayout.java index 508b685b5407..f9111dffe2c4 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CanvasLayout.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CanvasLayout.java @@ -154,7 +154,7 @@ public class CanvasLayout extends BoxLayout { @Override public void serialize(MapSerializer serializer) { super.serialize(serializer); - serializer.add("type", getSerializedName()); + serializer.addType(getSerializedName()); serializer.add("horizontalPositioning", mHorizontalPositioning); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CollapsibleColumnLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CollapsibleColumnLayout.java index afc41b1873ef..b0089525af5a 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CollapsibleColumnLayout.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CollapsibleColumnLayout.java @@ -21,6 +21,7 @@ import android.annotation.Nullable; import com.android.internal.widget.remotecompose.core.Operation; import com.android.internal.widget.remotecompose.core.Operations; import com.android.internal.widget.remotecompose.core.PaintContext; +import com.android.internal.widget.remotecompose.core.RemoteContext; import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.operations.layout.Component; import com.android.internal.widget.remotecompose.core.operations.layout.measure.ComponentMeasure; @@ -134,6 +135,24 @@ public class CollapsibleColumnLayout extends ColumnLayout { } @Override + public float minIntrinsicHeight(@NonNull RemoteContext context) { + float height = computeModifierDefinedHeight(context); + if (!mChildrenComponents.isEmpty()) { + height += mChildrenComponents.get(0).minIntrinsicHeight(context); + } + return height; + } + + @Override + public float minIntrinsicWidth(@NonNull RemoteContext context) { + float width = computeModifierDefinedWidth(context); + if (!mChildrenComponents.isEmpty()) { + width += mChildrenComponents.get(0).minIntrinsicWidth(context); + } + return width; + } + + @Override protected boolean hasVerticalIntrinsicDimension() { return true; } @@ -147,29 +166,54 @@ public class CollapsibleColumnLayout extends ColumnLayout { boolean verticalWrap, @NonNull MeasurePass measure, @NonNull Size size) { - super.computeWrapSize( - context, maxWidth, Float.MAX_VALUE, horizontalWrap, verticalWrap, measure, size); - } + int visibleChildren = 0; + ComponentMeasure self = measure.get(this); + self.addVisibilityOverride(Visibility.OVERRIDE_VISIBLE); + float currentMaxHeight = maxHeight; + for (Component c : mChildrenComponents) { + if (c instanceof CollapsibleColumnLayout) { + c.measure(context, 0f, maxWidth, 0f, currentMaxHeight, measure); + } else { + c.measure(context, 0f, maxWidth, 0f, Float.MAX_VALUE, measure); + } + ComponentMeasure m = measure.get(c); + if (!m.isGone()) { + size.setWidth(Math.max(size.getWidth(), m.getW())); + size.setHeight(size.getHeight() + m.getH()); + visibleChildren++; + currentMaxHeight -= m.getH(); + } + } + if (!mChildrenComponents.isEmpty()) { + size.setHeight(size.getHeight() + (mSpacedBy * (visibleChildren - 1))); + } - @Override - public boolean applyVisibility( - float selfWidth, float selfHeight, @NonNull MeasurePass measure) { float childrenWidth = 0f; float childrenHeight = 0f; - boolean changedVisibility = false; + + boolean overflow = false; for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (overflow || childMeasure.isGone()) { + childMeasure.addVisibilityOverride(Visibility.OVERRIDE_GONE); continue; } - if (childrenHeight + childMeasure.getH() > selfHeight) { - childMeasure.setVisibility(Visibility.GONE); - changedVisibility = true; + float childHeight = childMeasure.getH(); + boolean childDoesNotFits = childrenHeight + childHeight > maxHeight; + if (childDoesNotFits) { + childMeasure.addVisibilityOverride(Visibility.OVERRIDE_GONE); + overflow = true; } else { - childrenHeight += childMeasure.getH(); + childrenHeight += childHeight; childrenWidth = Math.max(childrenWidth, childMeasure.getW()); + visibleChildren++; } } - return changedVisibility; + if (verticalWrap) { + size.setHeight(Math.min(maxHeight, childrenHeight)); + } + if (visibleChildren == 0 || size.getHeight() <= 0f) { + self.addVisibilityOverride(Visibility.OVERRIDE_GONE); + } } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CollapsibleRowLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CollapsibleRowLayout.java index 0e7eb8676f46..05f332960c16 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CollapsibleRowLayout.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/CollapsibleRowLayout.java @@ -21,6 +21,7 @@ import android.annotation.Nullable; import com.android.internal.widget.remotecompose.core.Operation; import com.android.internal.widget.remotecompose.core.Operations; import com.android.internal.widget.remotecompose.core.PaintContext; +import com.android.internal.widget.remotecompose.core.RemoteContext; import com.android.internal.widget.remotecompose.core.WireBuffer; import com.android.internal.widget.remotecompose.core.operations.layout.Component; import com.android.internal.widget.remotecompose.core.operations.layout.measure.ComponentMeasure; @@ -139,6 +140,24 @@ public class CollapsibleRowLayout extends RowLayout { } @Override + public float minIntrinsicWidth(@NonNull RemoteContext context) { + float width = computeModifierDefinedWidth(context); + if (!mChildrenComponents.isEmpty()) { + width += mChildrenComponents.get(0).minIntrinsicWidth(context); + } + return width; + } + + @Override + public float minIntrinsicHeight(@NonNull RemoteContext context) { + float height = computeModifierDefinedHeight(context); + if (!mChildrenComponents.isEmpty()) { + height += mChildrenComponents.get(0).minIntrinsicHeight(context); + } + return height; + } + + @Override public void computeWrapSize( @NonNull PaintContext context, float maxWidth, @@ -157,19 +176,35 @@ public class CollapsibleRowLayout extends RowLayout { float childrenWidth = 0f; float childrenHeight = 0f; boolean changedVisibility = false; + int visibleChildren = 0; + ComponentMeasure self = measure.get(this); + self.clearVisibilityOverride(); + if (selfWidth <= 0 || selfHeight <= 0) { + self.addVisibilityOverride(Visibility.OVERRIDE_GONE); + return true; + } for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + int visibility = childMeasure.getVisibility(); + childMeasure.clearVisibilityOverride(); + if (!childMeasure.isVisible()) { continue; } - if (childrenWidth + childMeasure.getW() > selfWidth) { - childMeasure.setVisibility(Visibility.GONE); - changedVisibility = true; + if (childrenWidth + childMeasure.getW() > selfWidth + && childrenHeight + childMeasure.getH() > selfHeight) { + childMeasure.addVisibilityOverride(Visibility.OVERRIDE_GONE); + if (visibility != childMeasure.getVisibility()) { + changedVisibility = true; + } } else { childrenWidth += childMeasure.getW(); childrenHeight = Math.max(childrenHeight, childMeasure.getH()); + visibleChildren++; } } + if (visibleChildren == 0) { + self.addVisibilityOverride(Visibility.OVERRIDE_GONE); + } return changedVisibility; } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/ColumnLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/ColumnLayout.java index 47a55b6ed82a..cda90c2d3b0b 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/ColumnLayout.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/ColumnLayout.java @@ -138,7 +138,7 @@ public class ColumnLayout extends LayoutManager { for (Component c : mChildrenComponents) { c.measure(context, 0f, maxWidth, 0f, currentMaxHeight, measure); ComponentMeasure m = measure.get(c); - if (m.getVisibility() != Visibility.GONE) { + if (!m.isGone()) { size.setWidth(Math.max(size.getWidth(), m.getW())); size.setHeight(size.getHeight() + m.getH()); visibleChildrens++; @@ -164,7 +164,7 @@ public class ColumnLayout extends LayoutManager { for (Component child : mChildrenComponents) { child.measure(context, minWidth, maxWidth, minHeight, mh, measure); ComponentMeasure m = measure.get(child); - if (m.getVisibility() != Visibility.GONE) { + if (!m.isGone()) { mh -= m.getH(); } } @@ -172,11 +172,11 @@ public class ColumnLayout extends LayoutManager { } @Override - public float intrinsicHeight(@NonNull RemoteContext context) { + public float minIntrinsicHeight(@NonNull RemoteContext context) { float height = computeModifierDefinedHeight(context); float componentHeights = 0f; for (Component c : mChildrenComponents) { - componentHeights += c.intrinsicHeight(context); + componentHeights += c.minIntrinsicHeight(context); } return Math.max(height, componentHeights); } @@ -225,7 +225,7 @@ public class ColumnLayout extends LayoutManager { float totalWeights = 0f; for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } if (child instanceof LayoutComponent @@ -242,7 +242,7 @@ public class ColumnLayout extends LayoutManager { if (child instanceof LayoutComponent && ((LayoutComponent) child).getHeightModifier().hasWeight()) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } float weight = ((LayoutComponent) child).getHeightModifier().getValue(); @@ -280,7 +280,7 @@ public class ColumnLayout extends LayoutManager { int visibleChildrens = 0; for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } childrenWidth = Math.max(childrenWidth, childMeasure.getW()); @@ -307,17 +307,22 @@ public class ColumnLayout extends LayoutManager { case SPACE_BETWEEN: for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } total += childMeasure.getH(); } - verticalGap = (selfHeight - total) / (visibleChildrens - 1); + if (visibleChildrens > 1) { + verticalGap = (selfHeight - total) / (visibleChildrens - 1); + } else { + // we center the element + ty = (selfHeight - childrenHeight) / 2f; + } break; case SPACE_EVENLY: for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } total += childMeasure.getH(); @@ -328,7 +333,7 @@ public class ColumnLayout extends LayoutManager { case SPACE_AROUND: for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } total += childMeasure.getH(); @@ -353,7 +358,7 @@ public class ColumnLayout extends LayoutManager { } childMeasure.setX(tx); childMeasure.setY(ty); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } ty += childMeasure.getH(); diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/FitBoxLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/FitBoxLayout.java new file mode 100644 index 000000000000..ff7a3af11f20 --- /dev/null +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/FitBoxLayout.java @@ -0,0 +1,371 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.internal.widget.remotecompose.core.operations.layout.managers; + +import static com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation.INT; + +import android.annotation.NonNull; +import android.annotation.Nullable; + +import com.android.internal.widget.remotecompose.core.Operation; +import com.android.internal.widget.remotecompose.core.Operations; +import com.android.internal.widget.remotecompose.core.PaintContext; +import com.android.internal.widget.remotecompose.core.WireBuffer; +import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder; +import com.android.internal.widget.remotecompose.core.operations.layout.Component; +import com.android.internal.widget.remotecompose.core.operations.layout.LayoutComponent; +import com.android.internal.widget.remotecompose.core.operations.layout.measure.ComponentMeasure; +import com.android.internal.widget.remotecompose.core.operations.layout.measure.MeasurePass; +import com.android.internal.widget.remotecompose.core.operations.layout.measure.Size; +import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.HeightInModifierOperation; +import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.HeightModifierOperation; +import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.WidthInModifierOperation; +import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.WidthModifierOperation; +import com.android.internal.widget.remotecompose.core.serialize.MapSerializer; + +import java.util.List; + +/** FitBox layout implementation -- only display the child that fits in the available space */ +public class FitBoxLayout extends LayoutManager { + + public static final int START = 1; + public static final int CENTER = 2; + public static final int END = 3; + public static final int TOP = 4; + public static final int BOTTOM = 5; + + int mHorizontalPositioning; + int mVerticalPositioning; + + public FitBoxLayout( + @Nullable Component parent, + int componentId, + int animationId, + float x, + float y, + float width, + float height, + int horizontalPositioning, + int verticalPositioning) { + super(parent, componentId, animationId, x, y, width, height); + mHorizontalPositioning = horizontalPositioning; + mVerticalPositioning = verticalPositioning; + } + + public FitBoxLayout( + @Nullable Component parent, + int componentId, + int animationId, + int horizontalPositioning, + int verticalPositioning) { + this( + parent, + componentId, + animationId, + 0, + 0, + 0, + 0, + horizontalPositioning, + verticalPositioning); + } + + @NonNull + @Override + public String toString() { + return "BOX [" + + mComponentId + + ":" + + mAnimationId + + "] (" + + mX + + ", " + + mY + + " - " + + mWidth + + " x " + + mHeight + + ") " + + mVisibility; + } + + @NonNull + @Override + protected String getSerializedName() { + return "FITBOX"; + } + + @Override + public void computeWrapSize( + @NonNull PaintContext context, + float maxWidth, + float maxHeight, + boolean horizontalWrap, + boolean verticalWrap, + @NonNull MeasurePass measure, + @NonNull Size size) { + + boolean found = false; + ComponentMeasure self = measure.get(this); + for (Component c : mChildrenComponents) { + float cw = 0f; // c.intrinsicWidth(context.getContext()); + float ch = 0f; // c.intrinsicHeight(context.getContext()); + if (c instanceof LayoutComponent) { + LayoutComponent lc = (LayoutComponent) c; + WidthModifierOperation widthModifier = lc.getWidthModifier(); + if (widthModifier != null) { + WidthInModifierOperation widthIn = lc.getWidthModifier().getWidthIn(); + if (widthIn != null) { + cw = widthIn.getMin(); + } + } + HeightModifierOperation heightModifier = lc.getHeightModifier(); + if (heightModifier != null) { + HeightInModifierOperation heightIn = lc.getHeightModifier().getHeightIn(); + if (heightIn != null) { + ch = heightIn.getMin(); + } + } + } + c.measure(context, 0f, maxWidth, 0f, maxHeight, measure); + ComponentMeasure m = measure.get(c); + if (!found && cw <= maxWidth && ch <= maxHeight) { + found = true; + m.addVisibilityOverride(Visibility.OVERRIDE_VISIBLE); + size.setWidth(m.getW()); + size.setHeight(m.getH()); + } else { + m.addVisibilityOverride(Visibility.OVERRIDE_GONE); + } + } + if (!found) { + self.setVisibility(Visibility.GONE); + } else { + self.setVisibility(Visibility.VISIBLE); + } + + // add padding + size.setWidth(Math.max(size.getWidth(), computeModifierDefinedWidth(context.getContext()))); + size.setHeight( + Math.max(size.getHeight(), computeModifierDefinedHeight(context.getContext()))); + } + + @Override + public void computeSize( + @NonNull PaintContext context, + float minWidth, + float maxWidth, + float minHeight, + float maxHeight, + @NonNull MeasurePass measure) { + + ComponentMeasure self = measure.get(this); + boolean found = false; + for (Component c : mChildrenComponents) { + float cw = 0f; + float ch = 0f; + if (c instanceof LayoutComponent) { + LayoutComponent lc = (LayoutComponent) c; + WidthModifierOperation widthModifier = lc.getWidthModifier(); + if (widthModifier != null) { + WidthInModifierOperation widthIn = lc.getWidthModifier().getWidthIn(); + if (widthIn != null) { + cw = widthIn.getMin(); + } + } + HeightModifierOperation heightModifier = lc.getHeightModifier(); + if (heightModifier != null) { + HeightInModifierOperation heightIn = lc.getHeightModifier().getHeightIn(); + if (heightIn != null) { + ch = heightIn.getMin(); + } + } + } + c.measure(context, minWidth, maxWidth, minHeight, maxHeight, measure); + // child.measure(context, minWidth, Float.MAX_VALUE, minHeight, + // Float.MAX_VALUE, measure); + // m.getVisibility().clearOverride(); + ComponentMeasure m = measure.get(c); + // m.setVisibility(Visibility.GONE); + // m.getVisibility().add(Visibility.OVERRIDE_GONE); + // m.getVisibility().add(Visibility.OVERRIDE_GONE); + m.clearVisibilityOverride(); + if (!found && cw <= maxWidth && ch <= maxHeight) { + found = true; + m.addVisibilityOverride(Visibility.OVERRIDE_VISIBLE); + } else { + m.addVisibilityOverride(Visibility.OVERRIDE_GONE); + } + } + } + + @Override + public void internalLayoutMeasure(@NonNull PaintContext context, @NonNull MeasurePass measure) { + ComponentMeasure selfMeasure = measure.get(this); + float selfWidth = selfMeasure.getW() - mPaddingLeft - mPaddingRight; + float selfHeight = selfMeasure.getH() - mPaddingTop - mPaddingBottom; + applyVisibility(selfWidth, selfHeight, measure); + for (Component child : mChildrenComponents) { + ComponentMeasure m = measure.get(child); + float tx = 0f; + float ty = 0f; + switch (mVerticalPositioning) { + case TOP: + ty = 0f; + break; + case CENTER: + ty = (selfHeight - m.getH()) / 2f; + break; + case BOTTOM: + ty = selfHeight - m.getH(); + break; + } + switch (mHorizontalPositioning) { + case START: + tx = 0f; + break; + case CENTER: + tx = (selfWidth - m.getW()) / 2f; + break; + case END: + tx = selfWidth - m.getW(); + break; + } + m.setX(tx); + m.setY(ty); + } + } + + /** + * The name of the class + * + * @return the name + */ + @NonNull + public static String name() { + return "BoxLayout"; + } + + /** + * The OP_CODE for this command + * + * @return the opcode + */ + public static int id() { + return Operations.LAYOUT_FIT_BOX; + } + + /** + * Write the operation to the buffer + * + * @param buffer a WireBuffer + * @param componentId the component id + * @param animationId the component animation id + * @param horizontalPositioning the horizontal positioning rules + * @param verticalPositioning the vertical positioning rules + */ + public static void apply( + @NonNull WireBuffer buffer, + int componentId, + int animationId, + int horizontalPositioning, + int verticalPositioning) { + buffer.start(id()); + buffer.writeInt(componentId); + buffer.writeInt(animationId); + buffer.writeInt(horizontalPositioning); + buffer.writeInt(verticalPositioning); + } + + /** + * Read this operation and add it to the list of operations + * + * @param buffer the buffer to read + * @param operations the list of operations that will be added to + */ + public static void read(@NonNull WireBuffer buffer, @NonNull List<Operation> operations) { + int componentId = buffer.readInt(); + int animationId = buffer.readInt(); + int horizontalPositioning = buffer.readInt(); + int verticalPositioning = buffer.readInt(); + operations.add( + new FitBoxLayout( + null, + componentId, + animationId, + horizontalPositioning, + verticalPositioning)); + } + + /** + * Populate the documentation with a description of this operation + * + * @param doc to append the description to. + */ + public static void documentation(@NonNull DocumentationBuilder doc) { + doc.operation("Layout Operations", id(), name()) + .description( + "FitBox layout implementation.\n\n" + + "Only display the first child component that fits in the available" + + " space") + .examplesDimension(150, 100) + .exampleImage("Top", "layout-BoxLayout-start-top.png") + .exampleImage("Center", "layout-BoxLayout-center-center.png") + .exampleImage("Bottom", "layout-BoxLayout-end-bottom.png") + .field(INT, "COMPONENT_ID", "unique id for this component") + .field( + INT, + "ANIMATION_ID", + "id used to match components," + " for animation purposes") + .field(INT, "HORIZONTAL_POSITIONING", "horizontal positioning value") + .possibleValues("START", FitBoxLayout.START) + .possibleValues("CENTER", FitBoxLayout.CENTER) + .possibleValues("END", FitBoxLayout.END) + .field(INT, "VERTICAL_POSITIONING", "vertical positioning value") + .possibleValues("TOP", FitBoxLayout.TOP) + .possibleValues("CENTER", FitBoxLayout.CENTER) + .possibleValues("BOTTOM", FitBoxLayout.BOTTOM); + } + + @Override + public void write(@NonNull WireBuffer buffer) { + apply(buffer, mComponentId, mAnimationId, mHorizontalPositioning, mVerticalPositioning); + } + + @Override + public void serialize(MapSerializer serializer) { + super.serialize(serializer); + serializer.add("verticalPositioning", getPositioningString(mVerticalPositioning)); + serializer.add("horizontalPositioning", getPositioningString(mHorizontalPositioning)); + } + + private String getPositioningString(int pos) { + switch (pos) { + case START: + return "START"; + case CENTER: + return "CENTER"; + case END: + return "END"; + case TOP: + return "TOP"; + case BOTTOM: + return "BOTTOM"; + default: + return "NONE"; + } + } +} diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/LayoutManager.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/LayoutManager.java index 8b52bbe5cdf8..5b66b95cf1dd 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/LayoutManager.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/LayoutManager.java @@ -73,19 +73,19 @@ public abstract class LayoutManager extends LayoutComponent implements Measurabl } @Override - public float intrinsicHeight(@Nullable RemoteContext context) { + public float minIntrinsicHeight(@Nullable RemoteContext context) { float height = computeModifierDefinedHeight(context); for (Component c : mChildrenComponents) { - height = Math.max(c.intrinsicHeight(context), height); + height = Math.max(c.minIntrinsicHeight(context), height); } return height; } @Override - public float intrinsicWidth(@Nullable RemoteContext context) { + public float minIntrinsicWidth(@Nullable RemoteContext context) { float width = computeModifierDefinedWidth(context); for (Component c : mChildrenComponents) { - width = Math.max(c.intrinsicWidth(context), width); + width = Math.max(c.minIntrinsicWidth(context), width); } return width; } @@ -149,10 +149,10 @@ public abstract class LayoutManager extends LayoutComponent implements Measurabl Math.min(maxHeight, computeModifierDefinedHeight(context.getContext())); if (mWidthModifier.isIntrinsicMin()) { - maxWidth = intrinsicWidth(context.getContext()) + mPaddingLeft + mPaddingRight; + maxWidth = minIntrinsicWidth(context.getContext()) + mPaddingLeft + mPaddingRight; } if (mHeightModifier.isIntrinsicMin()) { - maxHeight = intrinsicHeight(context.getContext()) + mPaddingTop + mPaddingBottom; + maxHeight = minIntrinsicHeight(context.getContext()) + mPaddingTop + mPaddingBottom; } float insetMaxWidth = maxWidth - mPaddingLeft - mPaddingRight; @@ -171,6 +171,11 @@ public abstract class LayoutManager extends LayoutComponent implements Measurabl mHeightModifier.isWrap(), measure, mCachedWrapSize); + int selfVisibilityAfterMeasure = measure.get(this).getVisibility(); + if (Visibility.hasOverride(selfVisibilityAfterMeasure) + && mScheduledVisibility != selfVisibilityAfterMeasure) { + mScheduledVisibility = selfVisibilityAfterMeasure; + } measuredWidth = mCachedWrapSize.getWidth(); if (hasHorizontalWrap) { measuredWidth += mPaddingLeft + mPaddingRight; diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/RowLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/RowLayout.java index e93cbd74b0b5..d5d2e03c3f2a 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/RowLayout.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/RowLayout.java @@ -136,7 +136,7 @@ public class RowLayout extends LayoutManager { for (Component c : mChildrenComponents) { c.measure(context, 0f, currentMaxWidth, 0f, maxHeight, measure); ComponentMeasure m = measure.get(c); - if (m.getVisibility() != Visibility.GONE) { + if (!m.isGone()) { size.setWidth(size.getWidth() + m.getW()); size.setHeight(Math.max(size.getHeight(), m.getH())); visibleChildrens++; @@ -162,7 +162,7 @@ public class RowLayout extends LayoutManager { for (Component child : mChildrenComponents) { child.measure(context, minWidth, mw, minHeight, maxHeight, measure); ComponentMeasure m = measure.get(child); - if (m.getVisibility() != Visibility.GONE) { + if (!m.isGone()) { mw -= m.getW(); } } @@ -170,16 +170,26 @@ public class RowLayout extends LayoutManager { } @Override - public float intrinsicWidth(@Nullable RemoteContext context) { + public float minIntrinsicWidth(@Nullable RemoteContext context) { float width = computeModifierDefinedWidth(context); float componentWidths = 0f; for (Component c : mChildrenComponents) { - componentWidths += c.intrinsicWidth(context); + componentWidths += c.minIntrinsicWidth(context); } return Math.max(width, componentWidths); } @Override + public float minIntrinsicHeight(@Nullable RemoteContext context) { + float height = computeModifierDefinedHeight(context); + float componentHeights = 0f; + for (Component c : mChildrenComponents) { + componentHeights = Math.max(componentHeights, c.minIntrinsicHeight(context)); + } + return Math.max(height, componentHeights); + } + + @Override public void internalLayoutMeasure(@NonNull PaintContext context, @NonNull MeasurePass measure) { ComponentMeasure selfMeasure = measure.get(this); DebugLog.s( @@ -225,7 +235,7 @@ public class RowLayout extends LayoutManager { float totalWeights = 0f; for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } if (child instanceof LayoutComponent @@ -245,7 +255,7 @@ public class RowLayout extends LayoutManager { if (child instanceof LayoutComponent && ((LayoutComponent) child).getWidthModifier().hasWeight()) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } float weight = ((LayoutComponent) child).getWidthModifier().getValue(); @@ -283,7 +293,7 @@ public class RowLayout extends LayoutManager { int visibleChildrens = 0; for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } childrenWidth += childMeasure.getW(); @@ -311,17 +321,22 @@ public class RowLayout extends LayoutManager { case SPACE_BETWEEN: for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } total += childMeasure.getW(); } - horizontalGap = (selfWidth - total) / (visibleChildrens - 1); + if (visibleChildrens > 1) { + horizontalGap = (selfWidth - total) / (visibleChildrens - 1); + } else { + // we center the element + tx = (selfWidth - childrenWidth) / 2f; + } break; case SPACE_EVENLY: for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } total += childMeasure.getW(); @@ -332,7 +347,7 @@ public class RowLayout extends LayoutManager { case SPACE_AROUND: for (Component child : mChildrenComponents) { ComponentMeasure childMeasure = measure.get(child); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } total += childMeasure.getW(); @@ -357,7 +372,7 @@ public class RowLayout extends LayoutManager { } childMeasure.setX(tx); childMeasure.setY(ty); - if (childMeasure.getVisibility() == Visibility.GONE) { + if (childMeasure.isGone()) { continue; } tx += childMeasure.getW(); diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/StateLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/StateLayout.java index ee16bc2f4459..0192d8438a75 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/StateLayout.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/StateLayout.java @@ -413,7 +413,7 @@ public class StateLayout extends LayoutManager { if (index != currentLayoutIndex && index != previousLayoutIndex) { pane.mVisibility = Visibility.GONE; } - if (index == currentLayoutIndex && pane.mVisibility != Visibility.VISIBLE) { + if (index == currentLayoutIndex && !pane.isVisible()) { pane.mVisibility = Visibility.VISIBLE; } index++; @@ -511,7 +511,7 @@ public class StateLayout extends LayoutManager { && previousLayout.mAnimateMeasure == null) { inTransition = false; LayoutManager previous = getLayout(previousLayoutIndex); - if (previous != currentLayout && previous.mVisibility != Visibility.GONE) { + if (previous != currentLayout && !previous.isGone()) { previous.mVisibility = Visibility.GONE; previous.needsRepaint(); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/TextLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/TextLayout.java index d5db74b5ca51..2595a71abaa5 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/TextLayout.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/TextLayout.java @@ -280,7 +280,7 @@ public class TextLayout extends LayoutManager implements VariableSupport, Access + " x " + mHeight + ") " - + mVisibility; + + Visibility.toString(mVisibility); } @NonNull @@ -308,7 +308,7 @@ public class TextLayout extends LayoutManager implements VariableSupport, Access + ", " + mHeight + "] " - + mVisibility + + Visibility.toString(mVisibility) + " (" + mTextId + ":\"" @@ -343,7 +343,7 @@ public class TextLayout extends LayoutManager implements VariableSupport, Access flags |= PaintContext.TEXT_COMPLEX; } context.getTextBounds(mTextId, 0, mCachedString.length(), flags, bounds); - if (bounds[2] - bounds[1] > maxWidth && mMaxLines > 1) { + if (bounds[2] - bounds[1] > maxWidth && mMaxLines > 1 && maxWidth > 0f) { mComputedTextLayout = context.layoutComplexText( mTextId, @@ -375,12 +375,12 @@ public class TextLayout extends LayoutManager implements VariableSupport, Access } @Override - public float intrinsicHeight(@Nullable RemoteContext context) { + public float minIntrinsicHeight(@Nullable RemoteContext context) { return mTextH; } @Override - public float intrinsicWidth(@Nullable RemoteContext context) { + public float minIntrinsicWidth(@Nullable RemoteContext context) { return mTextW; } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/measure/ComponentMeasure.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/measure/ComponentMeasure.java index 11ed9f435070..993441944c33 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/measure/ComponentMeasure.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/measure/ComponentMeasure.java @@ -26,7 +26,7 @@ public class ComponentMeasure { float mY; float mW; float mH; - @NonNull Component.Visibility mVisibility = Component.Visibility.VISIBLE; + int mVisibility = Component.Visibility.VISIBLE; public void setX(float value) { mX = value; @@ -60,16 +60,15 @@ public class ComponentMeasure { return mH; } - public @NonNull Component.Visibility getVisibility() { + public int getVisibility() { return mVisibility; } - public void setVisibility(@NonNull Component.Visibility visibility) { + public void setVisibility(int visibility) { mVisibility = visibility; } - public ComponentMeasure( - int id, float x, float y, float w, float h, @NonNull Component.Visibility visibility) { + public ComponentMeasure(int id, float x, float y, float w, float h, int visibility) { this.mId = id; this.mX = x; this.mY = y; @@ -114,4 +113,42 @@ public class ComponentMeasure { public boolean same(@NonNull ComponentMeasure m) { return mX == m.mX && mY == m.mY && mW == m.mW && mH == m.mH && mVisibility == m.mVisibility; } + + /** + * Returns true if the component will be gone + * + * @return true if gone + */ + public boolean isGone() { + return Component.Visibility.isGone(mVisibility); + } + + /** + * Returns true if the component will be visible + * + * @return true if visible + */ + public boolean isVisible() { + return Component.Visibility.isVisible(mVisibility); + } + + /** + * Returns true if the component will be invisible + * + * @return true if invisible + */ + public boolean isInvisible() { + return Component.Visibility.isInvisible(mVisibility); + } + + /** Clear any override on the visibility */ + public void clearVisibilityOverride() { + mVisibility = Component.Visibility.clearOverride(mVisibility); + } + + /** Add a visibility override */ + public void addVisibilityOverride(int value) { + mVisibility = Component.Visibility.clearOverride(mVisibility); + mVisibility = Component.Visibility.add(mVisibility, value); + } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java index fd5f8c9cdbe7..1ab0c3dc7fb8 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java @@ -228,7 +228,7 @@ public class BackgroundModifierOperation extends DecoratorModifierOperation { public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "BackgroundModifierOperation") + .addType("BackgroundModifierOperation") .add("x", mX) .add("y", mY) .add("width", mWidth) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java index e5f318307a75..656a3c0fca68 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java @@ -290,7 +290,7 @@ public class BorderModifierOperation extends DecoratorModifierOperation { public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "BorderModifierOperation") + .addType("BorderModifierOperation") .add("x", mX) .add("y", mY) .add("width", mWidth) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ClipRectModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ClipRectModifierOperation.java index 00a53170fc48..e96dc838fc91 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ClipRectModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ClipRectModifierOperation.java @@ -111,7 +111,7 @@ public class ClipRectModifierOperation extends DecoratorModifierOperation { public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "ClipRectModifierOperation") + .addType("ClipRectModifierOperation") .add("width", mWidth) .add("height", mHeight); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentModifiers.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentModifiers.java index a9e342144cc5..14b2fad5825d 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentModifiers.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentModifiers.java @@ -327,7 +327,7 @@ public class ComponentModifiers extends PaintOperation public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "ComponentModifiers") + .addType("ComponentModifiers") .add("modifiers", mList); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentVisibilityOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentVisibilityOperation.java index fbf8a95248b9..88b28c39eec6 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentVisibilityOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ComponentVisibilityOperation.java @@ -41,7 +41,7 @@ public class ComponentVisibilityOperation extends Operation private static final int OP_CODE = Operations.MODIFIER_VISIBILITY; int mVisibilityId; - @NonNull Component.Visibility mVisibility = Component.Visibility.VISIBLE; + int mVisibility = Component.Visibility.VISIBLE; private LayoutComponent mParent; public ComponentVisibilityOperation(int id) { @@ -124,11 +124,11 @@ public class ComponentVisibilityOperation extends Operation @Override public void updateVariables(@NonNull RemoteContext context) { int visibility = context.getInteger(mVisibilityId); - if (visibility == Component.Visibility.VISIBLE.ordinal()) { + if (Component.Visibility.isVisible(visibility)) { mVisibility = Component.Visibility.VISIBLE; - } else if (visibility == Component.Visibility.GONE.ordinal()) { + } else if (Component.Visibility.isGone(visibility)) { mVisibility = Component.Visibility.GONE; - } else if (visibility == Component.Visibility.INVISIBLE.ordinal()) { + } else if (Component.Visibility.isInvisible(visibility)) { mVisibility = Component.Visibility.INVISIBLE; } else { mVisibility = Component.Visibility.GONE; @@ -150,8 +150,8 @@ public class ComponentVisibilityOperation extends Operation public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "ComponentVisibilityOperation") + .addType("ComponentVisibilityOperation") .add("visibilityId", mVisibilityId) - .add("visibility", mVisibility); + .add("visibility", Component.Visibility.toString(mVisibility)); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DrawContentOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DrawContentOperation.java index d7abdbae4962..6beb13586163 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DrawContentOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DrawContentOperation.java @@ -120,6 +120,6 @@ public class DrawContentOperation extends Operation @Override public void serialize(MapSerializer serializer) { - serializer.addTags(SerializeTags.MODIFIER).add("type", "DrawContentOperation"); + serializer.addTags(SerializeTags.MODIFIER).addType("DrawContentOperation"); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/GraphicsLayerModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/GraphicsLayerModifierOperation.java index c1c1f9568ea8..361438b51a47 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/GraphicsLayerModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/GraphicsLayerModifierOperation.java @@ -352,7 +352,7 @@ public class GraphicsLayerModifierOperation extends DecoratorModifierOperation { public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "GraphicsLayerModifierOperation") + .addType("GraphicsLayerModifierOperation") .add("scaleX", mScaleX) .add("scaleX", mScaleX) .add("rotationX", mRotationX) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightInModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightInModifierOperation.java index 7f0dd8d8d8e5..9b63c034675a 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightInModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightInModifierOperation.java @@ -107,7 +107,7 @@ public class HeightInModifierOperation extends DimensionInModifierOperation { public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "HeightInModifierOperation") + .addType("HeightInModifierOperation") .add("min", mV1, mValue1) .add("max", mV2, mValue2); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightModifierOperation.java index 1df84257f344..5fbaafca5759 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HeightModifierOperation.java @@ -143,7 +143,7 @@ public class HeightModifierOperation extends DimensionModifierOperation { public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "HeightModifierOperation") + .addType("HeightModifierOperation") .add("height", mValue, mOutValue) .add("dimensionModifierType", mType); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostActionOperation.java index 67714ef5abac..4d8acb4f04e2 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostActionOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostActionOperation.java @@ -130,7 +130,7 @@ public class HostActionOperation extends Operation public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "HostActionOperation") + .addType("HostActionOperation") .add("id", mActionId); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostNamedActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostNamedActionOperation.java index 40c13f143468..807ff68fa965 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostNamedActionOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/HostNamedActionOperation.java @@ -157,7 +157,7 @@ public class HostNamedActionOperation extends Operation implements ActionOperati public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "HostNamedActionOperation") + .addType("HostNamedActionOperation") .add("textId", mTextId) .add("actionType", getActionType(mType)) .add("valueId", mValueId); diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/MarqueeModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/MarqueeModifierOperation.java index d2a1684a262a..c493e253d243 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/MarqueeModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/MarqueeModifierOperation.java @@ -247,8 +247,8 @@ public class MarqueeModifierOperation extends DecoratorModifierOperation impleme mComponentHeight = height; if (component instanceof LayoutComponent) { LayoutComponent layoutComponent = (LayoutComponent) component; - setContentWidth(layoutComponent.intrinsicWidth(context)); - setContentHeight(layoutComponent.intrinsicHeight(context)); + setContentWidth(layoutComponent.minIntrinsicWidth(context)); + setContentHeight(layoutComponent.minIntrinsicHeight(context)); } } @@ -256,7 +256,7 @@ public class MarqueeModifierOperation extends DecoratorModifierOperation impleme public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "MarqueeModifierOperation") + .addType("MarqueeModifierOperation") .add("iterations", mIterations) .add("animationMode", mAnimationMode) .add("repeatDelayMillis", mRepeatDelayMillis) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/OffsetModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/OffsetModifierOperation.java index b7fe97b0e936..37f56cbc02e1 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/OffsetModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/OffsetModifierOperation.java @@ -162,7 +162,7 @@ public class OffsetModifierOperation extends DecoratorModifierOperation { public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "OffsetModifierOperation") + .addType("OffsetModifierOperation") .add("x", mX) .add("y", mY); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/PaddingModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/PaddingModifierOperation.java index d5b3a0b09261..0156992650ed 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/PaddingModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/PaddingModifierOperation.java @@ -184,7 +184,7 @@ public class PaddingModifierOperation extends Operation implements ModifierOpera public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "PaddingModifierOperation") + .addType("PaddingModifierOperation") .add("left", mLeft) .add("top", mTop) .add("right", mRight) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RippleModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RippleModifierOperation.java index 69ace8478e08..eb5bfcff7d40 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RippleModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RippleModifierOperation.java @@ -217,7 +217,7 @@ public class RippleModifierOperation extends DecoratorModifierOperation implemen public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "RippleModifierOperation") + .addType("RippleModifierOperation") .add("animateRippleStart", mAnimateRippleStart) .add("animateRippleX", mAnimateRippleX) .add("animateRippleY", mAnimateRippleY) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RoundedClipRectModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RoundedClipRectModifierOperation.java index 8442e05e59df..f0ed905ac158 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RoundedClipRectModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RoundedClipRectModifierOperation.java @@ -167,7 +167,7 @@ public class RoundedClipRectModifierOperation extends DrawBase4 public void serialize(MapSerializer serializer) { serialize(serializer, "topStart", "topEnd", "bottomStart", "bottomEnd") .addTags(SerializeTags.MODIFIER) - .add("type", CLASS_NAME) + .addType(CLASS_NAME) .add("width", mWidth) .add("height", mHeight); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ScrollModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ScrollModifierOperation.java index a57365ec9132..466e435e20cf 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ScrollModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ScrollModifierOperation.java @@ -397,7 +397,7 @@ public class ScrollModifierOperation extends ListActionsOperation public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "ScrollModifierOperation") + .addType("ScrollModifierOperation") .add("direction", mDirection) .add("max", mMax) .add("notchMax", mNotchMax) diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueFloatChangeActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueFloatChangeActionOperation.java index bd91734602d9..171e2bed6b00 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueFloatChangeActionOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueFloatChangeActionOperation.java @@ -126,7 +126,7 @@ public class ValueFloatChangeActionOperation extends Operation implements Action public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER, SerializeTags.ACTION) - .add("type", "ValueFloatChangeActionOperation") + .addType("ValueFloatChangeActionOperation") .add("targetValueId", mTargetValueId) .add("value", mValue); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueFloatExpressionChangeActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueFloatExpressionChangeActionOperation.java index 4b18d0aaf0df..d8133f6715a8 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueFloatExpressionChangeActionOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueFloatExpressionChangeActionOperation.java @@ -133,7 +133,7 @@ public class ValueFloatExpressionChangeActionOperation extends Operation public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER, SerializeTags.ACTION) - .add("type", "ValueFloatExpressionChangeActionOperation") + .addType("ValueFloatExpressionChangeActionOperation") .add("targetValueId", mTargetValueId) .add("valueExpressionId", mValueExpressionId); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueIntegerChangeActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueIntegerChangeActionOperation.java index d86c4a6ad416..05a6fd0f10da 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueIntegerChangeActionOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueIntegerChangeActionOperation.java @@ -131,7 +131,7 @@ public class ValueIntegerChangeActionOperation extends Operation implements Acti public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER, SerializeTags.ACTION) - .add("type", "ValueIntegerChangeActionOperation") + .addType("ValueIntegerChangeActionOperation") .add("targetValueId", mTargetValueId) .add("value", mValue); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueIntegerExpressionChangeActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueIntegerExpressionChangeActionOperation.java index e253460d2afb..8994febe7f7c 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueIntegerExpressionChangeActionOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueIntegerExpressionChangeActionOperation.java @@ -133,7 +133,7 @@ public class ValueIntegerExpressionChangeActionOperation extends Operation public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER, SerializeTags.ACTION) - .add("type", "ValueIntegerExpressionChangeActionOperation") + .addType("ValueIntegerExpressionChangeActionOperation") .add("targetValueId", mTargetValueId) .add("valueExpressionId", mValueExpressionId); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueStringChangeActionOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueStringChangeActionOperation.java index e84b29922523..08960d3576f4 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueStringChangeActionOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ValueStringChangeActionOperation.java @@ -139,7 +139,7 @@ public class ValueStringChangeActionOperation extends Operation implements Actio public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER, SerializeTags.ACTION) - .add("type", "ValueIntegerExpressionChangeActionOperation") + .addType("ValueIntegerExpressionChangeActionOperation") .add("targetValueId", mTargetValueId) .add("valueId", mValueId); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthInModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthInModifierOperation.java index 3282a9cb5426..93074c79319f 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthInModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthInModifierOperation.java @@ -107,7 +107,7 @@ public class WidthInModifierOperation extends DimensionInModifierOperation { public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "WidthInModifierOperation") + .addType("WidthInModifierOperation") .add("min", mV1, mValue1) .add("max", mV2, mValue2); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthModifierOperation.java index 6fe5a70b7ad4..ebdafa2aaa89 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/WidthModifierOperation.java @@ -143,7 +143,7 @@ public class WidthModifierOperation extends DimensionModifierOperation { public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "WidthModifierOperation") + .addType("WidthModifierOperation") .add("width", mValue, mOutValue) .add("dimensionModifierType", mType); } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ZIndexModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ZIndexModifierOperation.java index f250951ab87e..ddb34b57e936 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ZIndexModifierOperation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/ZIndexModifierOperation.java @@ -147,7 +147,7 @@ public class ZIndexModifierOperation extends DecoratorModifierOperation { public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER) - .add("type", "ZIndexModifierOperation") + .addType("ZIndexModifierOperation") .add("value", mValue); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java index 0f17b114133d..55b64364e4e5 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java @@ -1248,7 +1248,7 @@ public class PaintBundle implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", "PaintBundle"); + serializer.addType("PaintBundle"); List<Map<String, Object>> list = new ArrayList<>(); int i = 0; while (i < mPos) { @@ -1336,6 +1336,7 @@ public class PaintBundle implements Serializable { serializer.add("operations", list); } + @SuppressWarnings("JdkImmutableCollections") private static Map<String, Object> getVariable(int value) { float fValue = Float.intBitsToFloat(value); if (Float.isNaN(fValue)) { @@ -1344,6 +1345,7 @@ public class PaintBundle implements Serializable { return orderedOf("type", "Value", "value", fValue); } + @SuppressWarnings("JdkImmutableCollections") private static int serializeGradient( int cmd, int[] array, int i, List<Map<String, Object>> list) { int ret = i; diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java index cad76059f7a4..349ab6117b2b 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java +++ b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java @@ -34,8 +34,10 @@ public class FloatAnimation extends Easing implements Serializable { private float mWrap = Float.NaN; private float mInitialValue = Float.NaN; private float mTargetValue = Float.NaN; + private int mDirectionalSnap = 0; // private float mScale = 1; float mOffset = 0; + private boolean mPropagate = false; @NonNull @Override @@ -161,11 +163,15 @@ public class FloatAnimation extends Easing implements Serializable { int type = 0; float wrapValue = Float.NaN; float initialValue = Float.NaN; + int directionalSnap = 0; + boolean propagate = false; if (mSpec.length > 1) { int num_type = Float.floatToRawIntBits(mSpec[1]); type = num_type & 0xFF; boolean wrap = ((num_type >> 8) & 0x1) > 0; boolean init = ((num_type >> 8) & 0x2) > 0; + directionalSnap = (num_type >> 10) & 0x3; + propagate = ((num_type >> 12) & 0x1) > 0; len = (num_type >> 16) & 0xFFFF; int off = 2 + len; if (init) { @@ -229,6 +235,12 @@ public class FloatAnimation extends Easing implements Serializable { if (!Float.isNaN(wrapValue)) { str += " wrap =" + wrapValue; } + if (directionalSnap != 0) { + str += " directionalSnap=" + directionalSnap; + } + if (propagate) { + str += " propagate"; + } return str; } @@ -246,6 +258,8 @@ public class FloatAnimation extends Easing implements Serializable { mType = num_type & 0xFF; boolean wrap = ((num_type >> 8) & 0x1) > 0; boolean init = ((num_type >> 8) & 0x2) > 0; + int directional = (num_type >> 10) & 0x3; + boolean propagate = ((num_type >> 12) & 0x1) > 0; len = (num_type >> 16) & 0xFFFF; int off = 2 + len; if (init) { @@ -254,6 +268,8 @@ public class FloatAnimation extends Easing implements Serializable { if (wrap) { mWrap = mSpec[off]; } + mDirectionalSnap = directional; + mPropagate = propagate; } create(mType, description, 2, len); } @@ -347,7 +363,13 @@ public class FloatAnimation extends Easing implements Serializable { float dist = wrapDistance(mWrap, mInitialValue, mTargetValue); if ((dist > 0) && (mTargetValue < mInitialValue)) { mTargetValue += mWrap; - } else if ((dist < 0) && (mTargetValue > mInitialValue)) { + } else if ((dist < 0) && mDirectionalSnap != 0) { + if (mDirectionalSnap == 1 && mTargetValue > mInitialValue) { + mInitialValue = mTargetValue; + } + if (mDirectionalSnap == 2 && mTargetValue < mInitialValue) { + mInitialValue = mTargetValue; + } mTargetValue -= mWrap; } } @@ -377,6 +399,14 @@ public class FloatAnimation extends Easing implements Serializable { /** get the value at time t in seconds since start */ @Override public float get(float t) { + if (mDirectionalSnap == 1 && mTargetValue < mInitialValue) { + mInitialValue = mTargetValue; + return mTargetValue; + } + if (mDirectionalSnap == 2 && mTargetValue > mInitialValue) { + mInitialValue = mTargetValue; + return mTargetValue; + } return mEasingCurve.get(t / mDuration) * (mTargetValue - mInitialValue) + mInitialValue; } @@ -387,6 +417,13 @@ public class FloatAnimation extends Easing implements Serializable { } /** + * @return if you should propagate the animation + */ + public boolean isPropagate() { + return mPropagate; + } + + /** * Get the initial value * * @return the initial value @@ -398,7 +435,7 @@ public class FloatAnimation extends Easing implements Serializable { @Override public void serialize(MapSerializer serializer) { serializer - .add("type", "FloatAnimation") + .addType("FloatAnimation") .add("initialValue", mInitialValue) .add("targetValue", mInitialValue) .add("duration", mInitialValue) diff --git a/core/java/com/android/internal/widget/remotecompose/core/semantics/CoreSemantics.java b/core/java/com/android/internal/widget/remotecompose/core/semantics/CoreSemantics.java index 08559fc21acb..424894a3e665 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/semantics/CoreSemantics.java +++ b/core/java/com/android/internal/widget/remotecompose/core/semantics/CoreSemantics.java @@ -161,7 +161,7 @@ public class CoreSemantics extends Operation implements AccessibilityModifier { public void serialize(MapSerializer serializer) { serializer .addTags(SerializeTags.MODIFIER, SerializeTags.A11Y) - .add("type", "CoreSemantics") + .addType("CoreSemantics") .add("contentDescriptionId", mContentDescriptionId) .add("role", mRole) .add("textId", mTextId) diff --git a/core/java/com/android/internal/widget/remotecompose/core/serialize/MapSerializer.java b/core/java/com/android/internal/widget/remotecompose/core/serialize/MapSerializer.java index f9ecf0f4f672..20e94ab5d898 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/serialize/MapSerializer.java +++ b/core/java/com/android/internal/widget/remotecompose/core/serialize/MapSerializer.java @@ -25,11 +25,17 @@ import java.util.Map; public interface MapSerializer { /** + * Adds a "type" field with this value + * + * @param type The name of the type + */ + MapSerializer addType(String type); + + /** * Add a float expression * - * @param key - * @param value - * @return + * @param key The key + * @param value The float src */ MapSerializer addFloatExpressionSrc(String key, float[] value); diff --git a/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java b/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java index cb759a61249a..0da543f3336c 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java +++ b/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java @@ -131,6 +131,6 @@ public class BooleanConstant extends Operation implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("id", mId).add("value", mValue); + serializer.addType(CLASS_NAME).add("id", mId).add("value", mValue); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java b/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java index c734f813ede3..bdc765968387 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java +++ b/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java @@ -123,6 +123,6 @@ public class IntegerConstant extends Operation implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("id", mId).add("value", mValue); + serializer.addType(CLASS_NAME).add("id", mId).add("value", mValue); } } diff --git a/core/java/com/android/internal/widget/remotecompose/core/types/LongConstant.java b/core/java/com/android/internal/widget/remotecompose/core/types/LongConstant.java index 50509f3636b3..d071e0a21d22 100644 --- a/core/java/com/android/internal/widget/remotecompose/core/types/LongConstant.java +++ b/core/java/com/android/internal/widget/remotecompose/core/types/LongConstant.java @@ -35,9 +35,13 @@ public class LongConstant extends Operation implements Serializable { private static final String CLASS_NAME = "LongConstant"; private static final int OP_CODE = Operations.DATA_LONG; - private final long mValue; + private long mValue; private final int mId; + /** + * @param id the id of the constant + * @param value the value of the constant + */ public LongConstant(int id, long value) { mId = id; mValue = value; @@ -52,6 +56,15 @@ public class LongConstant extends Operation implements Serializable { return mValue; } + /** + * Set the value of the long constant + * + * @param value the value to set it to + */ + public void setValue(long value) { + mValue = value; + } + @Override public void write(@NonNull WireBuffer buffer) { apply(buffer, mId, mValue); @@ -114,6 +127,6 @@ public class LongConstant extends Operation implements Serializable { @Override public void serialize(MapSerializer serializer) { - serializer.add("type", CLASS_NAME).add("id", mId).add("value", mValue); + serializer.addType(CLASS_NAME).add("id", mId).add("value", mValue); } } diff --git a/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java b/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java index 1d1e579ebc2f..1f9a27429067 100644 --- a/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java +++ b/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java @@ -388,6 +388,16 @@ public class RemoteComposePlayer extends FrameLayout implements RemoteContextAwa mInner.setColor(colorName, colorValue); } + /** + * This sets long based on its name. + * + * @param name Name of the color + * @param value The new long value + */ + public void setLong(String name, long value) { + mInner.setLong(name, value); + } + private void mapColors() { String[] name = getNamedColors(); diff --git a/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPaintContext.java b/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPaintContext.java index ac4a294b5e5e..b5aedd8d0231 100644 --- a/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPaintContext.java +++ b/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPaintContext.java @@ -290,8 +290,8 @@ public class AndroidPaintContext extends PaintContext { } if ((flags & PaintContext.TEXT_MEASURE_FONT_HEIGHT) != 0) { - bounds[1] = Math.round(mCachedFontMetrics.top); - bounds[3] = Math.round(mCachedFontMetrics.bottom); + bounds[1] = Math.round(mCachedFontMetrics.ascent); + bounds[3] = Math.round(mCachedFontMetrics.descent); } else { bounds[1] = mTmpRect.top; bounds[3] = mTmpRect.bottom; @@ -344,6 +344,7 @@ public class AndroidPaintContext extends PaintContext { default: } staticLayoutBuilder.setMaxLines(maxLines); + staticLayoutBuilder.setIncludePad(false); StaticLayout staticLayout = staticLayoutBuilder.build(); return new AndroidComputedTextLayout( diff --git a/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPlatformServices.java b/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPlatformServices.java index ba8d83bff51f..51c42fe111bd 100644 --- a/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPlatformServices.java +++ b/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidPlatformServices.java @@ -60,6 +60,14 @@ public class AndroidPlatformServices implements Platform { } @Override + public boolean isAlpha8Image(@NonNull Object image) { + if (image instanceof Bitmap) { + return ((Bitmap) image).getConfig().equals(Bitmap.Config.ALPHA_8); + } + return false; + } + + @Override @Nullable public float[] pathToFloatArray(@NonNull Object path) { // if (path is RemotePath) { diff --git a/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidRemoteContext.java b/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidRemoteContext.java index 14349b028819..b31c76056e38 100644 --- a/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidRemoteContext.java +++ b/core/java/com/android/internal/widget/remotecompose/player/platform/AndroidRemoteContext.java @@ -20,6 +20,7 @@ import android.annotation.Nullable; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; +import android.graphics.Paint; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.remotecompose.core.RemoteContext; @@ -30,6 +31,7 @@ import com.android.internal.widget.remotecompose.core.operations.FloatExpression import com.android.internal.widget.remotecompose.core.operations.ShaderData; import com.android.internal.widget.remotecompose.core.operations.utilities.ArrayAccess; import com.android.internal.widget.remotecompose.core.operations.utilities.DataMap; +import com.android.internal.widget.remotecompose.core.types.LongConstant; import java.io.IOException; import java.net.MalformedURLException; @@ -141,6 +143,16 @@ public class AndroidRemoteContext extends RemoteContext { } @Override + public void setNamedLong(String name, long value) { + VarName entry = mVarNameHashMap.get(name); + if (entry != null) { + int id = entry.mId; + LongConstant longConstant = (LongConstant) mRemoteComposeState.getObject(id); + longConstant.setValue(value); + } + } + + @Override public void setNamedDataOverride(String dataName, Object value) { if (mVarNameHashMap.get(dataName) != null) { int id = mVarNameHashMap.get(dataName).mId; @@ -215,6 +227,27 @@ public class AndroidRemoteContext extends RemoteContext { case BitmapData.TYPE_PNG_8888: image = BitmapFactory.decodeByteArray(data, 0, data.length); break; + case BitmapData.TYPE_PNG_ALPHA_8: + image = decodePreferringAlpha8(data); + + // If needed convert to ALPHA_8. + if (!image.getConfig().equals(Bitmap.Config.ALPHA_8)) { + Bitmap alpha8Bitmap = + Bitmap.createBitmap( + image.getWidth(), + image.getHeight(), + Bitmap.Config.ALPHA_8); + Canvas canvas = new Canvas(alpha8Bitmap); + Paint paint = new Paint(); + paint.setXfermode( + new android.graphics.PorterDuffXfermode( + android.graphics.PorterDuff.Mode.SRC)); + canvas.drawBitmap(image, 0, 0, paint); + image.recycle(); // Release resources + + image = alpha8Bitmap; + } + break; case BitmapData.TYPE_RAW8888: image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); int[] idata = new int[data.length / 4]; @@ -255,6 +288,12 @@ public class AndroidRemoteContext extends RemoteContext { } } + private Bitmap decodePreferringAlpha8(@NonNull byte[] data) { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inPreferredConfig = Bitmap.Config.ALPHA_8; + return BitmapFactory.decodeByteArray(data, 0, data.length, options); + } + @Override public void loadText(int id, @NonNull String text) { if (!mRemoteComposeState.containsId(id)) { diff --git a/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java b/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java index 4d2dd05ca603..29cd40def562 100644 --- a/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java +++ b/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java @@ -200,6 +200,16 @@ public class RemoteComposeCanvas extends FrameLayout implements View.OnAttachSta mARContext.setNamedColorOverride(colorName, colorValue); } + /** + * set the value of a long associated with this name. + * + * @param name Name of color typically "android.xxx" + * @param value the long value + */ + public void setLong(String name, long value) { + mARContext.setNamedLong(name, value); + } + public RemoteComposeDocument getDocument() { return mDocument; } |