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;
StatusBarWindowView mStatusBarWindow;
PhoneStatusBarView mStatusBarView;
- private int mStatusBarWindowState;
+ private int mStatusBarWindowState = WINDOW_STATE_SHOWING;
int mPixelFormat;
Object mQueueLock = new Object();
// 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.
}
};
+ private boolean mInteracting;
private boolean mAutohideSuspended;
+ private int mStatusBarMode;
+ private int mNavigationBarMode;
private final Runnable mAutohide = new Runnable() {
@Override
visibilityChanged(true);
- suspendAutohide();
+ setInteracting(true);
}
public void animateCollapsePanels() {
mPostCollapseCleanup = null;
}
- // Reschedule suspended auto-hide if necessary
- resumeAutohide();
+ setInteracting(false);
}
/**
hideCling();
}
- suspendAutohide();
+ setInteracting(true);
return false;
}
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) {
}
// 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();
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;
}
: 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() {
|| ((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);
}
+ " 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());
}