diff options
author | Dianne Hackborn <hackbod@google.com> | 2010-10-28 11:28:39 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2010-10-28 11:28:39 -0700 |
commit | 82de1aecd17b4f2e0113fd345d84298649f001b8 (patch) | |
tree | 04c3b6e902f4ef1c4ccd955e3d8be0d2992c1b97 /policy | |
parent | e829fef63957a23b61cdb01bb692a17a041ff2dc (diff) | |
download | frameworks_base-82de1aecd17b4f2e0113fd345d84298649f001b8.zip frameworks_base-82de1aecd17b4f2e0113fd345d84298649f001b8.tar.gz frameworks_base-82de1aecd17b4f2e0113fd345d84298649f001b8.tar.bz2 |
Fix issue #3083761: windowSoftInputMode="adjustPan" ignored on stingray
The code for the new always-there status bar was a bit too brute-force,
and also impacting things like the IME. We now implement this by
actually having an explicit concept of "display size" that the status bar
can carve out from everyone else.
Change-Id: I1963d0b07f52e8d8dc3c836227da9bf5d3f2e8b9
Diffstat (limited to 'policy')
-rwxr-xr-x | policy/src/com/android/internal/policy/impl/PhoneWindowManager.java | 83 |
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 |