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

Commit c92d70df authored by Jerome Gaillard's avatar Jerome Gaillard
Browse files

Deals with android:rotation attribute in layoutlib

The way Android views deal with their rotation xml attribute is through
native code called for hardware accelerated rendering. So layoutlib
has to bypass that in order to take those attributes into account.

Bug: http://b.android.com/73300
Change-Id: Ieb5bf0567a25a9021491ebf3250cedd0752f7863
parent b9c48d8f
Loading
Loading
Loading
Loading
+150 −0
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ package android.view;
import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;

import android.graphics.Matrix;

/**
 * Delegate implementing the native methods of {@link RenderNode}
 * <p/>
@@ -36,6 +38,14 @@ public class RenderNode_Delegate {


    private float mLift;
    private float mRotation;
    private float mPivotX;
    private float mPivotY;
    private boolean mPivotExplicitelySet;
    private int mLeft;
    private int mRight;
    private int mTop;
    private int mBottom;
    @SuppressWarnings("UnusedDeclaration")
    private String mName;

@@ -69,4 +79,144 @@ public class RenderNode_Delegate {
        }
        return 0f;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetRotation(long renderNode, float rotation) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mRotation != rotation) {
            delegate.mRotation = rotation;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static float nGetRotation(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            return delegate.mRotation;
        }
        return 0f;
    }

    @LayoutlibDelegate
    /*package*/ static void getMatrix(RenderNode renderNode, Matrix outMatrix) {
        outMatrix.reset();
        if (renderNode != null) {
            outMatrix.preRotate(renderNode.getRotation(), renderNode.getPivotX(),
                    renderNode.getPivotY());
        }
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetLeft(long renderNode, int left) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mLeft != left) {
            delegate.mLeft = left;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetTop(long renderNode, int top) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mTop != top) {
            delegate.mTop = top;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetRight(long renderNode, int right) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mRight != right) {
            delegate.mRight = right;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetBottom(long renderNode, int bottom) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mBottom != bottom) {
            delegate.mBottom = bottom;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetLeftTopRightBottom(long renderNode, int left, int top, int right,
            int bottom) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && (delegate.mLeft != left || delegate.mTop != top || delegate
                .mRight != right || delegate.mBottom != bottom)) {
            delegate.mLeft = left;
            delegate.mTop = top;
            delegate.mRight = right;
            delegate.mBottom = bottom;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nIsPivotExplicitlySet(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            return delegate.mPivotExplicitelySet;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetPivotX(long renderNode, float pivotX) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mPivotX != pivotX) {
            delegate.mPivotX = pivotX;
            delegate.mPivotExplicitelySet = true;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static float nGetPivotX(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            if (delegate.mPivotExplicitelySet) {
                return delegate.mPivotX;
            } else {
                return (delegate.mRight - delegate.mLeft) / 2.0f;
            }
        }
        return 0f;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetPivotY(long renderNode, float pivotY) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mPivotY != pivotY) {
            delegate.mPivotY = pivotY;
            delegate.mPivotExplicitelySet = true;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static float nGetPivotY(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            if (delegate.mPivotExplicitelySet) {
                return delegate.mPivotY;
            } else {
                return (delegate.mBottom - delegate.mTop) / 2.0f;
            }
        }
        return 0f;
    }
}
+13 −0
Original line number Diff line number Diff line
@@ -192,6 +192,19 @@ public final class CreateInfo implements ICreateInfo {
        "android.view.RenderNode#nDestroyRenderNode",
        "android.view.RenderNode#nSetElevation",
        "android.view.RenderNode#nGetElevation",
        "android.view.RenderNode#nSetRotation",
        "android.view.RenderNode#nGetRotation",
        "android.view.RenderNode#getMatrix",
        "android.view.RenderNode#nSetLeft",
        "android.view.RenderNode#nSetTop",
        "android.view.RenderNode#nSetRight",
        "android.view.RenderNode#nSetBottom",
        "android.view.RenderNode#nSetLeftTopRightBottom",
        "android.view.RenderNode#nSetPivotX",
        "android.view.RenderNode#nGetPivotX",
        "android.view.RenderNode#nSetPivotY",
        "android.view.RenderNode#nGetPivotY",
        "android.view.RenderNode#nIsPivotExplicitlySet",
        "android.view.ViewGroup#drawChild",
        "android.widget.SimpleMonthView#getTitle",
        "android.widget.SimpleMonthView#getDayOfWeekLabel",