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

Commit df68c911 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Make LD stateful / opacity management look more like DC"

parents 6fc01e04 eb727759
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -1128,8 +1128,6 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {

            createAllFutures();

            mCheckedOpacity = true;

            final int N = mNumChildren;
            final Drawable[] drawables = mDrawables;
            int op = (N > 0) ? drawables[0].getOpacity() : PixelFormat.TRANSPARENT;
@@ -1138,6 +1136,7 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
            }

            mOpacity = op;
            mCheckedOpacity = true;
            return op;
        }

@@ -1148,19 +1147,19 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {

            createAllFutures();

            mCheckedStateful = true;

            final int N = mNumChildren;
            final Drawable[] drawables = mDrawables;
            boolean isStateful = false;
            for (int i = 0; i < N; i++) {
                if (drawables[i].isStateful()) {
                    mStateful = true;
                    return true;
                    isStateful = true;
                    break;
                }
            }

            mStateful = false;
            return false;
            mStateful = isStateful;
            mCheckedStateful = true;
            return isStateful;
        }

        public void growArray(int oldSize, int newSize) {
+56 −56
Original line number Diff line number Diff line
@@ -137,7 +137,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
            layers[i].setCallback(this);
            mLayerState.mChildrenChangingConfigurations |= layers[i].getChangingConfigurations();
        }
        mLayerState.mNum = length;
        mLayerState.mNumChildren = length;
        mLayerState.mChildren = r;

        ensurePadding();
