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;
24e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautnerimport static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD;
256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
274532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownimport com.android.server.input.InputWindowHandle;
284532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown
29e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautnerimport android.content.Context;
306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.res.Configuration;
316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Matrix;
326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.PixelFormat;
336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Rect;
34d040edbae968d826aa2c82d382345811a45c646bDianne Hackbornimport android.graphics.RectF;
356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Region;
366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.IBinder;
376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException;
389dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautnerimport android.os.UserHandle;
396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog;
4059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.DisplayInfo;
416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.Gravity;
426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IApplicationToken;
436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IWindow;
446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.InputChannel;
456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.View;
466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.ViewTreeObserver;
476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager;
486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManagerPolicy;
496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.io.PrintWriter;
516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.util.ArrayList;
526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerclass WindowList extends ArrayList<WindowState> {
5459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner}
5559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner
566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/**
576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * A window in the window manager.
586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */
59e32c30784191a9244a08450759471c934c85034cCraig Mautnerfinal class WindowState implements WindowManagerPolicy.WindowState {
60d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner    static final String TAG = "WindowState";
61d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner
625fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean DEBUG_VISIBILITY = WindowManagerService.DEBUG_VISIBILITY;
635fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean SHOW_TRANSACTIONS = WindowManagerService.SHOW_TRANSACTIONS;
6436991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn    static final boolean SHOW_LIGHT_TRANSACTIONS = WindowManagerService.SHOW_LIGHT_TRANSACTIONS;
655fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean SHOW_SURFACE_ALLOC = WindowManagerService.SHOW_SURFACE_ALLOC;
665fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowManagerService mService;
68e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    final WindowManagerPolicy mPolicy;
69e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    final Context mContext;
706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Session mSession;
716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final IWindow mClient;
726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowToken mToken;
736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowToken mRootToken;
746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    AppWindowToken mAppToken;
756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    AppWindowToken mTargetAppToken;
76d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner
77d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner    // mAttrs.flags is tested in animation without being locked. If the bits tested are ever
78d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner    // modified they will need to be locked.
796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowManager.LayoutParams mAttrs = new WindowManager.LayoutParams();
806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final DeathRecipient mDeathRecipient;
816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowState mAttachedWindow;
827b1aa77a9b25b4b1e8070c9cccfadcde39954952Craig Mautner    final WindowList mChildWindows = new WindowList();
836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final int mBaseLayer;
846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final int mSubLayer;
856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mLayoutAttached;
866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mIsImWindow;
876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mIsWallpaper;
886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final boolean mIsFloatingLayer;
899a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    int mSeq;
905fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    boolean mEnforceSizeCompat;
916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mViewVisibility;
929a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    int mSystemUiVisibility;
936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mPolicyVisibility = true;
946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mPolicyVisibilityAfterAnim = true;
956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mAppFreezing;
966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mAttachedHidden;    // is our parent window hidden?
976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mWallpaperVisible;  // for wallpaper, what was last vis report?
98ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
99ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    /**
100ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * The window size that was requested by the application.  These are in
101ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * the application's coordinate space (without compatibility scale applied).
102ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     */
1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mRequestedWidth;
1046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mRequestedHeight;
1051743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn    int mLastRequestedWidth;
1061743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn    int mLastRequestedHeight;
107ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
1086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mLayer;
1096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mHaveFrame;
1106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mObscured;
1116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mTurnOnScreen;
1126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mLayoutSeq = -1;
114a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
1156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    Configuration mConfiguration = null;
116e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner    // Sticky answer to isConfigChanged(), remains true until new Configuration is assigned.
117e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner    // Used only on {@link #TYPE_KEYGUARD}.
118e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner    private boolean mConfigHasChanged;
119a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
120ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    /**
121ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * Actual frame shown on-screen (may be modified by animation).  These
122ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * are in the screen's coordinate space (WITH the compatibility scale
123ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * applied).
124ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     */
125d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn    final RectF mShownFrame = new RectF();
1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
128ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * Insets that determine the actually visible area.  These are in the application's
129ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * coordinate space (without compatibility scale applied).
1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mVisibleInsets = new Rect();
1326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mLastVisibleInsets = new Rect();
1336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mVisibleInsetsChanged;
1346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1365c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn     * Insets that are covered by system windows (such as the status bar) and
1375c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn     * transient docking windows (such as the IME).  These are in the application's
138ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn     * coordinate space (without compatibility scale applied).
1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mContentInsets = new Rect();
1416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mLastContentInsets = new Rect();
1426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mContentInsetsChanged;
1436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Set to true if we are waiting for this window to receive its
1466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * given internal insets before laying out other windows based on it.
1476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mGivenInsetsPending;
1496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * These are the content insets that were given during layout for
1526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * this window, to be applied to windows behind it.
1536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mGivenContentInsets = new Rect();
1556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * These are the visible insets that were given during layout for
1586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * this window, to be applied to windows behind it.
1596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mGivenVisibleInsets = new Rect();
1616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * This is the given touchable area relative to the window frame, or null if none.
1646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Region mGivenTouchableRegion = new Region();
1666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
1686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Flag indicating whether the touchable region should be adjusted by
1696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * the visible insets; if false the area outside the visible insets is
1706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * NOT touchable, so we must use those to adjust the frame during hit
1716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * tests.
1726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
1736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mTouchableInsets = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
1746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
17585afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn    /**
17685afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn     * This is rectangle of the window's surface that is not covered by
17785afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn     * system decorations.
17885afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn     */
17985afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn    final Rect mSystemDecorRect = new Rect();
18085afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn    final Rect mLastSystemDecorRect = new Rect();
18185afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn
1826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Current transformation being applied.
183e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    float mGlobalScale=1;
184ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    float mInvGlobalScale=1;
1856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mHScale=1, mVScale=1;
1866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mLastHScale=1, mLastVScale=1;
1876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Matrix mTmpMatrix = new Matrix();
1886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
189ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    // "Real" frame that the application sees, in display coordinate space.
1906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mFrame = new Rect();
1916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mLastFrame = new Rect();
192ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    // Frame that is scaled to the application's coordinate space when in
193ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    // screen size compatibility mode.
194ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    final Rect mCompatFrame = new Rect();
1956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mContainingFrame = new Rect();
1976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mDisplayFrame = new Rect();
1986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mContentFrame = new Rect();
1996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mParentFrame = new Rect();
2006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Rect mVisibleFrame = new Rect();
2016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mContentChanged;
2036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // If a window showing a wallpaper: the requested offset for the
2056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // wallpaper; if a wallpaper window: the currently applied offset.
2066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperX = -1;
2076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperY = -1;
2086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // If a window showing a wallpaper: what fraction of the offset
2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // range corresponds to a full virtual screen.
2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperXStep = -1;
2126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mWallpaperYStep = -1;
2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Wallpaper windows: pixels offset based on above variables.
2156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mXOffset;
2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mYOffset;
2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // This is set after IWindowSession.relayout() has been called at
2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // least once for the window.  It allows us to detect the situation
2206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // where we don't yet have a surface, but should have one soon, so
2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // we can give the window focus before waiting for the relayout.
2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRelayoutCalled;
2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
224b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // If the application has called relayout() with changes that can
225b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // impact its window's size, we need to perform a layout pass on it
226b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // even if it is not currently visible for layout.  This is set
227b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    // when in that case until the layout is done.
228b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn    boolean mLayoutNeeded;
229b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn
2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Currently running an exit animation?
2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mExiting;
2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Currently on the mDestroySurface list?
2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mDestroying;
2356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Completely remove from window manager after exit animation?
2376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRemoveOnExit;
2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Set when the orientation is changing and this window has not yet
2406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // been updated for the new orientation.
2416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mOrientationChanging;
2426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Is this window now (or just being) removed?
2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRemoved;
2456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Temp for keeping track of windows that have been removed when
2476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // rebuilding window list.
2486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mRebuilding;
2496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Input channel and input window handle used by the input dispatcher.
2519302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    final InputWindowHandle mInputWindowHandle;
2526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    InputChannel mInputChannel;
2536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Used to improve performance of toString()
2556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    String mStringNameCache;
2566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    CharSequence mLastTitle;
257529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn    boolean mWasExiting;
2586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
259a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    final WindowStateAnimator mWinAnimator;
260a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
261c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner    boolean mHasSurface = false;
262c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner
26359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner    DisplayContent  mDisplayContent;
2646881a10557acf3b0270de54799d6f19437acf584Craig Mautner
265a2d7b1117abc23a3ff0ccda15a2f9138aaa7f4fcCraig Mautner    // UserId and appId of the owner. Don't display windows of non-current user.
26688400d3a31139c40c4014faf86c243647087ef6cCraig Mautner    int mOwnerUid;
26788400d3a31139c40c4014faf86c243647087ef6cCraig Mautner
26888400d3a31139c40c4014faf86c243647087ef6cCraig Mautner    /** When true this window can be displayed on screens owther than mOwnerUid's */
26988400d3a31139c40c4014faf86c243647087ef6cCraig Mautner    private boolean mShowToOwnerOnly;
2709dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautner
2716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
2729a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn           WindowState attachedWindow, int seq, WindowManager.LayoutParams a,
27359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner           int viewVisibility, final DisplayContent displayContent) {
2746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService = service;
2756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mSession = s;
2766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mClient = c;
2776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mToken = token;
278a2d7b1117abc23a3ff0ccda15a2f9138aaa7f4fcCraig Mautner        mOwnerUid = s.mUid;
2796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mAttrs.copyFrom(a);
2806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mViewVisibility = viewVisibility;
28159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner        mDisplayContent = displayContent;
282e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner        mPolicy = mService.mPolicy;
283e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner        mContext = mService.mContext;
2846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        DeathRecipient deathRecipient = new DeathRecipient();
2859a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        mSeq = seq;
286e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        mEnforceSizeCompat = (mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0;
2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) Slog.v(
288d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            TAG, "Window " + this + " client=" + c.asBinder()
289ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner            + " token=" + token + " (" + mAttrs.token + ")" + " params=" + a);
2906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
2916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            c.asBinder().linkToDeath(deathRecipient, 0);
2926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RemoteException e) {
2936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mDeathRecipient = null;
2946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow = null;
2956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLayoutAttached = false;
2966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsImWindow = false;
2976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsWallpaper = false;
2986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsFloatingLayer = false;
2996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mBaseLayer = 0;
3006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mSubLayer = 0;
3019302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mInputWindowHandle = null;
302a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            mWinAnimator = null;
3036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return;
3046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mDeathRecipient = deathRecipient;
3066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if ((mAttrs.type >= FIRST_SUB_WINDOW &&
3086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mAttrs.type <= LAST_SUB_WINDOW)) {
3096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // The multiplier here is to reserve space for multiple
3106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // windows in the same type layer.
311e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner            mBaseLayer = mPolicy.windowTypeToLayerLw(
3126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    attachedWindow.mAttrs.type) * WindowManagerService.TYPE_LAYER_MULTIPLIER
3136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + WindowManagerService.TYPE_LAYER_OFFSET;
314e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner            mSubLayer = mPolicy.subWindowTypeToLayerLw(a.type);
3156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow = attachedWindow;
316d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + this + " to " + mAttachedWindow);
3176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow.mChildWindows.add(this);
3186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLayoutAttached = mAttrs.type !=
3196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
3206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsImWindow = attachedWindow.mAttrs.type == TYPE_INPUT_METHOD
3216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || attachedWindow.mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
3226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsWallpaper = attachedWindow.mAttrs.type == TYPE_WALLPAPER;
3236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsFloatingLayer = mIsImWindow || mIsWallpaper;
3246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else {
3256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // The multiplier here is to reserve space for multiple
3266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // windows in the same type layer.
327e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner            mBaseLayer = mPolicy.windowTypeToLayerLw(a.type)
3286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    * WindowManagerService.TYPE_LAYER_MULTIPLIER
3296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + WindowManagerService.TYPE_LAYER_OFFSET;
3306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mSubLayer = 0;
3316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow = null;
3326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLayoutAttached = false;
3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsImWindow = mAttrs.type == TYPE_INPUT_METHOD
3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsWallpaper = mAttrs.type == TYPE_WALLPAPER;
3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mIsFloatingLayer = mIsImWindow || mIsWallpaper;
3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        WindowState appWin = this;
3406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        while (appWin.mAttachedWindow != null) {
341a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            appWin = appWin.mAttachedWindow;
3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        WindowToken appToken = appWin.mToken;
3446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        while (appToken.appWindowToken == null) {
3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowToken parent = mService.mTokenMap.get(appToken.token);
3466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (parent == null || appToken == parent) {
3476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
3486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            appToken = parent;
3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mRootToken = appToken;
3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mAppToken = appToken.appWindowToken;
3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
354322e40315609acd5a608440bc469d873e09559caCraig Mautner        mWinAnimator = new WindowStateAnimator(this);
355322e40315609acd5a608440bc469d873e09559caCraig Mautner        mWinAnimator.mAlpha = a.alpha;
356322e40315609acd5a608440bc469d873e09559caCraig Mautner
3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mRequestedWidth = 0;
3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mRequestedHeight = 0;
3591743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        mLastRequestedWidth = 0;
3601743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        mLastRequestedHeight = 0;
3616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mXOffset = 0;
3626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mYOffset = 0;
3636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mLayer = 0;
3646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mInputWindowHandle = new InputWindowHandle(
36559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner                mAppToken != null ? mAppToken.mInputApplicationHandle : null, this,
36659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner                displayContent.getDisplayId());
3676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void attach() {
3706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) Slog.v(
371d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            TAG, "Attaching " + this + " token=" + mToken
3726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            + ", list=" + mToken.windows);
3736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mSession.windowAddedLocked();
3746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
376a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
37785afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn    public void computeFrameLw(Rect pf, Rect df, Rect cf, Rect vf) {
3786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mHaveFrame = true;
3796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect container = mContainingFrame;
3816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        container.set(pf);
3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect display = mDisplayFrame;
3846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        display.set(df);
3856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int pw = container.right - container.left;
3876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int ph = container.bottom - container.top;
3886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        int w,h;
390ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        if ((mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0) {
391ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.width < 0) {
392ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = pw;
393ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
394ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = (int)(mAttrs.width * mGlobalScale + .5f);
395ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
396ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = mAttrs.width;
397ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
398ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.height < 0) {
399ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = ph;
400ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
401ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = (int)(mAttrs.height * mGlobalScale + .5f);
402ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
403ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = mAttrs.height;
404ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else {
406ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.width == WindowManager.LayoutParams.MATCH_PARENT) {
407ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = pw;
408ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
409ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = (int)(mRequestedWidth * mGlobalScale + .5f);
410ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
411ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                w = mRequestedWidth;
412ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
413ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mAttrs.height == WindowManager.LayoutParams.MATCH_PARENT) {
414ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = ph;
415ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else if (mEnforceSizeCompat) {
416ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = (int)(mRequestedHeight * mGlobalScale + .5f);
417ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            } else {
418ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                h = mRequestedHeight;
419ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            }
4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!mParentFrame.equals(pf)) {
4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //Slog.i(TAG, "Window " + this + " content frame from " + mParentFrame
4246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //        + " to " + pf);
4256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mParentFrame.set(pf);
4266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mContentChanged = true;
4276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4281743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        if (mRequestedWidth != mLastRequestedWidth || mRequestedHeight != mLastRequestedHeight) {
4291743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            mLastRequestedWidth = mRequestedWidth;
4301743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            mLastRequestedHeight = mRequestedHeight;
4311743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            mContentChanged = true;
4321743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        }
4336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect content = mContentFrame;
4356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        content.set(cf);
4366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect visible = mVisibleFrame;
4386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visible.set(vf);
4396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect frame = mFrame;
4416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int fw = frame.width();
4426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int fh = frame.height();
4436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        //System.out.println("In: w=" + w + " h=" + h + " container=" +
4456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        //                   container + " x=" + mAttrs.x + " y=" + mAttrs.y);
4466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
447ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        float x, y;
448ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        if (mEnforceSizeCompat) {
449ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            x = mAttrs.x * mGlobalScale;
450ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            y = mAttrs.y * mGlobalScale;
451ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        } else {
452ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            x = mAttrs.x;
453ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            y = mAttrs.y;
454ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        }
455ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
4566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        Gravity.apply(mAttrs.gravity, w, h, container,
457ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                (int) (x + mAttrs.horizontalMargin * pw),
458ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                (int) (y + mAttrs.verticalMargin * ph), frame);
4596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        //System.out.println("Out: " + mFrame);
4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Now make sure the window fits in the overall display.
4636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        Gravity.applyDisplay(mAttrs.gravity, df, frame);
4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4655c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn        // Make sure the system, content and visible frames are inside of the
4666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // final window frame.
4676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.left < frame.left) content.left = frame.left;
4686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.top < frame.top) content.top = frame.top;
4696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.right > frame.right) content.right = frame.right;
4706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (content.bottom > frame.bottom) content.bottom = frame.bottom;
4716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.left < frame.left) visible.left = frame.left;
4726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.top < frame.top) visible.top = frame.top;
4736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.right > frame.right) visible.right = frame.right;
4746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (visible.bottom > frame.bottom) visible.bottom = frame.bottom;
4756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect contentInsets = mContentInsets;
4776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.left = content.left-frame.left;
4786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.top = content.top-frame.top;
4796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.right = frame.right-content.right;
4806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        contentInsets.bottom = frame.bottom-content.bottom;
4816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final Rect visibleInsets = mVisibleInsets;
4836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.left = visible.left-frame.left;
4846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.top = visible.top-frame.top;
4856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.right = frame.right-visible.right;
4866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        visibleInsets.bottom = frame.bottom-visible.bottom;
4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
488ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        mCompatFrame.set(frame);
489e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if (mEnforceSizeCompat) {
490ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // If there is a size compatibility scale being applied to the
491ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // window, we need to apply this to its insets so that they are
492ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // reported to the app in its coordinate space.
493ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            contentInsets.scale(mInvGlobalScale);
494ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            visibleInsets.scale(mInvGlobalScale);
495ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn
496ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // Also the scaled frame that we report to the app needs to be
497ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            // adjusted to be in its coordinate space.
498ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            mCompatFrame.scale(mInvGlobalScale);
499e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        }
500e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
5016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mIsWallpaper && (fw != frame.width() || fh != frame.height())) {
50259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner            final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo();
50359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner            mService.updateWallpaperOffsetLocked(this, displayInfo.appWidth, displayInfo.appHeight,
50459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner                    false);
5056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) {
5086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //if ("com.google.android.youtube".equals(mAttrs.packageName)
5096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //        && mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
510d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner                Slog.v(TAG, "Resolving (mRequestedWidth="
5116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + mRequestedWidth + ", mRequestedheight="
5126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + mRequestedHeight + ") to" + " (pw=" + pw + ", ph=" + ph
5136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + "): frame=" + mFrame.toShortString()
5146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + " ci=" + contentInsets.toShortString()
5156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + " vi=" + visibleInsets.toShortString());
5166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            //}
5176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5201cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov    MagnificationSpec getWindowMagnificationSpecLocked() {
5211cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov        MagnificationSpec spec = mDisplayContent.mMagnificationSpec;
5221cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov        if (spec != null && !spec.isNop()) {
5231cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov            if (mAttachedWindow != null) {
524f1b674197577e815040cd75ef86d611965d603adCraig Mautner                if (!mPolicy.canMagnifyWindowLw(mAttachedWindow.mAttrs)) {
5251cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov                    return null;
5261cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov                }
5271cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov            }
528f1b674197577e815040cd75ef86d611965d603adCraig Mautner            if (!mPolicy.canMagnifyWindowLw(mAttrs)) {
5291cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov                return null;
5301cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov            }
5311cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov        }
5321cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov        return spec;
5331cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov    }
5341cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov
535a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getFrameLw() {
5376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mFrame;
5386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
540a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
541d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn    public RectF getShownFrameLw() {
5426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mShownFrame;
5436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
545a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getDisplayFrameLw() {
5476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mDisplayFrame;
5486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
550a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getContentFrameLw() {
5526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mContentFrame;
5536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
555a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getVisibleFrameLw() {
5576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mVisibleFrame;
5586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
560a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean getGivenInsetsPendingLw() {
5626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mGivenInsetsPending;
5636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
565a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getGivenContentInsetsLw() {
5676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mGivenContentInsets;
5686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
570a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public Rect getGivenVisibleInsetsLw() {
5726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mGivenVisibleInsets;
5736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
575a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner    @Override
5766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public WindowManager.LayoutParams getAttrs() {
5776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mAttrs;
5786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
580812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner    @Override
58173ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn    public boolean getNeedsMenuLw(WindowManagerPolicy.WindowState bottom) {
58273ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        int index = -1;
58373ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        WindowState ws = this;
58459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner        WindowList windows = getWindowList();
58573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        while (true) {
58673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if ((ws.mAttrs.privateFlags
58773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                    & WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY) != 0) {
58873ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                return (ws.mAttrs.flags & WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0;
58973ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
59073ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // If we reached the bottom of the range of windows we are considering,
59173ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // assume no menu is needed.
59273ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if (ws == bottom) {
59373ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                return false;
59473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
59573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // The current window hasn't specified whether menu key is needed;
59673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // look behind it.
59773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            // First, we may need to determine the starting position.
59873ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if (index < 0) {
59959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner                index = windows.indexOf(ws);
60073ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
60173ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            index--;
60273ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            if (index < 0) {
60373ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn                return false;
60473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            }
60559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner            ws = windows.get(index);
60673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn        }
60773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn    }
60873ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn
60919d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner    @Override
6109a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public int getSystemUiVisibility() {
6119a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        return mSystemUiVisibility;
6129a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    }
6139a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn
61419d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner    @Override
6156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public int getSurfaceLayer() {
6166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mLayer;
6176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
619812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner    @Override
6206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public IApplicationToken getAppToken() {
6216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mAppToken != null ? mAppToken.appToken : null;
6226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
62319d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner
62419d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner    public int getDisplayId() {
62519d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner        return mDisplayContent.getDisplayId();
62619d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner    }
62719d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner
6286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public long getInputDispatchingTimeoutNanos() {
6296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mAppToken != null
6306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                ? mAppToken.inputDispatchingTimeoutNanos
6316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                : WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
6326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
634e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner    @Override
6356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean hasAppShownWindows() {
636f41209568617f4acfaf6dea8f8b2cbe9c2994a3eCraig Mautner        return mAppToken != null && (mAppToken.firstWindowDrawn || mAppToken.startingDisplayed);
6376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isIdentityMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
6406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dsdx < .99999f || dsdx > 1.00001f) return false;
6416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dtdy < .99999f || dtdy > 1.00001f) return false;
6426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dtdx < -.000001f || dtdx > .000001f) return false;
6436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (dsdy < -.000001f || dsdy > .000001f) return false;
6446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return true;
6456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
647e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    void prelayout() {
648e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if (mEnforceSizeCompat) {
649e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            mGlobalScale = mService.mCompatibleScreenScale;
650ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            mInvGlobalScale = 1/mGlobalScale;
651e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        } else {
652ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            mGlobalScale = mInvGlobalScale = 1;
653e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        }
654e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    }
655e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
6566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Is this window visible?  It is not visible if there is no
6586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * surface, or we are in the process of running an exit animation
6596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * that will remove the surface, or its app token has been hidden.
6606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
66188400d3a31139c40c4014faf86c243647087ef6cCraig Mautner    @Override
6626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isVisibleLw() {
6636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
664c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mAttachedHidden
6656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (atoken == null || !atoken.hiddenRequested)
6666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mExiting && !mDestroying;
6676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Like {@link #isVisibleLw}, but also counts a window that is currently
6716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * "hidden" behind the keyguard as visible.  This allows us to apply
6726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * things like window flags that impact the keyguard.
6736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * XXX I am starting to think we need to have ANOTHER visibility flag
6746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * for this "hidden behind keyguard" state rather than overloading
6756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * mPolicyVisibility.  Ungh.
6766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
67788400d3a31139c40c4014faf86c243647087ef6cCraig Mautner    @Override
6786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isVisibleOrBehindKeyguardLw() {
679bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        if (mRootToken.waitingToShow &&
680bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
681bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn            return false;
682bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        }
6836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
684bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        final boolean animating = atoken != null
685594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                ? (atoken.mAppAnimator.animation != null) : false;
686c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && !mDestroying && !mExiting
6876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (atoken == null ? mPolicyVisibility : !atoken.hiddenRequested)
688bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                && ((!mAttachedHidden && mViewVisibility == View.VISIBLE
689bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                                && !mRootToken.hidden)
690a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                        || mWinAnimator.mAnimation != null || animating);
6916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
6926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
6936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
6946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Is this window visible, ignoring its app token?  It is not visible
6956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * if there is no surface, or we are in the process of running an exit animation
6966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * that will remove the surface.
6976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
6986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isWinVisibleLw() {
6996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
700c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mAttachedHidden
701594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                && (atoken == null || !atoken.hiddenRequested || atoken.mAppAnimator.animating)
7026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mExiting && !mDestroying;
7036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * The same as isVisible(), but follows the current hidden state of
7076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * the associated app token, not the pending requested hidden state.
7086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isVisibleNow() {
710c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mAttachedHidden
7116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mRootToken.hidden && !mExiting && !mDestroying;
7126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Can this window possibly be a drag/drop target?  The test here is
7166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * a combination of the above "visible now" with the check that the
7176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Input Manager uses when discarding windows from input consideration.
7186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isPotentialDragTarget() {
720cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        return isVisibleNow() && !mRemoved
721cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                && mInputChannel != null && mInputWindowHandle != null;
7226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Same as isVisible(), but we also count it as visible between the
7266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * call to IWindowSession.add() and the first relayout().
7276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isVisibleOrAdding() {
7296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
730bf08af3323117e15a65b74e66b7499d31537f9e1Craig Mautner        return (mHasSurface || (!mRelayoutCalled && mViewVisibility == View.VISIBLE))
7316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && mPolicyVisibility && !mAttachedHidden
7326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (atoken == null || !atoken.hiddenRequested)
7336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && !mExiting && !mDestroying;
7346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Is this window currently on-screen?  It is on-screen either if it
7386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * is visible or it is currently running an animation before no longer
7396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * being visible.
7406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isOnScreen() {
742c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        if (!mHasSurface || !mPolicyVisibility || mDestroying) {
743c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner            return false;
744c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        }
7456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
7466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (atoken != null) {
747c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner            return ((!mAttachedHidden && !atoken.hiddenRequested)
748594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                            || mWinAnimator.mAnimation != null || atoken.mAppAnimator.animation != null);
7496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
750c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return !mAttachedHidden || mWinAnimator.mAnimation != null;
7516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Like isOnScreen(), but we don't return true if the window is part
7556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * of a transition that has not yet been started.
7566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
7576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isReadyForDisplay() {
7586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mRootToken.waitingToShow &&
7596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
7606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
7616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
762c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && mPolicyVisibility && !mDestroying
7636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && ((!mAttachedHidden && mViewVisibility == View.VISIBLE
7646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                                && !mRootToken.hidden)
765a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                        || mWinAnimator.mAnimation != null
766594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        || ((mAppToken != null) && (mAppToken.mAppAnimator.animation != null)));
7676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
7686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
7696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
7706e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn     * Like isReadyForDisplay(), but ignores any force hiding of the window due
7716e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn     * to the keyguard.
7726e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn     */
7736e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn    boolean isReadyForDisplayIgnoringKeyguard() {
7746e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        if (mRootToken.waitingToShow &&
7756e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn                mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
7766e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn            return false;
7776e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        }
7786e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        final AppWindowToken atoken = mAppToken;
7796e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        if (atoken == null && !mPolicyVisibility) {
7806e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn            // If this is not an app window, and the policy has asked to force
7816e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn            // hide, then we really do want to hide.
7826e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn            return false;
7836e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        }
7846e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn        return mHasSurface && !mDestroying
7856e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn                && ((!mAttachedHidden && mViewVisibility == View.VISIBLE
7866e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn                                && !mRootToken.hidden)
7876e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn                        || mWinAnimator.mAnimation != null
7889c5bf3b36f3dd658320f34dbaee9d6d453606bf4Craig Mautner                        || ((atoken != null) && (atoken.mAppAnimator.animation != null)
7899c5bf3b36f3dd658320f34dbaee9d6d453606bf4Craig Mautner                                && !mWinAnimator.isDummyAnimation()));
7906e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn    }
7916e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn
7926e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn    /**
7936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Like isOnScreen, but returns false if the surface hasn't yet
7946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * been drawn.
7956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
796e6f7d5054a71eeae8c0b10a2305347efdcd8c3d3Craig Mautner    @Override
7976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isDisplayedLw() {
7986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final AppWindowToken atoken = mAppToken;
799bf90eaa5d2410bfb60ef84a0efcf3b5eb5022d9fCraig Mautner        return isDrawnLw() && mPolicyVisibility
8006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            && ((!mAttachedHidden &&
8016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    (atoken == null || !atoken.hiddenRequested))
802e6f7d5054a71eeae8c0b10a2305347efdcd8c3d3Craig Mautner                        || mWinAnimator.mAnimating
803e6f7d5054a71eeae8c0b10a2305347efdcd8c3d3Craig Mautner                        || (atoken != null && atoken.mAppAnimator.animation != null));
8046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8065c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn    /**
8075c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn     * Return true if this window (or a window it is attached to, but not
8085c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn     * considering its app token) is currently animating.
8095c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn     */
810e6f7d5054a71eeae8c0b10a2305347efdcd8c3d3Craig Mautner    @Override
8115c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn    public boolean isAnimatingLw() {
8125c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn        return mWinAnimator.mAnimation != null;
8135c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn    }
8145c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn
815812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner    @Override
816cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn    public boolean isGoneForLayoutLw() {
817cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn        final AppWindowToken atoken = mAppToken;
818cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn        return mViewVisibility == View.GONE
819cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || !mRelayoutCalled
820cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || (atoken == null && mRootToken.hidden)
821812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner                || (atoken != null && (atoken.hiddenRequested || atoken.hidden))
822cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || mAttachedHidden
823cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn                || mExiting || mDestroying;
824cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn    }
825cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn
8266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
8276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Returns true if the window has a surface that it has drawn a
8286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * complete UI in to.
8296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
8306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean isDrawnLw() {
831c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        return mHasSurface && !mDestroying &&
832749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner                (mWinAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW
833749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner                || mWinAnimator.mDrawState == WindowStateAnimator.HAS_DRAWN);
8346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
8376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Return true if the window is opaque and fully drawn.  This indicates
8386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * it may obscure windows behind it.
8396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
8406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isOpaqueDrawn() {
8416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return (mAttrs.format == PixelFormat.OPAQUE
8426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        || mAttrs.type == TYPE_WALLPAPER)
843a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                && isDrawnLw() && mWinAnimator.mAnimation == null
844594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                && (mAppToken == null || mAppToken.mAppAnimator.animation == null);
8456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /**
8486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Return whether this window is wanting to have a translation
8496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * animation applied to it for an in-progress move.  (Only makes
8506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * sense to call from performLayoutAndPlaceSurfacesLockedInner().)
8516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
8526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean shouldAnimateMove() {
853749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner        return mContentChanged && !mExiting && !mWinAnimator.mLastHidden && mService.okToDisplay()
8546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (mFrame.top != mLastFrame.top
8556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        || mFrame.left != mLastFrame.left)
8562fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner                && (mAttachedWindow == null || !mAttachedWindow.shouldAnimateMove());
8576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean isFullscreen(int screenWidth, int screenHeight) {
860ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        return mFrame.left <= 0 && mFrame.top <= 0 &&
861ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                mFrame.right >= screenWidth && mFrame.bottom >= screenHeight;
8626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
8636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
864812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner    boolean isConfigChanged() {
865e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner        boolean configChanged = mConfiguration != mService.mCurConfiguration
866812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner                && (mConfiguration == null
867812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner                        || (mConfiguration.diff(mService.mCurConfiguration) != 0));
868e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner
869e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner        if (mAttrs.type == TYPE_KEYGUARD) {
870e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner            // Retain configuration changed status until resetConfiguration called.
871e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner            mConfigHasChanged |= configChanged;
872e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner            configChanged = mConfigHasChanged;
873e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner        }
874e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner
875e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner        return configChanged;
876812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner    }
877812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner
878812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner    boolean isConfigDiff(int mask) {
879812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner        return mConfiguration != mService.mCurConfiguration
880812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner                && mConfiguration != null
881812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner                && (mConfiguration.diff(mService.mCurConfiguration) & mask) != 0;
882812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner    }
883812d2ca475e88d4e52870a4eeeb096a411f0f077Craig Mautner
8846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void removeLocked() {
8856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        disposeInputChannel();
8866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
8876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mAttachedWindow != null) {
888d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + this + " from " + mAttachedWindow);
8896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mAttachedWindow.mChildWindows.remove(this);
8906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
89198129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        mWinAnimator.destroyDeferredSurfaceLocked(false);
89298129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        mWinAnimator.destroySurfaceLocked(false);
8936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mSession.windowRemovedLocked();
8946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
8956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mClient.asBinder().unlinkToDeath(mDeathRecipient, 0);
8966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RuntimeException e) {
8976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Ignore if it has already been removed (usually because
8986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // we are doing this as part of processing a death note.)
8996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
901cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
902e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner    void setConfiguration(final Configuration newConfig) {
903e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner        mConfiguration = newConfig;
904e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner        mConfigHasChanged = false;
905e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner    }
906e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner
907cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    void setInputChannel(InputChannel inputChannel) {
908cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (mInputChannel != null) {
909cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            throw new IllegalStateException("Window already has an input channel.");
910cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        }
911cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
912cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInputChannel = inputChannel;
913cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInputWindowHandle.inputChannel = inputChannel;
914cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    }
915cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
9166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void disposeInputChannel() {
9176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mInputChannel != null) {
9186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mInputManager.unregisterInputChannel(mInputChannel);
9196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
9206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputChannel.dispose();
9216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputChannel = null;
9226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
923cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
924cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        mInputWindowHandle.inputChannel = null;
9256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
9276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private class DeathRecipient implements IBinder.DeathRecipient {
928e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner        @Override
9296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public void binderDied() {
9306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
9316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                synchronized(mService.mWindowMap) {
9326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowState win = mService.windowForClientLocked(mSession, mClient, false);
933d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner                    Slog.i(TAG, "WIN DEATH: " + win);
9346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    if (win != null) {
9356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mService.removeWindowLocked(mSession, win);
9366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    }
9376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
9386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } catch (IllegalArgumentException ex) {
9396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // This will happen if the window has already been
9406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // removed.
9416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
9426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
945ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner    /** Returns true if this window desires key events.
946ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner     * TODO(cmautner): Is this the same as {@link WindowManagerService#canBeImeTarget}
947ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner     */
9486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public final boolean canReceiveKeys() {
9496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return     isVisibleOrAdding()
9506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && (mViewVisibility == View.VISIBLE)
9516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                && ((mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == 0);
9526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
954749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner    @Override
9556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean hasDrawnLw() {
956749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner        return mWinAnimator.mDrawState == WindowStateAnimator.HAS_DRAWN;
9576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
959749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner    @Override
9606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean showLw(boolean doAnimation) {
9616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return showLw(doAnimation, true);
9626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
9646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean showLw(boolean doAnimation, boolean requestAnim) {
9655962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner        if (isHiddenFromUserLocked()) {
96688400d3a31139c40c4014faf86c243647087ef6cCraig Mautner            Slog.w(TAG, "current user violation " + mService.mCurrentUserId + " trying to display "
967a2d7b1117abc23a3ff0ccda15a2f9138aaa7f4fcCraig Mautner                    + this + ", type " + mAttrs.type + ", belonging to " + mOwnerUid);
9689dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautner            return false;
9699dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautner        }
9706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mPolicyVisibility && mPolicyVisibilityAfterAnim) {
971e32c30784191a9244a08450759471c934c85034cCraig Mautner            // Already showing.
9726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
9736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
974d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner        if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility true: " + this);
9756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
976d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (DEBUG_VISIBILITY) Slog.v(TAG, "doAnimation: mPolicyVisibility="
977a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                    + mPolicyVisibility + " mAnimation=" + mWinAnimator.mAnimation);
9782fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner            if (!mService.okToDisplay()) {
9796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
980a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            } else if (mPolicyVisibility && mWinAnimator.mAnimation == null) {
9816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // Check for the case where we are currently visible and
9826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // not animating; we do not want to do animation at such a
9836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // point to become visible when we already are.
9846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
9856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
9866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mPolicyVisibility = true;
9886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mPolicyVisibilityAfterAnim = true;
9896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
990c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            mWinAnimator.applyAnimationLocked(WindowManagerPolicy.TRANSIT_ENTER, true);
9916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (requestAnim) {
993711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner            mService.updateLayoutToAnimationLocked();
9946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
9956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return true;
9966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
9976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
998f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn    @Override
9996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean hideLw(boolean doAnimation) {
10006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return hideLw(doAnimation, true);
10016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
10026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
10036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean hideLw(boolean doAnimation, boolean requestAnim) {
10046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
10052fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner            if (!mService.okToDisplay()) {
10066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
10076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
10086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        boolean current = doAnimation ? mPolicyVisibilityAfterAnim
10106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                : mPolicyVisibility;
10116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!current) {
1012e32c30784191a9244a08450759471c934c85034cCraig Mautner            // Already hiding.
10136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
10146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
1016c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            mWinAnimator.applyAnimationLocked(WindowManagerPolicy.TRANSIT_EXIT, false);
1017a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            if (mWinAnimator.mAnimation == null) {
10186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                doAnimation = false;
10196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
10206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (doAnimation) {
10226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mPolicyVisibilityAfterAnim = false;
10236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else {
1024d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner            if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility false: " + this);
10256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mPolicyVisibilityAfterAnim = false;
10266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mPolicyVisibility = false;
10276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // Window is no longer visible -- make sure if we were waiting
10286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // for it to be displayed before enabling the display, that
10296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // we allow the display to be enabled now.
10306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.enableScreenIfNeededLocked();
10316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mService.mCurrentFocus == this) {
10326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mFocusMayChange = true;
10336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
10346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (requestAnim) {
1036711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner            mService.updateLayoutToAnimationLocked();
10376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
10386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return true;
10396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
10406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1041f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn    @Override
1042f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn    public boolean isAlive() {
1043f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn        return mClient.asBinder().isBinderAlive();
1044f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn    }
1045f87d19621dc2a30232bba1f51862a0b671eb9729Dianne Hackborn
1046a987d43bc916b6446fe41037d9fcf07e778b3452Craig Mautner    boolean isClosing() {
1047a987d43bc916b6446fe41037d9fcf07e778b3452Craig Mautner        return mExiting || (mService.mClosingApps.contains(mAppToken));
1048a987d43bc916b6446fe41037d9fcf07e778b3452Craig Mautner    }
1049a987d43bc916b6446fe41037d9fcf07e778b3452Craig Mautner
105069b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner    @Override
105169b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner    public boolean isDefaultDisplay() {
105269b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner        return mDisplayContent.isDefaultDisplay;
105369b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner    }
105469b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner
105588400d3a31139c40c4014faf86c243647087ef6cCraig Mautner    public void setShowToOwnerOnlyLocked(boolean showToOwnerOnly) {
105688400d3a31139c40c4014faf86c243647087ef6cCraig Mautner        mShowToOwnerOnly = showToOwnerOnly;
105788400d3a31139c40c4014faf86c243647087ef6cCraig Mautner    }
105888400d3a31139c40c4014faf86c243647087ef6cCraig Mautner
10595962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner    boolean isHiddenFromUserLocked() {
1060341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner        // Attached windows are evaluated based on the window that they are attached to.
1061341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner        WindowState win = this;
1062341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner        while (win.mAttachedWindow != null) {
1063341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner            win = win.mAttachedWindow;
1064341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner        }
1065341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner        if (win.mAttrs.type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW
1066341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner                && win.mAppToken != null && win.mAppToken.showWhenLocked) {
1067341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner            // Save some cycles by not calling getDisplayInfo unless it is an application
1068341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner            // window intended for all users.
1069341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner            final DisplayInfo displayInfo = win.mDisplayContent.getDisplayInfo();
1070341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner            if (win.mFrame.left <= 0 && win.mFrame.top <= 0
1071341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner                    && win.mFrame.right >= displayInfo.appWidth
1072341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner                    && win.mFrame.bottom >= displayInfo.appHeight) {
10735962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner                // Is a fullscreen window, like the clock alarm. Show to everyone.
10745962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner                return false;
10755962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner            }
10765962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner        }
10775962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner
1078341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner        return win.mShowToOwnerOnly
1079341220fd099b2e74ac605d417f274537dc4bc749Craig Mautner                && UserHandle.getUserId(win.mOwnerUid) != mService.mCurrentUserId;
10809dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautner    }
10819dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautner
1082ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    private static void applyInsets(Region outRegion, Rect frame, Rect inset) {
1083ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        outRegion.set(
1084ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                frame.left + inset.left, frame.top + inset.top,
1085ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                frame.right - inset.right, frame.bottom - inset.bottom);
1086e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    }
1087e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
10886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void getTouchableRegion(Region outRegion) {
1089ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        final Rect frame = mFrame;
10906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        switch (mTouchableInsets) {
10916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            default:
10926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME:
10936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                outRegion.set(frame);
10946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
1095e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT:
1096ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                applyInsets(outRegion, frame, mGivenContentInsets);
10976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
1098e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_VISIBLE:
1099ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                applyInsets(outRegion, frame, mGivenVisibleInsets);
11006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
11016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION: {
11026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                final Region givenTouchableRegion = mGivenTouchableRegion;
11036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                outRegion.set(givenTouchableRegion);
11046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                outRegion.translate(frame.left, frame.top);
11056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
11066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
11076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
11086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
11096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
111059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner    WindowList getWindowList() {
111159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner        return mDisplayContent.getWindowList();
111259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner    }
111359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner
1114a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dump(PrintWriter pw, String prefix, boolean dumpAll) {
111559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner        pw.print(prefix); pw.print("mDisplayId="); pw.print(mDisplayContent.getDisplayId());
111659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner                pw.print(" mSession="); pw.print(mSession);
11176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" mClient="); pw.println(mClient.asBinder());
111888400d3a31139c40c4014faf86c243647087ef6cCraig Mautner        pw.print(prefix); pw.print("mOwnerUid="); pw.print(mOwnerUid);
111988400d3a31139c40c4014faf86c243647087ef6cCraig Mautner                pw.print(" mShowToOwnerOnly="); pw.println(mShowToOwnerOnly);
11206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("mAttrs="); pw.println(mAttrs);
1121a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.print(prefix); pw.print("Requested w="); pw.print(mRequestedWidth);
1122a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(" h="); pw.print(mRequestedHeight);
1123a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(" mLayoutSeq="); pw.println(mLayoutSeq);
11241743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        if (mRequestedWidth != mLastRequestedWidth || mRequestedHeight != mLastRequestedHeight) {
11251743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn            pw.print(prefix); pw.print("LastRequested w="); pw.print(mLastRequestedWidth);
11261743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn                    pw.print(" h="); pw.println(mLastRequestedHeight);
11271743b64d87cee56e51dedbe4ad60fa2acc28af9cDianne Hackborn        }
11286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mAttachedWindow != null || mLayoutAttached) {
11296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mAttachedWindow="); pw.print(mAttachedWindow);
11306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mLayoutAttached="); pw.println(mLayoutAttached);
11316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
11326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mIsImWindow || mIsWallpaper || mIsFloatingLayer) {
11336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mIsImWindow="); pw.print(mIsImWindow);
11346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mIsWallpaper="); pw.print(mIsWallpaper);
11356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mIsFloatingLayer="); pw.print(mIsFloatingLayer);
11366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mWallpaperVisible="); pw.println(mWallpaperVisible);
11376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1138a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1139a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mBaseLayer="); pw.print(mBaseLayer);
1140a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mSubLayer="); pw.print(mSubLayer);
1141a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mAnimLayer="); pw.print(mLayer); pw.print("+");
1142594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.print((mTargetAppToken != null ?
1143594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                            mTargetAppToken.mAppAnimator.animLayerAdjustment
1144594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                          : (mAppToken != null ? mAppToken.mAppAnimator.animLayerAdjustment : 0)));
1145c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner                    pw.print("="); pw.print(mWinAnimator.mAnimLayer);
1146c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner                    pw.print(" mLastLayer="); pw.println(mWinAnimator.mLastLayer);
11476d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn        }
1148a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1149a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mToken="); pw.println(mToken);
1150a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mRootToken="); pw.println(mRootToken);
1151a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mAppToken != null) {
1152a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(prefix); pw.print("mAppToken="); pw.println(mAppToken);
1153a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
1154a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mTargetAppToken != null) {
1155a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(prefix); pw.print("mTargetAppToken="); pw.println(mTargetAppToken);
1156a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
1157a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mViewVisibility=0x");
1158a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(Integer.toHexString(mViewVisibility));
1159a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(" mHaveFrame="); pw.print(mHaveFrame);
1160a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(" mObscured="); pw.println(mObscured);
11619a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            pw.print(prefix); pw.print("mSeq="); pw.print(mSeq);
11629a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            pw.print(" mSystemUiVisibility=0x");
11639a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            pw.println(Integer.toHexString(mSystemUiVisibility));
11646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
11656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!mPolicyVisibility || !mPolicyVisibilityAfterAnim || mAttachedHidden) {
11666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mPolicyVisibility=");
11676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(mPolicyVisibility);
11686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mPolicyVisibilityAfterAnim=");
11696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(mPolicyVisibilityAfterAnim);
11706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mAttachedHidden="); pw.println(mAttachedHidden);
11716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1172b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn        if (!mRelayoutCalled || mLayoutNeeded) {
1173b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn            pw.print(prefix); pw.print("mRelayoutCalled="); pw.print(mRelayoutCalled);
1174b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn                    pw.print(" mLayoutNeeded="); pw.println(mLayoutNeeded);
11756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
11766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mXOffset != 0 || mYOffset != 0) {
11776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("Offsets x="); pw.print(mXOffset);
11786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" y="); pw.println(mYOffset);
11796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1180a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1181a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mGivenContentInsets=");
1182a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mGivenContentInsets.printShortString(pw);
1183a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mGivenVisibleInsets=");
1184a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mGivenVisibleInsets.printShortString(pw);
1185a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
1186a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mTouchableInsets != 0 || mGivenInsetsPending) {
1187a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(prefix); pw.print("mTouchableInsets="); pw.print(mTouchableInsets);
1188a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(" mGivenInsetsPending="); pw.println(mGivenInsetsPending);
1189a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                Region region = new Region();
1190a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                getTouchableRegion(region);
1191a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                pw.print(prefix); pw.print("touchable region="); pw.println(region);
1192a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
1193a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mConfiguration="); pw.println(mConfiguration);
11946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1195c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        pw.print(prefix); pw.print("mHasSurface="); pw.print(mHasSurface);
1196178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                pw.print(" mShownFrame="); mShownFrame.printShortString(pw);
1197178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                pw.print(" isReadyForDisplay()="); pw.println(isReadyForDisplay());
1198a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
1199a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw);
1200a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" last="); mLastFrame.printShortString(pw);
1201a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
120285afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn            pw.print(prefix); pw.print("mSystemDecorRect="); mSystemDecorRect.printShortString(pw);
120385afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                    pw.print(" last="); mLastSystemDecorRect.printShortString(pw);
120485afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                    pw.println();
1205a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
1206ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        if (mEnforceSizeCompat) {
1207ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            pw.print(prefix); pw.print("mCompatFrame="); mCompatFrame.printShortString(pw);
1208ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    pw.println();
1209ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        }
1210a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
12115c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn            pw.print(prefix); pw.print("Frames: containing=");
1212a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mContainingFrame.printShortString(pw);
12135c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.print(" parent="); mParentFrame.printShortString(pw);
12145c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.print(" display="); mDisplayFrame.printShortString(pw);
12155c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.println();
121685afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn            pw.print(prefix); pw.print("    content="); mContentFrame.printShortString(pw);
12175c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.print(" visible="); mVisibleFrame.printShortString(pw);
1218a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
121985afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn            pw.print(prefix); pw.print("Cur insets: content=");
122085afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                    mContentInsets.printShortString(pw);
12215c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.print(" visible="); mVisibleInsets.printShortString(pw);
1222a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
122385afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn            pw.print(prefix); pw.print("Lst insets: content=");
122485afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                    mLastContentInsets.printShortString(pw);
12255c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                    pw.print(" visible="); mLastVisibleInsets.printShortString(pw);
1226a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
1227a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
1228529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print(mWinAnimator); pw.println(":");
1229529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        mWinAnimator.dump(pw, prefix + "  ", dumpAll);
12306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mExiting || mRemoveOnExit || mDestroying || mRemoved) {
12316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mExiting="); pw.print(mExiting);
12326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mRemoveOnExit="); pw.print(mRemoveOnExit);
12336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mDestroying="); pw.print(mDestroying);
12346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mRemoved="); pw.println(mRemoved);
12356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
12366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mOrientationChanging || mAppFreezing || mTurnOnScreen) {
12376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mOrientationChanging=");
12386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(mOrientationChanging);
12396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mAppFreezing="); pw.print(mAppFreezing);
12406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mTurnOnScreen="); pw.println(mTurnOnScreen);
12416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
12426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mHScale != 1 || mVScale != 1) {
12436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mHScale="); pw.print(mHScale);
12446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mVScale="); pw.println(mVScale);
12456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
12466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mWallpaperX != -1 || mWallpaperY != -1) {
12476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mWallpaperX="); pw.print(mWallpaperX);
12486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mWallpaperY="); pw.println(mWallpaperY);
12496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
12506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mWallpaperXStep != -1 || mWallpaperYStep != -1) {
12516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("mWallpaperXStep="); pw.print(mWallpaperXStep);
12526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" mWallpaperYStep="); pw.println(mWallpaperYStep);
12536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
12546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
12556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
12566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    String makeInputChannelName() {
12576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return Integer.toHexString(System.identityHashCode(this))
12586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            + " " + mAttrs.getTitle();
12596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
12606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
12616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    @Override
12626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public String toString() {
12636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mStringNameCache == null || mLastTitle != mAttrs.getTitle()
1264529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                || mWasExiting != mExiting) {
12656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mLastTitle = mAttrs.getTitle();
1266529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            mWasExiting = mExiting;
12676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mStringNameCache = "Window{" + Integer.toHexString(System.identityHashCode(this))
12685fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                    + " u" + UserHandle.getUserId(mSession.mUid)
1269a987d43bc916b6446fe41037d9fcf07e778b3452Craig Mautner                    + " " + mLastTitle + (mExiting ? " EXITING}" : "}");
12706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
12716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mStringNameCache;
12726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1273cef37fb481d16eda2b304887a8738ed599bc1b21satok}
1274