summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java107
-rw-r--r--policy/src/com/android/internal/policy/impl/BarController.java10
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java3
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();