@@ -154,7 +154,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
     */
    LayerDrawable(@Nullable LayerState state, @Nullable Resources res) {
        mLayerState = createConstantState(state, res);
        if (mLayerState.mNum > 0) {
        if (mLayerState.mNumChildren > 0) {
            ensurePadding();
            refreshPadding();
        }
@@ -185,7 +185,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        a.recycle();

        final ChildDrawable[] array = state.mChildren;
        final int N = state.mNum;
        final int N = state.mNumChildren;
        for (int i = 0; i < N; i++) {
            final ChildDrawable layer = array[i];
            layer.setDensity(density);
@@ -217,7 +217,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        }

        final ChildDrawable[] array = state.mChildren;
        final int N = state.mNum;
        final int N = state.mNumChildren;
        for (int i = 0; i < N; i++) {
            final ChildDrawable layer = array[i];
            layer.setDensity(density);
@@ -416,7 +416,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        }

        final ChildDrawable[] layers = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            if (layers[i].mDrawable.isProjected()) {
                return true;
@@ -435,7 +435,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    int addLayer(@NonNull ChildDrawable layer) {
        final LayerState st = mLayerState;
        final int N = st.mChildren != null ? st.mChildren.length : 0;
        final int i = st.mNum;
        final int i = st.mNumChildren;
        if (i >= N) {
            final ChildDrawable[] nu = new ChildDrawable[N + 10];
            if (i > 0) {
@@ -446,7 +446,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        }

        st.mChildren[i] = layer;
        st.mNum++;
        st.mNumChildren++;
        st.invalidateCache();
        return i;
    }
@@ -514,7 +514,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
     */
    public Drawable findDrawableByLayerId(int id) {
        final ChildDrawable[] layers = mLayerState.mChildren;
        for (int i = mLayerState.mNum - 1; i >= 0; i--) {
        for (int i = mLayerState.mNumChildren - 1; i >= 0; i--) {
            if (layers[i].mId == id) {
                return layers[i].mDrawable;
            }
@@ -549,7 +549,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
     * @attr ref android.R.styleable#LayerDrawableItem_id
     */
    public int getId(int index) {
        if (index >= mLayerState.mNum) {
        if (index >= mLayerState.mNumChildren) {
            throw new IndexOutOfBoundsException();
        }
        return mLayerState.mChildren[index].mId;
@@ -561,7 +561,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
     * @return The number of layers.
     */
    public int getNumberOfLayers() {
        return mLayerState.mNum;
        return mLayerState.mNumChildren;
    }

    /**
@@ -593,7 +593,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
     */
    public int findIndexByLayerId(int id) {
        final ChildDrawable[] layers = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final ChildDrawable childDrawable = layers[i];
            if (childDrawable.mId == id) {
@@ -615,7 +615,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
     * @attr ref android.R.styleable#LayerDrawableItem_drawable
     */
    public void setDrawable(int index, Drawable drawable) {
        if (index >= mLayerState.mNum) {
        if (index >= mLayerState.mNumChildren) {
            throw new IndexOutOfBoundsException();
        }

@@ -651,7 +651,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
     * @attr ref android.R.styleable#LayerDrawableItem_drawable
     */
    public Drawable getDrawable(int index) {
        if (index >= mLayerState.mNum) {
        if (index >= mLayerState.mNumChildren) {
            throw new IndexOutOfBoundsException();
        }
        return mLayerState.mChildren[index].mDrawable;
@@ -1003,7 +1003,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    @Override
    public void draw(Canvas canvas) {
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1230,7 +1230,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {

        // Add all the padding.
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            refreshChildPadding(i, array[i]);

@@ -1249,7 +1249,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {

        // Take the max padding.
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            refreshChildPadding(i, array[i]);

@@ -1268,7 +1268,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    @Override
    public void getOutline(@NonNull Outline outline) {
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1283,7 +1283,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    @Override
    public void setHotspot(float x, float y) {
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1295,7 +1295,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    @Override
    public void setHotspotBounds(int left, int top, int right, int bottom) {
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1323,7 +1323,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    public boolean setVisible(boolean visible, boolean restart) {
        final boolean changed = super.setVisible(visible, restart);
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1337,7 +1337,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    @Override
    public void setDither(boolean dither) {
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1349,7 +1349,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    @Override
    public void setAlpha(int alpha) {
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1371,7 +1371,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    @Override
    public void setColorFilter(ColorFilter colorFilter) {
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1383,7 +1383,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    @Override
    public void setTintList(ColorStateList tint) {
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1395,7 +1395,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    @Override
    public void setTintMode(Mode tintMode) {
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1406,7 +1406,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {

    private Drawable getFirstNonNullDrawable() {
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1444,7 +1444,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        mLayerState.mAutoMirrored = mirrored;

        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1461,7 +1461,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    @Override
    public void jumpToCurrentState() {
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1480,7 +1480,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        boolean changed = false;

        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null && dr.isStateful() && dr.setState(state)) {
@@ -1501,7 +1501,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        boolean changed = false;

        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null && dr.setLevel(level)) {
@@ -1543,7 +1543,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        final boolean isPaddingNested = mLayerState.mPaddingMode == PADDING_MODE_NEST;
        final ChildDrawable[] array = mLayerState.mChildren;

        for (int i = 0, count = mLayerState.mNum; i < count; i++) {
        for (int i = 0, count = mLayerState.mNumChildren; i < count; i++) {
            final ChildDrawable r = array[i];
            final Drawable d = r.mDrawable;
            if (d == null) {
@@ -1642,7 +1642,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        final boolean nest = mLayerState.mPaddingMode == PADDING_MODE_NEST;
        final boolean isLayoutRtl = getLayoutDirection() == LayoutDirection.RTL;
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final ChildDrawable r = array[i];
            if (r.mDrawable == null) {
@@ -1684,7 +1684,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {

        final boolean nest = mLayerState.mPaddingMode == PADDING_MODE_NEST;
        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final ChildDrawable r = array[i];
            if (r.mDrawable == null) {
@@ -1733,7 +1733,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
     * Ensures the child padding caches are large enough.
     */
    void ensurePadding() {
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        if (mPaddingL != null && mPaddingL.length >= N) {
            return;
        }
@@ -1745,7 +1745,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    }

    void refreshPadding() {
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        final ChildDrawable[] array = mLayerState.mChildren;
        for (int i = 0; i < N; i++) {
            refreshChildPadding(i, array[i]);
@@ -1766,7 +1766,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        if (!mMutated && super.mutate() == this) {
            mLayerState = createConstantState(mLayerState, null);
            final ChildDrawable[] array = mLayerState.mChildren;
            final int N = mLayerState.mNum;
            final int N = mLayerState.mNumChildren;
            for (int i = 0; i < N; i++) {
                final Drawable dr = array[i].mDrawable;
                if (dr != null) {
@@ -1785,7 +1785,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        super.clearMutated();

        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1800,7 +1800,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        boolean changed = false;

        final ChildDrawable[] array = mLayerState.mChildren;
        final int N = mLayerState.mNum;
        final int N = mLayerState.mNumChildren;
        for (int i = 0; i < N; i++) {
            final Drawable dr = array[i].mDrawable;
            if (dr != null) {
@@ -1905,7 +1905,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    static class LayerState extends ConstantState {
        private int[] mThemeAttrs;

        int mNum;
        int mNumChildren;
        ChildDrawable[] mChildren;

        int mDensity;
@@ -1922,10 +1922,10 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        @Config int mChangingConfigurations;
        @Config int mChildrenChangingConfigurations;

        private boolean mHaveOpacity;
        private boolean mCheckedOpacity;
        private int mOpacity;

        private boolean mHaveIsStateful;
        private boolean mCheckedStateful;
        private boolean mIsStateful;

        private boolean mAutoMirrored = false;
@@ -1938,9 +1938,9 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {

            if (orig != null) {
                final ChildDrawable[] origChildDrawable = orig.mChildren;
                final int N = orig.mNum;
                final int N = orig.mNumChildren;

                mNum = N;
                mNumChildren = N;
                mChildren = new ChildDrawable[N];

                mChangingConfigurations = orig.mChangingConfigurations;
@@ -1951,9 +1951,9 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
                    mChildren[i] = new ChildDrawable(or, owner, res);
                }

                mHaveOpacity = orig.mHaveOpacity;
                mCheckedOpacity = orig.mCheckedOpacity;
                mOpacity = orig.mOpacity;
                mHaveIsStateful = orig.mHaveIsStateful;
                mCheckedStateful = orig.mCheckedStateful;
                mIsStateful = orig.mIsStateful;
                mAutoMirrored = orig.mAutoMirrored;
                mPaddingMode = orig.mPaddingMode;
@@ -1970,7 +1970,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
                    applyDensityScaling(orig.mDensity, mDensity);
                }
            } else {
                mNum = 0;
                mNumChildren = 0;
                mChildren = null;
            }
        }
@@ -2022,7 +2022,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
            }

            final ChildDrawable[] array = mChildren;
            final int N = mNum;
            final int N = mNumChildren;
            for (int i = 0; i < N; i++) {
                final ChildDrawable layer = array[i];
                if (layer.canApplyTheme()) {
@@ -2050,12 +2050,12 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        }

        public final int getOpacity() {
            if (mHaveOpacity) {
            if (mCheckedOpacity) {
                return mOpacity;
            }

            final int N = mNumChildren;
            final ChildDrawable[] array = mChildren;
            final int N = mNum;

            // Seek to the first non-null drawable.
            int firstIndex = -1;
@@ -2082,17 +2082,17 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
            }

            mOpacity = op;
            mHaveOpacity = true;
            mCheckedOpacity = true;
            return op;
        }

        public final boolean isStateful() {
            if (mHaveIsStateful) {
            if (mCheckedStateful) {
                return mIsStateful;
            }

            final int N = mNumChildren;
            final ChildDrawable[] array = mChildren;
            final int N = mNum;
            boolean isStateful = false;
            for (int i = 0; i < N; i++) {
                final Drawable dr = array[i].mDrawable;
@@ -2103,13 +2103,13 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
            }

            mIsStateful = isStateful;
            mHaveIsStateful = true;
            mCheckedStateful = true;
            return isStateful;
        }

        public final boolean canConstantState() {
            final ChildDrawable[] array = mChildren;
            final int N = mNum;
            final int N = mNumChildren;
            for (int i = 0; i < N; i++) {
                final Drawable dr = array[i].mDrawable;
                if (dr != null && dr.getConstantState() == null) {
@@ -2122,8 +2122,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
        }

        public void invalidateCache() {
            mHaveOpacity = false;
            mHaveIsStateful = false;
            mCheckedOpacity = false;
            mCheckedStateful = false;
        }

    }
+4 −4
Original line number Diff line number Diff line
@@ -667,7 +667,7 @@ public class RippleDrawable extends LayerDrawable {
    public void getOutline(@NonNull Outline outline) {
        final LayerState state = mLayerState;
        final ChildDrawable[] children = state.mChildren;
        final int N = state.mNum;
        final int N = state.mNumChildren;
        for (int i = 0; i < N; i++) {
            if (children[i].mId != R.id.mask) {
                children[i].mDrawable.getOutline(outline);
@@ -815,7 +815,7 @@ public class RippleDrawable extends LayerDrawable {

        // Check for non-opaque, non-mask content.
        final ChildDrawable[] array = mLayerState.mChildren;
        final int count = mLayerState.mNum;
        final int count = mLayerState.mNumChildren;
        for (int i = 0; i < count; i++) {
            if (array[i].mDrawable.getOpacity() != PixelFormat.OPAQUE) {
                return MASK_CONTENT;
@@ -829,7 +829,7 @@ public class RippleDrawable extends LayerDrawable {
    private void drawContent(Canvas canvas) {
        // Draw everything except the mask.
        final ChildDrawable[] array = mLayerState.mChildren;
        final int count = mLayerState.mNum;
        final int count = mLayerState.mNumChildren;
        for (int i = 0; i < count; i++) {
            if (array[i].mId != R.id.mask) {
                array[i].mDrawable.draw(canvas);
@@ -1045,7 +1045,7 @@ public class RippleDrawable extends LayerDrawable {
        mLayerState = mState;
        mDensity = Drawable.resolveDensity(res, mState.mDensity);

        if (mState.mNum > 0) {
        if (mState.mNumChildren > 0) {
            ensurePadding();
            refreshPadding();
        }