Merge "Ensure IME windows always appear north of the nav bar." into klp-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
f016a91247
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
public void setInteracting(boolean interacting) {
|
||||
mInteracting = interacting;
|
||||
if (mInteracting) {
|
||||
suspendAutohide();
|
||||
} else {
|
||||
resumeSuspendedAutohide();
|
||||
}
|
||||
checkBarModes();
|
||||
}
|
||||
|
||||
private void resumeSuspendedAutohide() {
|
||||
if (mAutohideSuspended) {
|
||||
scheduleAutohide();
|
||||
mHandler.postDelayed(mResumeSemiTransparent, 500); // longer than home -> launcher
|
||||
mHandler.postDelayed(mCheckBarModes, 500); // longer than home -> launcher
|
||||
}
|
||||
}
|
||||
|
||||
private void animateTransitionTo(int newMode) {
|
||||
mStatusBarView.getBarTransitions().transitionTo(newMode, true /*animate*/);
|
||||
if (mNavigationBarView != null) {
|
||||
mNavigationBarView.getBarTransitions().transitionTo(newMode, true /*animate*/);
|
||||
}
|
||||
}
|
||||
|
||||
@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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user