WindowState.java revision c8bc97e53044cd62c0e023fdc441fd13127d0283
16e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/*
26e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Copyright (C) 2011 The Android Open Source Project
36e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn *
46e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
56e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * you may not use this file except in compliance with the License.
66e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * You may obtain a copy of the License at
76e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn *
86e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
96e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn *
106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Unless required by applicable law or agreed to in writing, software
116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * See the License for the specific language governing permissions and
146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * limitations under the License.
156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */
166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornpackage com.android.server.wm;
186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
26e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautnerimport android.content.Context;
276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.res.Configuration;
286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Matrix;
296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.PixelFormat;
306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Rect;
31d040edbae968d826aa2c82d382345811a45c646bDianne Hackbornimport android.graphics.RectF;
326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Region;
336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.IBinder;
346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException;
356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog;
366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.Gravity;
376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IApplicationToken;
386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IWindow;
396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.InputChannel;
406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.View;
416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.ViewTreeObserver;
426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager;
436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManagerPolicy;
446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.io.PrintWriter;
466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.util.ArrayList;
476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/**
496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * A window in the window manager.
506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */
51e32c30784191a9244a08450759471c934c85034cCraig Mautnerfinal class WindowState implements WindowManagerPolicy.WindowState {
52d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner    static final String TAG = "WindowState";
53d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner
545fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean DEBUG_VISIBILITY = WindowManagerService.DEBUG_VISIBILITY;
555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean SHOW_TRANSACTIONS = WindowManagerService.SHOW_TRANSACTIONS;
5636991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn    static final boolean SHOW_LIGHT_TRANSACTIONS = WindowManagerService.SHOW_LIGHT_TRANSACTIONS;
575fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean SHOW_SURFACE_ALLOC = WindowManagerService.SHOW_SURFACE_ALLOC;
585fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowManagerService mService;
60e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    final WindowManagerPolicy mPolicy;
61e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    final Context mContext;
626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Session mSession;
636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final IWindow mClient;
646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowToken mToken;
656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowToken mRootToken;
666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    AppWindowToken mAppToken;
676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    AppWindowToken mTargetAppToken;
686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowManager.LayoutParams mAttrs = new WindowManager.LayoutParams();
696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final DeathRecipient mDeathRecipient;
706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowState mAttachedWindow;
716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final ArrayList<WindowState> mChildWindows = new ArrayList<WindowState>();
726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final int mBaseLayer;
736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final int mSubLayer;
746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mLayoutAttached;
756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mIsImWindow;
766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mIsWallpaper;
776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mIsFloatingLayer;
789a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    int mSeq;
795fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    boolean mEnforceSizeCompat;
806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mViewVisibility;
819a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    int mSystemUiVisibility;
826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mPolicyVisibility = true;
836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mPolicyVisibilityAfterAnim = true;
846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mAppFreezing;
856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mAttachedHidden;    // is our parent window hidden?
866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mLastHidden;        // was this window last hidden?
876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mWallpaperVisible;  // for wallpaper, what was last vis report?
88ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
89ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    /**
90ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * The window size that was requested by the application.  These are in
91ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * the application's coordinate space (without compatibility scale applied).
92ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     */
936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mRequestedWidth;
946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mRequestedHeight;
951743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn    int mLastRequestedWidth;
961743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn    int mLastRequestedHeight;
97ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mLayer;
996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mHaveFrame;
1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mObscured;
1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mTurnOnScreen;
1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mLayoutSeq = -1;
104a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
1056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    Configuration mConfiguration = null;
106a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
107ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    /**
108ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * Actual frame shown on-screen (may be modified by animation).  These
109ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * are in the screen's coordinate space (WITH the compatibility scale
110ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * applied).
111ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     */
112d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn    final RectF mShownFrame = new RectF();
1136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
115ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * Insets that determine the actually visible area.  These are in the application's
116ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * coordinate space (without compatibility scale applied).
1176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mVisibleInsets = new Rect();
1196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mLastVisibleInsets = new Rect();
1206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mVisibleInsetsChanged;
1216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
123ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * Insets that are covered by system windows.  These are in the application's
124ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * coordinate space (without compatibility scale applied).
1256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mContentInsets = new Rect();
1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mLastContentInsets = new Rect();
1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mContentInsetsChanged;
1296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Set to true if we are waiting for this window to receive its
1326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * given internal insets before laying out other windows based on it.
1336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mGivenInsetsPending;
1356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * These are the content insets that were given during layout for
1386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * this window, to be applied to windows behind it.
1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mGivenContentInsets = new Rect();
1416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * These are the visible insets that were given during layout for
1446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * this window, to be applied to windows behind it.
1456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mGivenVisibleInsets = new Rect();
1476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * This is the given touchable area relative to the window frame, or null if none.
1506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Region mGivenTouchableRegion = new Region();
1526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Flag indicating whether the touchable region should be adjusted by
1556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * the visible insets; if false the area outside the visible insets is
1566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * NOT touchable, so we must use those to adjust the frame during hit
1576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * tests.
1586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mTouchableInsets = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
1606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Current transformation being applied.
162e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    float mGlobalScale=1;
163ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    float mInvGlobalScale=1;
1646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mHScale=1, mVScale=1;
1656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mLastHScale=1, mLastVScale=1;
1666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Matrix mTmpMatrix = new Matrix();
1676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
168ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    // "Real" frame that the application sees, in display coordinate space.
1696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mFrame = new Rect();
1706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mLastFrame = new Rect();
171ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    // Frame that is scaled to the application's coordinate space when in
172ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    // screen size compatibility mode.
173ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    final Rect mCompatFrame = new Rect();
1746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mContainingFrame = new Rect();
1766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mDisplayFrame = new Rect();
1776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mContentFrame = new Rect();
1786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mParentFrame = new Rect();
1796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mVisibleFrame = new Rect();
1806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mContentChanged;
1826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // If a window showing a wallpaper: the requested offset for the
1846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // wallpaper; if a wallpaper window: the currently applied offset.
1856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperX = -1;
1866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperY = -1;
1876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // If a window showing a wallpaper: what fraction of the offset
1896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // range corresponds to a full virtual screen.
1906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperXStep = -1;
1916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperYStep = -1;
1926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Wallpaper windows: pixels offset based on above variables.
1946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mXOffset;
1956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mYOffset;
1966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // This is set after IWindowSession.relayout() has been called at
1986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // least once for the window.  It allows us to detect the situation
1996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // where we don't yet have a surface, but should have one soon, so
2006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // we can give the window focus before waiting for the relayout.
2016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRelayoutCalled;
2026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
203b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // If the application has called relayout() with changes that can
204b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // impact its window's size, we need to perform a layout pass on it
205b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // even if it is not currently visible for layout.  This is set
206b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // when in that case until the layout is done.
207b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    boolean mLayoutNeeded;
208b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn
2096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // This is set during the time after the window's drawing has been
2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // committed, and before its surface is actually shown.  It is used
2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // to delay showing the surface until all windows in a token are ready
2126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // to be shown.
2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mReadyToShow;
2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Set when the window has been shown in the screen the first time.
2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mHasDrawn;
2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Currently running an exit animation?
2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mExiting;
2206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Currently on the mDestroySurface list?
2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mDestroying;
2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Completely remove from window manager after exit animation?
2256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRemoveOnExit;
2266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Set when the orientation is changing and this window has not yet
2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // been updated for the new orientation.
2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mOrientationChanging;
2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Is this window now (or just being) removed?
2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRemoved;
2336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Temp for keeping track of windows that have been removed when
2356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // rebuilding window list.
2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRebuilding;
2376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Input channel and input window handle used by the input dispatcher.
2399302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    final InputWindowHandle mInputWindowHandle;
2406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    InputChannel mInputChannel;
2416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Used to improve performance of toString()
2436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    String mStringNameCache;
2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    CharSequence mLastTitle;
2456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mWasPaused;
2466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
247a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    final WindowStateAnimator mWinAnimator;
248a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
249c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner    boolean mHasSurface = false;
250c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner
2516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
2529a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn           WindowState attachedWindow, int seq, WindowManager.LayoutParams a,
2536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn           int viewVisibility) {
2546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService = service;
2556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mSession = s;
2566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mClient = c;
2576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mToken = token;
2586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mAttrs.copyFrom(a);
2596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mViewVisibility = viewVisibility;
260e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner        mPolicy = mService.mPolicy;
261e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner        mContext = mService.mContext;
2626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        DeathRecipient deathRecipient = new DeathRecipient();
2639a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        mSeq = seq;
264e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        mEnforceSizeCompat = (mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0;
2656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) Slog.v(
266d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            TAG, "Window " + this + " client=" + c.asBinder()
2676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            + " token=" + token + " (" + mAttrs.token + ")");
2686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
2696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            c.asBinder().linkToDeath(deathRecipient, 0);
2706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RemoteException e) {
2716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mDeathRecipient = null;
2726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow = null;
2736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLayoutAttached = false;
2746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsImWindow = false;
2756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsWallpaper = false;
2766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsFloatingLayer = false;
2776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mBaseLayer = 0;
2786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mSubLayer = 0;
2799302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mInputWindowHandle = null;
280a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            mWinAnimator = null;
2816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return;
2826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mDeathRecipient = deathRecipient;
2846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if ((mAttrs.type >= FIRST_SUB_WINDOW &&
2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mAttrs.type <= LAST_SUB_WINDOW)) {
2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // The multiplier here is to reserve space for multiple
2886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // windows in the same type layer.
289e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner            mBaseLayer = mPolicy.windowTypeToLayerLw(
2906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    attachedWindow.mAttrs.type) * WindowManagerService.TYPE_LAYER_MULTIPLIER
2916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + WindowManagerService.TYPE_LAYER_OFFSET;
292e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner            mSubLayer = mPolicy.subWindowTypeToLayerLw(a.type);
2936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow = attachedWindow;
294d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + this + " to " + mAttachedWindow);
2956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow.mChildWindows.add(this);
2966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLayoutAttached = mAttrs.type !=
2976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
2986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsImWindow = attachedWindow.mAttrs.type == TYPE_INPUT_METHOD
2996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || attachedWindow.mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
3006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsWallpaper = attachedWindow.mAttrs.type == TYPE_WALLPAPER;
3016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsFloatingLayer = mIsImWindow || mIsWallpaper;
3026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else {
3036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // The multiplier here is to reserve space for multiple
3046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // windows in the same type layer.
305e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner            mBaseLayer = mPolicy.windowTypeToLayerLw(a.type)
3066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    * WindowManagerService.TYPE_LAYER_MULTIPLIER
3076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + WindowManagerService.TYPE_LAYER_OFFSET;
3086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mSubLayer = 0;
3096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow = null;
3106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLayoutAttached = false;
3116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsImWindow = mAttrs.type == TYPE_INPUT_METHOD
3126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
3136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsWallpaper = mAttrs.type == TYPE_WALLPAPER;
3146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsFloatingLayer = mIsImWindow || mIsWallpaper;
3156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
317a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner        mWinAnimator = new WindowStateAnimator(service, this, mAttachedWindow);
318c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner        mWinAnimator.mAlpha = a.alpha;
319a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
3206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        WindowState appWin = this;
3216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        while (appWin.mAttachedWindow != null) {
322a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            appWin = appWin.mAttachedWindow;
3236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        WindowToken appToken = appWin.mToken;
3256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        while (appToken.appWindowToken == null) {
3266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowToken parent = mService.mTokenMap.get(appToken.token);
3276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (parent == null || appToken == parent) {
3286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
3296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            appToken = parent;
3316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mRootToken = appToken;
3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mAppToken = appToken.appWindowToken;
3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mRequestedWidth = 0;
3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mRequestedHeight = 0;
3371743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        mLastRequestedWidth = 0;
3381743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        mLastRequestedHeight = 0;
3396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mXOffset = 0;
3406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mYOffset = 0;
3416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mLayer = 0;
3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mInputWindowHandle = new InputWindowHandle(
3436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mAppToken != null ? mAppToken.mInputApplicationHandle : null, this);
3446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void attach() {
3476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) Slog.v(
348d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            TAG, "Attaching " + this + " token=" + mToken
3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            + ", list=" + mToken.windows);
3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mSession.windowAddedLocked();
3516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
353a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
3546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void computeFrameLw(Rect pf, Rect df, Rect cf, Rect vf) {
3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mHaveFrame = true;
3566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect container = mContainingFrame;
3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        container.set(pf);
3596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect display = mDisplayFrame;
3616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        display.set(df);
3626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int pw = container.right - container.left;
3646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int ph = container.bottom - container.top;
3656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        int w,h;
367ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        if ((mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0) {
368ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.width < 0) {
369ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = pw;
370ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
371ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = (int)(mAttrs.width * mGlobalScale + .5f);
372ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
373ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = mAttrs.width;
374ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
375ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.height < 0) {
376ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = ph;
377ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
378ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = (int)(mAttrs.height * mGlobalScale + .5f);
379ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
380ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = mAttrs.height;
381ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else {
383ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.width == WindowManager.LayoutParams.MATCH_PARENT) {
384ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = pw;
385ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
386ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = (int)(mRequestedWidth * mGlobalScale + .5f);
387ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
388ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = mRequestedWidth;
389ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
390ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.height == WindowManager.LayoutParams.MATCH_PARENT) {
391ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = ph;
392ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
393ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = (int)(mRequestedHeight * mGlobalScale + .5f);
394ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
395ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = mRequestedHeight;
396ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
3976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!mParentFrame.equals(pf)) {
4006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //Slog.i(TAG, "Window " + this + " content frame from " + mParentFrame
4016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //        + " to " + pf);
4026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mParentFrame.set(pf);
4036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mContentChanged = true;
4046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4051743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        if (mRequestedWidth != mLastRequestedWidth || mRequestedHeight != mLastRequestedHeight) {
4061743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            mLastRequestedWidth = mRequestedWidth;
4071743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            mLastRequestedHeight = mRequestedHeight;
4081743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            mContentChanged = true;
4091743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        }
4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect content = mContentFrame;
4126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        content.set(cf);
4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect visible = mVisibleFrame;
4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visible.set(vf);
4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect frame = mFrame;
4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int fw = frame.width();
4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int fh = frame.height();
4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        //System.out.println("In: w=" + w + " h=" + h + " container=" +
4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        //                   container + " x=" + mAttrs.x + " y=" + mAttrs.y);
4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
424ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        float x, y;
425ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        if (mEnforceSizeCompat) {
426ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            x = mAttrs.x * mGlobalScale;
427ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            y = mAttrs.y * mGlobalScale;
428ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        } else {
429ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            x = mAttrs.x;
430ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            y = mAttrs.y;
431ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        }
432ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
4336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        Gravity.apply(mAttrs.gravity, w, h, container,
434ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                (int) (x + mAttrs.horizontalMargin * pw),
435ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                (int) (y + mAttrs.verticalMargin * ph), frame);
4366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        //System.out.println("Out: " + mFrame);
4386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Now make sure the window fits in the overall display.
4406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        Gravity.applyDisplay(mAttrs.gravity, df, frame);
4416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Make sure the content and visible frames are inside of the
4436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // final window frame.
4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.left < frame.left) content.left = frame.left;
4456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.top < frame.top) content.top = frame.top;
4466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.right > frame.right) content.right = frame.right;
4476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.bottom > frame.bottom) content.bottom = frame.bottom;
4486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.left < frame.left) visible.left = frame.left;
4496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.top < frame.top) visible.top = frame.top;
4506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.right > frame.right) visible.right = frame.right;
4516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.bottom > frame.bottom) visible.bottom = frame.bottom;
4526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect contentInsets = mContentInsets;
4546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.left = content.left-frame.left;
4556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.top = content.top-frame.top;
4566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.right = frame.right-content.right;
4576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.bottom = frame.bottom-content.bottom;
4586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect visibleInsets = mVisibleInsets;
4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.left = visible.left-frame.left;
4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.top = visible.top-frame.top;
4626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.right = frame.right-visible.right;
4636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.bottom = frame.bottom-visible.bottom;
4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
465ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        mCompatFrame.set(frame);
466e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if (mEnforceSizeCompat) {
467ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // If there is a size compatibility scale being applied to the
468ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // window, we need to apply this to its insets so that they are
469ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // reported to the app in its coordinate space.
470ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            contentInsets.scale(mInvGlobalScale);
471ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            visibleInsets.scale(mInvGlobalScale);
472ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
473ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // Also the scaled frame that we report to the app needs to be
474ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // adjusted to be in its coordinate space.
475ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            mCompatFrame.scale(mInvGlobalScale);
476e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        }
477e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
4786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mIsWallpaper && (fw != frame.width() || fh != frame.height())) {
479bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            mService.updateWallpaperOffsetLocked(this,
480bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                    mService.mAppDisplayWidth, mService.mAppDisplayHeight, false);
4816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) {
4846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //if ("com.google.android.youtube".equals(mAttrs.packageName)
4856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //        && mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
486d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner                Slog.v(TAG, "Resolving (mRequestedWidth="
4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + mRequestedWidth + ", mRequestedheight="
4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + mRequestedHeight + ") to" + " (pw=" + pw + ", ph=" + ph
4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + "): frame=" + mFrame.toShortString()
4906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + " ci=" + contentInsets.toShortString()
4916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + " vi=" + visibleInsets.toShortString());
4926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //}
4936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
496a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
4976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getFrameLw() {
4986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mFrame;
4996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
501a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
502d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn    public RectF getShownFrameLw() {
5036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mShownFrame;
5046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
506a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getDisplayFrameLw() {
5086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mDisplayFrame;
5096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
511a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getContentFrameLw() {
5136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mContentFrame;
5146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
516a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getVisibleFrameLw() {
5186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mVisibleFrame;
5196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
521a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean getGivenInsetsPendingLw() {
5236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mGivenInsetsPending;
5246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
526a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getGivenContentInsetsLw() {
5286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mGivenContentInsets;
5296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
531a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getGivenVisibleInsetsLw() {
5336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mGivenVisibleInsets;
5346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
536a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public WindowManager.LayoutParams getAttrs() {
5386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mAttrs;
5396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
54173ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn    public boolean getNeedsMenuLw(WindowManagerPolicy.WindowState bottom) {
54273ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        int index = -1;
54373ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        WindowState ws = this;
54473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        while (true) {
54573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if ((ws.mAttrs.privateFlags
54673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                    & WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY) != 0) {
54773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                return (ws.mAttrs.flags & WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0;
54873ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
54973ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // If we reached the bottom of the range of windows we are considering,
55073ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // assume no menu is needed.
55173ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if (ws == bottom) {
55273ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                return false;
55373ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
55473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // The current window hasn't specified whether menu key is needed;
55573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // look behind it.
55673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // First, we may need to determine the starting position.
55773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if (index < 0) {
55873ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                index = mService.mWindows.indexOf(ws);
55973ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
56073ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            index--;
56173ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if (index < 0) {
56273ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                return false;
56373ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
56473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            ws = mService.mWindows.get(index);
56573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        }
56673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn    }
56773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn
5689a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public int getSystemUiVisibility() {
5699a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        return mSystemUiVisibility;
5709a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    }
5719a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn
5726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public int getSurfaceLayer() {
5736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mLayer;
5746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public IApplicationToken getAppToken() {
5776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mAppToken != null ? mAppToken.appToken : null;
5786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public long getInputDispatchingTimeoutNanos() {
5816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mAppToken != null
5826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                ? mAppToken.inputDispatchingTimeoutNanos
5836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                : WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
5846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean hasAppShownWindows() {
5876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mAppToken != null ? mAppToken.firstWindowDrawn : false;
5886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isIdentityMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
5916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dsdx < .99999f || dsdx > 1.00001f) return false;
5926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dtdy < .99999f || dtdy > 1.00001f) return false;
5936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dtdx < -.000001f || dtdx > .000001f) return false;
5946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dsdy < -.000001f || dsdy > .000001f) return false;
5956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return true;
5966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
598e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    void prelayout() {
599e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if (mEnforceSizeCompat) {
600e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            mGlobalScale = mService.mCompatibleScreenScale;
601ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            mInvGlobalScale = 1/mGlobalScale;
602e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        } else {
603ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            mGlobalScale = mInvGlobalScale = 1;
604e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        }
605e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    }
606e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
6076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Is this window visible?  It is not visible if there is no
6096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * surface, or we are in the process of running an exit animation
6106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * that will remove the surface, or its app token has been hidden.
6116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isVisibleLw() {
6136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
614c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mAttachedHidden
6156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (atoken == null || !atoken.hiddenRequested)
6166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mExiting && !mDestroying;
6176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Like {@link #isVisibleLw}, but also counts a window that is currently
6216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * "hidden" behind the keyguard as visible.  This allows us to apply
6226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * things like window flags that impact the keyguard.
6236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * XXX I am starting to think we need to have ANOTHER visibility flag
6246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * for this "hidden behind keyguard" state rather than overloading
6256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * mPolicyVisibility.  Ungh.
6266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isVisibleOrBehindKeyguardLw() {
628bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        if (mRootToken.waitingToShow &&
629bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
630bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn            return false;
631bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        }
6326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
633bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        final boolean animating = atoken != null
634bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                ? (atoken.animation != null) : false;
635c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && !mDestroying && !mExiting
6366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (atoken == null ? mPolicyVisibility : !atoken.hiddenRequested)
637bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                && ((!mAttachedHidden && mViewVisibility == View.VISIBLE
638bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                                && !mRootToken.hidden)
639a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                        || mWinAnimator.mAnimation != null || animating);
6406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Is this window visible, ignoring its app token?  It is not visible
6446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * if there is no surface, or we are in the process of running an exit animation
6456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * that will remove the surface.
6466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isWinVisibleLw() {
6486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
649c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mAttachedHidden
6506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (atoken == null || !atoken.hiddenRequested || atoken.animating)
6516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mExiting && !mDestroying;
6526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * The same as isVisible(), but follows the current hidden state of
6566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * the associated app token, not the pending requested hidden state.
6576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isVisibleNow() {
659c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mAttachedHidden
6606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mRootToken.hidden && !mExiting && !mDestroying;
6616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Can this window possibly be a drag/drop target?  The test here is
6656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * a combination of the above "visible now" with the check that the
6666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Input Manager uses when discarding windows from input consideration.
6676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isPotentialDragTarget() {
669cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        return isVisibleNow() && !mRemoved
670cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                && mInputChannel != null && mInputWindowHandle != null;
6716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Same as isVisible(), but we also count it as visible between the
6756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * call to IWindowSession.add() and the first relayout().
6766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isVisibleOrAdding() {
6786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
679c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return ((mHasSurface && !mWinAnimator.mReportDestroySurface)
6806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        || (!mRelayoutCalled && mViewVisibility == View.VISIBLE))
6816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && mPolicyVisibility && !mAttachedHidden
6826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (atoken == null || !atoken.hiddenRequested)
6836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mExiting && !mDestroying;
6846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Is this window currently on-screen?  It is on-screen either if it
6886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * is visible or it is currently running an animation before no longer
6896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * being visible.
6906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isOnScreen() {
692c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        if (!mHasSurface || !mPolicyVisibility || mDestroying) {
693c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner            return false;
694c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        }
6956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
6966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (atoken != null) {
697c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner            return ((!mAttachedHidden && !atoken.hiddenRequested)
698a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                            || mWinAnimator.mAnimation != null || atoken.animation != null);
6996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
700c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return !mAttachedHidden || mWinAnimator.mAnimation != null;
7016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Like isOnScreen(), but we don't return true if the window is part
7056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * of a transition that has not yet been started.
7066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isReadyForDisplay() {
7086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mRootToken.waitingToShow &&
7096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
7106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
7116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
712c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mDestroying
7136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && ((!mAttachedHidden && mViewVisibility == View.VISIBLE
7146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                                && !mRootToken.hidden)
715a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                        || mWinAnimator.mAnimation != null
716ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner                        || ((mAppToken != null) && (mAppToken.animation != null)));
7176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Like isOnScreen, but returns false if the surface hasn't yet
7216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * been drawn.
7226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isDisplayedLw() {
7246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
725bf90eaa5d2410bfb60ef84a0efcf3b5eb5022d9fCraig Mautner        return isDrawnLw() && mPolicyVisibility
7266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            && ((!mAttachedHidden &&
7276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    (atoken == null || !atoken.hiddenRequested))
728a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                    || mWinAnimator.mAnimating);
7296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
731cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn    public boolean isGoneForLayoutLw() {
732cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn        final AppWindowToken atoken = mAppToken;
733cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn        return mViewVisibility == View.GONE
734cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || !mRelayoutCalled
735cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || (atoken == null && mRootToken.hidden)
736b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn                || (atoken != null && (atoken.hiddenRequested || atoken.hidden))
737cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || mAttachedHidden
738cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || mExiting || mDestroying;
739cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn    }
740cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn
7416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Returns true if the window has a surface that it has drawn a
7436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * complete UI in to.
7446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isDrawnLw() {
746c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && !mDestroying &&
747c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner            !mWinAnimator.mDrawPending && !mWinAnimator.mCommitDrawPending;
7486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Return true if the window is opaque and fully drawn.  This indicates
7526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * it may obscure windows behind it.
7536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isOpaqueDrawn() {
7556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return (mAttrs.format == PixelFormat.OPAQUE
7566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        || mAttrs.type == TYPE_WALLPAPER)
757a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                && isDrawnLw() && mWinAnimator.mAnimation == null
758bf90eaa5d2410bfb60ef84a0efcf3b5eb5022d9fCraig Mautner                && (mAppToken == null || mAppToken.animation == null);
7596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Return whether this window is wanting to have a translation
7636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * animation applied to it for an in-progress move.  (Only makes
7646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * sense to call from performLayoutAndPlaceSurfacesLockedInner().)
7656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean shouldAnimateMove() {
7672fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner        return mContentChanged && !mExiting && !mLastHidden && mService.okToDisplay()
7686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (mFrame.top != mLastFrame.top
7696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        || mFrame.left != mLastFrame.left)
7702fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner                && (mAttachedWindow == null || !mAttachedWindow.shouldAnimateMove());
7716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isFullscreen(int screenWidth, int screenHeight) {
774ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        return mFrame.left <= 0 && mFrame.top <= 0 &&
775ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                mFrame.right >= screenWidth && mFrame.bottom >= screenHeight;
7766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void removeLocked() {
7796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        disposeInputChannel();
7806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mAttachedWindow != null) {
782d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + this + " from " + mAttachedWindow);
7836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow.mChildWindows.remove(this);
7846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
785c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner        mWinAnimator.destroyDeferredSurfaceLocked();
786c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner        mWinAnimator.destroySurfaceLocked();
7876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mSession.windowRemovedLocked();
7886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
7896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mClient.asBinder().unlinkToDeath(mDeathRecipient, 0);
7906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RuntimeException e) {
7916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Ignore if it has already been removed (usually because
7926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // we are doing this as part of processing a death note.)
7936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
7946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
795cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
796cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    void setInputChannel(InputChannel inputChannel) {
797cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (mInputChannel != null) {
798cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            throw new IllegalStateException("Window already has an input channel.");
799cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        }
800cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
801cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInputChannel = inputChannel;
802cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInputWindowHandle.inputChannel = inputChannel;
803cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    }
804cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
8056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void disposeInputChannel() {
8066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mInputChannel != null) {
8076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mInputManager.unregisterInputChannel(mInputChannel);
8086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputChannel.dispose();
8106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputChannel = null;
8116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
812cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
813cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInputWindowHandle.inputChannel = null;
8146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private class DeathRecipient implements IBinder.DeathRecipient {
8176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public void binderDied() {
8186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
8196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                synchronized(mService.mWindowMap) {
8206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowState win = mService.windowForClientLocked(mSession, mClient, false);
821d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner                    Slog.i(TAG, "WIN DEATH: " + win);
8226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    if (win != null) {
8236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mService.removeWindowLocked(mSession, win);
8246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    }
8256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
8266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } catch (IllegalArgumentException ex) {
8276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // This will happen if the window has already been
8286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // removed.
8296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
8306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
8316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /** Returns true if this window desires key events. */
8346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public final boolean canReceiveKeys() {
8356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return     isVisibleOrAdding()
8366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (mViewVisibility == View.VISIBLE)
8376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && ((mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == 0);
8386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean hasDrawnLw() {
8416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mHasDrawn;
8426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean showLw(boolean doAnimation) {
8456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return showLw(doAnimation, true);
8466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean showLw(boolean doAnimation, boolean requestAnim) {
8496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mPolicyVisibility && mPolicyVisibilityAfterAnim) {
850e32c30784191a9244a08450759471c934c85034cCraig Mautner            // Already showing.
8516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
8526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
853d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner        if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility true: " + this);
8546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
855d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (DEBUG_VISIBILITY) Slog.v(TAG, "doAnimation: mPolicyVisibility="
856a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                    + mPolicyVisibility + " mAnimation=" + mWinAnimator.mAnimation);
8572fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner            if (!mService.okToDisplay()) {
8586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
859a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            } else if (mPolicyVisibility && mWinAnimator.mAnimation == null) {
8606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // Check for the case where we are currently visible and
8616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // not animating; we do not want to do animation at such a
8626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // point to become visible when we already are.
8636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
8646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
8656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
8666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mPolicyVisibility = true;
8676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mPolicyVisibilityAfterAnim = true;
8686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
869c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            mWinAnimator.applyAnimationLocked(WindowManagerPolicy.TRANSIT_ENTER, true);
8706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
8716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (requestAnim) {
8724a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown            mService.scheduleAnimationLocked();
8736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
8746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return true;
8756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean hideLw(boolean doAnimation) {
8786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return hideLw(doAnimation, true);
8796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean hideLw(boolean doAnimation, boolean requestAnim) {
8826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
8832fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner            if (!mService.okToDisplay()) {
8846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
8856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
8866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
8876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        boolean current = doAnimation ? mPolicyVisibilityAfterAnim
8886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                : mPolicyVisibility;
8896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!current) {
890e32c30784191a9244a08450759471c934c85034cCraig Mautner            // Already hiding.
8916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
8926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
8936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
894c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            mWinAnimator.applyAnimationLocked(WindowManagerPolicy.TRANSIT_EXIT, false);
895a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            if (mWinAnimator.mAnimation == null) {
8966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
8976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
8986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
8996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
9006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mPolicyVisibilityAfterAnim = false;
9016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else {
902d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility false: " + this);
9036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mPolicyVisibilityAfterAnim = false;
9046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mPolicyVisibility = false;
9056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Window is no longer visible -- make sure if we were waiting
9066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // for it to be displayed before enabling the display, that
9076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // we allow the display to be enabled now.
9086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.enableScreenIfNeededLocked();
9096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mService.mCurrentFocus == this) {
9106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mFocusMayChange = true;
9116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
9126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (requestAnim) {
9144a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown            mService.scheduleAnimationLocked();
9156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return true;
9176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
919ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    private static void applyInsets(Region outRegion, Rect frame, Rect inset) {
920ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        outRegion.set(
921ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                frame.left + inset.left, frame.top + inset.top,
922ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                frame.right - inset.right, frame.bottom - inset.bottom);
923e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    }
924e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
9256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void getTouchableRegion(Region outRegion) {
926ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        final Rect frame = mFrame;
9276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        switch (mTouchableInsets) {
9286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            default:
9296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME:
9306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                outRegion.set(frame);
9316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
932e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT:
933ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                applyInsets(outRegion, frame, mGivenContentInsets);
9346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
935e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_VISIBLE:
936ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                applyInsets(outRegion, frame, mGivenVisibleInsets);
9376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
9386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION: {
9396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                final Region givenTouchableRegion = mGivenTouchableRegion;
9406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                outRegion.set(givenTouchableRegion);
9416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                outRegion.translate(frame.left, frame.top);
9426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
9436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
9446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
947a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dump(PrintWriter pw, String prefix, boolean dumpAll) {
9486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("mSession="); pw.print(mSession);
9496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" mClient="); pw.println(mClient.asBinder());
9506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("mAttrs="); pw.println(mAttrs);
951a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.print(prefix); pw.print("Requested w="); pw.print(mRequestedWidth);
952a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(" h="); pw.print(mRequestedHeight);
953a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(" mLayoutSeq="); pw.println(mLayoutSeq);
9541743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        if (mRequestedWidth != mLastRequestedWidth || mRequestedHeight != mLastRequestedHeight) {
9551743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            pw.print(prefix); pw.print("LastRequested w="); pw.print(mLastRequestedWidth);
9561743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn                    pw.print(" h="); pw.println(mLastRequestedHeight);
9571743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        }
9586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mAttachedWindow != null || mLayoutAttached) {
9596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mAttachedWindow="); pw.print(mAttachedWindow);
9606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mLayoutAttached="); pw.println(mLayoutAttached);
9616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mIsImWindow || mIsWallpaper || mIsFloatingLayer) {
9636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mIsImWindow="); pw.print(mIsImWindow);
9646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mIsWallpaper="); pw.print(mIsWallpaper);
9656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mIsFloatingLayer="); pw.print(mIsFloatingLayer);
9666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mWallpaperVisible="); pw.println(mWallpaperVisible);
9676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
968a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
969a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mBaseLayer="); pw.print(mBaseLayer);
970a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mSubLayer="); pw.print(mSubLayer);
971a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mAnimLayer="); pw.print(mLayer); pw.print("+");
972a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print((mTargetAppToken != null ? mTargetAppToken.animLayerAdjustment
973a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                          : (mAppToken != null ? mAppToken.animLayerAdjustment : 0)));
974c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner                    pw.print("="); pw.print(mWinAnimator.mAnimLayer);
975c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner                    pw.print(" mLastLayer="); pw.println(mWinAnimator.mLastLayer);
9766d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn        }
977a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
978a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mToken="); pw.println(mToken);
979a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mRootToken="); pw.println(mRootToken);
980a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mAppToken != null) {
981a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(prefix); pw.print("mAppToken="); pw.println(mAppToken);
982a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
983a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mTargetAppToken != null) {
984a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(prefix); pw.print("mTargetAppToken="); pw.println(mTargetAppToken);
985a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
986a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mViewVisibility=0x");
987a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(Integer.toHexString(mViewVisibility));
988a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(" mLastHidden="); pw.print(mLastHidden);
989a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(" mHaveFrame="); pw.print(mHaveFrame);
990a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(" mObscured="); pw.println(mObscured);
9919a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            pw.print(prefix); pw.print("mSeq="); pw.print(mSeq);
9929a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            pw.print(" mSystemUiVisibility=0x");
9939a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            pw.println(Integer.toHexString(mSystemUiVisibility));
9946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!mPolicyVisibility || !mPolicyVisibilityAfterAnim || mAttachedHidden) {
9966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mPolicyVisibility=");
9976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(mPolicyVisibility);
9986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mPolicyVisibilityAfterAnim=");
9996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(mPolicyVisibilityAfterAnim);
10006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mAttachedHidden="); pw.println(mAttachedHidden);
10016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1002b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn        if (!mRelayoutCalled || mLayoutNeeded) {
1003b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn            pw.print(prefix); pw.print("mRelayoutCalled="); pw.print(mRelayoutCalled);
1004b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn                    pw.print(" mLayoutNeeded="); pw.println(mLayoutNeeded);
10056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mXOffset != 0 || mYOffset != 0) {
10076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("Offsets x="); pw.print(mXOffset);
10086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" y="); pw.println(mYOffset);
10096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1010a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1011a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mGivenContentInsets=");
1012a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mGivenContentInsets.printShortString(pw);
1013a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mGivenVisibleInsets=");
1014a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mGivenVisibleInsets.printShortString(pw);
1015a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
1016a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mTouchableInsets != 0 || mGivenInsetsPending) {
1017a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(prefix); pw.print("mTouchableInsets="); pw.print(mTouchableInsets);
1018a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(" mGivenInsetsPending="); pw.println(mGivenInsetsPending);
1019a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
1020a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mConfiguration="); pw.println(mConfiguration);
10216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1022c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        pw.print(prefix); pw.print("mHasSurface="); pw.print(mHasSurface);
1023c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner                pw.print(" mShownFrame="); mShownFrame.printShortString(pw); pw.println();
1024a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1025a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw);
1026a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" last="); mLastFrame.printShortString(pw);
1027a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
1028a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
1029ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        if (mEnforceSizeCompat) {
1030ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            pw.print(prefix); pw.print("mCompatFrame="); mCompatFrame.printShortString(pw);
1031ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    pw.println();
1032ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        }
1033a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1034a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mContainingFrame=");
1035a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mContainingFrame.printShortString(pw);
1036a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mParentFrame=");
1037a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mParentFrame.printShortString(pw);
1038a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mDisplayFrame=");
1039a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mDisplayFrame.printShortString(pw);
1040a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
1041a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mContentFrame="); mContentFrame.printShortString(pw);
1042a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mVisibleFrame="); mVisibleFrame.printShortString(pw);
1043a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
1044a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mContentInsets="); mContentInsets.printShortString(pw);
1045a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" last="); mLastContentInsets.printShortString(pw);
1046a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mVisibleInsets="); mVisibleInsets.printShortString(pw);
1047a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" last="); mLastVisibleInsets.printShortString(pw);
1048a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
1049a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
1050a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner        mWinAnimator.dump(pw, prefix, dumpAll);
1051a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1052a608b882327fbb393bde3854953cd322a6fea675Craig Mautner            pw.print(prefix); pw.print("mDrawPending="); pw.print(mWinAnimator.mDrawPending);
1053a608b882327fbb393bde3854953cd322a6fea675Craig Mautner                    pw.print(" mCommitDrawPending="); pw.print(mWinAnimator.mCommitDrawPending);
1054a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mReadyToShow="); pw.print(mReadyToShow);
1055a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mHasDrawn="); pw.println(mHasDrawn);
1056a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
10576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mExiting || mRemoveOnExit || mDestroying || mRemoved) {
10586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mExiting="); pw.print(mExiting);
10596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mRemoveOnExit="); pw.print(mRemoveOnExit);
10606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mDestroying="); pw.print(mDestroying);
10616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mRemoved="); pw.println(mRemoved);
10626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mOrientationChanging || mAppFreezing || mTurnOnScreen) {
10646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mOrientationChanging=");
10656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(mOrientationChanging);
10666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mAppFreezing="); pw.print(mAppFreezing);
10676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mTurnOnScreen="); pw.println(mTurnOnScreen);
10686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mHScale != 1 || mVScale != 1) {
10706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mHScale="); pw.print(mHScale);
10716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mVScale="); pw.println(mVScale);
10726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mWallpaperX != -1 || mWallpaperY != -1) {
10746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mWallpaperX="); pw.print(mWallpaperX);
10756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mWallpaperY="); pw.println(mWallpaperY);
10766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mWallpaperXStep != -1 || mWallpaperYStep != -1) {
10786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mWallpaperXStep="); pw.print(mWallpaperXStep);
10796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mWallpaperYStep="); pw.println(mWallpaperYStep);
10806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
10826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
10836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    String makeInputChannelName() {
10846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return Integer.toHexString(System.identityHashCode(this))
10856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            + " " + mAttrs.getTitle();
10866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
10876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
10886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    @Override
10896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public String toString() {
10906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mStringNameCache == null || mLastTitle != mAttrs.getTitle()
10916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                || mWasPaused != mToken.paused) {
10926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLastTitle = mAttrs.getTitle();
10936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mWasPaused = mToken.paused;
10946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mStringNameCache = "Window{" + Integer.toHexString(System.identityHashCode(this))
10956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + " " + mLastTitle + " paused=" + mWasPaused + "}";
10966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mStringNameCache;
10986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1099cef37fb481d16eda2b304887a8738ed599bc1b21satok}
1100