OSDN Git Service

Ensure IME windows always appear north of the nav bar.
authorJohn Spurlock <jspurlock@google.com>
Wed, 28 Aug 2013 18:17:09 +0000 (14:17 -0400)
committerJohn Spurlock <jspurlock@google.com>
Wed, 28 Aug 2013 18:20:22 +0000 (14:20 -0400)
Even if the bars are transparent / invisible.

Refactor the PSB bar mode override logic to take the IME hint into
account.  Bars are overriden to opaque when hint is showing.

Initialize bar state to showing, fix bug that would mark state
as hidden pre-show (on shell restart).

Bug:10505132
Bug:9499956
Change-Id: I21e830e90c7e9812b4192ca65c3c0cd7a6b72798

packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java
packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
policy/src/com/android/internal/policy/impl/BarController.java
policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

index 24f7d83..e32d7f2 100644 (file)
@@ -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
     }
 
index 9648b11..eef4f44 100644 (file)
@@ -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);
index 318ec51..6302244 100644 (file)
@@ -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;
index 62f8596..850f94d 100644 (file)
@@ -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,13 +127,21 @@ 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);
             final float alpha = newMode == MODE_OPAQUE ? KeyButtonView.DEFAULT_QUIESCENT_ALPHA : 1f;
index faf0368..4b0a2b7 100644 (file)
@@ -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());
         }
 
index 01c53fe..41b2fd1 100644 (file)
@@ -51,7 +51,7 @@ public class BarController {
     private IStatusBarService mStatusBarService;
 
     private WindowState mWin;
-    private int mState;
+    private int mState = StatusBarManager.WINDOW_STATE_SHOWING;
     private int mTransientBarState;
     private boolean mPendingShow;
     private long mLastTransparent;
@@ -110,7 +110,7 @@ public class BarController {
         final boolean oldAnim = mWin.isAnimatingLw();
         final boolean rt = show ? mWin.showLw(true) : mWin.hideLw(true);
         final int state = computeState(oldVis, oldAnim, mWin.isVisibleLw(), mWin.isAnimatingLw());
-        if (state > -1) {
+        if (state > -1 && mWin.hasDrawnLw()) {
             updateState(state);
         }
         return rt;
@@ -146,7 +146,7 @@ public class BarController {
     }
 
     public boolean checkHiddenLw() {
-        if (mWin != null) {
+        if (mWin != null && mWin.hasDrawnLw()) {
             if (!mWin.isVisibleLw() && !mWin.isAnimatingLw()) {
                 updateState(StatusBarManager.WINDOW_STATE_HIDDEN);
             }
@@ -230,9 +230,9 @@ public class BarController {
     public void dump(PrintWriter pw, String prefix) {
         if (mWin != null) {
             pw.print(prefix); pw.println(mTag);
-            pw.print("  "); pw.print("mState"); pw.print('=');
+            pw.print(prefix); pw.print("  "); pw.print("mState"); pw.print('=');
             pw.println(StatusBarManager.windowStateToString(mState));
-            pw.print("  "); pw.print("mTransientBar"); pw.print('=');
+            pw.print(prefix); pw.print("  "); pw.print("mTransientBar"); pw.print('=');
             pw.println(transientBarStateToString(mTransientBarState));
         }
     }
index 8fc6115..ff1d6cb 100644 (file)
@@ -2986,7 +2986,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
             pf.left = df.left = of.left = cf.left = vf.left = mDockLeft;
             pf.top = df.top = of.top = cf.top = vf.top = mDockTop;
             pf.right = df.right = of.right = cf.right = vf.right = mDockRight;
-            pf.bottom = df.bottom = of.bottom = cf.bottom = vf.bottom = mDockBottom;
+            // IM dock windows always go above the nav bar.
+            pf.bottom = df.bottom = of.bottom = cf.bottom = vf.bottom = mStableBottom;
             // IM dock windows always go to the bottom of the screen.
             attrs.gravity = Gravity.BOTTOM;
             mDockLayer = win.getSurfaceLayer();