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

Commit 3919ad88 authored by Nader Jawad's avatar Nader Jawad Committed by android-build-merger
Browse files

Merge "Fixed issue where GradientDrawable orientation was not consumed properly" into qt-dev

am: 9625faaf

Change-Id: I86c9f4e126604208609eca09fedaf6d7a4cd6a75
parents 04747af6 9625faaf
Loading
Loading
Loading
Loading
+91 −79
Original line number Diff line number Diff line
@@ -637,8 +637,7 @@ public class GradientDrawable extends Drawable {
     * @see #setOrientation(Orientation)
     */
    public Orientation getOrientation() {
        updateGradientStateOrientation();
        return mGradientState.mOrientation;
        return mGradientState.getOrientation();
    }

    /**
@@ -654,10 +653,7 @@ public class GradientDrawable extends Drawable {
     * @see #getOrientation()
     */
    public void setOrientation(Orientation orientation) {
        // Update the angle here so that subsequent attempts to obtain the orientation
        // from the angle overwrite previously configured values during inflation
        mGradientState.mAngle = getAngleFromOrientation(orientation);
        mGradientState.mOrientation = orientation;
        mGradientState.setOrientation(orientation);
        mGradientIsDirty = true;
        invalidateSelf();
    }
@@ -1245,76 +1241,6 @@ public class GradientDrawable extends Drawable {
        return true;
    }

    /**
     * Update the orientation of the gradient based on the given angle only if the type is
     * {@link #LINEAR_GRADIENT}
     */
    private void updateGradientStateOrientation() {
        if (mGradientState.mGradient == LINEAR_GRADIENT) {
            int angle = mGradientState.mAngle;
            if (angle % 45 != 0) {
                throw new IllegalArgumentException("Linear gradient requires 'angle' attribute to "
                     + "be a multiple of 45");
            }

            Orientation orientation;
            switch (angle) {
                case 0:
                    orientation = Orientation.LEFT_RIGHT;
                    break;
                case 45:
                    orientation = Orientation.BL_TR;
                    break;
                case 90:
                    orientation = Orientation.BOTTOM_TOP;
                    break;
                case 135:
                    orientation = Orientation.BR_TL;
                    break;
                case 180:
                    orientation = Orientation.RIGHT_LEFT;
                    break;
                case 225:
                    orientation = Orientation.TR_BL;
                    break;
                case 270:
                    orientation = Orientation.TOP_BOTTOM;
                    break;
                case 315:
                    orientation = Orientation.TL_BR;
                    break;
                default:
                    // Should not get here as exception is thrown above if angle is not multiple
                    // of 45 degrees
                    orientation = Orientation.LEFT_RIGHT;
                    break;
            }
            mGradientState.mOrientation = orientation;
        }
    }

    private int getAngleFromOrientation(Orientation orientation) {
        switch (orientation) {
            default:
            case LEFT_RIGHT:
                return 0;
            case BL_TR:
                return 45;
            case BOTTOM_TOP:
                return 90;
            case BR_TL:
                return 135;
            case RIGHT_LEFT:
                return 180;
            case TR_BL:
                return 225;
            case TOP_BOTTOM:
                return 270;
            case TL_BR:
                return 315;
        }
    }

    /**
     * This checks mGradientIsDirty, and if it is true, recomputes both our drawing
     * rectangle (mRect) and the gradient itself, since it depends on our
@@ -1344,8 +1270,7 @@ public class GradientDrawable extends Drawable {

                if (st.mGradient == LINEAR_GRADIENT) {
                    final float level = st.mUseLevel ? getLevel() / 10000.0f : 1.0f;
                    updateGradientStateOrientation();
                    switch (st.mOrientation) {
                    switch (st.getOrientation()) {
                    case TOP_BOTTOM:
                        x0 = r.left;            y0 = r.top;
                        x1 = x0;                y1 = level * r.bottom;
@@ -2056,7 +1981,7 @@ public class GradientDrawable extends Drawable {
        int[] mAttrPadding;

        public GradientState(Orientation orientation, int[] gradientColors) {
            mOrientation = orientation;
            setOrientation(orientation);
            setGradientColors(gradientColors);
        }

@@ -2259,6 +2184,93 @@ public class GradientDrawable extends Drawable {
            mCenterY = y;
        }

        public void setOrientation(Orientation orientation) {
            // Update the angle here so that subsequent attempts to obtain the orientation
            // from the angle overwrite previously configured values during inflation
            mAngle = getAngleFromOrientation(orientation);
            mOrientation = orientation;
        }

        @NonNull
        public Orientation getOrientation() {
            updateGradientStateOrientation();
            return mOrientation;
        }

        /**
         * Update the orientation of the gradient based on the given angle only if the type is
         * {@link #LINEAR_GRADIENT}
         */
        private void updateGradientStateOrientation() {
            if (mGradient == LINEAR_GRADIENT) {
                int angle = mAngle;
                if (angle % 45 != 0) {
                    throw new IllegalArgumentException("Linear gradient requires 'angle' attribute "
                            + "to be a multiple of 45");
                }

                Orientation orientation;
                switch (angle) {
                    case 0:
                        orientation = Orientation.LEFT_RIGHT;
                        break;
                    case 45:
                        orientation = Orientation.BL_TR;
                        break;
                    case 90:
                        orientation = Orientation.BOTTOM_TOP;
                        break;
                    case 135:
                        orientation = Orientation.BR_TL;
                        break;
                    case 180:
                        orientation = Orientation.RIGHT_LEFT;
                        break;
                    case 225:
                        orientation = Orientation.TR_BL;
                        break;
                    case 270:
                        orientation = Orientation.TOP_BOTTOM;
                        break;
                    case 315:
                        orientation = Orientation.TL_BR;
                        break;
                    default:
                        // Should not get here as exception is thrown above if angle is not multiple
                        // of 45 degrees
                        orientation = Orientation.LEFT_RIGHT;
                        break;
                }
                mOrientation = orientation;
            }
        }

        private int getAngleFromOrientation(@Nullable Orientation orientation) {
            if (orientation != null) {
                switch (orientation) {
                    default:
                    case LEFT_RIGHT:
                        return 0;
                    case BL_TR:
                        return 45;
                    case BOTTOM_TOP:
                        return 90;
                    case BR_TL:
                        return 135;
                    case RIGHT_LEFT:
                        return 180;
                    case TR_BL:
                        return 225;
                    case TOP_BOTTOM:
                        return 270;
                    case TL_BR:
                        return 315;
                }
            } else {
                return 0;
            }
        }

        public void setGradientColors(@Nullable int[] colors) {
            mGradientColors = colors;
            mSolidColors = null;