diff options
| author | 2012-04-30 14:04:36 -0700 | |
|---|---|---|
| committer | 2012-04-30 14:04:36 -0700 | |
| commit | 1e945c4fda0242e8ae02ccb7a2262556f41b42cc (patch) | |
| tree | 133d6e23b062ca260d9b2d10a54bc0fc6240fe0b | |
| parent | 5f610b735994a5212cbc54b8e3ad250d30403ed1 (diff) | |
| parent | 5c58de3a523a384c47b0b1e0f5dd9728a74cd9f7 (diff) | |
Merge "Add system insets to windows." into jb-dev
13 files changed, 170 insertions, 52 deletions
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 6917fb215365..9d3667766fec 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -154,6 +154,7 @@ public abstract class WallpaperService extends Service { int mCurWindowPrivateFlags = mWindowPrivateFlags; final Rect mVisibleInsets = new Rect(); final Rect mWinFrame = new Rect(); + final Rect mSystemInsets = new Rect(); final Rect mContentInsets = new Rect(); final Configuration mConfiguration = new Configuration(); @@ -253,7 +254,7 @@ public abstract class WallpaperService extends Service { final BaseIWindow mWindow = new BaseIWindow() { @Override - public void resized(int w, int h, Rect coveredInsets, + public void resized(int w, int h, Rect systemInsets, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { Message msg = mCaller.obtainMessageI(MSG_WINDOW_RESIZED, reportDraw ? 1 : 0); @@ -620,7 +621,7 @@ public abstract class WallpaperService extends Service { final int relayoutResult = mSession.relayout( mWindow, mWindow.mSeq, mLayout, mWidth, mHeight, - View.VISIBLE, 0, mWinFrame, mContentInsets, + View.VISIBLE, 0, mWinFrame, mSystemInsets, mContentInsets, mVisibleInsets, mConfiguration, mSurfaceHolder.mSurface); if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index d73723a049d1..555f306d965b 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -45,8 +45,8 @@ oneway interface IWindow { */ void executeCommand(String command, String parameters, in ParcelFileDescriptor descriptor); - void resized(int w, int h, in Rect coveredInsets, in Rect visibleInsets, - boolean reportDraw, in Configuration newConfig); + void resized(int w, int h, in Rect systemInsets, in Rect contentInsets, + in Rect visibleInsets, boolean reportDraw, in Configuration newConfig); void dispatchAppVisibility(boolean visible); void dispatchGetNewSurface(); void dispatchScreenState(boolean on); diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index 53d6e1f20281..f26d5e1d14cf 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -58,6 +58,10 @@ interface IWindowSession { * {@link WindowManagerImpl#RELAYOUT_DEFER_SURFACE_DESTROY}. * @param outFrame Rect in which is placed the new position/size on * screen. + * @param outSystemInsets Rect in which is placed the offsets from + * <var>outFrame</var> over which any core system UI elements are + * currently covering the window. This is not generally used for + * layout, but just to know where the window is obscured. * @param outContentInsets Rect in which is placed the offsets from * <var>outFrame</var> in which the content of the window should be * placed. This can be used to modify the window layout to ensure its @@ -79,9 +83,9 @@ interface IWindowSession { */ int relayout(IWindow window, int seq, in WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, int viewVisibility, - int flags, out Rect outFrame, out Rect outContentInsets, - out Rect outVisibleInsets, out Configuration outConfig, - out Surface outSurface); + int flags, out Rect outFrame, out Rect outSystemInsets, + out Rect outContentInsets, out Rect outVisibleInsets, + out Configuration outConfig, out Surface outSurface); /** * If a call to relayout() asked to have the surface destroy deferred, diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index c658a80323d7..ee322f8b773c 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -98,6 +98,7 @@ public class SurfaceView extends View { MyWindow mWindow; final Rect mVisibleInsets = new Rect(); final Rect mWinFrame = new Rect(); + final Rect mSystemInsets = new Rect(); final Rect mContentInsets = new Rect(); final Configuration mConfiguration = new Configuration(); @@ -471,7 +472,7 @@ public class SurfaceView extends View { mWindow, mWindow.mSeq, mLayout, mWidth, mHeight, visible ? VISIBLE : GONE, WindowManagerImpl.RELAYOUT_DEFER_SURFACE_DESTROY, - mWinFrame, mContentInsets, + mWinFrame, mSystemInsets, mContentInsets, mVisibleInsets, mConfiguration, mNewSurface); if ((relayoutResult&WindowManagerImpl.RELAYOUT_RES_FIRST_TIME) != 0) { mReportDrawNeeded = true; @@ -605,7 +606,7 @@ public class SurfaceView extends View { mSurfaceView = new WeakReference<SurfaceView>(surfaceView); } - public void resized(int w, int h, Rect coveredInsets, + public void resized(int w, int h, Rect systemInsets, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { SurfaceView surfaceView = mSurfaceView.get(); if (surfaceView != null) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 21e57db9a92f..9565547610a6 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -261,6 +261,7 @@ public final class ViewRootImpl implements ViewParent, final Rect mPendingVisibleInsets = new Rect(); final Rect mPendingContentInsets = new Rect(); + final Rect mPendingSystemInsets = new Rect(); final ViewTreeObserver.InternalInsetsInfo mLastGivenInsets = new ViewTreeObserver.InternalInsetsInfo(); @@ -3846,7 +3847,7 @@ public final class ViewRootImpl implements ViewParent, (int) (mView.getMeasuredWidth() * appScale + 0.5f), (int) (mView.getMeasuredHeight() * appScale + 0.5f), viewVisibility, insetsPending ? WindowManagerImpl.RELAYOUT_INSETS_PENDING : 0, - mWinFrame, mPendingContentInsets, mPendingVisibleInsets, + mWinFrame, mPendingSystemInsets, mPendingContentInsets, mPendingVisibleInsets, mPendingConfiguration, mSurface); //Log.d(TAG, "<<<<<< BACK FROM relayout"); if (restore) { @@ -4689,11 +4690,11 @@ public final class ViewRootImpl implements ViewParent, mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor); } - public void resized(int w, int h, Rect coveredInsets, Rect visibleInsets, - boolean reportDraw, Configuration newConfig) { + public void resized(int w, int h, Rect systemInsets, Rect contentInsets, + Rect visibleInsets, boolean reportDraw, Configuration newConfig) { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { - viewAncestor.dispatchResized(w, h, coveredInsets, visibleInsets, reportDraw, + viewAncestor.dispatchResized(w, h, contentInsets, visibleInsets, reportDraw, newConfig); } } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 27baaea870f8..94762b903e08 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -140,6 +140,10 @@ public interface WindowManagerPolicy { * @param displayFrame The frame of the overall display in which this * window can appear, used for constraining the overall dimensions * of the window. + * @param systemFrame The frame within the display that any system + * elements are currently covering. These indicate which parts of + * the window should be considered completely obscured by the screen + * decorations. * @param contentFrame The frame within the display in which we would * like active content to appear. This will cause windows behind to * be resized to match the given content frame. @@ -151,7 +155,7 @@ public interface WindowManagerPolicy { * are visible. */ public void computeFrameLw(Rect parentFrame, Rect displayFrame, - Rect contentFrame, Rect visibleFrame); + Rect systemFrame, Rect contentFrame, Rect visibleFrame); /** * Retrieve the current frame of the window that has been assigned by @@ -173,12 +177,20 @@ public interface WindowManagerPolicy { * Retrieve the frame of the display that this window was last * laid out in. Must be called with the * window manager lock held. - * + * * @return Rect The rectangle holding the display frame. */ public Rect getDisplayFrameLw(); /** + * Retrieve the frame of the system elements that last covered the window. + * Must be called with the window manager lock held. + * + * @return Rect The rectangle holding the system frame. + */ + public Rect getSystemFrameLw(); + + /** * Retrieve the frame of the content area that this window was last * laid out in. This is the area in which the content of the window * should be placed. It will be smaller than the display frame to @@ -298,6 +310,12 @@ public interface WindowManagerPolicy { boolean isDisplayedLw(); /** + * Return true if this window (or a window it is attached to, but not + * considering its app token) is currently animating. + */ + public boolean isAnimatingLw(); + + /** * Is this window considered to be gone for purposes of layout? */ boolean isGoneForLayoutLw(); @@ -305,8 +323,6 @@ public interface WindowManagerPolicy { /** * Returns true if this window has been shown on screen at some time in * the past. Must be called with the window manager lock held. - * - * @return boolean */ public boolean hasDrawnLw(); diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index a649ee140d73..fbed4859f0e4 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -33,7 +33,7 @@ public class BaseIWindow extends IWindow.Stub { mSession = session; } - public void resized(int w, int h, Rect coveredInsets, + public void resized(int w, int h, Rect systemInsets, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { if (reportDraw) { try { diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index d2053ff26d8f..319eb3608a9a 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -407,6 +407,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { // that area of the display from all other windows. int mRestrictedScreenLeft, mRestrictedScreenTop; int mRestrictedScreenWidth, mRestrictedScreenHeight; + // During layout, the current screen borders accounting for any currently + // visible system UI elements. + int mSystemLeft, mSystemTop, mSystemRight, mSystemBottom; // For applications requesting stable content insets, these are them. int mStableLeft, mStableTop, mStableRight, mStableBottom; // During layout, the current screen borders with all outer decoration @@ -423,6 +426,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { int mDockLeft, mDockTop, mDockRight, mDockBottom; // During layout, the layer at which the doc window is placed. int mDockLayer; + // During layout, this is the layer of the status bar. + int mStatusBarLayer; int mLastSystemUiFlags; // Bits that we are in the process of clearing, so we want to prevent // them from being set by applications until everything has been updated @@ -438,6 +443,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final Rect mTmpParentFrame = new Rect(); static final Rect mTmpDisplayFrame = new Rect(); + static final Rect mTmpSystemFrame = new Rect(); static final Rect mTmpContentFrame = new Rect(); static final Rect mTmpVisibleFrame = new Rect(); static final Rect mTmpNavigationFrame = new Rect(); @@ -2168,11 +2174,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { mRestrictedScreenLeft = mRestrictedScreenTop = 0; mRestrictedScreenWidth = displayWidth; mRestrictedScreenHeight = displayHeight; - mDockLeft = mContentLeft = mStableLeft = mCurLeft = 0; - mDockTop = mContentTop = mStableTop = mCurTop = 0; - mDockRight = mContentRight = mStableRight = mCurRight = displayWidth; - mDockBottom = mContentBottom = mStableBottom = mCurBottom = displayHeight; + mDockLeft = mContentLeft = mStableLeft = mSystemLeft = mCurLeft = 0; + mDockTop = mContentTop = mStableTop = mSystemTop = mCurTop = 0; + mDockRight = mContentRight = mStableRight = mSystemRight = mCurRight = displayWidth; + mDockBottom = mContentBottom = mStableBottom = mSystemBottom = mCurBottom = displayHeight; mDockLayer = 0x10000000; + mStatusBarLayer = -1; // start with the current dock rect, which will be (0,0,displayWidth,displayHeight) final Rect pf = mTmpParentFrame; @@ -2232,6 +2239,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { // We currently want to hide the navigation UI. mNavigationBar.hideLw(true); } + if (navVisible && !mNavigationBar.isAnimatingLw()) { + // If the nav bar is currently requested to be visible, + // and not in the process of animating on or off, then + // we can tell the app that it is covered by it. + mSystemBottom = mTmpNavigationFrame.top; + } } else { // Landscape screen; nav bar goes to the right. int left = displayWidth - mNavigationBarWidthForRotation[displayRotation]; @@ -2250,6 +2263,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { // We currently want to hide the navigation UI. mNavigationBar.hideLw(true); } + if (navVisible && !mNavigationBar.isAnimatingLw()) { + // If the nav bar is currently requested to be visible, + // and not in the process of animating on or off, then + // we can tell the app that it is covered by it. + mSystemRight = mTmpNavigationFrame.left; + } } // Make sure the content and current rectangles are updated to // account for the restrictions from the navigation bar. @@ -2257,9 +2276,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { mContentBottom = mCurBottom = mDockBottom; mContentLeft = mCurLeft = mDockLeft; mContentRight = mCurRight = mDockRight; + mStatusBarLayer = mNavigationBar.getSurfaceLayer(); // And compute the final frame. mNavigationBar.computeFrameLw(mTmpNavigationFrame, mTmpNavigationFrame, - mTmpNavigationFrame, mTmpNavigationFrame); + mTmpNavigationFrame, mTmpNavigationFrame, mTmpNavigationFrame); if (DEBUG_LAYOUT) Log.i(TAG, "mNavigationBar frame: " + mTmpNavigationFrame); } if (DEBUG_LAYOUT) Log.i(TAG, String.format("mDock rect: (%d,%d - %d,%d)", @@ -2277,8 +2297,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { vf.right = mStableRight; vf.bottom = mStableBottom; + mStatusBarLayer = mStatusBar.getSurfaceLayer(); + // Let the status bar determine its size. - mStatusBar.computeFrameLw(pf, df, vf, vf); + mStatusBar.computeFrameLw(pf, df, df, vf, vf); // For layout, the status bar is always at the top with our fixed height. mStableTop = mUnrestrictedScreenTop + mStatusBarHeight; @@ -2303,6 +2325,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { mContentLeft, mContentTop, mContentRight, mContentBottom, mCurLeft, mCurTop, mCurRight, mCurBottom)); } + if (mStatusBar.isVisibleLw() && !mStatusBar.isAnimatingLw()) { + // If the status bar is currently requested to be visible, + // and not in the process of animating on or off, then + // we can tell the app that it is covered by it. + mSystemTop = mUnrestrictedScreenTop + mStatusBarHeight; + } } } @@ -2368,6 +2396,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { final Rect pf = mTmpParentFrame; final Rect df = mTmpDisplayFrame; + final Rect sf = mTmpSystemFrame; final Rect cf = mTmpContentFrame; final Rect vf = mTmpVisibleFrame; @@ -2611,6 +2640,20 @@ public class PhoneWindowManager implements WindowManagerPolicy { df.right = df.bottom = cf.right = cf.bottom = vf.right = vf.bottom = 10000; } + // Compute the system frame. This is easy: for things behind the + // status bar, it is any application windows; otherwise it is not set. + int parentType = attached != null ? attached.getAttrs().type : attrs.type; + if (win.getSurfaceLayer() < mStatusBarLayer + && parentType < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW) { + sf.left = mSystemLeft; + sf.top = mSystemTop; + sf.right = mSystemRight; + sf.bottom = mSystemBottom; + } else { + sf.left = sf.top = -10000; + sf.right = sf.bottom = 10000; + } + if (DEBUG_LAYOUT) Log.v(TAG, "Compute frame " + attrs.getTitle() + ": sim=#" + Integer.toHexString(sim) + " attach=" + attached + " type=" + attrs.type @@ -2618,7 +2661,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { + " pf=" + pf.toShortString() + " df=" + df.toShortString() + " cf=" + cf.toShortString() + " vf=" + vf.toShortString()); - win.computeFrameLw(pf, df, cf, vf); + win.computeFrameLw(pf, df, sf, cf, vf); // Dock windows carve out the bottom of the screen, so normal windows // can't appear underneath them. @@ -4193,6 +4236,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(","); pw.print(mStableTop); pw.print(")-("); pw.print(mStableRight); pw.print(","); pw.print(mStableBottom); pw.println(")"); + pw.print(prefix); pw.print("mSystem=("); pw.print(mSystemLeft); + pw.print(","); pw.print(mSystemTop); + pw.print(")-("); pw.print(mSystemRight); + pw.print(","); pw.print(mSystemBottom); pw.println(")"); pw.print(prefix); pw.print("mCur=("); pw.print(mCurLeft); pw.print(","); pw.print(mCurTop); pw.print(")-("); pw.print(mCurRight); @@ -4205,7 +4252,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(","); pw.print(mDockTop); pw.print(")-("); pw.print(mDockRight); pw.print(","); pw.print(mDockBottom); pw.println(")"); - pw.print(prefix); pw.print("mDockLayer="); pw.println(mDockLayer); + pw.print(prefix); pw.print("mDockLayer="); pw.print(mDockLayer); + pw.print(" mStatusBarLayer="); pw.println(mStatusBarLayer); pw.print(prefix); pw.print("mTopFullscreenOpaqueWindowState="); pw.println(mTopFullscreenOpaqueWindowState); pw.print(prefix); pw.print("mTopIsFullscreen="); pw.print(mTopIsFullscreen); diff --git a/services/java/com/android/server/wm/Session.java b/services/java/com/android/server/wm/Session.java index 77575f2f5251..53c0e070461a 100644 --- a/services/java/com/android/server/wm/Session.java +++ b/services/java/com/android/server/wm/Session.java @@ -151,13 +151,14 @@ final class Session extends IWindowSession.Stub public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, int viewFlags, - int flags, Rect outFrame, Rect outContentInsets, + int flags, Rect outFrame, Rect outSystemInsets, Rect outContentInsets, Rect outVisibleInsets, Configuration outConfig, Surface outSurface) { if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED relayout from " + Binder.getCallingPid()); int res = mService.relayoutWindow(this, window, seq, attrs, requestedWidth, requestedHeight, viewFlags, flags, - outFrame, outContentInsets, outVisibleInsets, outConfig, outSurface); + outFrame, outSystemInsets, outContentInsets, outVisibleInsets, + outConfig, outSurface); if (false) Slog.d(WindowManagerService.TAG, "<<<<<< EXITING relayout to " + Binder.getCallingPid()); return res; diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 1dce5dd0f94b..16aeb354442b 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -2647,8 +2647,8 @@ 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 outVisibleInsets, - Configuration outConfig, Surface outSurface) { + Rect outFrame, Rect outSystemInsets, Rect outContentInsets, + Rect outVisibleInsets, Configuration outConfig, Surface outSurface) { boolean displayed = false; boolean inTouchMode; boolean configChanged; @@ -2939,6 +2939,7 @@ public class WindowManagerService extends IWindowManager.Stub win.mAppToken.updateReportedVisibilityLocked(); } outFrame.set(win.mCompatFrame); + outSystemInsets.set(win.mSystemInsets); outContentInsets.set(win.mContentInsets); outVisibleInsets.set(win.mVisibleInsets); if (localLOGV) Slog.v( @@ -8092,10 +8093,12 @@ public class WindowManagerService extends IWindowManager.Stub private void updateResizingWindows(final WindowState w) { final WindowStateAnimator winAnimator = w.mWinAnimator; if (w.mHasSurface && !w.mAppFreezing && w.mLayoutSeq == mLayoutSeq) { + w.mSystemInsetsChanged |= + !w.mLastSystemInsets.equals(w.mSystemInsets); w.mContentInsetsChanged |= - !w.mLastContentInsets.equals(w.mContentInsets); + !w.mLastContentInsets.equals(w.mContentInsets); w.mVisibleInsetsChanged |= - !w.mLastVisibleInsets.equals(w.mVisibleInsets); + !w.mLastVisibleInsets.equals(w.mVisibleInsets); boolean configChanged = w.mConfiguration != mCurConfiguration && (w.mConfiguration == null @@ -8108,7 +8111,8 @@ public class WindowManagerService extends IWindowManager.Stub + ": configChanged=" + configChanged + " last=" + w.mLastFrame + " frame=" + w.mFrame); w.mLastFrame.set(w.mFrame); - if (w.mContentInsetsChanged + if (w.mSystemInsetsChanged + || w.mContentInsetsChanged || w.mVisibleInsetsChanged || winAnimator.mSurfaceResized || configChanged) { @@ -8120,6 +8124,7 @@ public class WindowManagerService extends IWindowManager.Stub + " configChanged=" + configChanged); } + w.mLastSystemInsets.set(w.mSystemInsets); w.mLastContentInsets.set(w.mContentInsets); w.mLastVisibleInsets.set(w.mVisibleInsets); makeWindowFreezingScreenIfNeededLocked(w); @@ -8505,10 +8510,11 @@ public class WindowManagerService extends IWindowManager.Stub winAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING) Slog.i( TAG, "Resizing " + win + " WITH DRAW PENDING"); win.mClient.resized((int)winAnimator.mSurfaceW, - (int)winAnimator.mSurfaceH, + (int)winAnimator.mSurfaceH, win.mLastSystemInsets, win.mLastContentInsets, win.mLastVisibleInsets, winAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING, configChanged ? win.mConfiguration : null); + win.mSystemInsetsChanged = false; win.mContentInsetsChanged = false; win.mVisibleInsetsChanged = false; winAnimator.mSurfaceResized = false; diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index 4de64257e1b5..05e7d3a0a2d1 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -124,7 +124,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { boolean mVisibleInsetsChanged; /** - * Insets that are covered by system windows. These are in the application's + * Insets that are covered by system windows (such as the status bar) and + * transient docking windows (such as the IME). These are in the application's * coordinate space (without compatibility scale applied). */ final Rect mContentInsets = new Rect(); @@ -132,6 +133,14 @@ final class WindowState implements WindowManagerPolicy.WindowState { boolean mContentInsetsChanged; /** + * Insets that are covered by system windows such as the status bar. These + * are in the application's coordinate space (without compatibility scale applied). + */ + final Rect mSystemInsets = new Rect(); + final Rect mLastSystemInsets = new Rect(); + boolean mSystemInsetsChanged; + + /** * Set to true if we are waiting for this window to receive its * given internal insets before laying out other windows based on it. */ @@ -178,6 +187,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { final Rect mContainingFrame = new Rect(); final Rect mDisplayFrame = new Rect(); + final Rect mSystemFrame = new Rect(); final Rect mContentFrame = new Rect(); final Rect mParentFrame = new Rect(); final Rect mVisibleFrame = new Rect(); @@ -346,7 +356,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { } @Override - public void computeFrameLw(Rect pf, Rect df, Rect cf, Rect vf) { + public void computeFrameLw(Rect pf, Rect df, Rect sf, Rect cf, Rect vf) { mHaveFrame = true; final Rect container = mContainingFrame; @@ -403,6 +413,9 @@ final class WindowState implements WindowManagerPolicy.WindowState { mContentChanged = true; } + final Rect system = mSystemFrame; + system.set(sf); + final Rect content = mContentFrame; content.set(cf); @@ -434,8 +447,12 @@ final class WindowState implements WindowManagerPolicy.WindowState { // Now make sure the window fits in the overall display. Gravity.applyDisplay(mAttrs.gravity, df, frame); - // Make sure the content and visible frames are inside of the + // Make sure the system, content and visible frames are inside of the // final window frame. + if (system.left < frame.left) system.left = frame.left; + if (system.top < frame.top) system.top = frame.top; + if (system.right > frame.right) system.right = frame.right; + if (system.bottom > frame.bottom) system.bottom = frame.bottom; if (content.left < frame.left) content.left = frame.left; if (content.top < frame.top) content.top = frame.top; if (content.right > frame.right) content.right = frame.right; @@ -445,6 +462,12 @@ final class WindowState implements WindowManagerPolicy.WindowState { if (visible.right > frame.right) visible.right = frame.right; if (visible.bottom > frame.bottom) visible.bottom = frame.bottom; + final Rect systemInsets = mSystemInsets; + systemInsets.left = system.left-frame.left; + systemInsets.top = system.top-frame.top; + systemInsets.right = frame.right-system.right; + systemInsets.bottom = frame.bottom-system.bottom; + final Rect contentInsets = mContentInsets; contentInsets.left = content.left-frame.left; contentInsets.top = content.top-frame.top; @@ -462,6 +485,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { // If there is a size compatibility scale being applied to the // window, we need to apply this to its insets so that they are // reported to the app in its coordinate space. + systemInsets.scale(mInvGlobalScale); contentInsets.scale(mInvGlobalScale); visibleInsets.scale(mInvGlobalScale); @@ -482,6 +506,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { + mRequestedWidth + ", mRequestedheight=" + mRequestedHeight + ") to" + " (pw=" + pw + ", ph=" + ph + "): frame=" + mFrame.toShortString() + + " si=" + systemInsets.toShortString() + " ci=" + contentInsets.toShortString() + " vi=" + visibleInsets.toShortString()); //} @@ -504,6 +529,11 @@ final class WindowState implements WindowManagerPolicy.WindowState { } @Override + public Rect getSystemFrameLw() { + return mSystemFrame; + } + + @Override public Rect getContentFrameLw() { return mContentFrame; } @@ -723,6 +753,14 @@ final class WindowState implements WindowManagerPolicy.WindowState { || mWinAnimator.mAnimating); } + /** + * Return true if this window (or a window it is attached to, but not + * considering its app token) is currently animating. + */ + public boolean isAnimatingLw() { + return mWinAnimator.mAnimation != null; + } + public boolean isGoneForLayoutLw() { final AppWindowToken atoken = mAppToken; return mViewVisibility == View.GONE @@ -1035,20 +1073,22 @@ final class WindowState implements WindowManagerPolicy.WindowState { pw.println(); } if (dumpAll) { - pw.print(prefix); pw.print("mContainingFrame="); + pw.print(prefix); pw.print("Frames: containing="); mContainingFrame.printShortString(pw); - pw.print(" mParentFrame="); - mParentFrame.printShortString(pw); - pw.print(" mDisplayFrame="); - mDisplayFrame.printShortString(pw); + pw.print(" parent="); mParentFrame.printShortString(pw); + pw.print(" display="); mDisplayFrame.printShortString(pw); + pw.println(); + pw.print(prefix); pw.print(" system="); mSystemFrame.printShortString(pw); + pw.print(" content="); mContentFrame.printShortString(pw); + pw.print(" visible="); mVisibleFrame.printShortString(pw); pw.println(); - pw.print(prefix); pw.print("mContentFrame="); mContentFrame.printShortString(pw); - pw.print(" mVisibleFrame="); mVisibleFrame.printShortString(pw); + pw.print(prefix); pw.print("Cur insets: system="); mSystemInsets.printShortString(pw); + pw.print(" content="); mContentInsets.printShortString(pw);; + pw.print(" visible="); mVisibleInsets.printShortString(pw); pw.println(); - pw.print(prefix); pw.print("mContentInsets="); mContentInsets.printShortString(pw); - pw.print(" last="); mLastContentInsets.printShortString(pw); - pw.print(" mVisibleInsets="); mVisibleInsets.printShortString(pw); - pw.print(" last="); mLastVisibleInsets.printShortString(pw); + pw.print(prefix); pw.print("Lst insets: system="); mLastSystemInsets.printShortString(pw); + pw.print(" content="); mLastContentInsets.printShortString(pw);; + pw.print(" visible="); mLastVisibleInsets.printShortString(pw); pw.println(); } mWinAnimator.dump(pw, prefix, dumpAll); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java index 434ae9da96ab..c44ddc6e1409 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java @@ -47,8 +47,8 @@ public final class BridgeWindow implements IWindow { } @Override - public void resized(int arg0, int arg1, Rect arg2, Rect arg3, boolean arg4, Configuration arg5) - throws RemoteException { + public void resized(int arg0, int arg1, Rect argBlah, Rect arg2, Rect arg3, + boolean arg4, Configuration arg5) throws RemoteException { // pass for now. } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java index d3721ed10f70..3996d2693241 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java @@ -69,8 +69,8 @@ public final class BridgeWindowSession implements IWindowSession { } @Override public int relayout(IWindow arg0, int seq, LayoutParams arg1, int arg2, int arg3, int arg4, - int arg4_5, Rect arg5, Rect arg6, Rect arg7, Configuration arg7b, Surface arg8) - throws RemoteException { + int arg4_5, Rect arg4_6, Rect arg5, Rect arg6, Rect arg7, Configuration arg7b, + Surface arg8) throws RemoteException { // pass for now. return 0; } |