am f016a912: Merge "Ensure IME windows always appear north of the nav bar." into klp-dev

* commit 'f016a91247d591fd77e82383a84ae41606e30edd':
  Ensure IME windows always appear north of the nav bar.
This commit is contained in:
John Spurlock
2013-08-28 12:34:02 -07:00
committed by Android Git Automerger
7 changed files with 91 additions and 62 deletions

View File

@@ -1102,11 +1102,7 @@ public abstract class BaseStatusBar extends SystemUI implements
return km.inKeyguardRestrictedInputMode(); return km.inKeyguardRestrictedInputMode();
} }
public void suspendAutohide() { public void setInteracting(boolean interacting) {
// hook for subclasses
}
public void resumeAutohide() {
// hook for subclasses // hook for subclasses
} }

View File

@@ -86,9 +86,9 @@ public class DelegateViewHelper {
} }
if (action == MotionEvent.ACTION_DOWN) { if (action == MotionEvent.ACTION_DOWN) {
mBar.suspendAutohide(); mBar.setInteracting(true);
} else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
mBar.resumeAutohide(); mBar.setInteracting(false);
} }
mDelegateView.getLocationOnScreen(mTempPoint); mDelegateView.getLocationOnScreen(mTempPoint);

View File

@@ -64,17 +64,6 @@ public class BarTransitions {
return mMode; 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) { public void transitionTo(int mode, boolean animate) {
if (mMode == mode) return; if (mMode == mode) return;
int oldMode = mMode; int oldMode = mMode;

View File

@@ -112,9 +112,11 @@ public class NavigationBarView extends LinearLayout {
} }
private final class NavigationBarTransitions extends BarTransitions { 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 mTransparentBottom;
private final Drawable mTransparentRight; private final Drawable mTransparentRight;
private final int mTransparentColor;
public NavigationBarTransitions(Context context) { public NavigationBarTransitions(Context context) {
super(context, NavigationBarView.this); super(context, NavigationBarView.this);
@@ -125,12 +127,20 @@ public class NavigationBarView extends LinearLayout {
}; };
mTransparentBottom = new GradientDrawable(Orientation.BOTTOM_TOP, gradientColors); mTransparentBottom = new GradientDrawable(Orientation.BOTTOM_TOP, gradientColors);
mTransparentRight = new GradientDrawable(Orientation.RIGHT_LEFT, gradientColors); mTransparentRight = new GradientDrawable(Orientation.RIGHT_LEFT, gradientColors);
mTransparentColor = res.getColor(R.color.status_bar_background_transparent);
} }
public void setVertical(boolean isVertical) { public void setVertical(boolean isVertical) {
if (!ENABLE_GRADIENT) return;
mTransparent = isVertical ? mTransparentRight : mTransparentBottom; mTransparent = isVertical ? mTransparentRight : mTransparentBottom;
} }
@Override
protected Integer getBackgroundColor(int mode) {
if (!ENABLE_GRADIENT && mode == MODE_TRANSPARENT) return mTransparentColor;
return super.getBackgroundColor(mode);
}
@Override @Override
protected void onTransition(int oldMode, int newMode, boolean animate) { protected void onTransition(int oldMode, int newMode, boolean animate) {
super.onTransition(oldMode, newMode, animate); super.onTransition(oldMode, newMode, animate);

View File

@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.phone; 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 android.app.StatusBarManager.windowStateToString;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
@@ -170,7 +172,7 @@ public class PhoneStatusBar extends BaseStatusBar {
StatusBarWindowView mStatusBarWindow; StatusBarWindowView mStatusBarWindow;
PhoneStatusBarView mStatusBarView; PhoneStatusBarView mStatusBarView;
private int mStatusBarWindowState; private int mStatusBarWindowState = WINDOW_STATE_SHOWING;
int mPixelFormat; int mPixelFormat;
Object mQueueLock = new Object(); Object mQueueLock = new Object();
@@ -234,7 +236,7 @@ public class PhoneStatusBar extends BaseStatusBar {
// on-screen navigation buttons // on-screen navigation buttons
private NavigationBarView mNavigationBarView = null; private NavigationBarView mNavigationBarView = null;
private int mNavigationBarWindowState; private int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
// the tracker view // the tracker view
int mTrackingPosition; // the position of the top of the tracking 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 boolean mAutohideSuspended;
private int mStatusBarMode;
private int mNavigationBarMode;
private final Runnable mAutohide = new Runnable() { private final Runnable mAutohide = new Runnable() {
@Override @Override
@@ -1394,7 +1399,7 @@ public class PhoneStatusBar extends BaseStatusBar {
visibilityChanged(true); visibilityChanged(true);
suspendAutohide(); setInteracting(true);
} }
public void animateCollapsePanels() { public void animateCollapsePanels() {
@@ -1678,8 +1683,7 @@ public class PhoneStatusBar extends BaseStatusBar {
mPostCollapseCleanup = null; mPostCollapseCleanup = null;
} }
// Reschedule suspended auto-hide if necessary setInteracting(false);
resumeAutohide();
} }
/** /**
@@ -1826,7 +1830,7 @@ public class PhoneStatusBar extends BaseStatusBar {
hideCling(); hideCling();
} }
suspendAutohide(); setInteracting(true);
return false; return false;
} }
@@ -1843,11 +1847,12 @@ public class PhoneStatusBar extends BaseStatusBar {
if (mNavigationBarView != null) { if (mNavigationBarView != null) {
mNavigationBarView.setNavigationIconHints(hints); mNavigationBarView.setNavigationIconHints(hints);
} }
checkBarModes();
} }
@Override // CommandQueue @Override // CommandQueue
public void setWindowState(int window, int state) { public void setWindowState(int window, int state) {
boolean showing = state == StatusBarManager.WINDOW_STATE_SHOWING; boolean showing = state == WINDOW_STATE_SHOWING;
if (mStatusBarWindow != null if (mStatusBarWindow != null
&& window == StatusBarManager.WINDOW_STATUS_BAR && window == StatusBarManager.WINDOW_STATUS_BAR
&& mStatusBarWindowState != state) { && mStatusBarWindowState != state) {
@@ -1898,17 +1903,28 @@ public class PhoneStatusBar extends BaseStatusBar {
} }
// update status bar mode // update status bar mode
int sbMode = updateBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(), final int sbMode = computeBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(),
View.STATUS_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS, View.STATUS_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS);
mStatusBarWindowState);
// update navigation bar mode // update navigation bar mode
int nbMode = mNavigationBarView == null ? -1 : updateBarMode( final int nbMode = mNavigationBarView == null ? -1 : computeBarMode(
oldVal, newVal, mNavigationBarView.getBarTransitions(), oldVal, newVal, mNavigationBarView.getBarTransitions(),
View.NAVIGATION_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION, View.NAVIGATION_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION);
mNavigationBarWindowState); final boolean sbModeChanged = sbMode != -1;
final boolean nbModeChanged = nbMode != -1;
if (sbMode != -1 || 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 // update transient bar autohide
if (sbMode == MODE_SEMI_TRANSPARENT || nbMode == MODE_SEMI_TRANSPARENT) { if (sbMode == MODE_SEMI_TRANSPARENT || nbMode == MODE_SEMI_TRANSPARENT) {
scheduleAutohide(); scheduleAutohide();
@@ -1935,15 +1951,13 @@ public class PhoneStatusBar extends BaseStatusBar {
return mStatusBarView.getBarTransitions().getMode(); return mStatusBarView.getBarTransitions().getMode();
} }
private int updateBarMode(int oldVis, int newVis, BarTransitions transitions, private int computeBarMode(int oldVis, int newVis, BarTransitions transitions,
int transientFlag, int transparentFlag, int windowState) { int transientFlag, int transparentFlag) {
final int oldMode = barMode(oldVis, transientFlag, transparentFlag); final int oldMode = barMode(oldVis, transientFlag, transparentFlag);
final int newMode = barMode(newVis, transientFlag, transparentFlag); final int newMode = barMode(newVis, transientFlag, transparentFlag);
if (oldMode == newMode) { if (oldMode == newMode) {
return -1; // no mode change return -1; // no mode change
} }
final boolean animate = windowState == StatusBarManager.WINDOW_STATE_SHOWING;
transitions.transitionTo(newMode, animate);
return newMode; return newMode;
} }
@@ -1953,35 +1967,49 @@ public class PhoneStatusBar extends BaseStatusBar {
: MODE_OPAQUE; : 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 @Override
public void run() { public void run() {
if ((mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT) != 0) { checkBarModes();
animateTransitionTo(BarTransitions.MODE_SEMI_TRANSPARENT);
}
}}; }};
@Override @Override
public void resumeAutohide() { public void setInteracting(boolean interacting) {
mInteracting = interacting;
if (mInteracting) {
suspendAutohide();
} else {
resumeSuspendedAutohide();
}
checkBarModes();
}
private void resumeSuspendedAutohide() {
if (mAutohideSuspended) { if (mAutohideSuspended) {
scheduleAutohide(); scheduleAutohide();
mHandler.postDelayed(mResumeSemiTransparent, 500); // longer than home -> launcher mHandler.postDelayed(mCheckBarModes, 500); // longer than home -> launcher
} }
} }
private void animateTransitionTo(int newMode) { private void suspendAutohide() {
mStatusBarView.getBarTransitions().transitionTo(newMode, true /*animate*/);
if (mNavigationBarView != null) {
mNavigationBarView.getBarTransitions().transitionTo(newMode, true /*animate*/);
}
}
@Override
public void suspendAutohide() {
mHandler.removeCallbacks(mAutohide); mHandler.removeCallbacks(mAutohide);
mHandler.removeCallbacks(mResumeSemiTransparent); mHandler.removeCallbacks(mCheckBarModes);
mAutohideSuspended = (mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT) != 0; mAutohideSuspended = (mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT) != 0;
animateTransitionTo(BarTransitions.MODE_OPAQUE);
} }
private void cancelAutohide() { private void cancelAutohide() {
@@ -2087,8 +2115,8 @@ public class PhoneStatusBar extends BaseStatusBar {
|| ((vis & InputMethodService.IME_VISIBLE) != 0); || ((vis & InputMethodService.IME_VISIBLE) != 0);
mCommandQueue.setNavigationIconHints( mCommandQueue.setNavigationIconHints(
altBack ? (mNavigationIconHints | StatusBarManager.NAVIGATION_HINT_BACK_ALT) altBack ? (mNavigationIconHints | NAVIGATION_HINT_BACK_ALT)
: (mNavigationIconHints & ~StatusBarManager.NAVIGATION_HINT_BACK_ALT)); : (mNavigationIconHints & ~NAVIGATION_HINT_BACK_ALT));
if (mQS != null) mQS.setImeWindowStatus(vis > 0); if (mQS != null) mQS.setImeWindowStatus(vis > 0);
} }
@@ -2186,12 +2214,17 @@ public class PhoneStatusBar extends BaseStatusBar {
+ " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY()); + " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY());
} }
pw.print(" mInteracting="); pw.println(mInteracting);
pw.print(" mStatusBarWindowState="); pw.print(" mStatusBarWindowState=");
pw.println(windowStateToString(mStatusBarWindowState)); pw.println(windowStateToString(mStatusBarWindowState));
pw.print(" mStatusBarMode=");
pw.println(BarTransitions.modeToString(mStatusBarMode));
dumpBarTransitions(pw, "mStatusBarView", mStatusBarView.getBarTransitions()); dumpBarTransitions(pw, "mStatusBarView", mStatusBarView.getBarTransitions());
if (mNavigationBarView != null) { if (mNavigationBarView != null) {
pw.print(" mNavigationBarWindowState="); pw.print(" mNavigationBarWindowState=");
pw.println(windowStateToString(mNavigationBarWindowState)); pw.println(windowStateToString(mNavigationBarWindowState));
pw.print(" mNavigationBarMode=");
pw.println(BarTransitions.modeToString(mNavigationBarMode));
dumpBarTransitions(pw, "mNavigationBarView", mNavigationBarView.getBarTransitions()); dumpBarTransitions(pw, "mNavigationBarView", mNavigationBarView.getBarTransitions());
} }

View File

@@ -51,7 +51,7 @@ public class BarController {
private IStatusBarService mStatusBarService; private IStatusBarService mStatusBarService;
private WindowState mWin; private WindowState mWin;
private int mState; private int mState = StatusBarManager.WINDOW_STATE_SHOWING;
private int mTransientBarState; private int mTransientBarState;
private boolean mPendingShow; private boolean mPendingShow;
private long mLastTransparent; private long mLastTransparent;
@@ -110,7 +110,7 @@ public class BarController {
final boolean oldAnim = mWin.isAnimatingLw(); final boolean oldAnim = mWin.isAnimatingLw();
final boolean rt = show ? mWin.showLw(true) : mWin.hideLw(true); final boolean rt = show ? mWin.showLw(true) : mWin.hideLw(true);
final int state = computeState(oldVis, oldAnim, mWin.isVisibleLw(), mWin.isAnimatingLw()); final int state = computeState(oldVis, oldAnim, mWin.isVisibleLw(), mWin.isAnimatingLw());
if (state > -1) { if (state > -1 && mWin.hasDrawnLw()) {
updateState(state); updateState(state);
} }
return rt; return rt;
@@ -146,7 +146,7 @@ public class BarController {
} }
public boolean checkHiddenLw() { public boolean checkHiddenLw() {
if (mWin != null) { if (mWin != null && mWin.hasDrawnLw()) {
if (!mWin.isVisibleLw() && !mWin.isAnimatingLw()) { if (!mWin.isVisibleLw() && !mWin.isAnimatingLw()) {
updateState(StatusBarManager.WINDOW_STATE_HIDDEN); updateState(StatusBarManager.WINDOW_STATE_HIDDEN);
} }
@@ -230,9 +230,9 @@ public class BarController {
public void dump(PrintWriter pw, String prefix) { public void dump(PrintWriter pw, String prefix) {
if (mWin != null) { if (mWin != null) {
pw.print(prefix); pw.println(mTag); 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.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)); pw.println(transientBarStateToString(mTransientBarState));
} }
} }

View File

@@ -2986,7 +2986,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
pf.left = df.left = of.left = cf.left = vf.left = mDockLeft; pf.left = df.left = of.left = cf.left = vf.left = mDockLeft;
pf.top = df.top = of.top = cf.top = vf.top = mDockTop; pf.top = df.top = of.top = cf.top = vf.top = mDockTop;
pf.right = df.right = of.right = cf.right = vf.right = mDockRight; 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. // IM dock windows always go to the bottom of the screen.
attrs.gravity = Gravity.BOTTOM; attrs.gravity = Gravity.BOTTOM;
mDockLayer = win.getSurfaceLayer(); mDockLayer = win.getSurfaceLayer();