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

Commit e8c264c1 authored by Steve Kondik's avatar Steve Kondik Committed by Steve Kondik
Browse files

systemui: Fix various issues with transparent bars

 * You current can't enable lights-out with transparency/translucency-
   the code is only half-way there but it's sequenced in a strange way
   and the translucent combo isn't implemented at all. Fix it.
 * Enabling a transparent navbar when the bar is vertical (landscape)
   has bugs that make the behavior unpredictable for some apps. We can
   still allow it, so add a new View flag to signal this.

Change-Id: Iec98c960d6c13a294d8f9f0dd9f9e2fc1f8f9b52
parent ef7ae6d9
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -2789,6 +2789,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     */
    public static final int SYSTEM_UI_TRANSPARENT = 0x00008000;
    /**
     * @hide
     *
     * Allow navbars to become transparent when vertical. Only enable this
     * if you know how to deal with the bugs!
     */
    public static final int SYSTEM_UI_ALLOW_TRANSPARENT_VERTICAL_NAV = 0x00000010;
    /**
     * @hide
     */
+6 −3
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ public class BarTransitions {
    public static final int MODE_TRANSPARENT = 4;
    public static final int MODE_WARNING = 5;
    public static final int MODE_LIGHTS_OUT_TRANSPARENT = 6;
    public static final int MODE_LIGHTS_OUT_TRANSLUCENT = 7;

    public static final int LIGHTS_IN_DURATION = 250;
    public static final int LIGHTS_OUT_DURATION = 750;
@@ -89,7 +90,7 @@ public class BarTransitions {
                || mode == MODE_TRANSPARENT)) {
            mode = MODE_OPAQUE;
        }
        if (!HIGH_END && (mode == MODE_LIGHTS_OUT_TRANSPARENT)) {
        if (!HIGH_END && (mode == MODE_LIGHTS_OUT_TRANSPARENT || mode == MODE_LIGHTS_OUT_TRANSLUCENT)) {
            mode = MODE_LIGHTS_OUT;
        }
        if (mMode == mode) return;
@@ -120,6 +121,8 @@ public class BarTransitions {
        if (mode == MODE_TRANSPARENT) return "MODE_TRANSPARENT";
        if (mode == MODE_WARNING) return "MODE_WARNING";
        if (mode == MODE_LIGHTS_OUT_TRANSPARENT) return "MODE_LIGHTS_OUT_TRANSPARENT";
        if (mode == MODE_LIGHTS_OUT_TRANSLUCENT) return "MODE_LIGHTS_OUT_TRANSLUCENT";
        if (mode == -1) return "MODE_UNKNOWN";
        throw new IllegalArgumentException("Unknown mode " + mode);
    }

@@ -128,7 +131,7 @@ public class BarTransitions {
    }

    protected boolean isLightsOut(int mode) {
        return mode == MODE_LIGHTS_OUT || mode == MODE_LIGHTS_OUT_TRANSPARENT;
        return mode == MODE_LIGHTS_OUT || mode == MODE_LIGHTS_OUT_TRANSPARENT || mode == MODE_LIGHTS_OUT_TRANSLUCENT;
    }

    private static class BarBackgroundDrawable extends Drawable {
@@ -245,7 +248,7 @@ public class BarTransitions {
            int targetGradientAlpha = 0, targetColor = 0;
            if (mMode == MODE_WARNING) {
                targetColor = mWarning;
            } else if (mMode == MODE_TRANSLUCENT) {
            } else if (mMode == MODE_TRANSLUCENT || mMode == MODE_LIGHTS_OUT_TRANSLUCENT) {
                targetColor = mSemiTransparent;
            } else if (mMode == MODE_SEMI_TRANSPARENT) {
                targetColor = mSemiTransparent;
+7 −2
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ public final class NavigationBarTransitions extends BarTransitions {
    private boolean mLightsOut;
    private boolean mVertical;
    private int mRequestedMode;
    private boolean mTransparencyAllowedWhenVertical = false;

    public NavigationBarTransitions(NavigationBarView view) {
        super(view, R.drawable.nav_background, R.color.navigation_bar_background_opaque,
@@ -60,14 +61,18 @@ public final class NavigationBarTransitions extends BarTransitions {
        transitionTo(mRequestedMode, false /*animate*/);
    }

    public void setTransparencyAllowedWhenVertical(boolean allowed) {
        mTransparencyAllowedWhenVertical = allowed;
    }

    @Override
    public void transitionTo(int mode, boolean animate) {
        mRequestedMode = mode;
        if (mVertical) {
        if (mVertical && !mTransparencyAllowedWhenVertical) {
            // translucent mode not allowed when vertical
            if (mode == MODE_TRANSLUCENT || mode == MODE_TRANSPARENT) {
                mode = MODE_OPAQUE;
            } else if (mode == MODE_LIGHTS_OUT_TRANSPARENT) {
            } else if (mode == MODE_LIGHTS_OUT_TRANSPARENT || mode == MODE_LIGHTS_OUT_TRANSLUCENT) {
                mode = MODE_LIGHTS_OUT;
            }
        }
+4 −0
Original line number Diff line number Diff line
@@ -269,6 +269,10 @@ public class NavigationBarView extends LinearLayout {
        notifyVerticalChangedListener(mVertical);
    }

    public void setTransparencyAllowedWhenVertical(boolean allowed) {
        mBarTransitions.setTransparencyAllowedWhenVertical(allowed);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        initDownStates(event);
+11 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.app.StatusBarManager.windowStateToString;
import static com.android.systemui.settings.BrightnessController.BRIGHTNESS_ADJ_RESOLUTION;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSLUCENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
@@ -3174,6 +3175,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
            // clobbering the bit below
            final boolean wasRecentsVisible = (mSystemUiVisibility & View.RECENT_APPS_VISIBLE) > 0;

            // private flag to permit a transparent navbar when the bar is vertical (landscape)
            // this is buggy unless carefully controlled.
            if (mNavigationBarView != null) {
                mNavigationBarView.setTransparencyAllowedWhenVertical(
                        (diff & View.SYSTEM_UI_ALLOW_TRANSPARENT_VERTICAL_NAV) != 0);
            }

            mSystemUiVisibility = newVal;

            // update low profile
@@ -3250,9 +3258,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,

    private int barMode(int vis, int transientFlag, int translucentFlag) {
        int lightsOutTransparent = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_TRANSPARENT;
        int lightsOutTranslucent = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.STATUS_BAR_TRANSLUCENT;
        return (vis & transientFlag) != 0 ? MODE_SEMI_TRANSPARENT
                : (vis & translucentFlag) != 0 ? MODE_TRANSLUCENT
                : (vis & lightsOutTransparent) == lightsOutTransparent ? MODE_LIGHTS_OUT_TRANSPARENT
                : (vis & lightsOutTranslucent) == lightsOutTranslucent ? MODE_LIGHTS_OUT_TRANSLUCENT
                : (vis & translucentFlag) != 0 ? MODE_TRANSLUCENT
                : (vis & View.SYSTEM_UI_TRANSPARENT) != 0 ? MODE_TRANSPARENT
                : (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0 ? MODE_LIGHTS_OUT
                : MODE_OPAQUE;
Loading