Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5243502a authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Update to ToT RemoteCompose" into main

parents cb8d2c79 1aab5da7
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -118,6 +118,8 @@ public class CoreDocument implements Serializable {
    boolean mFirstPaint = true;
    private boolean mIsUpdateDoc = false;
    private int mHostExceptionID = 0;
    private int mBitmapMemory = 0;
    private int mBitmapCount = 0;

    public CoreDocument() {
        this(new SystemClock());
@@ -570,6 +572,15 @@ public class CoreDocument implements Serializable {
        return mHostExceptionID;
    }

    /**
     * Get the bitmap memory used by the document
     *
     * @return the bitmap memory used by the document
     */
    public int bitmapMemory() {
        return mBitmapMemory;
    }

    private interface Visitor {
        void visit(Operation op);
    }
@@ -825,7 +836,10 @@ public class CoreDocument implements Serializable {
                mFloatExpressions.put(expression.mId, expression);
            }
        }
        mBitmapMemory = 0;
        mBitmapCount = 0;
        mOperations = inflateComponents(mOperations);

        mBuffer = buffer;
        for (Operation op : mOperations) {
            if (op instanceof RootLayoutComponent) {
@@ -854,6 +868,11 @@ public class CoreDocument implements Serializable {

        mLastId = -1;
        for (Operation o : operations) {
            if (o instanceof BitmapData) {
                BitmapData bitmap = (BitmapData) o;
                mBitmapMemory += bitmap.getHeight() * bitmap.getWidth() * 4;
                mBitmapCount++;
            }
            if (o instanceof Container) {
                Container container = (Container) o;
                if (container instanceof Component) {
@@ -1116,7 +1135,9 @@ public class CoreDocument implements Serializable {
    /**
     * Programmatically trigger the click response for the given id
     *
     * @param context the context
     * @param id the click area id
     * @param metadata the metadata of the click event
     */
    public void performClick(@NonNull RemoteContext context, int id, @NonNull String metadata) {
        for (ClickAreaRepresentation clickArea : mClickAreas) {
@@ -1166,6 +1187,7 @@ public class CoreDocument implements Serializable {
    /**
     * Support touch drag events on commands supporting touch
     *
     * @param context the context
     * @param x position of touch
     * @param y position of touch
     */
@@ -1189,6 +1211,7 @@ public class CoreDocument implements Serializable {
    /**
     * Support touch down events on commands supporting touch
     *
     * @param context the context
     * @param x position of touch
     * @param y position of touch
     */
@@ -1207,8 +1230,11 @@ public class CoreDocument implements Serializable {
    /**
     * Support touch up events on commands supporting touch
     *
     * @param context the context
     * @param x position of touch
     * @param y position of touch
     * @param dx the x component of the drag vector
     * @param dy the y component of the drag vector
     */
    public void touchUp(@NonNull RemoteContext context, float x, float y, float dx, float dy) {
        context.loadFloat(RemoteContext.ID_TOUCH_POS_X, x);
@@ -1228,8 +1254,11 @@ public class CoreDocument implements Serializable {
    /**
     * Support touch cancel events on commands supporting touch
     *
     * @param context the context
     * @param x position of touch
     * @param y position of touch
     * @param dx the x component of the drag vector
     * @param dy the y component of the drag vector
     */
    public void touchCancel(@NonNull RemoteContext context, float x, float y, float dx, float dy) {
        if (mRootLayoutComponent != null) {
+11 −1
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ import com.android.internal.widget.remotecompose.core.operations.TextSubtext;
import com.android.internal.widget.remotecompose.core.operations.Theme;
import com.android.internal.widget.remotecompose.core.operations.TimeAttribute;
import com.android.internal.widget.remotecompose.core.operations.TouchExpression;
import com.android.internal.widget.remotecompose.core.operations.WakeIn;
import com.android.internal.widget.remotecompose.core.operations.layout.CanvasContent;
import com.android.internal.widget.remotecompose.core.operations.layout.CanvasOperations;
import com.android.internal.widget.remotecompose.core.operations.layout.ClickModifierOperation;
@@ -268,6 +269,7 @@ public class Operations {
    public static final int MATRIX_VECTOR_MATH = 188;
    public static final int DATA_FONT = 189;
    public static final int DRAW_TO_BITMAP = 190;
    public static final int WAKE_IN = 191;

    ///////////////////////////////////////// ======================

@@ -359,10 +361,12 @@ public class Operations {
    public static final int PROFILE_EXPERIMENTAL = 0x1;
    public static final int PROFILE_DEPRECATED = 0x2;
    public static final int PROFILE_OEM = 0x4;
    public static final int PROFILE_LOW_POWER = 0x8;

    // Intersected profiles
    public static final int PROFILE_WIDGETS = 0x100;
    public static final int PROFILE_ANDROIDX = 0x200;
    public static final int PROFILE_ANDROID_NATIVE = 0x400;

    /**
     * Returns true if the operation exists for the given api level
@@ -435,6 +439,7 @@ public class Operations {
            sMapV7AndroidX.put(DATA_SHADER, ShaderData::read);
            sMapV7AndroidX.put(DATA_FONT, FontData::read);
            sMapV7AndroidX.put(DRAW_TO_BITMAP, DrawToBitmap::read);
            sMapV7AndroidX.put(WAKE_IN, WakeIn::read);
        }
        return sMapV7AndroidX;
    }
@@ -523,6 +528,11 @@ public class Operations {
                if ((profiles & Operations.PROFILE_DEPRECATED) != 0) {
                    widgets.putAll(createMapV7_Widgets_Deprecated());
                }
                listProfiles.add(widgets);
            }
            if ((profiles & PROFILE_ANDROID_NATIVE) != 0) {
                throw new UnsupportedOperationException(
                        "Android native profiles are defined externally");
            }

            if (listProfiles.size() == 1) {
@@ -577,7 +587,7 @@ public class Operations {
        return result;
    }

    static class UniqueIntMap<T> extends IntMap<T> {
    public static class UniqueIntMap<T> extends IntMap<T> {
        @Override
        public T put(int key, @NonNull T value) {
            assert null == get(key) : "Opcode " + key + " already used in Operations !";
+15 −6
Original line number Diff line number Diff line
@@ -216,9 +216,9 @@ public abstract class PaintContext {
    /**
     * Replace the current paint with the PaintBundle
     *
     * @param paint
     * @param paintBundle
     */
    public abstract void replacePaint(@NonNull PaintBundle paint);
    public abstract void replacePaint(@NonNull PaintBundle paintBundle);

    /**
     * draw a round rect
@@ -331,10 +331,10 @@ public abstract class PaintContext {
     * @param path2Id
     * @param tween 0.0 = is path1 1.0 is path2
     * @param start
     * @param stop
     * @param end
     */
    public abstract void drawTweenPath(
            int path1Id, int path2Id, float tween, float start, float stop);
            int path1Id, int path2Id, float tween, float start, float end);

    /**
     * Interpolate between two path and return the resulting path
@@ -477,6 +477,15 @@ public abstract class PaintContext {
        mNeedsRepaint = true;
    }

    /**
     * Repaint in the given time
     *
     * @param seconds the delay in seconds to the next render loop pass
     */
    public void wakeIn(float seconds) {
        mContext.mRemoteComposeState.wakeIn(seconds);
    }

    /**
     * Starts a graphics layer
     *
@@ -502,10 +511,10 @@ public abstract class PaintContext {
    /**
     * Returns a String from an id
     *
     * @param textId
     * @param id
     * @return the string if found
     */
    public abstract @Nullable String getText(int textId);
    public abstract @Nullable String getText(int id);

    /**
     * Returns true if the document has been encoded for at least the given version MAJOR.MINOR
+40 −0
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ import com.android.internal.widget.remotecompose.core.operations.Theme;
import com.android.internal.widget.remotecompose.core.operations.TimeAttribute;
import com.android.internal.widget.remotecompose.core.operations.TouchExpression;
import com.android.internal.widget.remotecompose.core.operations.Utils;
import com.android.internal.widget.remotecompose.core.operations.WakeIn;
import com.android.internal.widget.remotecompose.core.operations.layout.CanvasContent;
import com.android.internal.widget.remotecompose.core.operations.layout.CanvasOperations;
import com.android.internal.widget.remotecompose.core.operations.layout.ComponentStart;
@@ -142,6 +143,7 @@ import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Set;

/** Provides an abstract buffer to encode/decode RemoteCompose operations */
public class RemoteComposeBuffer {
@@ -209,6 +211,7 @@ public class RemoteComposeBuffer {
     *
     * @param width the width of the document in pixels
     * @param height the height of the document in pixels
     * @param density the density of the document in pixels per device pixel
     * @param capabilities bitmask indicating needed capabilities (unused for now)
     */
    public void header(int width, int height, float density, long capabilities) {
@@ -240,6 +243,7 @@ public class RemoteComposeBuffer {
     * @param dstTop top coordinate of the destination area
     * @param dstRight right coordinate of the destination area
     * @param dstBottom bottom coordinate of the destination area
     * @param contentDescriptionId the content description of the image
     */
    public void drawBitmap(
            int imageId,
@@ -271,6 +275,7 @@ public class RemoteComposeBuffer {
    /**
     * look up map and return the id of the object looked up
     *
     * @param id the id of the data
     * @param mapId the map to access
     * @param strId the string to lookup
     */
@@ -673,6 +678,7 @@ public class RemoteComposeBuffer {
    /**
     * Create a TextFromFloat command which creates text from a Float.
     *
     * @param id The id of the text to create
     * @param value The value to convert
     * @param digitsBefore the digits before the decimal point
     * @param digitsAfter the digits after the decimal point
@@ -1087,6 +1093,7 @@ public class RemoteComposeBuffer {
    /**
     * Add a float that is a computation based on variables
     *
     * @param id the id of the float
     * @param value A RPN style float operation i.e. "4, 3, ADD" outputs 7
     */
    public void addAnimatedFloat(int id, @NonNull float ... value) {
@@ -1096,6 +1103,7 @@ public class RemoteComposeBuffer {
    /**
     * Add a float that is a computation based on variables. see packAnimation
     *
     * @param id the id of the float
     * @param value A RPN style float operation i.e. "4, 3, ADD" outputs 7
     * @param animation Array of floats that represents animation
     */
@@ -1111,6 +1119,7 @@ public class RemoteComposeBuffer {
     * @param min the minimum value
     * @param max the maximum value
     * @param velocityId the id for the velocity TODO support in v2
     * @param touchEffects the touch effects
     * @param exp The Float Expression
     * @param touchMode the touch up handling behaviour
     * @param touchSpec the touch up handling parameters
@@ -1144,6 +1153,7 @@ public class RemoteComposeBuffer {
    /**
     * measure the text and return a measure as a float
     *
     * @param id id of the measure
     * @param textId id of the text
     * @param mode the mode 0 is the width
     */
@@ -1154,6 +1164,7 @@ public class RemoteComposeBuffer {
    /**
     * measure the text and return the length of the text as float
     *
     * @param id id of the length op
     * @param textId id of the text
     */
    public void textLength(int id, int textId) {
@@ -1185,6 +1196,7 @@ public class RemoteComposeBuffer {
     *
     * @param id int map id
     * @param keys
     * @param types
     * @param listId
     */
    public void addMap(
@@ -1198,6 +1210,7 @@ public class RemoteComposeBuffer {
     * <p>TODO: do we want both a float and an int index version of this method? bbade@ TODO
     * for @hoford - add a unit test for this method
     *
     * @param id id of the text
     * @param dataSet
     * @param index index as a float variable
     */
@@ -1210,6 +1223,7 @@ public class RemoteComposeBuffer {
     *
     * <p>TODO for hoford - add a unit test for this method
     *
     * @param id id of the text
     * @param dataSet
     * @param index index as an int variable
     */
@@ -1220,6 +1234,7 @@ public class RemoteComposeBuffer {
    /**
     * Add and integer expression
     *
     * @param id the id of the expression
     * @param mask defines which elements are operators or variables
     * @param value array of values to calculate maximum 32
     */
@@ -1412,6 +1427,7 @@ public class RemoteComposeBuffer {
     * Add a scroll modifier
     *
     * @param direction HORIZONTAL(0) or VERTICAL(1)
     * @param max max scroll amount
     */
    public void addModifierScroll(int direction, float max) {
        ScrollModifierOperation.apply(mBuffer, direction, 0f, max, 0f);
@@ -1604,6 +1620,8 @@ public class RemoteComposeBuffer {
     * @param componentId component id
     * @param animationId animation id
     * @param bitmapId bitmap id
     * @param scaleType scale type
     * @param alpha alpha value
     */
    public void addImage(
            int componentId, int animationId, int bitmapId, int scaleType, float alpha) {
@@ -1745,6 +1763,7 @@ public class RemoteComposeBuffer {
     * @param fontStyle font style (0 : Normal, 1 : Italic)
     * @param fontWeight font weight (1 to 1000, normal is 400)
     * @param fontFamilyId font family or null
     * @param textAlign text alignment (0 : Center, 1 : Left, 2 : Right)
     * @param overflow
     * @param maxLines
     */
@@ -2064,6 +2083,18 @@ public class RemoteComposeBuffer {
        mBuffer.setVersion(documentApiLevel, profiles);
    }

    /**
     * Set current version of the buffer (typically for writing)
     *
     * @param documentApiLevel
     * @param supportedOperations
     */
    public void setVersion(int documentApiLevel, @NonNull Set<Integer> supportedOperations) {
        mApiLevel = documentApiLevel;

        mBuffer.setValidOperations(supportedOperations);
    }

    /**
     * Add a matrix constant
     *
@@ -2108,4 +2139,13 @@ public class RemoteComposeBuffer {
    public void addFont(int id, int type, @NonNull byte [] data) {
        FontData.apply(mBuffer, id, type, data);
    }

    /**
     * Add a wake in command
     *
     * @param seconds time to start the render loop
     */
    public void wakeIn(float seconds) {
        WakeIn.apply(mBuffer, seconds);
    }
}
+29 −4
Original line number Diff line number Diff line
@@ -39,6 +39,9 @@ public class RemoteComposeState implements CollectionsAccess {
    //    private static final int MAX_FLOATS = 500;
    private static int sMaxColors = 200;

    /** Offset added to bitmap to cache bitmap textures */
    public static final int BITMAP_TEXTURE_ID_OFFSET = 2000;

    private static final int MAX_DATA = 1000;
    private final IntMap<Object> mIntDataMap = new IntMap<>();
    private final IntMap<Boolean> mIntWrittenMap = new IntMap<>();
@@ -474,27 +477,49 @@ public class RemoteComposeState implements CollectionsAccess {
        return mVarListeners.get(id) != null;
    }

    float mLastRepaint = Float.NaN;

    /**
     * List of Commands that need to be updated
     *
     * @param context The context
     * @param currentTime The current time
     * @return The number of ops to update
     */
    public int getOpsToUpdate(@NonNull RemoteContext context, long currentTime) {
        if (mVarListeners.get(RemoteContext.ID_CONTINUOUS_SEC) != null) {
            return 1;
        }
        int repaintMs = Integer.MAX_VALUE;
        if (!Float.isNaN(mRepaintSeconds)) {
            repaintMs = (int) (mRepaintSeconds * 1000);
            mLastRepaint = mRepaintSeconds;
        }
        if (mVarListeners.get(RemoteContext.ID_TIME_IN_SEC) != null) {
            int sub = (int) (currentTime % 1000);
            return 2 + 1000 - sub;
            return Math.min(repaintMs, 2 + 1000 - sub);
        }
        if (mVarListeners.get(RemoteContext.ID_TIME_IN_MIN) != null) {
            int sub = (int) (currentTime % 60000);
            return 2 + 1000 * 60 - sub;
            return Math.min(repaintMs, 2 + 1000 * 60 - sub);
        }

        return -1;
    }

    float mRepaintSeconds = Float.NaN;

    /**
     * Set the amount of time to repaint the document
     *
     * @param seconds the delay in seconds to the next render loop pass
     */
    public void wakeIn(float seconds) {
        if (Float.isNaN(seconds) || Float.isNaN(mLastRepaint) || mRepaintSeconds > seconds) {
            mRepaintSeconds = seconds;
        }
    }

    /**
     * Set the width of the overall document on screen.
     *
@@ -542,8 +567,8 @@ public class RemoteComposeState implements CollectionsAccess {
    }

    @Override
    public int getId(int id, int index) {
        ArrayAccess array = mCollectionMap.get(id & 0xFFFFF);
    public int getId(int listId, int index) {
        ArrayAccess array = mCollectionMap.get(listId & 0xFFFFF);
        if (array != null) {
            return array.getId(index);
        }
Loading