diff options
7 files changed, 90 insertions, 61 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 24f7d83e4151..e32d7f2a3a78 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -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 } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java index 9648b11ab4e7..eef4f4456da8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java @@ -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); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java index 318ec5117bde..6302244c6bcc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java @@ -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; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 62f8596fb6f8..850f94dc1b05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -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; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index faf0368262f7..4b0a2b7ea967 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -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()); } diff --git a/policy/src/com/android/internal/policy/impl/BarController.java b/policy/src/com/android/internal/policy/impl/BarController.java index 01c53febf872..41b2fd1104ef 100644 --- a/policy/src/com/android/internal/policy/impl/BarController.java +++ b/policy/src/com/android/internal/policy/impl/BarController.java @@ -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)); } } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 8fc61155b776..ff1d6cb5138b 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -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(); |