diff options
author | Dianne Hackborn <hackbod@google.com> | 2013-02-22 15:05:25 -0800 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2013-02-22 19:14:37 -0800 |
commit | c4aad01cbbb69c916ef323693e1fd0560b0eccba (patch) | |
tree | 20f636eb690f976e9f83ec0a23e6ac991776b08b /services/java/com/android/server/wm/WindowManagerService.java | |
parent | fb6806570911851fb8cbaaf5bdf275a89f3c3ef4 (diff) | |
download | frameworks_base-c4aad01cbbb69c916ef323693e1fd0560b0eccba.zip frameworks_base-c4aad01cbbb69c916ef323693e1fd0560b0eccba.tar.gz frameworks_base-c4aad01cbbb69c916ef323693e1fd0560b0eccba.tar.bz2 |
Formalize overscan metrics.
The window manager now maintains and reports a new formal
"overscan insets" for each window, much like the existing
content and visible insets. This is used to correctly
position the various UI elements in the various combination
of layout options. In particular, this allows us to have
an activity that is using fitSystemWindows to have the content
of its UI extend out to the visible content part of the screen
while still positioning its fixed UI elements inside the
standard content rect (and the entire window extending all
the way into the overscan area to fill the screen as desired).
Okay, maybe that is not written so clearly. Well, it made
my head hurt too, so suffer!
The key thing is that windows now need to know about three
rectangles: the overall rectangle of the window, the rectangle
inside of the overscan area, and the rectangle inside of the
content area. The FLAG_LAYOUT_IN_OVERSCAN option controls
whether the second rectangle is pushed out to fill the entire
overscan area.
Also did some improvements to debug dumping in the window
manager.
Change-Id: Ib2368c4aff5709d00662c799507c37b6826929fd
Diffstat (limited to 'services/java/com/android/server/wm/WindowManagerService.java')
-rw-r--r-- | services/java/com/android/server/wm/WindowManagerService.java | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 6cc02a5..086da37 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -2640,7 +2640,7 @@ public class WindowManagerService extends IWindowManager.Stub public int relayoutWindow(Session session, IWindow client, int seq, WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, int viewVisibility, int flags, - Rect outFrame, Rect outContentInsets, + Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, Rect outVisibleInsets, Configuration outConfig, Surface outSurface) { boolean toBeDisplayed = false; boolean inTouchMode; @@ -2907,6 +2907,7 @@ public class WindowManagerService extends IWindowManager.Stub win.mAppToken.updateReportedVisibilityLocked(); } outFrame.set(win.mCompatFrame); + outOverscanInsets.set(win.mOverscanInsets); outContentInsets.set(win.mContentInsets); outVisibleInsets.set(win.mVisibleInsets); if (localLOGV) Slog.v( @@ -8127,6 +8128,8 @@ public class WindowManagerService extends IWindowManager.Stub private void updateResizingWindows(final WindowState w) { final WindowStateAnimator winAnimator = w.mWinAnimator; if (w.mHasSurface && w.mLayoutSeq == mLayoutSeq) { + w.mOverscanInsetsChanged |= + !w.mLastOverscanInsets.equals(w.mOverscanInsets); w.mContentInsetsChanged |= !w.mLastContentInsets.equals(w.mContentInsets); w.mVisibleInsetsChanged |= @@ -8154,6 +8157,7 @@ public class WindowManagerService extends IWindowManager.Stub + " configChanged=" + configChanged); } + w.mLastOverscanInsets.set(w.mOverscanInsets); w.mLastContentInsets.set(w.mContentInsets); w.mLastVisibleInsets.set(w.mVisibleInsets); makeWindowFreezingScreenIfNeededLocked(w); @@ -8690,9 +8694,11 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_ORIENTATION && winAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING) Slog.i( TAG, "Resizing " + win + " WITH DRAW PENDING"); - win.mClient.resized(win.mFrame, win.mLastContentInsets, win.mLastVisibleInsets, + win.mClient.resized(win.mFrame, win.mLastOverscanInsets, win.mLastContentInsets, + win.mLastVisibleInsets, winAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING, configChanged ? win.mConfiguration : null); + win.mOverscanInsetsChanged = false; win.mContentInsetsChanged = false; win.mVisibleInsetsChanged = false; winAnimator.mSurfaceResized = false; @@ -9656,6 +9662,18 @@ public class WindowManagerService extends IWindowManager.Stub } } + void dumpDisplayContentsLocked(PrintWriter pw, boolean dumpAll) { + pw.println("WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)"); + if (mDisplayReady) { + DisplayContentsIterator dCIterator = new DisplayContentsIterator(); + while (dCIterator.hasNext()) { + dCIterator.next().dump(" ", pw); + } + } else { + pw.println(" NO DISPLAY"); + } + } + void dumpWindowsLocked(PrintWriter pw, boolean dumpAll, ArrayList<WindowState> windows) { pw.println("WINDOW MANAGER WINDOWS (dumpsys window windows)"); @@ -9777,15 +9795,6 @@ public class WindowManagerService extends IWindowManager.Stub } } pw.println(); - pw.println(" DisplayContents:"); - if (mDisplayReady) { - DisplayContentsIterator dCIterator = new DisplayContentsIterator(); - while (dCIterator.hasNext()) { - dCIterator.next().dump(" ", pw); - } - } else { - pw.println(" NO DISPLAY"); - } pw.print(" mCurConfiguration="); pw.println(this.mCurConfiguration); pw.print(" mCurrentFocus="); pw.println(mCurrentFocus); if (mLastFocus != mCurrentFocus) { @@ -9965,6 +9974,7 @@ public class WindowManagerService extends IWindowManager.Stub pw.println(" p[policy]: policy state"); pw.println(" a[animator]: animator state"); pw.println(" s[essions]: active sessions"); + pw.println(" d[isplays]: active display contents"); pw.println(" t[okens]: token list"); pw.println(" w[indows]: window list"); pw.println(" cmd may also be a NAME to dump windows. NAME may"); @@ -10003,6 +10013,11 @@ public class WindowManagerService extends IWindowManager.Stub dumpSessionsLocked(pw, true); } return; + } else if ("displays".equals(cmd) || "d".equals(cmd)) { + synchronized(mWindowMap) { + dumpDisplayContentsLocked(pw, true); + } + return; } else if ("tokens".equals(cmd) || "t".equals(cmd)) { synchronized(mWindowMap) { dumpTokensLocked(pw, true); @@ -10053,6 +10068,11 @@ public class WindowManagerService extends IWindowManager.Stub if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } + dumpDisplayContentsLocked(pw, dumpAll); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } dumpTokensLocked(pw, dumpAll); pw.println(); if (dumpAll) { |