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

Commit f016a912 authored by John Spurlock's avatar John Spurlock Committed by Android (Google) Code Review
Browse files

Merge "Ensure IME windows always appear north of the nav bar." into klp-dev

parents f503fbd0 d4e6575c
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -1102,11 +1102,7 @@ public abstract class BaseStatusBar extends SystemUI implements
        return km.inKeyguardRestrictedInputMode();
    }

    public void suspendAutohide() {
        // hook for subclasses
    }

    public void resumeAutohide() {
    public void setInteracting(boolean interacting) {
        // hook for subclasses
    }

+2 −2
Original line number Diff line number Diff line
@@ -86,9 +86,9 @@ public class DelegateViewHelper {
        }

        if (action == MotionEvent.ACTION_DOWN) {
            mBar.suspendAutohide();
            mBar.setInteracting(true);
        } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
            mBar.resumeAutohide();
            mBar.setInteracting(false);
        }

        mDelegateView.getLocationOnScreen(mTempPoint);
+0 −11
Original line number Diff line number Diff line
@@ -64,17 +64,6 @@ public class BarTransitions {
        return mMode;
    }

    public void setTransparent(Drawable transparent) {
        mTransparent = transparent;
        if (mMode == MODE_TRANSPARENT) {
            transitionTo(MODE_TRANSPARENT);
        }
    }

    public void transitionTo(int mode) {
        transitionTo(mode, false);
    }

    public void transitionTo(int mode, boolean animate) {
        if (mMode == mode) return;
        int oldMode = mMode;
+10 −0
Original line number Diff line number Diff line
@@ -112,9 +112,11 @@ public class NavigationBarView extends LinearLayout {
    }

    private final class NavigationBarTransitions extends BarTransitions {
        private static final boolean ENABLE_GRADIENT = false;  // until we can smooth transition

        private final Drawable mTransparentBottom;
        private final Drawable mTransparentRight;
        private final int mTransparentColor;

        public NavigationBarTransitions(Context context) {
            super(context, NavigationBarView.this);
@@ -125,12 +127,20 @@ public class NavigationBarView extends LinearLayout {
            };
            mTransparentBottom = new GradientDrawable(Orientation.BOTTOM_TOP, gradientColors);
            mTransparentRight = new GradientDrawable(Orientation.RIGHT_LEFT, gradientColors);
            mTransparentColor = res.getColor(R.color.status_bar_background_transparent);
        }

        public void setVertical(boolean isVertical) {
            if (!ENABLE_GRADIENT) return;
            mTransparent = isVertical ? mTransparentRight : mTransparentBottom;
        }

        @Override
        protected Integer getBackgroundColor(int mode) {
            if (!ENABLE_GRADIENT && mode == MODE_TRANSPARENT) return mTransparentColor;
            return super.getBackgroundColor(mode);
        }

        @Override
        protected void onTransition(int oldMode, int newMode, boolean animate) {
            super.onTransition(oldMode, newMode, animate);
+70 −37
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.statusbar.phone;

import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT;
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.app.StatusBarManager.windowStateToString;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
@@ -170,7 +172,7 @@ public class PhoneStatusBar extends BaseStatusBar {

    StatusBarWindowView mStatusBarWindow;
    PhoneStatusBarView mStatusBarView;
    private int mStatusBarWindowState;
    private int mStatusBarWindowState = WINDOW_STATE_SHOWING;

    int mPixelFormat;
    Object mQueueLock = new Object();
@@ -234,7 +236,7 @@ public class PhoneStatusBar extends BaseStatusBar {

    // on-screen navigation buttons
    private NavigationBarView mNavigationBarView = null;
    private int mNavigationBarWindowState;
    private int mNavigationBarWindowState = WINDOW_STATE_SHOWING;

    // the tracker view
    int mTrackingPosition; // the position of the top of the tracking view.
@@ -312,7 +314,10 @@ public class PhoneStatusBar extends BaseStatusBar {
        }
    };

    private boolean mInteracting;
    private boolean mAutohideSuspended;
    private int mStatusBarMode;
    private int mNavigationBarMode;

    private final Runnable mAutohide = new Runnable() {
        @Override
@@ -1394,7 +1399,7 @@ public class PhoneStatusBar extends BaseStatusBar {

        visibilityChanged(true);

        suspendAutohide();
        setInteracting(true);
    }

    public void animateCollapsePanels() {
@@ -1678,8 +1683,7 @@ public class PhoneStatusBar extends BaseStatusBar {
            mPostCollapseCleanup = null;
        }

        // Reschedule suspended auto-hide if necessary
        resumeAutohide();
        setInteracting(false);
    }

    /**
@@ -1826,7 +1830,7 @@ public class PhoneStatusBar extends BaseStatusBar {
            hideCling();
        }

        suspendAutohide();
        setInteracting(true);
        return false;
    }

@@ -1843,11 +1847,12 @@ public class PhoneStatusBar extends BaseStatusBar {
        if (mNavigationBarView != null) {
            mNavigationBarView.setNavigationIconHints(hints);
        }
        checkBarModes();
    }

    @Override // CommandQueue
    public void setWindowState(int window, int state) {
        boolean showing = state == StatusBarManager.WINDOW_STATE_SHOWING;
        boolean showing = state == WINDOW_STATE_SHOWING;
        if (mStatusBarWindow != null
                && window == StatusBarManager.WINDOW_STATUS_BAR
                && mStatusBarWindowState != state) {
@@ -1898,17 +1903,28 @@ public class PhoneStatusBar extends BaseStatusBar {
            }

            // update status bar mode
            int sbMode = updateBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(),
                    View.STATUS_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS,
                    mStatusBarWindowState);
            final int sbMode = computeBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(),
                    View.STATUS_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS);

            // update navigation bar mode
            int nbMode = mNavigationBarView == null ? -1 : updateBarMode(
            final int nbMode = mNavigationBarView == null ? -1 : computeBarMode(
                    oldVal, newVal, mNavigationBarView.getBarTransitions(),
                    View.NAVIGATION_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION,
                    mNavigationBarWindowState);

            if (sbMode != -1 || nbMode != -1) {
                    View.NAVIGATION_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION);
            final boolean sbModeChanged = sbMode != -1;
            final boolean nbModeChanged = nbMode != -1;
            boolean checkBarModes = false;
            if (sbModeChanged && sbMode != mStatusBarMode) {
                mStatusBarMode = sbMode;
                checkBarModes = true;
            }
            if (nbModeChanged && nbMode != mNavigationBarMode) {
                mNavigationBarMode = nbMode;
                checkBarModes = true;
            }
            if (checkBarModes) {
                checkBarModes();
            }
            if (sbModeChanged || nbModeChanged) {
                // update transient bar autohide
                if (sbMode == MODE_SEMI_TRANSPARENT || nbMode == MODE_SEMI_TRANSPARENT) {
                    scheduleAutohide();
@@ -1935,15 +1951,13 @@ public class PhoneStatusBar extends BaseStatusBar {
        return mStatusBarView.getBarTransitions().getMode();
    }

    private int updateBarMode(int oldVis, int newVis, BarTransitions transitions,
            int transientFlag, int transparentFlag, int windowState) {
    private int computeBarMode(int oldVis, int newVis, BarTransitions transitions,
            int transientFlag, int transparentFlag) {
        final int oldMode = barMode(oldVis, transientFlag, transparentFlag);
        final int newMode = barMode(newVis, transientFlag, transparentFlag);
        if (oldMode == newMode) {
            return -1; // no mode change
        }
        final boolean animate = windowState == StatusBarManager.WINDOW_STATE_SHOWING;
        transitions.transitionTo(newMode, animate);
        return newMode;
    }

@@ -1953,35 +1967,49 @@ public class PhoneStatusBar extends BaseStatusBar {
                : MODE_OPAQUE;
    }

    private final Runnable mResumeSemiTransparent = new Runnable() {
    private void checkBarModes() {
        checkBarMode(mStatusBarMode, mStatusBarWindowState, mStatusBarView.getBarTransitions());
        if (mNavigationBarView != null) {
            checkBarMode(mNavigationBarMode,
                    mNavigationBarWindowState, mNavigationBarView.getBarTransitions());
        }
    }

    private void checkBarMode(int mode, int windowState, BarTransitions transitions) {
        final boolean imeVisible = (mNavigationIconHints & NAVIGATION_HINT_BACK_ALT) != 0;
        final int finalMode = imeVisible || mInteracting ? MODE_OPAQUE : mode;
        final boolean animate = windowState == WINDOW_STATE_SHOWING;
        transitions.transitionTo(finalMode, animate);
    }

    private final Runnable mCheckBarModes = new Runnable() {
        @Override
        public void run() {
            if ((mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT) != 0) {
                animateTransitionTo(BarTransitions.MODE_SEMI_TRANSPARENT);
            }
            checkBarModes();
        }};

    @Override
    public void resumeAutohide() {
        if (mAutohideSuspended) {
            scheduleAutohide();
            mHandler.postDelayed(mResumeSemiTransparent, 500); // longer than home -> launcher
    public void setInteracting(boolean interacting) {
        mInteracting = interacting;
        if (mInteracting) {
            suspendAutohide();
        } else {
            resumeSuspendedAutohide();
        }
        checkBarModes();
    }

    private void animateTransitionTo(int newMode) {
        mStatusBarView.getBarTransitions().transitionTo(newMode, true /*animate*/);
        if (mNavigationBarView != null) {
            mNavigationBarView.getBarTransitions().transitionTo(newMode, true /*animate*/);
    private void resumeSuspendedAutohide() {
        if (mAutohideSuspended) {
            scheduleAutohide();
            mHandler.postDelayed(mCheckBarModes, 500); // longer than home -> launcher
        }
    }

    @Override
    public void suspendAutohide() {
    private void suspendAutohide() {
        mHandler.removeCallbacks(mAutohide);
        mHandler.removeCallbacks(mResumeSemiTransparent);
        mHandler.removeCallbacks(mCheckBarModes);
        mAutohideSuspended = (mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT) != 0;
        animateTransitionTo(BarTransitions.MODE_OPAQUE);
    }

    private void cancelAutohide() {
@@ -2087,8 +2115,8 @@ public class PhoneStatusBar extends BaseStatusBar {
            || ((vis & InputMethodService.IME_VISIBLE) != 0);

        mCommandQueue.setNavigationIconHints(
                altBack ? (mNavigationIconHints | StatusBarManager.NAVIGATION_HINT_BACK_ALT)
                        : (mNavigationIconHints & ~StatusBarManager.NAVIGATION_HINT_BACK_ALT));
                altBack ? (mNavigationIconHints | NAVIGATION_HINT_BACK_ALT)
                        : (mNavigationIconHints & ~NAVIGATION_HINT_BACK_ALT));
        if (mQS != null) mQS.setImeWindowStatus(vis > 0);
    }

@@ -2186,12 +2214,17 @@ public class PhoneStatusBar extends BaseStatusBar {
                    + " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY());
        }

        pw.print("  mInteracting="); pw.println(mInteracting);
        pw.print("  mStatusBarWindowState=");
        pw.println(windowStateToString(mStatusBarWindowState));
        pw.print("  mStatusBarMode=");
        pw.println(BarTransitions.modeToString(mStatusBarMode));
        dumpBarTransitions(pw, "mStatusBarView", mStatusBarView.getBarTransitions());
        if (mNavigationBarView != null) {
            pw.print("  mNavigationBarWindowState=");
            pw.println(windowStateToString(mNavigationBarWindowState));
            pw.print("  mNavigationBarMode=");
            pw.println(BarTransitions.modeToString(mNavigationBarMode));
            dumpBarTransitions(pw, "mNavigationBarView", mNavigationBarView.getBarTransitions());
        }

Loading