summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java83
1 files changed, 52 insertions, 31 deletions
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index b4c696b..cd1ad4c 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -256,8 +256,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
};
- // The current size of the screen.
- int mW, mH;
+ // The current size of the screen; these may be different than (0,0)-(dw,dh)
+ // if the status bar can't be hidden; in that case it effectively carves out
+ // that area of the display from all other windows.
+ int mScreenLeft, mScreenTop, mScreenWidth, mScreenHeight;
// During layout, the current screen borders with all outer decoration
// (status bar, input method dock) accounted for.
int mCurLeft, mCurTop, mCurRight, mCurBottom;
@@ -1316,10 +1318,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
public void getContentInsetHintLw(WindowManager.LayoutParams attrs, Rect contentInset) {
final int fl = attrs.flags;
- if (mStatusBarCanHide && (fl &
- (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR))
+ if ((fl & (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR))
== (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR)) {
- contentInset.set(mCurLeft, mCurTop, mW - mCurRight, mH - mCurBottom);
+ contentInset.set(mCurLeft, mCurTop,
+ (mScreenLeft+mScreenWidth) - mCurRight,
+ (mScreenTop+mScreenHeight) - mCurBottom);
} else {
contentInset.setEmpty();
}
@@ -1327,8 +1330,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
/** {@inheritDoc} */
public void beginLayoutLw(int displayWidth, int displayHeight) {
- mW = displayWidth;
- mH = displayHeight;
+ mScreenLeft = mScreenTop = 0;
+ mScreenWidth = displayWidth;
+ mScreenHeight = displayHeight;
mDockLeft = mContentLeft = mCurLeft = 0;
mDockTop = mContentTop = mCurTop = 0;
mDockRight = mContentRight = mCurRight = displayWidth;
@@ -1350,16 +1354,34 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// If the status bar is hidden, we don't want to cause
// windows behind it to scroll.
final Rect r = mStatusBar.getFrameLw();
- if (mDockTop == r.top) mDockTop = r.bottom;
- else if (mDockBottom == r.bottom) mDockBottom = r.top;
- mContentTop = mCurTop = mDockTop;
- mContentBottom = mCurBottom = mDockBottom;
- if (DEBUG_LAYOUT) Log.v(TAG, "Status bar: mDockTop=" + mDockTop
- + " mContentTop=" + mContentTop
- + " mCurTop=" + mCurTop
- + " mDockBottom=" + mDockBottom
- + " mContentBottom=" + mContentBottom
- + " mCurBottom=" + mCurBottom);
+ if (mStatusBarCanHide) {
+ // Status bar may go away, so the screen area it occupies
+ // is available to apps but just covering them when the
+ // status bar is visible.
+ if (mDockTop == r.top) mDockTop = r.bottom;
+ else if (mDockBottom == r.bottom) mDockBottom = r.top;
+ mContentTop = mCurTop = mDockTop;
+ mContentBottom = mCurBottom = mDockBottom;
+ if (DEBUG_LAYOUT) Log.v(TAG, "Status bar: mDockTop=" + mDockTop
+ + " mContentTop=" + mContentTop
+ + " mCurTop=" + mCurTop
+ + " mDockBottom=" + mDockBottom
+ + " mContentBottom=" + mContentBottom
+ + " mCurBottom=" + mCurBottom);
+ } else {
+ // Status bar can't go away; the part of the screen it
+ // covers does not exist for anything behind it.
+ if (mScreenTop == r.top) {
+ mScreenTop = r.bottom;
+ mScreenHeight -= (r.bottom-r.top);
+ } else if ((mScreenHeight-mScreenTop) == r.bottom) {
+ mScreenHeight -= (r.bottom-r.top);
+ }
+ mContentTop = mCurTop = mDockTop = mScreenTop;
+ mContentBottom = mCurBottom = mDockBottom = mScreenTop+mScreenHeight;
+ if (DEBUG_LAYOUT) Log.v(TAG, "Status bar: mScreenTop=" + mScreenTop
+ + " mScreenHeight=" + mScreenHeight);
+ }
}
}
}
@@ -1444,8 +1466,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
attrs.gravity = Gravity.BOTTOM;
mDockLayer = win.getSurfaceLayer();
} else {
- if (mStatusBarCanHide && (fl &
- (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR))
+ if ((fl & (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR))
== (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR)) {
// This is the case for a normal activity window: we want it
// to cover all of the screen space, and it can take care of
@@ -1456,10 +1477,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// frame is the same as the one we are attached to.
setAttachedWindowFrames(win, fl, sim, attached, true, pf, df, cf, vf);
} else {
- pf.left = df.left = 0;
- pf.top = df.top = 0;
- pf.right = df.right = mW;
- pf.bottom = df.bottom = mH;
+ pf.left = df.left = mScreenLeft;
+ pf.top = df.top = mScreenTop;
+ pf.right = df.right = mScreenLeft+mScreenWidth;
+ pf.bottom = df.bottom = mScreenTop+mScreenHeight;
if ((sim & SOFT_INPUT_MASK_ADJUST) != SOFT_INPUT_ADJUST_RESIZE) {
cf.left = mDockLeft;
cf.top = mDockTop;
@@ -1476,13 +1497,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
vf.right = mCurRight;
vf.bottom = mCurBottom;
}
- } else if (mStatusBarCanHide && (fl & FLAG_LAYOUT_IN_SCREEN) != 0) {
+ } else if ((fl & FLAG_LAYOUT_IN_SCREEN) != 0) {
// A window that has requested to fill the entire screen just
// gets everything, period.
- pf.left = df.left = cf.left = 0;
- pf.top = df.top = cf.top = 0;
- pf.right = df.right = cf.right = mW;
- pf.bottom = df.bottom = cf.bottom = mH;
+ pf.left = df.left = cf.left = mScreenLeft;
+ pf.top = df.top = cf.top = mScreenTop;
+ pf.right = df.right = cf.right = mScreenLeft+mScreenWidth;
+ pf.bottom = df.bottom = cf.bottom = mScreenTop+mScreenHeight;
vf.left = mCurLeft;
vf.top = mCurTop;
vf.right = mCurRight;
@@ -1743,9 +1764,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
rect.union(w.getShownFrameLw());
}
}
- final int insetw = mW/10;
- final int inseth = mH/10;
- if (rect.contains(insetw, inseth, mW-insetw, mH-inseth)) {
+ final int insetw = mScreenWidth/10;
+ final int inseth = mScreenHeight/10;
+ if (rect.contains(insetw, inseth, mScreenWidth-insetw, mScreenHeight-inseth)) {
// All of the status bar windows put together cover the
// screen, so the app can't be seen. (Note this test doesn't
// work if the rects of these windows are at off offsets or