WindowState.java revision 6e2281d44c9b71a03a50ed24d654927111cd2b72
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
264532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownimport com.android.server.input.InputWindowHandle;
274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown
28e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautnerimport android.content.Context;
296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.res.Configuration;
306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Matrix;
316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.PixelFormat;
326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Rect;
33d040edbae968d826aa2c82d382345811a45c646bDianne Hackbornimport android.graphics.RectF;
346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Region;
356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.IBinder;
366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException;
376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog;
386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.Gravity;
396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IApplicationToken;
406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IWindow;
416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.InputChannel;
426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.View;
436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.ViewTreeObserver;
446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager;
456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManagerPolicy;
466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.io.PrintWriter;
486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.util.ArrayList;
496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/**
516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * A window in the window manager.
526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */
53e32c30784191a9244a08450759471c934c85034cCraig Mautnerfinal class WindowState implements WindowManagerPolicy.WindowState {
54d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner    static final String TAG = "WindowState";
55d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner
565fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean DEBUG_VISIBILITY = WindowManagerService.DEBUG_VISIBILITY;
575fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean SHOW_TRANSACTIONS = WindowManagerService.SHOW_TRANSACTIONS;
5836991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn    static final boolean SHOW_LIGHT_TRANSACTIONS = WindowManagerService.SHOW_LIGHT_TRANSACTIONS;
595fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean SHOW_SURFACE_ALLOC = WindowManagerService.SHOW_SURFACE_ALLOC;
605fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowManagerService mService;
62e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    final WindowManagerPolicy mPolicy;
63e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    final Context mContext;
646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Session mSession;
656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final IWindow mClient;
666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowToken mToken;
676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowToken mRootToken;
686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    AppWindowToken mAppToken;
696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    AppWindowToken mTargetAppToken;
70d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner
71d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner    // mAttrs.flags is tested in animation without being locked. If the bits tested are ever
72d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner    // modified they will need to be locked.
736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowManager.LayoutParams mAttrs = new WindowManager.LayoutParams();
746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final DeathRecipient mDeathRecipient;
756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowState mAttachedWindow;
766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final ArrayList<WindowState> mChildWindows = new ArrayList<WindowState>();
776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final int mBaseLayer;
786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final int mSubLayer;
796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mLayoutAttached;
806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mIsImWindow;
816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mIsWallpaper;
826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mIsFloatingLayer;
839a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    int mSeq;
845fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    boolean mEnforceSizeCompat;
856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mViewVisibility;
869a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    int mSystemUiVisibility;
876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mPolicyVisibility = true;
886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mPolicyVisibilityAfterAnim = true;
896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mAppFreezing;
906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mAttachedHidden;    // is our parent window hidden?
916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mWallpaperVisible;  // for wallpaper, what was last vis report?
92ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
93ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    /**
94ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * The window size that was requested by the application.  These are in
95ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * the application's coordinate space (without compatibility scale applied).
96ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     */
976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mRequestedWidth;
986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mRequestedHeight;
991743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn    int mLastRequestedWidth;
1001743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn    int mLastRequestedHeight;
101ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mLayer;
1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mHaveFrame;
1046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mObscured;
1056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mTurnOnScreen;
1066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mLayoutSeq = -1;
108a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
1096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    Configuration mConfiguration = null;
110a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
111ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    /**
112ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * Actual frame shown on-screen (may be modified by animation).  These
113ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * are in the screen's coordinate space (WITH the compatibility scale
114ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * applied).
115ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     */
116d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn    final RectF mShownFrame = new RectF();
1176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
119ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * Insets that determine the actually visible area.  These are in the application's
120ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * coordinate space (without compatibility scale applied).
1216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mVisibleInsets = new Rect();
1236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mLastVisibleInsets = new Rect();
1246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mVisibleInsetsChanged;
1256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1275c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn     * Insets that are covered by system windows (such as the status bar) and
1285c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn     * transient docking windows (such as the IME).  These are in the application's
129ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * coordinate space (without compatibility scale applied).
1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mContentInsets = new Rect();
1326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mLastContentInsets = new Rect();
1336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mContentInsetsChanged;
1346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Set to true if we are waiting for this window to receive its
1376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * given internal insets before laying out other windows based on it.
1386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mGivenInsetsPending;
1406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * These are the content insets that were given during layout for
1436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * this window, to be applied to windows behind it.
1446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mGivenContentInsets = new Rect();
1466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * These are the visible insets that were given during layout for
1496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * this window, to be applied to windows behind it.
1506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mGivenVisibleInsets = new Rect();
1526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * This is the given touchable area relative to the window frame, or null if none.
1556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Region mGivenTouchableRegion = new Region();
1576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Flag indicating whether the touchable region should be adjusted by
1606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * the visible insets; if false the area outside the visible insets is
1616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * NOT touchable, so we must use those to adjust the frame during hit
1626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * tests.
1636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mTouchableInsets = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
1656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
16685afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn    /**
16785afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn     * This is rectangle of the window's surface that is not covered by
16885afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn     * system decorations.
16985afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn     */
17085afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn    final Rect mSystemDecorRect = new Rect();
17185afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn    final Rect mLastSystemDecorRect = new Rect();
17285afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn
1736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Current transformation being applied.
174e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    float mGlobalScale=1;
175ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    float mInvGlobalScale=1;
1766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mHScale=1, mVScale=1;
1776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mLastHScale=1, mLastVScale=1;
1786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Matrix mTmpMatrix = new Matrix();
1796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
180ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    // "Real" frame that the application sees, in display coordinate space.
1816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mFrame = new Rect();
1826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mLastFrame = new Rect();
183ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    // Frame that is scaled to the application's coordinate space when in
184ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    // screen size compatibility mode.
185ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    final Rect mCompatFrame = new Rect();
1866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mContainingFrame = new Rect();
1886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mDisplayFrame = new Rect();
1896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mContentFrame = new Rect();
1906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mParentFrame = new Rect();
1916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mVisibleFrame = new Rect();
1926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mContentChanged;
1946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // If a window showing a wallpaper: the requested offset for the
1966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // wallpaper; if a wallpaper window: the currently applied offset.
1976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperX = -1;
1986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperY = -1;
1996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // If a window showing a wallpaper: what fraction of the offset
2016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // range corresponds to a full virtual screen.
2026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperXStep = -1;
2036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperYStep = -1;
2046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Wallpaper windows: pixels offset based on above variables.
2066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mXOffset;
2076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mYOffset;
2086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // This is set after IWindowSession.relayout() has been called at
2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // least once for the window.  It allows us to detect the situation
2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // where we don't yet have a surface, but should have one soon, so
2126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // we can give the window focus before waiting for the relayout.
2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRelayoutCalled;
2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
215b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // If the application has called relayout() with changes that can
216b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // impact its window's size, we need to perform a layout pass on it
217b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // even if it is not currently visible for layout.  This is set
218b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // when in that case until the layout is done.
219b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    boolean mLayoutNeeded;
220b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn
2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Currently running an exit animation?
2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mExiting;
2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Currently on the mDestroySurface list?
2256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mDestroying;
2266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Completely remove from window manager after exit animation?
2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRemoveOnExit;
2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Set when the orientation is changing and this window has not yet
2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // been updated for the new orientation.
2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mOrientationChanging;
2336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Is this window now (or just being) removed?
2356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRemoved;
2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Temp for keeping track of windows that have been removed when
2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // rebuilding window list.
2396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRebuilding;
2406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Input channel and input window handle used by the input dispatcher.
2429302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    final InputWindowHandle mInputWindowHandle;
2436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    InputChannel mInputChannel;
2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Used to improve performance of toString()
2466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    String mStringNameCache;
2476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    CharSequence mLastTitle;
2486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mWasPaused;
2496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
250a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    final WindowStateAnimator mWinAnimator;
251a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
252c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner    boolean mHasSurface = false;
253c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner
2546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
2559a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn           WindowState attachedWindow, int seq, WindowManager.LayoutParams a,
2566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn           int viewVisibility) {
2576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService = service;
2586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mSession = s;
2596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mClient = c;
2606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mToken = token;
2616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mAttrs.copyFrom(a);
2626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mViewVisibility = viewVisibility;
263e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner        mPolicy = mService.mPolicy;
264e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner        mContext = mService.mContext;
2656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        DeathRecipient deathRecipient = new DeathRecipient();
2669a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        mSeq = seq;
267e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        mEnforceSizeCompat = (mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0;
2686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) Slog.v(
269d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            TAG, "Window " + this + " client=" + c.asBinder()
2706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            + " token=" + token + " (" + mAttrs.token + ")");
2716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
2726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            c.asBinder().linkToDeath(deathRecipient, 0);
2736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RemoteException e) {
2746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mDeathRecipient = null;
2756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow = null;
2766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLayoutAttached = false;
2776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsImWindow = false;
2786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsWallpaper = false;
2796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsFloatingLayer = false;
2806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mBaseLayer = 0;
2816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mSubLayer = 0;
2829302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mInputWindowHandle = null;
283a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            mWinAnimator = null;
2846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return;
2856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mDeathRecipient = deathRecipient;
2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if ((mAttrs.type >= FIRST_SUB_WINDOW &&
2896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mAttrs.type <= LAST_SUB_WINDOW)) {
2906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // The multiplier here is to reserve space for multiple
2916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // windows in the same type layer.
292e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner            mBaseLayer = mPolicy.windowTypeToLayerLw(
2936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    attachedWindow.mAttrs.type) * WindowManagerService.TYPE_LAYER_MULTIPLIER
2946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + WindowManagerService.TYPE_LAYER_OFFSET;
295e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner            mSubLayer = mPolicy.subWindowTypeToLayerLw(a.type);
2966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow = attachedWindow;
297d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + this + " to " + mAttachedWindow);
2986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow.mChildWindows.add(this);
2996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLayoutAttached = mAttrs.type !=
3006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
3016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsImWindow = attachedWindow.mAttrs.type == TYPE_INPUT_METHOD
3026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || attachedWindow.mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
3036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsWallpaper = attachedWindow.mAttrs.type == TYPE_WALLPAPER;
3046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsFloatingLayer = mIsImWindow || mIsWallpaper;
3056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else {
3066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // The multiplier here is to reserve space for multiple
3076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // windows in the same type layer.
308e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner            mBaseLayer = mPolicy.windowTypeToLayerLw(a.type)
3096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    * WindowManagerService.TYPE_LAYER_MULTIPLIER
3106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + WindowManagerService.TYPE_LAYER_OFFSET;
3116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mSubLayer = 0;
3126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow = null;
3136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLayoutAttached = false;
3146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsImWindow = mAttrs.type == TYPE_INPUT_METHOD
3156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
3166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsWallpaper = mAttrs.type == TYPE_WALLPAPER;
3176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsFloatingLayer = mIsImWindow || mIsWallpaper;
3186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
320a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner        mWinAnimator = new WindowStateAnimator(service, this, mAttachedWindow);
321c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner        mWinAnimator.mAlpha = a.alpha;
322a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
3236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        WindowState appWin = this;
3246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        while (appWin.mAttachedWindow != null) {
325a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            appWin = appWin.mAttachedWindow;
3266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        WindowToken appToken = appWin.mToken;
3286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        while (appToken.appWindowToken == null) {
3296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowToken parent = mService.mTokenMap.get(appToken.token);
3306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (parent == null || appToken == parent) {
3316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
3326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            appToken = parent;
3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mRootToken = appToken;
3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mAppToken = appToken.appWindowToken;
3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mRequestedWidth = 0;
3396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mRequestedHeight = 0;
3401743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        mLastRequestedWidth = 0;
3411743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        mLastRequestedHeight = 0;
3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mXOffset = 0;
3436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mYOffset = 0;
3446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mLayer = 0;
3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mInputWindowHandle = new InputWindowHandle(
3466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mAppToken != null ? mAppToken.mInputApplicationHandle : null, this);
3476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void attach() {
3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) Slog.v(
351d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            TAG, "Attaching " + this + " token=" + mToken
3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            + ", list=" + mToken.windows);
3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mSession.windowAddedLocked();
3546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
356a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
35785afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn    public void computeFrameLw(Rect pf, Rect df, Rect cf, Rect vf) {
3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mHaveFrame = true;
3596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect container = mContainingFrame;
3616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        container.set(pf);
3626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect display = mDisplayFrame;
3646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        display.set(df);
3656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int pw = container.right - container.left;
3676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int ph = container.bottom - container.top;
3686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        int w,h;
370ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        if ((mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0) {
371ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.width < 0) {
372ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = pw;
373ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
374ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = (int)(mAttrs.width * mGlobalScale + .5f);
375ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
376ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = mAttrs.width;
377ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
378ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.height < 0) {
379ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = ph;
380ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
381ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = (int)(mAttrs.height * mGlobalScale + .5f);
382ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
383ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = mAttrs.height;
384ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
3856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else {
386ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.width == WindowManager.LayoutParams.MATCH_PARENT) {
387ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = pw;
388ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
389ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = (int)(mRequestedWidth * mGlobalScale + .5f);
390ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
391ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = mRequestedWidth;
392ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
393ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.height == WindowManager.LayoutParams.MATCH_PARENT) {
394ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = ph;
395ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
396ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = (int)(mRequestedHeight * mGlobalScale + .5f);
397ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
398ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = mRequestedHeight;
399ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
4006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!mParentFrame.equals(pf)) {
4036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //Slog.i(TAG, "Window " + this + " content frame from " + mParentFrame
4046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //        + " to " + pf);
4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mParentFrame.set(pf);
4066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mContentChanged = true;
4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4081743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        if (mRequestedWidth != mLastRequestedWidth || mRequestedHeight != mLastRequestedHeight) {
4091743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            mLastRequestedWidth = mRequestedWidth;
4101743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            mLastRequestedHeight = mRequestedHeight;
4111743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            mContentChanged = true;
4121743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        }
4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect content = mContentFrame;
4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        content.set(cf);
4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect visible = mVisibleFrame;
4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visible.set(vf);
4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect frame = mFrame;
4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int fw = frame.width();
4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int fh = frame.height();
4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        //System.out.println("In: w=" + w + " h=" + h + " container=" +
4256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        //                   container + " x=" + mAttrs.x + " y=" + mAttrs.y);
4266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
427ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        float x, y;
428ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        if (mEnforceSizeCompat) {
429ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            x = mAttrs.x * mGlobalScale;
430ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            y = mAttrs.y * mGlobalScale;
431ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        } else {
432ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            x = mAttrs.x;
433ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            y = mAttrs.y;
434ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        }
435ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
4366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        Gravity.apply(mAttrs.gravity, w, h, container,
437ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                (int) (x + mAttrs.horizontalMargin * pw),
438ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                (int) (y + mAttrs.verticalMargin * ph), frame);
4396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        //System.out.println("Out: " + mFrame);
4416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Now make sure the window fits in the overall display.
4436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        Gravity.applyDisplay(mAttrs.gravity, df, frame);
4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4455c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn        // Make sure the system, content and visible frames are inside of the
4466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // final window frame.
4476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.left < frame.left) content.left = frame.left;
4486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.top < frame.top) content.top = frame.top;
4496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.right > frame.right) content.right = frame.right;
4506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.bottom > frame.bottom) content.bottom = frame.bottom;
4516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.left < frame.left) visible.left = frame.left;
4526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.top < frame.top) visible.top = frame.top;
4536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.right > frame.right) visible.right = frame.right;
4546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.bottom > frame.bottom) visible.bottom = frame.bottom;
4556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect contentInsets = mContentInsets;
4576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.left = content.left-frame.left;
4586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.top = content.top-frame.top;
4596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.right = frame.right-content.right;
4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.bottom = frame.bottom-content.bottom;
4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect visibleInsets = mVisibleInsets;
4636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.left = visible.left-frame.left;
4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.top = visible.top-frame.top;
4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.right = frame.right-visible.right;
4666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.bottom = frame.bottom-visible.bottom;
4676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
468ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        mCompatFrame.set(frame);
469e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if (mEnforceSizeCompat) {
470ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // If there is a size compatibility scale being applied to the
471ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // window, we need to apply this to its insets so that they are
472ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // reported to the app in its coordinate space.
473ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            contentInsets.scale(mInvGlobalScale);
474ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            visibleInsets.scale(mInvGlobalScale);
475ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
476ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // Also the scaled frame that we report to the app needs to be
477ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // adjusted to be in its coordinate space.
478ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            mCompatFrame.scale(mInvGlobalScale);
479e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        }
480e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
4816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mIsWallpaper && (fw != frame.width() || fh != frame.height())) {
482bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            mService.updateWallpaperOffsetLocked(this,
483bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                    mService.mAppDisplayWidth, mService.mAppDisplayHeight, false);
4846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) {
4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //if ("com.google.android.youtube".equals(mAttrs.packageName)
4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //        && mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
489d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner                Slog.v(TAG, "Resolving (mRequestedWidth="
4906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + mRequestedWidth + ", mRequestedheight="
4916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + mRequestedHeight + ") to" + " (pw=" + pw + ", ph=" + ph
4926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + "): frame=" + mFrame.toShortString()
4936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + " ci=" + contentInsets.toShortString()
4946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + " vi=" + visibleInsets.toShortString());
4956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //}
4966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
499a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getFrameLw() {
5016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mFrame;
5026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
504a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
505d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn    public RectF getShownFrameLw() {
5066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mShownFrame;
5076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
509a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getDisplayFrameLw() {
5116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mDisplayFrame;
5126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
514a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getContentFrameLw() {
5166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mContentFrame;
5176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
519a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getVisibleFrameLw() {
5216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mVisibleFrame;
5226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
524a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean getGivenInsetsPendingLw() {
5266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mGivenInsetsPending;
5276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
529a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getGivenContentInsetsLw() {
5316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mGivenContentInsets;
5326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
534a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getGivenVisibleInsetsLw() {
5366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mGivenVisibleInsets;
5376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
539a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public WindowManager.LayoutParams getAttrs() {
5416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mAttrs;
5426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
54473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn    public boolean getNeedsMenuLw(WindowManagerPolicy.WindowState bottom) {
54573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        int index = -1;
54673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        WindowState ws = this;
54773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        while (true) {
54873ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if ((ws.mAttrs.privateFlags
54973ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                    & WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY) != 0) {
55073ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                return (ws.mAttrs.flags & WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0;
55173ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
55273ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // If we reached the bottom of the range of windows we are considering,
55373ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // assume no menu is needed.
55473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if (ws == bottom) {
55573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                return false;
55673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
55773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // The current window hasn't specified whether menu key is needed;
55873ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // look behind it.
55973ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // First, we may need to determine the starting position.
56073ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if (index < 0) {
56173ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                index = mService.mWindows.indexOf(ws);
56273ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
56373ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            index--;
56473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if (index < 0) {
56573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                return false;
56673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
56773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            ws = mService.mWindows.get(index);
56873ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        }
56973ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn    }
57073ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn
5719a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public int getSystemUiVisibility() {
5729a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        return mSystemUiVisibility;
5739a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    }
5749a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn
5756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public int getSurfaceLayer() {
5766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mLayer;
5776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public IApplicationToken getAppToken() {
5806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mAppToken != null ? mAppToken.appToken : null;
5816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public long getInputDispatchingTimeoutNanos() {
5846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mAppToken != null
5856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                ? mAppToken.inputDispatchingTimeoutNanos
5866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                : WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
5876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean hasAppShownWindows() {
5906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mAppToken != null ? mAppToken.firstWindowDrawn : false;
5916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isIdentityMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
5946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dsdx < .99999f || dsdx > 1.00001f) return false;
5956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dtdy < .99999f || dtdy > 1.00001f) return false;
5966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dtdx < -.000001f || dtdx > .000001f) return false;
5976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dsdy < -.000001f || dsdy > .000001f) return false;
5986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return true;
5996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
601e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    void prelayout() {
602e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if (mEnforceSizeCompat) {
603e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            mGlobalScale = mService.mCompatibleScreenScale;
604ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            mInvGlobalScale = 1/mGlobalScale;
605e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        } else {
606ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            mGlobalScale = mInvGlobalScale = 1;
607e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        }
608e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    }
609e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
6106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Is this window visible?  It is not visible if there is no
6126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * surface, or we are in the process of running an exit animation
6136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * that will remove the surface, or its app token has been hidden.
6146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isVisibleLw() {
6166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
617c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mAttachedHidden
6186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (atoken == null || !atoken.hiddenRequested)
6196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mExiting && !mDestroying;
6206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Like {@link #isVisibleLw}, but also counts a window that is currently
6246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * "hidden" behind the keyguard as visible.  This allows us to apply
6256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * things like window flags that impact the keyguard.
6266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * XXX I am starting to think we need to have ANOTHER visibility flag
6276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * for this "hidden behind keyguard" state rather than overloading
6286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * mPolicyVisibility.  Ungh.
6296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isVisibleOrBehindKeyguardLw() {
631bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        if (mRootToken.waitingToShow &&
632bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
633bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn            return false;
634bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        }
6356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
636bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        final boolean animating = atoken != null
637594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                ? (atoken.mAppAnimator.animation != null) : false;
638c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && !mDestroying && !mExiting
6396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (atoken == null ? mPolicyVisibility : !atoken.hiddenRequested)
640bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                && ((!mAttachedHidden && mViewVisibility == View.VISIBLE
641bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                                && !mRootToken.hidden)
642a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                        || mWinAnimator.mAnimation != null || animating);
6436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Is this window visible, ignoring its app token?  It is not visible
6476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * if there is no surface, or we are in the process of running an exit animation
6486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * that will remove the surface.
6496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isWinVisibleLw() {
6516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
652c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mAttachedHidden
653594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                && (atoken == null || !atoken.hiddenRequested || atoken.mAppAnimator.animating)
6546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mExiting && !mDestroying;
6556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * The same as isVisible(), but follows the current hidden state of
6596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * the associated app token, not the pending requested hidden state.
6606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isVisibleNow() {
662c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mAttachedHidden
6636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mRootToken.hidden && !mExiting && !mDestroying;
6646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Can this window possibly be a drag/drop target?  The test here is
6686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * a combination of the above "visible now" with the check that the
6696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Input Manager uses when discarding windows from input consideration.
6706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isPotentialDragTarget() {
672cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        return isVisibleNow() && !mRemoved
673cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                && mInputChannel != null && mInputWindowHandle != null;
6746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Same as isVisible(), but we also count it as visible between the
6786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * call to IWindowSession.add() and the first relayout().
6796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isVisibleOrAdding() {
6816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
682bf08af3323117e15a65b74e66b7499d31537f9e1Craig Mautner        return (mHasSurface || (!mRelayoutCalled && mViewVisibility == View.VISIBLE))
6836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && mPolicyVisibility && !mAttachedHidden
6846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (atoken == null || !atoken.hiddenRequested)
6856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mExiting && !mDestroying;
6866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Is this window currently on-screen?  It is on-screen either if it
6906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * is visible or it is currently running an animation before no longer
6916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * being visible.
6926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isOnScreen() {
694c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        if (!mHasSurface || !mPolicyVisibility || mDestroying) {
695c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner            return false;
696c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        }
6976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
6986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (atoken != null) {
699c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner            return ((!mAttachedHidden && !atoken.hiddenRequested)
700594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                            || mWinAnimator.mAnimation != null || atoken.mAppAnimator.animation != null);
7016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
702c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return !mAttachedHidden || mWinAnimator.mAnimation != null;
7036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Like isOnScreen(), but we don't return true if the window is part
7076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * of a transition that has not yet been started.
7086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isReadyForDisplay() {
7106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mRootToken.waitingToShow &&
7116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
7126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
7136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
714c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mDestroying
7156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && ((!mAttachedHidden && mViewVisibility == View.VISIBLE
7166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                                && !mRootToken.hidden)
717a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                        || mWinAnimator.mAnimation != null
718594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        || ((mAppToken != null) && (mAppToken.mAppAnimator.animation != null)));
7196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7226e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn     * Like isReadyForDisplay(), but ignores any force hiding of the window due
7236e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn     * to the keyguard.
7246e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn     */
7256e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn    boolean isReadyForDisplayIgnoringKeyguard() {
7266e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        if (mRootToken.waitingToShow &&
7276e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn                mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
7286e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn            return false;
7296e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        }
7306e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        final AppWindowToken atoken = mAppToken;
7316e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        if (atoken == null && !mPolicyVisibility) {
7326e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn            // If this is not an app window, and the policy has asked to force
7336e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn            // hide, then we really do want to hide.
7346e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn            return false;
7356e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        }
7366e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        return mHasSurface && !mDestroying
7376e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn                && ((!mAttachedHidden && mViewVisibility == View.VISIBLE
7386e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn                                && !mRootToken.hidden)
7396e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn                        || mWinAnimator.mAnimation != null
7406e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn                        || ((atoken != null) && (atoken.mAppAnimator.animation != null)));
7416e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn    }
7426e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn
7436e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn    /**
7446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Like isOnScreen, but returns false if the surface hasn't yet
7456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * been drawn.
7466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isDisplayedLw() {
7486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
749bf90eaa5d2410bfb60ef84a0efcf3b5eb5022d9fCraig Mautner        return isDrawnLw() && mPolicyVisibility
7506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            && ((!mAttachedHidden &&
7516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    (atoken == null || !atoken.hiddenRequested))
752a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                    || mWinAnimator.mAnimating);
7536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7555c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn    /**
7565c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn     * Return true if this window (or a window it is attached to, but not
7575c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn     * considering its app token) is currently animating.
7585c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn     */
7595c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn    public boolean isAnimatingLw() {
7605c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn        return mWinAnimator.mAnimation != null;
7615c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn    }
7625c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn
763cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn    public boolean isGoneForLayoutLw() {
764cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn        final AppWindowToken atoken = mAppToken;
765cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn        return mViewVisibility == View.GONE
766cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || !mRelayoutCalled
767cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || (atoken == null && mRootToken.hidden)
768b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn                || (atoken != null && (atoken.hiddenRequested || atoken.hidden))
769cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || mAttachedHidden
770cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || mExiting || mDestroying;
771cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn    }
772cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn
7736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Returns true if the window has a surface that it has drawn a
7756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * complete UI in to.
7766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isDrawnLw() {
778c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && !mDestroying &&
779749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner                (mWinAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW
780749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner                || mWinAnimator.mDrawState == WindowStateAnimator.HAS_DRAWN);
7816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Return true if the window is opaque and fully drawn.  This indicates
7856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * it may obscure windows behind it.
7866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isOpaqueDrawn() {
7886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return (mAttrs.format == PixelFormat.OPAQUE
7896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        || mAttrs.type == TYPE_WALLPAPER)
790a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                && isDrawnLw() && mWinAnimator.mAnimation == null
791594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                && (mAppToken == null || mAppToken.mAppAnimator.animation == null);
7926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Return whether this window is wanting to have a translation
7966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * animation applied to it for an in-progress move.  (Only makes
7976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * sense to call from performLayoutAndPlaceSurfacesLockedInner().)
7986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean shouldAnimateMove() {
800749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner        return mContentChanged && !mExiting && !mWinAnimator.mLastHidden && mService.okToDisplay()
8016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (mFrame.top != mLastFrame.top
8026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        || mFrame.left != mLastFrame.left)
8032fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner                && (mAttachedWindow == null || !mAttachedWindow.shouldAnimateMove());
8046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isFullscreen(int screenWidth, int screenHeight) {
807ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        return mFrame.left <= 0 && mFrame.top <= 0 &&
808ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                mFrame.right >= screenWidth && mFrame.bottom >= screenHeight;
8096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void removeLocked() {
8126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        disposeInputChannel();
8136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mAttachedWindow != null) {
815d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + this + " from " + mAttachedWindow);
8166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow.mChildWindows.remove(this);
8176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
818c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner        mWinAnimator.destroyDeferredSurfaceLocked();
819c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner        mWinAnimator.destroySurfaceLocked();
8206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mSession.windowRemovedLocked();
8216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
8226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mClient.asBinder().unlinkToDeath(mDeathRecipient, 0);
8236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RuntimeException e) {
8246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Ignore if it has already been removed (usually because
8256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // we are doing this as part of processing a death note.)
8266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
8276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
828cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
829cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    void setInputChannel(InputChannel inputChannel) {
830cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (mInputChannel != null) {
831cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            throw new IllegalStateException("Window already has an input channel.");
832cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        }
833cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
834cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInputChannel = inputChannel;
835cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInputWindowHandle.inputChannel = inputChannel;
836cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    }
837cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
8386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void disposeInputChannel() {
8396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mInputChannel != null) {
8406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mInputManager.unregisterInputChannel(mInputChannel);
8416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputChannel.dispose();
8436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputChannel = null;
8446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
845cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
846cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInputWindowHandle.inputChannel = null;
8476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private class DeathRecipient implements IBinder.DeathRecipient {
8506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public void binderDied() {
8516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
8526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                synchronized(mService.mWindowMap) {
8536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowState win = mService.windowForClientLocked(mSession, mClient, false);
854d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner                    Slog.i(TAG, "WIN DEATH: " + win);
8556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    if (win != null) {
8566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mService.removeWindowLocked(mSession, win);
8576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    }
8586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
8596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } catch (IllegalArgumentException ex) {
8606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // This will happen if the window has already been
8616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // removed.
8626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
8636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
8646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
866ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner    /** Returns true if this window desires key events.
867ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner     * TODO(cmautner): Is this the same as {@link WindowManagerService#canBeImeTarget}
868ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner     */
8696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public final boolean canReceiveKeys() {
8706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return     isVisibleOrAdding()
8716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (mViewVisibility == View.VISIBLE)
8726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && ((mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == 0);
8736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
875749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner    @Override
8766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean hasDrawnLw() {
877749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner        return mWinAnimator.mDrawState == WindowStateAnimator.HAS_DRAWN;
8786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
880749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner    @Override
8816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean showLw(boolean doAnimation) {
8826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return showLw(doAnimation, true);
8836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean showLw(boolean doAnimation, boolean requestAnim) {
8866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mPolicyVisibility && mPolicyVisibilityAfterAnim) {
887e32c30784191a9244a08450759471c934c85034cCraig Mautner            // Already showing.
8886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
8896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
890d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner        if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility true: " + this);
8916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
892d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (DEBUG_VISIBILITY) Slog.v(TAG, "doAnimation: mPolicyVisibility="
893a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                    + mPolicyVisibility + " mAnimation=" + mWinAnimator.mAnimation);
8942fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner            if (!mService.okToDisplay()) {
8956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
896a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            } else if (mPolicyVisibility && mWinAnimator.mAnimation == null) {
8976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // Check for the case where we are currently visible and
8986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // not animating; we do not want to do animation at such a
8996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // point to become visible when we already are.
9006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
9016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
9026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mPolicyVisibility = true;
9046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mPolicyVisibilityAfterAnim = true;
9056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
906c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            mWinAnimator.applyAnimationLocked(WindowManagerPolicy.TRANSIT_ENTER, true);
9076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (requestAnim) {
9094a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown            mService.scheduleAnimationLocked();
9106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return true;
9126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
914f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn    @Override
9156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean hideLw(boolean doAnimation) {
9166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return hideLw(doAnimation, true);
9176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
9196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean hideLw(boolean doAnimation, boolean requestAnim) {
9206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
9212fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner            if (!mService.okToDisplay()) {
9226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
9236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
9246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        boolean current = doAnimation ? mPolicyVisibilityAfterAnim
9266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                : mPolicyVisibility;
9276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!current) {
928e32c30784191a9244a08450759471c934c85034cCraig Mautner            // Already hiding.
9296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
9306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
932c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            mWinAnimator.applyAnimationLocked(WindowManagerPolicy.TRANSIT_EXIT, false);
933a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            if (mWinAnimator.mAnimation == null) {
9346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
9356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
9366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
9386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mPolicyVisibilityAfterAnim = false;
9396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else {
940d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility false: " + this);
9416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mPolicyVisibilityAfterAnim = false;
9426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mPolicyVisibility = false;
9436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Window is no longer visible -- make sure if we were waiting
9446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // for it to be displayed before enabling the display, that
9456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // we allow the display to be enabled now.
9466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.enableScreenIfNeededLocked();
9476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mService.mCurrentFocus == this) {
9486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mFocusMayChange = true;
9496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
9506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (requestAnim) {
9524a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown            mService.scheduleAnimationLocked();
9536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return true;
9556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
957f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn    @Override
958f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn    public boolean isAlive() {
959f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn        return mClient.asBinder().isBinderAlive();
960f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn    }
961f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn
962ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    private static void applyInsets(Region outRegion, Rect frame, Rect inset) {
963ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        outRegion.set(
964ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                frame.left + inset.left, frame.top + inset.top,
965ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                frame.right - inset.right, frame.bottom - inset.bottom);
966e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    }
967e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
9686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void getTouchableRegion(Region outRegion) {
969ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        final Rect frame = mFrame;
9706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        switch (mTouchableInsets) {
9716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            default:
9726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME:
9736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                outRegion.set(frame);
9746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
975e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT:
976ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                applyInsets(outRegion, frame, mGivenContentInsets);
9776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
978e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_VISIBLE:
979ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                applyInsets(outRegion, frame, mGivenVisibleInsets);
9806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
9816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION: {
9826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                final Region givenTouchableRegion = mGivenTouchableRegion;
9836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                outRegion.set(givenTouchableRegion);
9846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                outRegion.translate(frame.left, frame.top);
9856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
9866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
9876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
990a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dump(PrintWriter pw, String prefix, boolean dumpAll) {
9916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("mSession="); pw.print(mSession);
9926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" mClient="); pw.println(mClient.asBinder());
9936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("mAttrs="); pw.println(mAttrs);
994a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.print(prefix); pw.print("Requested w="); pw.print(mRequestedWidth);
995a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(" h="); pw.print(mRequestedHeight);
996a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(" mLayoutSeq="); pw.println(mLayoutSeq);
9971743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        if (mRequestedWidth != mLastRequestedWidth || mRequestedHeight != mLastRequestedHeight) {
9981743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            pw.print(prefix); pw.print("LastRequested w="); pw.print(mLastRequestedWidth);
9991743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn                    pw.print(" h="); pw.println(mLastRequestedHeight);
10001743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        }
10016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mAttachedWindow != null || mLayoutAttached) {
10026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mAttachedWindow="); pw.print(mAttachedWindow);
10036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mLayoutAttached="); pw.println(mLayoutAttached);
10046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mIsImWindow || mIsWallpaper || mIsFloatingLayer) {
10066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mIsImWindow="); pw.print(mIsImWindow);
10076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mIsWallpaper="); pw.print(mIsWallpaper);
10086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mIsFloatingLayer="); pw.print(mIsFloatingLayer);
10096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mWallpaperVisible="); pw.println(mWallpaperVisible);
10106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1011a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1012a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mBaseLayer="); pw.print(mBaseLayer);
1013a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mSubLayer="); pw.print(mSubLayer);
1014a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mAnimLayer="); pw.print(mLayer); pw.print("+");
1015594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.print((mTargetAppToken != null ?
1016594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                            mTargetAppToken.mAppAnimator.animLayerAdjustment
1017594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                          : (mAppToken != null ? mAppToken.mAppAnimator.animLayerAdjustment : 0)));
1018c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner                    pw.print("="); pw.print(mWinAnimator.mAnimLayer);
1019c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner                    pw.print(" mLastLayer="); pw.println(mWinAnimator.mLastLayer);
10206d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn        }
1021a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1022a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mToken="); pw.println(mToken);
1023a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mRootToken="); pw.println(mRootToken);
1024a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mAppToken != null) {
1025a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(prefix); pw.print("mAppToken="); pw.println(mAppToken);
1026a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
1027a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mTargetAppToken != null) {
1028a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(prefix); pw.print("mTargetAppToken="); pw.println(mTargetAppToken);
1029a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
1030a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mViewVisibility=0x");
1031a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(Integer.toHexString(mViewVisibility));
1032a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(" mHaveFrame="); pw.print(mHaveFrame);
1033a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(" mObscured="); pw.println(mObscured);
10349a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            pw.print(prefix); pw.print("mSeq="); pw.print(mSeq);
10359a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            pw.print(" mSystemUiVisibility=0x");
10369a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            pw.println(Integer.toHexString(mSystemUiVisibility));
10376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!mPolicyVisibility || !mPolicyVisibilityAfterAnim || mAttachedHidden) {
10396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mPolicyVisibility=");
10406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(mPolicyVisibility);
10416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mPolicyVisibilityAfterAnim=");
10426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(mPolicyVisibilityAfterAnim);
10436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mAttachedHidden="); pw.println(mAttachedHidden);
10446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1045b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn        if (!mRelayoutCalled || mLayoutNeeded) {
1046b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn            pw.print(prefix); pw.print("mRelayoutCalled="); pw.print(mRelayoutCalled);
1047b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn                    pw.print(" mLayoutNeeded="); pw.println(mLayoutNeeded);
10486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mXOffset != 0 || mYOffset != 0) {
10506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("Offsets x="); pw.print(mXOffset);
10516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" y="); pw.println(mYOffset);
10526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1053a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1054a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mGivenContentInsets=");
1055a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mGivenContentInsets.printShortString(pw);
1056a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mGivenVisibleInsets=");
1057a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mGivenVisibleInsets.printShortString(pw);
1058a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
1059a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mTouchableInsets != 0 || mGivenInsetsPending) {
1060a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(prefix); pw.print("mTouchableInsets="); pw.print(mTouchableInsets);
1061a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(" mGivenInsetsPending="); pw.println(mGivenInsetsPending);
1062a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
1063a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mConfiguration="); pw.println(mConfiguration);
10646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1065c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        pw.print(prefix); pw.print("mHasSurface="); pw.print(mHasSurface);
1066c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner                pw.print(" mShownFrame="); mShownFrame.printShortString(pw); pw.println();
1067a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1068a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw);
1069a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" last="); mLastFrame.printShortString(pw);
1070a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
107185afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn            pw.print(prefix); pw.print("mSystemDecorRect="); mSystemDecorRect.printShortString(pw);
107285afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                    pw.print(" last="); mLastSystemDecorRect.printShortString(pw);
107385afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                    pw.println();
1074a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
1075ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        if (mEnforceSizeCompat) {
1076ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            pw.print(prefix); pw.print("mCompatFrame="); mCompatFrame.printShortString(pw);
1077ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    pw.println();
1078ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        }
1079a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
10805c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn            pw.print(prefix); pw.print("Frames: containing=");
1081a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mContainingFrame.printShortString(pw);
10825c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.print(" parent="); mParentFrame.printShortString(pw);
10835c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.print(" display="); mDisplayFrame.printShortString(pw);
10845c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.println();
108585afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn            pw.print(prefix); pw.print("    content="); mContentFrame.printShortString(pw);
10865c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.print(" visible="); mVisibleFrame.printShortString(pw);
1087a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
108885afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn            pw.print(prefix); pw.print("Cur insets: content=");
108985afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                    mContentInsets.printShortString(pw);
10905c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.print(" visible="); mVisibleInsets.printShortString(pw);
1091a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
109285afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn            pw.print(prefix); pw.print("Lst insets: content=");
109385afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                    mLastContentInsets.printShortString(pw);
10945c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.print(" visible="); mLastVisibleInsets.printShortString(pw);
1095a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
1096a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
1097a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner        mWinAnimator.dump(pw, prefix, dumpAll);
10986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mExiting || mRemoveOnExit || mDestroying || mRemoved) {
10996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mExiting="); pw.print(mExiting);
11006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mRemoveOnExit="); pw.print(mRemoveOnExit);
11016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mDestroying="); pw.print(mDestroying);
11026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mRemoved="); pw.println(mRemoved);
11036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
11046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mOrientationChanging || mAppFreezing || mTurnOnScreen) {
11056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mOrientationChanging=");
11066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(mOrientationChanging);
11076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mAppFreezing="); pw.print(mAppFreezing);
11086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mTurnOnScreen="); pw.println(mTurnOnScreen);
11096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
11106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mHScale != 1 || mVScale != 1) {
11116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mHScale="); pw.print(mHScale);
11126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mVScale="); pw.println(mVScale);
11136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
11146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mWallpaperX != -1 || mWallpaperY != -1) {
11156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mWallpaperX="); pw.print(mWallpaperX);
11166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mWallpaperY="); pw.println(mWallpaperY);
11176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
11186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mWallpaperXStep != -1 || mWallpaperYStep != -1) {
11196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mWallpaperXStep="); pw.print(mWallpaperXStep);
11206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mWallpaperYStep="); pw.println(mWallpaperYStep);
11216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
11226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
11236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
11246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    String makeInputChannelName() {
11256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return Integer.toHexString(System.identityHashCode(this))
11266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            + " " + mAttrs.getTitle();
11276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
11286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
11296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    @Override
11306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public String toString() {
11316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mStringNameCache == null || mLastTitle != mAttrs.getTitle()
11326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                || mWasPaused != mToken.paused) {
11336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLastTitle = mAttrs.getTitle();
11346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mWasPaused = mToken.paused;
11356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mStringNameCache = "Window{" + Integer.toHexString(System.identityHashCode(this))
11366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + " " + mLastTitle + " paused=" + mWasPaused + "}";
11376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
11386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mStringNameCache;
11396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1140cef37fb481d16eda2b304887a8738ed599bc1b21satok}
1141