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

Commit 1b268cbc authored by Yorke Lee's avatar Yorke Lee
Browse files

Add setAlwaysOpaque and setTint to BarTransitions

Allow the opacity and color of the NavigationBarView
to be controlled.

Bug: 26425669

Change-Id: I364f183bf0ef90c446ae68987ccc3b6bbf09aa67
parent bb6939e4
Loading
Loading
Loading
Loading
+49 −4
Original line number Original line Diff line number Diff line
@@ -22,8 +22,12 @@ import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Rect;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.os.SystemClock;
import android.os.SystemClock;
import android.util.Log;
import android.util.Log;
@@ -55,6 +59,7 @@ public class BarTransitions {
    private final BarBackgroundDrawable mBarBackground;
    private final BarBackgroundDrawable mBarBackground;


    private int mMode;
    private int mMode;
    private boolean mAlwaysOpaque = false;


    public BarTransitions(View view, int gradientResourceId) {
    public BarTransitions(View view, int gradientResourceId) {
        mTag = "BarTransitions." + view.getClass().getSimpleName();
        mTag = "BarTransitions." + view.getClass().getSimpleName();
@@ -69,13 +74,25 @@ public class BarTransitions {
        return mMode;
        return mMode;
    }
    }


    /**
     * @param alwaysOpaque if {@code true}, the bar's background will always be opaque, regardless
     *         of what mode it is currently set to.
     */
    public void setAlwaysOpaque(boolean alwaysOpaque) {
        mAlwaysOpaque = alwaysOpaque;
    }

    public boolean isAlwaysOpaque() {
        // Low-end devices do not support translucent modes, fallback to opaque
        return !HIGH_END || mAlwaysOpaque;
    }

    public void transitionTo(int mode, boolean animate) {
    public void transitionTo(int mode, boolean animate) {
        // low-end devices do not support translucent modes, fallback to opaque
        if (isAlwaysOpaque() && (mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSLUCENT
        if (!HIGH_END && (mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSLUCENT
                || mode == MODE_TRANSPARENT)) {
                || mode == MODE_TRANSPARENT)) {
            mode = MODE_OPAQUE;
            mode = MODE_OPAQUE;
        }
        }
        if (!HIGH_END && (mode == MODE_LIGHTS_OUT_TRANSPARENT)) {
        if (isAlwaysOpaque() && (mode == MODE_LIGHTS_OUT_TRANSPARENT)) {
            mode = MODE_LIGHTS_OUT;
            mode = MODE_LIGHTS_OUT;
        }
        }
        if (mMode == mode) return;
        if (mMode == mode) return;
@@ -131,10 +148,13 @@ public class BarTransitions {


        private int mGradientAlpha;
        private int mGradientAlpha;
        private int mColor;
        private int mColor;
        private PorterDuffColorFilter mTintFilter;
        private Paint mPaint = new Paint();


        private int mGradientAlphaStart;
        private int mGradientAlphaStart;
        private int mColorStart;
        private int mColorStart;



        public BarBackgroundDrawable(Context context, int gradientResourceId) {
        public BarBackgroundDrawable(Context context, int gradientResourceId) {
            final Resources res = context.getResources();
            final Resources res = context.getResources();
            if (DEBUG_COLORS) {
            if (DEBUG_COLORS) {
@@ -162,6 +182,26 @@ public class BarTransitions {
            // noop
            // noop
        }
        }


        @Override
        public void setTint(int color) {
            if (mTintFilter == null) {
                mTintFilter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN);
            } else {
                mTintFilter.setColor(color);
            }
            invalidateSelf();
        }

        @Override
        public void setTintMode(Mode tintMode) {
            if (mTintFilter == null) {
                mTintFilter = new PorterDuffColorFilter(0, tintMode);
            } else {
                mTintFilter.setMode(tintMode);
            }
            invalidateSelf();
        }

        @Override
        @Override
        protected void onBoundsChange(Rect bounds) {
        protected void onBoundsChange(Rect bounds) {
            super.onBoundsChange(bounds);
            super.onBoundsChange(bounds);
@@ -208,6 +248,7 @@ public class BarTransitions {
            } else {
            } else {
                targetColor = mOpaque;
                targetColor = mOpaque;
            }
            }

            if (!mAnimating) {
            if (!mAnimating) {
                mColor = targetColor;
                mColor = targetColor;
                mGradientAlpha = targetGradientAlpha;
                mGradientAlpha = targetGradientAlpha;
@@ -234,7 +275,11 @@ public class BarTransitions {
                mGradient.draw(canvas);
                mGradient.draw(canvas);
            }
            }
            if (Color.alpha(mColor) > 0) {
            if (Color.alpha(mColor) > 0) {
                canvas.drawColor(mColor);
                mPaint.setColor(mColor);
                if (mTintFilter != null) {
                    mPaint.setColorFilter(mTintFilter);
                }
                canvas.drawPaint(mPaint);
            }
            }
            if (mAnimating) {
            if (mAnimating) {
                invalidateSelf();  // keep going
                invalidateSelf();  // keep going