WindowState.java revision ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0
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_APPLICATION_STARTING; 236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; 246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; 256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; 266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.server.wm.WindowManagerService.H; 286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.res.Configuration; 306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Matrix; 316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.PixelFormat; 326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Rect; 33d040edbae968d826aa2c82d382345811a45c646bDianne Hackbornimport android.graphics.RectF; 346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Region; 356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.IBinder; 366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException; 376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog; 386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.Gravity; 396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IApplicationToken; 406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IWindow; 416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.InputChannel; 426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.Surface; 436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.View; 446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.ViewTreeObserver; 456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager; 466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManagerPolicy; 476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager.LayoutParams; 486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.animation.Animation; 496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.animation.Transformation; 506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.io.PrintWriter; 526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.util.ArrayList; 536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/** 556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * A window in the window manager. 566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 57dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautnerfinal class WindowState implements WindowManagerPolicy.WindowState, 58dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner WindowManagerService.StepAnimator { 595fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn static final boolean DEBUG_VISIBILITY = WindowManagerService.DEBUG_VISIBILITY; 605fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn static final boolean SHOW_TRANSACTIONS = WindowManagerService.SHOW_TRANSACTIONS; 6136991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn static final boolean SHOW_LIGHT_TRANSACTIONS = WindowManagerService.SHOW_LIGHT_TRANSACTIONS; 625fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn static final boolean SHOW_SURFACE_ALLOC = WindowManagerService.SHOW_SURFACE_ALLOC; 635fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final WindowManagerService mService; 656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Session mSession; 666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final IWindow mClient; 676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowToken mToken; 686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowToken mRootToken; 696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn AppWindowToken mAppToken; 706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn AppWindowToken mTargetAppToken; 716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final WindowManager.LayoutParams mAttrs = new WindowManager.LayoutParams(); 726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final DeathRecipient mDeathRecipient; 736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final WindowState mAttachedWindow; 746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final ArrayList<WindowState> mChildWindows = new ArrayList<WindowState>(); 756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int mBaseLayer; 766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int mSubLayer; 776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final boolean mLayoutAttached; 786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final boolean mIsImWindow; 796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final boolean mIsWallpaper; 806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final boolean mIsFloatingLayer; 819a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn int mSeq; 825fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn boolean mEnforceSizeCompat; 836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mViewVisibility; 849a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn int mSystemUiVisibility; 856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mPolicyVisibility = true; 866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mPolicyVisibilityAfterAnim = true; 876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mAppFreezing; 886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Surface mSurface; 896d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn Surface mPendingDestroySurface; 906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mReportDestroySurface; 916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mSurfacePendingDestroy; 926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mAttachedHidden; // is our parent window hidden? 936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mLastHidden; // was this window last hidden? 946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mWallpaperVisible; // for wallpaper, what was last vis report? 9583eaab5b43e479c85dc112a1f9b3e53e907bae1fCraig Mautner boolean mWasAnimating; // Were we animating going into the most recent animation step? 96ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn 97ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn /** 98ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn * The window size that was requested by the application. These are in 99ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn * the application's coordinate space (without compatibility scale applied). 100ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn */ 1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mRequestedWidth; 1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mRequestedHeight; 103ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn 1046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mLayer; 1056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mAnimLayer; 1066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mLastLayer; 1076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mHaveFrame; 1086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mObscured; 1096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mTurnOnScreen; 1106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mLayoutSeq = -1; 1126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Configuration mConfiguration = null; 1146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 115ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn /** 116ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn * Actual frame shown on-screen (may be modified by animation). These 117ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn * are in the screen's coordinate space (WITH the compatibility scale 118ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn * applied). 119ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn */ 120d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn final RectF mShownFrame = new RectF(); 1216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 1236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Set when we have changed the size of the surface, to know that 1246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * we must tell them application to resize (and thus redraw itself). 1256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mSurfaceResized; 1276d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 1286d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn /** 1296d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn * Set if the client has asked that the destroy of its surface be delayed 1306d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn * until it explicitly says it is okay. 1316d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn */ 1326d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn boolean mSurfaceDestroyDeferred; 1336d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 1346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 135ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn * Insets that determine the actually visible area. These are in the application's 136ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn * coordinate space (without compatibility scale applied). 1376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 1386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mVisibleInsets = new Rect(); 1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mLastVisibleInsets = new Rect(); 1406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mVisibleInsetsChanged; 1416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 143ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn * Insets that are covered by system windows. These are in the application's 144ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn * coordinate space (without compatibility scale applied). 1456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 1466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mContentInsets = new Rect(); 1476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mLastContentInsets = new Rect(); 1486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mContentInsetsChanged; 1496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 1516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Set to true if we are waiting for this window to receive its 1526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * given internal insets before laying out other windows based on it. 1536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 1546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mGivenInsetsPending; 1556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 1576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * These are the content insets that were given during layout for 1586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * this window, to be applied to windows behind it. 1596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 1606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mGivenContentInsets = new Rect(); 1616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 1636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * These are the visible insets that were given during layout for 1646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * this window, to be applied to windows behind it. 1656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 1666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mGivenVisibleInsets = new Rect(); 1676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 1696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * This is the given touchable area relative to the window frame, or null if none. 1706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 1716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Region mGivenTouchableRegion = new Region(); 1726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 1746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Flag indicating whether the touchable region should be adjusted by 1756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * the visible insets; if false the area outside the visible insets is 1766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * NOT touchable, so we must use those to adjust the frame during hit 1776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * tests. 1786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 1796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mTouchableInsets = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; 1806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Current transformation being applied. 1826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mHaveMatrix; 183e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn float mGlobalScale=1; 184ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn float mInvGlobalScale=1; 1856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mDsDx=1, mDtDx=0, mDsDy=0, mDtDy=1; 1866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1; 1876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mHScale=1, mVScale=1; 1886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mLastHScale=1, mLastVScale=1; 1896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Matrix mTmpMatrix = new Matrix(); 1906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 191ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn // "Real" frame that the application sees, in display coordinate space. 1926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mFrame = new Rect(); 1936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mLastFrame = new Rect(); 194ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn // Frame that is scaled to the application's coordinate space when in 195ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn // screen size compatibility mode. 196ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn final Rect mCompatFrame = new Rect(); 1976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mContainingFrame = new Rect(); 1996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mDisplayFrame = new Rect(); 2006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mContentFrame = new Rect(); 2016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mParentFrame = new Rect(); 2026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect mVisibleFrame = new Rect(); 2036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mContentChanged; 2056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mShownAlpha = 1; 2076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mAlpha = 1; 2086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mLastAlpha = 1; 2096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Set to true if, when the window gets displayed, it should perform 2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // an enter animation. 2126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mEnterAnimationPending; 2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Currently running animation. 2156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mAnimating; 2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mLocalAnimating; 2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Animation mAnimation; 2186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mAnimationIsEntrance; 2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mHasTransformation; 2206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mHasLocalTransformation; 2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Transformation mTransformation = new Transformation(); 2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // If a window showing a wallpaper: the requested offset for the 2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // wallpaper; if a wallpaper window: the currently applied offset. 2256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mWallpaperX = -1; 2266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mWallpaperY = -1; 2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // If a window showing a wallpaper: what fraction of the offset 2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // range corresponds to a full virtual screen. 2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mWallpaperXStep = -1; 2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mWallpaperYStep = -1; 2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Wallpaper windows: pixels offset based on above variables. 2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mXOffset; 2356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mYOffset; 2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This is set after IWindowSession.relayout() has been called at 2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // least once for the window. It allows us to detect the situation 2396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // where we don't yet have a surface, but should have one soon, so 2406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // we can give the window focus before waiting for the relayout. 2416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mRelayoutCalled; 2426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 243b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn // If the application has called relayout() with changes that can 244b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn // impact its window's size, we need to perform a layout pass on it 245b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn // even if it is not currently visible for layout. This is set 246b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn // when in that case until the layout is done. 247b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn boolean mLayoutNeeded; 248b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn 2496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This is set after the Surface has been created but before the 2506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // window has been drawn. During this time the surface is hidden. 2516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mDrawPending; 2526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This is set after the window has finished drawing for the first 2546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // time but before its surface is shown. The surface will be 2556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // displayed when the next layout is run. 2566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mCommitDrawPending; 2576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This is set during the time after the window's drawing has been 2596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // committed, and before its surface is actually shown. It is used 2606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // to delay showing the surface until all windows in a token are ready 2616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // to be shown. 2626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mReadyToShow; 2636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Set when the window has been shown in the screen the first time. 2656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mHasDrawn; 2666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Currently running an exit animation? 2686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mExiting; 2696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Currently on the mDestroySurface list? 2716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mDestroying; 2726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Completely remove from window manager after exit animation? 2746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mRemoveOnExit; 2756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Set when the orientation is changing and this window has not yet 2776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // been updated for the new orientation. 2786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mOrientationChanging; 2796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Is this window now (or just being) removed? 2816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mRemoved; 2826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Temp for keeping track of windows that have been removed when 2846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // rebuilding window list. 2856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mRebuilding; 2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // For debugging, this is the last information given to the surface flinger. 2886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mSurfaceShown; 289d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn float mSurfaceX, mSurfaceY, mSurfaceW, mSurfaceH; 2906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mSurfaceLayer; 2916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mSurfaceAlpha; 2926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Input channel and input window handle used by the input dispatcher. 2949302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown final InputWindowHandle mInputWindowHandle; 2956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn InputChannel mInputChannel; 2966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Used to improve performance of toString() 2986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn String mStringNameCache; 2996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn CharSequence mLastTitle; 3006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mWasPaused; 3016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3022f995a7eaa1aba2c038c698039ed6837dfe7e51eCraig Mautner // Used to save animation distances between the time they are calculated and when they are 3032f995a7eaa1aba2c038c698039ed6837dfe7e51eCraig Mautner // used. 3042f995a7eaa1aba2c038c698039ed6837dfe7e51eCraig Mautner int mAnimDw; 3052f995a7eaa1aba2c038c698039ed6837dfe7e51eCraig Mautner int mAnimDh; 3062f995a7eaa1aba2c038c698039ed6837dfe7e51eCraig Mautner 307ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner static final int ANIM_STATE_IDLE = 0; 308ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner static final int ANIM_STATE_RUNNING = 1; 309ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner static final int ANIM_STATE_STOPPING = 2; 310ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner int mAnimState = ANIM_STATE_IDLE; 311ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner 3126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token, 3139a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn WindowState attachedWindow, int seq, WindowManager.LayoutParams a, 3146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int viewVisibility) { 3156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService = service; 3166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSession = s; 3176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mClient = c; 3186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mToken = token; 3196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAttrs.copyFrom(a); 3206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mViewVisibility = viewVisibility; 3216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn DeathRecipient deathRecipient = new DeathRecipient(); 3226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAlpha = a.alpha; 3239a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn mSeq = seq; 324e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mEnforceSizeCompat = (mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0; 3256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.localLOGV) Slog.v( 3266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "Window " + this + " client=" + c.asBinder() 3276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " token=" + token + " (" + mAttrs.token + ")"); 3286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 3296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn c.asBinder().linkToDeath(deathRecipient, 0); 3306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RemoteException e) { 3316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDeathRecipient = null; 3326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAttachedWindow = null; 3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLayoutAttached = false; 3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mIsImWindow = false; 3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mIsWallpaper = false; 3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mIsFloatingLayer = false; 3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mBaseLayer = 0; 3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSubLayer = 0; 3399302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputWindowHandle = null; 3406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 3416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDeathRecipient = deathRecipient; 3436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if ((mAttrs.type >= FIRST_SUB_WINDOW && 3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAttrs.type <= LAST_SUB_WINDOW)) { 3466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // The multiplier here is to reserve space for multiple 3476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // windows in the same type layer. 3486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mBaseLayer = mService.mPolicy.windowTypeToLayerLw( 3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn attachedWindow.mAttrs.type) * WindowManagerService.TYPE_LAYER_MULTIPLIER 3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + WindowManagerService.TYPE_LAYER_OFFSET; 3516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSubLayer = mService.mPolicy.subWindowTypeToLayerLw(a.type); 3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAttachedWindow = attachedWindow; 3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(WindowManagerService.TAG, "Adding " + this + " to " + mAttachedWindow); 3546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAttachedWindow.mChildWindows.add(this); 3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLayoutAttached = mAttrs.type != 3566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; 3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mIsImWindow = attachedWindow.mAttrs.type == TYPE_INPUT_METHOD 3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || attachedWindow.mAttrs.type == TYPE_INPUT_METHOD_DIALOG; 3596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mIsWallpaper = attachedWindow.mAttrs.type == TYPE_WALLPAPER; 3606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mIsFloatingLayer = mIsImWindow || mIsWallpaper; 3616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else { 3626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // The multiplier here is to reserve space for multiple 3636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // windows in the same type layer. 3646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mBaseLayer = mService.mPolicy.windowTypeToLayerLw(a.type) 3656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * WindowManagerService.TYPE_LAYER_MULTIPLIER 3666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + WindowManagerService.TYPE_LAYER_OFFSET; 3676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSubLayer = 0; 3686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAttachedWindow = null; 3696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLayoutAttached = false; 3706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mIsImWindow = mAttrs.type == TYPE_INPUT_METHOD 3716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || mAttrs.type == TYPE_INPUT_METHOD_DIALOG; 3726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mIsWallpaper = mAttrs.type == TYPE_WALLPAPER; 3736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mIsFloatingLayer = mIsImWindow || mIsWallpaper; 3746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState appWin = this; 3776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn while (appWin.mAttachedWindow != null) { 3786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn appWin = mAttachedWindow; 3796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowToken appToken = appWin.mToken; 3816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn while (appToken.appWindowToken == null) { 3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowToken parent = mService.mTokenMap.get(appToken.token); 3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (parent == null || appToken == parent) { 3846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 3856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn appToken = parent; 3876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mRootToken = appToken; 3896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAppToken = appToken.appWindowToken; 3906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurface = null; 3926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mRequestedWidth = 0; 3936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mRequestedHeight = 0; 3946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mXOffset = 0; 3956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mYOffset = 0; 3966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLayer = 0; 3976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimLayer = 0; 3986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLastLayer = 0; 3996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputWindowHandle = new InputWindowHandle( 4006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAppToken != null ? mAppToken.mInputApplicationHandle : null, this); 4016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void attach() { 4046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.localLOGV) Slog.v( 4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "Attaching " + this + " token=" + mToken 4066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ", list=" + mToken.windows); 4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSession.windowAddedLocked(); 4086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void computeFrameLw(Rect pf, Rect df, Rect cf, Rect vf) { 4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mHaveFrame = true; 4126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect container = mContainingFrame; 4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn container.set(pf); 4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect display = mDisplayFrame; 4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn display.set(df); 4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int pw = container.right - container.left; 4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int ph = container.bottom - container.top; 4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int w,h; 423ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if ((mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0) { 424ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (mAttrs.width < 0) { 425ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w = pw; 426ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } else if (mEnforceSizeCompat) { 427ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w = (int)(mAttrs.width * mGlobalScale + .5f); 428ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } else { 429ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w = mAttrs.width; 430ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } 431ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (mAttrs.height < 0) { 432ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn h = ph; 433ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } else if (mEnforceSizeCompat) { 434ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn h = (int)(mAttrs.height * mGlobalScale + .5f); 435ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } else { 436ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn h = mAttrs.height; 437ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } 4386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else { 439ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (mAttrs.width == WindowManager.LayoutParams.MATCH_PARENT) { 440ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w = pw; 441ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } else if (mEnforceSizeCompat) { 442ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w = (int)(mRequestedWidth * mGlobalScale + .5f); 443ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } else { 444ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w = mRequestedWidth; 445ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } 446ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (mAttrs.height == WindowManager.LayoutParams.MATCH_PARENT) { 447ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn h = ph; 448ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } else if (mEnforceSizeCompat) { 449ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn h = (int)(mRequestedHeight * mGlobalScale + .5f); 450ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } else { 451ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn h = mRequestedHeight; 452ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } 4536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mParentFrame.equals(pf)) { 4566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn //Slog.i(TAG, "Window " + this + " content frame from " + mParentFrame 4576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // + " to " + pf); 4586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mParentFrame.set(pf); 4596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mContentChanged = true; 4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect content = mContentFrame; 4636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn content.set(cf); 4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect visible = mVisibleFrame; 4666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn visible.set(vf); 4676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect frame = mFrame; 4696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int fw = frame.width(); 4706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int fh = frame.height(); 4716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn //System.out.println("In: w=" + w + " h=" + h + " container=" + 4736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // container + " x=" + mAttrs.x + " y=" + mAttrs.y); 4746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 475ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn float x, y; 476ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (mEnforceSizeCompat) { 477ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn x = mAttrs.x * mGlobalScale; 478ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn y = mAttrs.y * mGlobalScale; 479ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } else { 480ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn x = mAttrs.x; 481ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn y = mAttrs.y; 482ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } 483ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn 4846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Gravity.apply(mAttrs.gravity, w, h, container, 485ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn (int) (x + mAttrs.horizontalMargin * pw), 486ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn (int) (y + mAttrs.verticalMargin * ph), frame); 4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn //System.out.println("Out: " + mFrame); 4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Now make sure the window fits in the overall display. 4916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Gravity.applyDisplay(mAttrs.gravity, df, frame); 4926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Make sure the content and visible frames are inside of the 4946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // final window frame. 4956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (content.left < frame.left) content.left = frame.left; 4966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (content.top < frame.top) content.top = frame.top; 4976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (content.right > frame.right) content.right = frame.right; 4986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (content.bottom > frame.bottom) content.bottom = frame.bottom; 4996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (visible.left < frame.left) visible.left = frame.left; 5006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (visible.top < frame.top) visible.top = frame.top; 5016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (visible.right > frame.right) visible.right = frame.right; 5026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (visible.bottom > frame.bottom) visible.bottom = frame.bottom; 5036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect contentInsets = mContentInsets; 5056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn contentInsets.left = content.left-frame.left; 5066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn contentInsets.top = content.top-frame.top; 5076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn contentInsets.right = frame.right-content.right; 5086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn contentInsets.bottom = frame.bottom-content.bottom; 5096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect visibleInsets = mVisibleInsets; 5116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn visibleInsets.left = visible.left-frame.left; 5126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn visibleInsets.top = visible.top-frame.top; 5136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn visibleInsets.right = frame.right-visible.right; 5146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn visibleInsets.bottom = frame.bottom-visible.bottom; 5156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 516ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn mCompatFrame.set(frame); 517e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (mEnforceSizeCompat) { 518ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn // If there is a size compatibility scale being applied to the 519ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn // window, we need to apply this to its insets so that they are 520ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn // reported to the app in its coordinate space. 521ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn contentInsets.scale(mInvGlobalScale); 522ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn visibleInsets.scale(mInvGlobalScale); 523ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn 524ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn // Also the scaled frame that we report to the app needs to be 525ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn // adjusted to be in its coordinate space. 526ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn mCompatFrame.scale(mInvGlobalScale); 527e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 528e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 5296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mIsWallpaper && (fw != frame.width() || fh != frame.height())) { 530bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mService.updateWallpaperOffsetLocked(this, 531bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mService.mAppDisplayWidth, mService.mAppDisplayHeight, false); 5326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.localLOGV) { 5356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn //if ("com.google.android.youtube".equals(mAttrs.packageName) 5366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // && mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) { 5376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Resolving (mRequestedWidth=" 5386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mRequestedWidth + ", mRequestedheight=" 5396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mRequestedHeight + ") to" + " (pw=" + pw + ", ph=" + ph 5406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + "): frame=" + mFrame.toShortString() 5416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " ci=" + contentInsets.toShortString() 5426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " vi=" + visibleInsets.toShortString()); 5436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn //} 5446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public Rect getFrameLw() { 5486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mFrame; 5496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 551d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn public RectF getShownFrameLw() { 5526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mShownFrame; 5536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public Rect getDisplayFrameLw() { 5566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mDisplayFrame; 5576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public Rect getContentFrameLw() { 5606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mContentFrame; 5616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public Rect getVisibleFrameLw() { 5646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mVisibleFrame; 5656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean getGivenInsetsPendingLw() { 5686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mGivenInsetsPending; 5696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public Rect getGivenContentInsetsLw() { 5726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mGivenContentInsets; 5736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public Rect getGivenVisibleInsetsLw() { 5766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mGivenVisibleInsets; 5776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public WindowManager.LayoutParams getAttrs() { 5806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mAttrs; 5816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 58373ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn public boolean getNeedsMenuLw(WindowManagerPolicy.WindowState bottom) { 58473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn int index = -1; 58573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn WindowState ws = this; 58673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn while (true) { 58773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn if ((ws.mAttrs.privateFlags 58873ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn & WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY) != 0) { 58973ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn return (ws.mAttrs.flags & WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0; 59073ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn } 59173ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn // If we reached the bottom of the range of windows we are considering, 59273ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn // assume no menu is needed. 59373ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn if (ws == bottom) { 59473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn return false; 59573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn } 59673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn // The current window hasn't specified whether menu key is needed; 59773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn // look behind it. 59873ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn // First, we may need to determine the starting position. 59973ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn if (index < 0) { 60073ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn index = mService.mWindows.indexOf(ws); 60173ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn } 60273ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn index--; 60373ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn if (index < 0) { 60473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn return false; 60573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn } 60673ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn ws = mService.mWindows.get(index); 60773ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn } 60873ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn } 60973ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn 6109a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn public int getSystemUiVisibility() { 6119a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn return mSystemUiVisibility; 6129a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn } 6139a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn 6146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public int getSurfaceLayer() { 6156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mLayer; 6166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 6176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 6186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public IApplicationToken getAppToken() { 6196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mAppToken != null ? mAppToken.appToken : null; 6206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 6216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 6226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public long getInputDispatchingTimeoutNanos() { 6236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mAppToken != null 6246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn ? mAppToken.inputDispatchingTimeoutNanos 6256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn : WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; 6266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 6276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 6286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean hasAppShownWindows() { 6296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mAppToken != null ? mAppToken.firstWindowDrawn : false; 6306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 6316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 6326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setAnimation(Animation anim) { 6336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.localLOGV) Slog.v( 6346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "Setting animation in " + this + ": " + anim); 6356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimating = false; 6366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLocalAnimating = false; 6376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation = anim; 6386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION); 6396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation.scaleCurrentDuration(mService.mWindowAnimationScale); 6406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 6416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 6426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void clearAnimation() { 6436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAnimation != null) { 6446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimating = true; 6456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLocalAnimating = false; 6466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation.cancel(); 6476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation = null; 648ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner mAnimState = ANIM_STATE_IDLE; 6496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 6506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 6516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 652cef37fb481d16eda2b304887a8738ed599bc1b21satok // TODO: Fix and call finishExit() instead of cancelExitAnimationForNextAnimationLocked() 653cef37fb481d16eda2b304887a8738ed599bc1b21satok // for avoiding the code duplication. 654cef37fb481d16eda2b304887a8738ed599bc1b21satok void cancelExitAnimationForNextAnimationLocked() { 655cef37fb481d16eda2b304887a8738ed599bc1b21satok if (!mExiting) return; 656cef37fb481d16eda2b304887a8738ed599bc1b21satok if (mAnimation != null) { 657cef37fb481d16eda2b304887a8738ed599bc1b21satok mAnimation.cancel(); 658cef37fb481d16eda2b304887a8738ed599bc1b21satok mAnimation = null; 659cef37fb481d16eda2b304887a8738ed599bc1b21satok destroySurfaceLocked(); 660ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner mAnimState = ANIM_STATE_IDLE; 661cef37fb481d16eda2b304887a8738ed599bc1b21satok } 662cef37fb481d16eda2b304887a8738ed599bc1b21satok mExiting = false; 663cef37fb481d16eda2b304887a8738ed599bc1b21satok } 664cef37fb481d16eda2b304887a8738ed599bc1b21satok 6656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Surface createSurfaceLocked() { 6666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mSurface == null) { 6676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mReportDestroySurface = false; 6686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfacePendingDestroy = false; 669e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(WindowManagerService.TAG, 670e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn "createSurface " + this + ": DRAW NOW PENDING"); 6716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDrawPending = true; 6726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mCommitDrawPending = false; 6736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mReadyToShow = false; 6746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAppToken != null) { 6756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAppToken.allDrawn = false; 6766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 6776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 6783ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn mService.makeWindowFreezingScreenIfNeededLocked(this); 6793ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn 6806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int flags = 0; 6816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 6826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if ((mAttrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) { 6836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn flags |= Surface.SECURE; 6846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 6855fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (DEBUG_VISIBILITY) Slog.v( 6866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "Creating surface in session " 6876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mSession.mSurfaceSession + " window " + this 688ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn + " w=" + mCompatFrame.width() 689ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn + " h=" + mCompatFrame.height() + " format=" 6906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mAttrs.format + " flags=" + flags); 6916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 692ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn int w = mCompatFrame.width(); 693ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn int h = mCompatFrame.height(); 6946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if ((mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { 6956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // for a scaled surface, we always want the requested 6966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // size. 6976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn w = mRequestedWidth; 6986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn h = mRequestedHeight; 6996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 7006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 7016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Something is wrong and SurfaceFlinger will not like this, 7026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // try to revert to sane values 7036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (w <= 0) w = 1; 7046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (h <= 0) h = 1; 7056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 7066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceShown = false; 7076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceLayer = 0; 7086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceAlpha = 1; 7096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceX = 0; 7106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceY = 0; 7116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceW = w; 7126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceH = h; 7136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 7146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final boolean isHwAccelerated = (mAttrs.flags & 7156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0; 7166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : mAttrs.format; 7174941dea00a3167addf14ac6bb962cf5bc3590466Romain Guy if (!PixelFormat.formatHasAlpha(mAttrs.format)) { 7186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn flags |= Surface.OPAQUE; 7196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 7206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurface = new Surface( 7216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSession.mSurfaceSession, mSession.mPid, 7226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAttrs.getTitle().toString(), 7236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 0, w, h, format, flags); 7245fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(WindowManagerService.TAG, 7255fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn " CREATE SURFACE " 7266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mSurface + " IN SESSION " 7276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mSession.mSurfaceSession 7286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ": pid=" + mSession.mPid + " format=" 7296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mAttrs.format + " flags=0x" 7306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + Integer.toHexString(flags) 7316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " / " + this); 7326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (Surface.OutOfResourcesException e) { 7336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "OutOfResourcesException creating surface"); 734648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn mService.reclaimSomeSurfaceMemoryLocked(this, "create", true); 7356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return null; 7366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (Exception e) { 7376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.e(WindowManagerService.TAG, "Exception creating surface", e); 7386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return null; 7396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 7406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 7416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.localLOGV) Slog.v( 7426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "Got surface: " + mSurface 7436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ", set left=" + mFrame.left + " top=" + mFrame.top 7446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ", animLayer=" + mAnimLayer); 74536991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) { 7466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.i(WindowManagerService.TAG, ">>> OPEN TRANSACTION createSurfaceLocked"); 747ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn WindowManagerService.logSurface(this, "CREATE pos=(" + mFrame.left 748ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn + "," + mFrame.top + ") (" + 749ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn mCompatFrame.width() + "x" + mCompatFrame.height() + "), layer=" + 7506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimLayer + " HIDE", null); 7516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 7526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Surface.openTransaction(); 7536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 7546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 7556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceX = mFrame.left + mXOffset; 7566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceY = mFrame.top + mYOffset; 7576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurface.setPosition(mSurfaceX, mSurfaceY); 7586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceLayer = mAnimLayer; 7596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurface.setLayer(mAnimLayer); 7606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceShown = false; 7616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurface.hide(); 7626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if ((mAttrs.flags&WindowManager.LayoutParams.FLAG_DITHER) != 0) { 7635fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(this, "DITHER", null); 7646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurface.setFlags(Surface.SURFACE_DITHER, 7656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Surface.SURFACE_DITHER); 7666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 7676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RuntimeException e) { 7686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "Error creating surface in " + w, e); 769648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn mService.reclaimSomeSurfaceMemoryLocked(this, "create-init", true); 7706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 7716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLastHidden = true; 7726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } finally { 7736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Surface.closeTransaction(); 77436991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(WindowManagerService.TAG, 77536991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn "<<< CLOSE TRANSACTION createSurfaceLocked"); 7766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 7776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.localLOGV) Slog.v( 7786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "Created surface " + this); 7796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 7806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mSurface; 7816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 7826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 7836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void destroySurfaceLocked() { 7846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAppToken != null && this == mAppToken.startingWindow) { 7856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAppToken.startingDisplayed = false; 7866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 7876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 7886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mSurface != null) { 7896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDrawPending = false; 7906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mCommitDrawPending = false; 7916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mReadyToShow = false; 7926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 7936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int i = mChildWindows.size(); 7946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn while (i > 0) { 7956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn i--; 7966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState c = mChildWindows.get(i); 7976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn c.mAttachedHidden = true; 7986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 7996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 8006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mReportDestroySurface) { 8016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mReportDestroySurface = false; 8026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfacePendingDestroy = true; 8036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 8046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mClient.dispatchGetNewSurface(); 8056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // We'll really destroy on the next time around. 8066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 8076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RemoteException e) { 8086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 8116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 8125fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (DEBUG_VISIBILITY) { 8136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn RuntimeException e = null; 8146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!WindowManagerService.HIDE_STACK_CRAWLS) { 8156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn e = new RuntimeException(); 8166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn e.fillInStackTrace(); 8176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "Window " + this + " destroying surface " 8196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mSurface + ", session " + mSession, e); 8206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8216d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (mSurfaceDestroyDeferred) { 8226d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (mSurface != null && mPendingDestroySurface != mSurface) { 8236d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (mPendingDestroySurface != null) { 8246d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 8256d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn RuntimeException e = null; 8266d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (!WindowManagerService.HIDE_STACK_CRAWLS) { 8276d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn e = new RuntimeException(); 8286d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn e.fillInStackTrace(); 8296d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 8306d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn WindowManagerService.logSurface(this, "DESTROY PENDING", e); 8316d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 8326d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mPendingDestroySurface.destroy(); 8336d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 8346d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mPendingDestroySurface = mSurface; 8356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8366d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } else { 8376d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 8386d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn RuntimeException e = null; 8396d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (!WindowManagerService.HIDE_STACK_CRAWLS) { 8406d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn e = new RuntimeException(); 8416d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn e.fillInStackTrace(); 8426d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 8436d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn WindowManagerService.logSurface(this, "DESTROY", e); 8446d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 8456d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mSurface.destroy(); 8466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RuntimeException e) { 8486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "Exception thrown when destroying Window " + this 8496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " surface " + mSurface + " session " + mSession 8506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ": " + e.toString()); 8516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 8536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceShown = false; 8546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurface = null; 8556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 8586d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn void destroyDeferredSurfaceLocked() { 8596d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn try { 8606d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (mPendingDestroySurface != null) { 8616d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 8626d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn RuntimeException e = null; 8636d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (!WindowManagerService.HIDE_STACK_CRAWLS) { 8646d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn e = new RuntimeException(); 8656d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn e.fillInStackTrace(); 8666d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 8676d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mService.logSurface(this, "DESTROY PENDING", e); 8686d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 8696d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mPendingDestroySurface.destroy(); 8706d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 8716d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } catch (RuntimeException e) { 8726d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn Slog.w(WindowManagerService.TAG, "Exception thrown when destroying Window " 8736d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn + this + " surface " + mPendingDestroySurface 8746d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn + " session " + mSession + ": " + e.toString()); 8756d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 8766d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mSurfaceDestroyDeferred = false; 8776d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mPendingDestroySurface = null; 8786d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 8796d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 8806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean finishDrawingLocked() { 8816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mDrawPending) { 8825fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (SHOW_TRANSACTIONS || WindowManagerService.DEBUG_ORIENTATION) Slog.v( 8833ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn WindowManagerService.TAG, "finishDrawingLocked: " + this + " in " + mSurface); 8846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mCommitDrawPending = true; 8856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDrawPending = false; 8866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return true; 8876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 8896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 8916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This must be called while inside a transaction. 8926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean commitFinishDrawingLocked(long currentTime) { 8936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn //Slog.i(TAG, "commitFinishDrawingLocked: " + mSurface); 8946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mCommitDrawPending) { 8956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 8966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 8976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mCommitDrawPending = false; 8986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mReadyToShow = true; 8996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final boolean starting = mAttrs.type == TYPE_APPLICATION_STARTING; 9006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final AppWindowToken atoken = mAppToken; 9016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (atoken == null || atoken.allDrawn || starting) { 9026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn performShowLocked(); 9036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return true; 9056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 9076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This must be called while inside a transaction. 9086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean performShowLocked() { 9095fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (DEBUG_VISIBILITY) { 9106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn RuntimeException e = null; 9116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!WindowManagerService.HIDE_STACK_CRAWLS) { 9126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn e = new RuntimeException(); 9136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn e.fillInStackTrace(); 9146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "performShow on " + this 9166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ": readyToShow=" + mReadyToShow + " readyForDisplay=" + isReadyForDisplay() 9176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " starting=" + (mAttrs.type == TYPE_APPLICATION_STARTING), e); 9186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mReadyToShow && isReadyForDisplay()) { 9205fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (SHOW_TRANSACTIONS || WindowManagerService.DEBUG_ORIENTATION) WindowManagerService.logSurface(this, 9216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn "SHOW (performShowLocked)", null); 9225fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, "Showing " + this 9236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " during animation: policyVis=" + mPolicyVisibility 9246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " attHidden=" + mAttachedHidden 9256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " tok.hiddenRequested=" 9266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + (mAppToken != null ? mAppToken.hiddenRequested : false) 9276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " tok.hidden=" 9286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + (mAppToken != null ? mAppToken.hidden : false) 9296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " animating=" + mAnimating 9306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " tok animating=" 9316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + (mAppToken != null ? mAppToken.animating : false)); 9326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mService.showSurfaceRobustlyLocked(this)) { 9336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 9346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLastAlpha = -1; 9366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mHasDrawn = true; 9376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLastHidden = false; 9386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mReadyToShow = false; 9396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.enableScreenIfNeededLocked(); 9406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 9416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.applyEnterAnimationLocked(this); 9426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 9436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int i = mChildWindows.size(); 9446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn while (i > 0) { 9456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn i--; 9466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState c = mChildWindows.get(i); 9476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (c.mAttachedHidden) { 9486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn c.mAttachedHidden = false; 9496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (c.mSurface != null) { 9506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn c.performShowLocked(); 9516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // It hadn't been shown, which means layout not 9526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // performed on it, so now we want to make sure to 9536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // do a layout. If called from within the transaction 9546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // loop, this will cause it to restart with a new 9556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // layout. 9566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mLayoutNeeded = true; 9576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 9616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAttrs.type != TYPE_APPLICATION_STARTING 9626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && mAppToken != null) { 9636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAppToken.firstWindowDrawn = true; 9646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 9656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAppToken.startingData != null) { 9666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_STARTING_WINDOW || WindowManagerService.DEBUG_ANIM) Slog.v(WindowManagerService.TAG, 9676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn "Finish starting " + mToken 9686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ": first real window is shown, no animation"); 9696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // If this initial window is animating, stop it -- we 9706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // will do an animation to reveal it from behind the 9716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // starting window, so there is no need for it to also 9726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // be doing its own stuff. 9736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAnimation != null) { 9746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation.cancel(); 9756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation = null; 9766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Make sure we clean up the animation. 9776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimating = true; 978ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner mAnimState = ANIM_STATE_IDLE; 9796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mFinishedStarting.add(mAppToken); 9816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mH.sendEmptyMessage(H.FINISHED_STARTING); 9826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAppToken.updateReportedVisibilityLocked(); 9846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return true; 9876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 9886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 989dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner @Override 990dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner public boolean stepAnimation(long currentTime) { 991ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner if ((mAnimation == null) || !mLocalAnimating || (mAnimState != ANIM_STATE_RUNNING)) { 992dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner return false; 993dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner } 994dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner mTransformation.clear(); 995dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner final boolean more = mAnimation.getTransformation(currentTime, mTransformation); 996dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v( 997dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner WindowManagerService.TAG, "Stepped animation in " + this + 998dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner ": more=" + more + ", xform=" + mTransformation); 999dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner if (!more) { 1000ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner mAnimState = ANIM_STATE_STOPPING; 1001dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner } 1002dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner return more; 1003dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner } 1004dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner 10056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This must be called while inside a transaction. Returns true if 10066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // there is more animation to run. 1007dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner boolean startAndFinishAnimationLocked(long currentTime) { 100883eaab5b43e479c85dc112a1f9b3e53e907bae1fCraig Mautner // Save the animation state as it was before this step so WindowManagerService can tell if 100983eaab5b43e479c85dc112a1f9b3e53e907bae1fCraig Mautner // we just started or just stopped animating by comparing mWasAnimating with isAnimating(). 1010343511c9ec6a7a1d3760f784824a64e732f3b7a2Craig Mautner mWasAnimating = mAnimating; 1011bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (!mService.mDisplayFrozen && mService.mPolicy.isScreenOnFully()) { 10126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // We will run animations as long as the display isn't frozen. 10136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 10146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mDrawPending && !mCommitDrawPending && mAnimation != null) { 10156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mHasTransformation = true; 10166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mHasLocalTransformation = true; 10176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mLocalAnimating) { 10186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_ANIM) Slog.v( 10196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "Starting animation in " + this + 1020ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn " @ " + currentTime + ": ww=" + mFrame.width() + 1021ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn " wh=" + mFrame.height() + 10222f995a7eaa1aba2c038c698039ed6837dfe7e51eCraig Mautner " dw=" + mAnimDw + " dh=" + mAnimDh + 10232f995a7eaa1aba2c038c698039ed6837dfe7e51eCraig Mautner " scale=" + mService.mWindowAnimationScale); 10242f995a7eaa1aba2c038c698039ed6837dfe7e51eCraig Mautner mAnimation.initialize(mFrame.width(), mFrame.height(), mAnimDw, mAnimDh); 10256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation.setStartTime(currentTime); 10266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLocalAnimating = true; 10276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimating = true; 1028ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner mAnimState = ANIM_STATE_RUNNING; 10296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1030ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner if ((mAnimation != null) && mLocalAnimating && 1031ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner (mAnimState != ANIM_STATE_STOPPING)) { 10326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return true; 10336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 10346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_ANIM) Slog.v( 10356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "Finished animation in " + this + 10366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn " @ " + currentTime); 10376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn //WindowManagerService.this.dump(); 10386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 10396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mHasLocalTransformation = false; 10406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if ((!mLocalAnimating || mAnimationIsEntrance) && mAppToken != null 10416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && mAppToken.animation != null) { 10426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // When our app token is animating, we kind-of pretend like 10436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // we are as well. Note the mLocalAnimating mAnimationIsEntrance 10446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // part of this check means that we will only do this if 10456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // our window is not currently exiting, or it is not 10466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // locally animating itself. The idea being that one that 10476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // is exiting and doing a local animation should be removed 10486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // once that animation is done. 10496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimating = true; 10506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mHasTransformation = true; 10516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mTransformation.clear(); 10526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 10536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else if (mHasTransformation) { 10546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Little trick to get through the path below to act like 10556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // we have finished an animation. 10566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimating = true; 10576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else if (isAnimating()) { 10586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimating = true; 10596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 10606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else if (mAnimation != null) { 10616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // If the display is frozen, and there is a pending animation, 10626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // clear it and make sure we run the cleanup code. 10636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimating = true; 10646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLocalAnimating = true; 10656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation.cancel(); 10666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation = null; 10676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 10686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 10696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mAnimating && !mLocalAnimating) { 10706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 10716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 10726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 10736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_ANIM) Slog.v( 10746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "Animation done in " + this + ": exiting=" + mExiting 10756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ", reportedVisible=" 10766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + (mAppToken != null ? mAppToken.reportedVisible : false)); 10776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 10786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimating = false; 10796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLocalAnimating = false; 10806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAnimation != null) { 10816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation.cancel(); 10826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimation = null; 10836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 10846d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (mService.mWindowDetachedWallpaper == this) { 10856d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mService.mWindowDetachedWallpaper = null; 10866d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 10876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimLayer = mLayer; 10886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mIsImWindow) { 10896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimLayer += mService.mInputMethodAnimLayerAdjustment; 10906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else if (mIsWallpaper) { 10916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAnimLayer += mService.mWallpaperAnimLayerAdjustment; 10926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 10936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_LAYERS) Slog.v(WindowManagerService.TAG, "Stepping win " + this 10946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " anim layer: " + mAnimLayer); 10956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mHasTransformation = false; 10966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mHasLocalTransformation = false; 10976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mPolicyVisibility != mPolicyVisibilityAfterAnim) { 10985fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (DEBUG_VISIBILITY) { 10996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Policy visibility changing after anim in " + this + ": " 11006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mPolicyVisibilityAfterAnim); 11016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mPolicyVisibility = mPolicyVisibilityAfterAnim; 1103f809870f118663055dc0f8b626204e7bb1133fb5Dianne Hackborn mService.mLayoutNeeded = true; 11046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mPolicyVisibility) { 11056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mService.mCurrentFocus == this) { 11066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mFocusMayChange = true; 11076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Window is no longer visible -- make sure if we were waiting 11096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // for it to be displayed before enabling the display, that 11106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // we allow the display to be enabled now. 11116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.enableScreenIfNeededLocked(); 11126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mTransformation.clear(); 11156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mHasDrawn 11166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING 11176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && mAppToken != null 11186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && mAppToken.firstWindowDrawn 11196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && mAppToken.startingData != null) { 11206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_STARTING_WINDOW) Slog.v(WindowManagerService.TAG, "Finish starting " 11216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mToken + ": first real window done animating"); 11226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mFinishedStarting.add(mAppToken); 11236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mH.sendEmptyMessage(H.FINISHED_STARTING); 11246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 11266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn finishExit(); 11276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 11286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAppToken != null) { 11296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAppToken.updateReportedVisibilityLocked(); 11306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1132ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner mAnimState = ANIM_STATE_IDLE; 11336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 11346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 11366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void finishExit() { 11376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_ANIM) Slog.v( 11386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "finishExit in " + this 11396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ": exiting=" + mExiting 11406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " remove=" + mRemoveOnExit 11416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " windowAnimating=" + isWindowAnimating()); 11426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 11436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int N = mChildWindows.size(); 11446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn for (int i=0; i<N; i++) { 11456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mChildWindows.get(i).finishExit(); 11466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 11486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mExiting) { 11496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 11506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 11526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (isWindowAnimating()) { 11536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 11546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 11566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.localLOGV) Slog.v( 11576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowManagerService.TAG, "Exit animation finished in " + this 11586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + ": remove=" + mRemoveOnExit); 11596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mSurface != null) { 11606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDestroySurface.add(this); 11616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDestroying = true; 11625fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(this, "HIDE (finishExit)", null); 11636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurfaceShown = false; 11646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 11656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurface.hide(); 11666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RuntimeException e) { 11676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "Error hiding surface in " + this, e); 11686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLastHidden = true; 11706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mExiting = false; 11726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mRemoveOnExit) { 11736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mPendingRemove.add(this); 11746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mRemoveOnExit = false; 11756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 11786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean isIdentityMatrix(float dsdx, float dtdx, float dsdy, float dtdy) { 11796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (dsdx < .99999f || dsdx > 1.00001f) return false; 11806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (dtdy < .99999f || dtdy > 1.00001f) return false; 11816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (dtdx < -.000001f || dtdx > .000001f) return false; 11826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (dsdy < -.000001f || dsdy > .000001f) return false; 11836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return true; 11846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 11856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1186e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn void prelayout() { 1187e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (mEnforceSizeCompat) { 1188e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mGlobalScale = mService.mCompatibleScreenScale; 1189ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn mInvGlobalScale = 1/mGlobalScale; 1190e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else { 1191ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn mGlobalScale = mInvGlobalScale = 1; 1192e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1193e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1194e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 11956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void computeShownFrameLocked() { 11966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final boolean selfTransformation = mHasLocalTransformation; 11976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Transformation attachedTransformation = 11986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn (mAttachedWindow != null && mAttachedWindow.mHasLocalTransformation) 11996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn ? mAttachedWindow.mTransformation : null; 12006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Transformation appTransformation = 12016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn (mAppToken != null && mAppToken.hasTransformation) 12026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn ? mAppToken.transformation : null; 12036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 12046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Wallpapers are animated based on the "real" window they 12056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // are currently targeting. 12066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAttrs.type == TYPE_WALLPAPER && mService.mLowerWallpaperTarget == null 12076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && mService.mWallpaperTarget != null) { 12086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mService.mWallpaperTarget.mHasLocalTransformation && 12096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mWallpaperTarget.mAnimation != null && 12106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn !mService.mWallpaperTarget.mAnimation.getDetachWallpaper()) { 12116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn attachedTransformation = mService.mWallpaperTarget.mTransformation; 12126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_WALLPAPER && attachedTransformation != null) { 12136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "WP target attached xform: " + attachedTransformation); 12146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 12156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 12166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mService.mWallpaperTarget.mAppToken != null && 12176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mWallpaperTarget.mAppToken.hasTransformation && 12186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mWallpaperTarget.mAppToken.animation != null && 12196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn !mService.mWallpaperTarget.mAppToken.animation.getDetachWallpaper()) { 12206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn appTransformation = mService.mWallpaperTarget.mAppToken.transformation; 12216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_WALLPAPER && appTransformation != null) { 12226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "WP target app xform: " + appTransformation); 12236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 12246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 12256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 12266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 12276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final boolean screenAnimation = mService.mScreenRotationAnimation != null 12286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && mService.mScreenRotationAnimation.isAnimating(); 12296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (selfTransformation || attachedTransformation != null 12306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || appTransformation != null || screenAnimation) { 12316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // cache often used attributes locally 12326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Rect frame = mFrame; 12336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final float tmpFloats[] = mService.mTmpFloats; 12346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Matrix tmpMatrix = mTmpMatrix; 12356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 12366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Compute the desired transformation. 123773db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn if (screenAnimation) { 123873db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn // If we are doing a screen animation, the global rotation 123973db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn // applied to windows can result in windows that are carefully 124073db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn // aligned with each other to slightly separate, allowing you 124173db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn // to see what is behind them. An unsightly mess. This... 124273db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn // thing... magically makes it call good: scale each window 124373db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn // slightly (two pixels larger in each dimension, from the 124473db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn // window's center). 124573db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn final float w = frame.width(); 124673db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn final float h = frame.height(); 1247526f0a0e158cf46c244edc57624c15ebce26c71fMathias Agopian if (w>=1 && h>=1) { 1248526f0a0e158cf46c244edc57624c15ebce26c71fMathias Agopian tmpMatrix.setScale(1 + 2/w, 1 + 2/h, w/2, h/2); 1249526f0a0e158cf46c244edc57624c15ebce26c71fMathias Agopian } else { 1250526f0a0e158cf46c244edc57624c15ebce26c71fMathias Agopian tmpMatrix.reset(); 1251526f0a0e158cf46c244edc57624c15ebce26c71fMathias Agopian } 125273db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn } else { 125373db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn tmpMatrix.reset(); 125473db0d802ee4e1355d400329084eee6f5cff02a3Dianne Hackborn } 1255e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn tmpMatrix.postScale(mGlobalScale, mGlobalScale); 12566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (selfTransformation) { 12576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn tmpMatrix.postConcat(mTransformation.getMatrix()); 12586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 12596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn tmpMatrix.postTranslate(frame.left + mXOffset, frame.top + mYOffset); 12606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (attachedTransformation != null) { 12616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn tmpMatrix.postConcat(attachedTransformation.getMatrix()); 12626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 12636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (appTransformation != null) { 12646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn tmpMatrix.postConcat(appTransformation.getMatrix()); 12656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 12666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (screenAnimation) { 12676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn tmpMatrix.postConcat( 12686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mScreenRotationAnimation.getEnterTransformation().getMatrix()); 12696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 12706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 12716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // "convert" it into SurfaceFlinger's format 12726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // (a 2x2 matrix + an offset) 12736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Here we must not transform the position of the surface 12746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // since it is already included in the transformation. 12756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn //Slog.i(TAG, "Transform: " + matrix); 12766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 12776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mHaveMatrix = true; 12786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn tmpMatrix.getValues(tmpFloats); 12796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDsDx = tmpFloats[Matrix.MSCALE_X]; 12806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDtDx = tmpFloats[Matrix.MSKEW_Y]; 12816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDsDy = tmpFloats[Matrix.MSKEW_X]; 12826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDtDy = tmpFloats[Matrix.MSCALE_Y]; 1283d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn float x = tmpFloats[Matrix.MTRANS_X]; 1284d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn float y = tmpFloats[Matrix.MTRANS_Y]; 12856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int w = frame.width(); 12866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int h = frame.height(); 12876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mShownFrame.set(x, y, x+w, y+h); 12886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 12896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Now set the alpha... but because our current hardware 12906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // can't do alpha transformation on a non-opaque surface, 12916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // turn it off if we are running an animation that is also 12926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // transforming since it is more important to have that 12936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // animation be smooth. 12946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mShownAlpha = mAlpha; 12956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mService.mLimitedAlphaCompositing 12966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || (!PixelFormat.formatHasAlpha(mAttrs.format) 12976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || (isIdentityMatrix(mDsDx, mDtDx, mDsDy, mDtDy) 12986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && x == frame.left && y == frame.top))) { 12996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn //Slog.i(TAG, "Applying alpha transform"); 13006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (selfTransformation) { 13016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mShownAlpha *= mTransformation.getAlpha(); 13026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (attachedTransformation != null) { 13046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mShownAlpha *= attachedTransformation.getAlpha(); 13056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (appTransformation != null) { 13076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mShownAlpha *= appTransformation.getAlpha(); 13086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (screenAnimation) { 13106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mShownAlpha *= 13116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mScreenRotationAnimation.getEnterTransformation().getAlpha(); 13126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else { 13146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn //Slog.i(TAG, "Not applying alpha transform"); 13156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 13176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.localLOGV) Slog.v( 1318ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner WindowManagerService.TAG, "computeShownFrameLocked: Animating " + this + 13196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn ": " + mShownFrame + 1320ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner ", alpha=" + mTransformation.getAlpha() + ", mShownAlpha=" + mShownAlpha); 13216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 13226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1324ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 1325ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner WindowManagerService.TAG, "computeShownFrameLocked: " + this + 1326ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner " not attached, mAlpha=" + mAlpha); 13276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mShownFrame.set(mFrame); 13286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mXOffset != 0 || mYOffset != 0) { 13296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mShownFrame.offset(mXOffset, mYOffset); 13306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mShownAlpha = mAlpha; 13326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mHaveMatrix = false; 1333e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mDsDx = mGlobalScale; 13346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDtDx = 0; 13356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDsDy = 0; 1336e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mDtDy = mGlobalScale; 13376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 13396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 13406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Is this window visible? It is not visible if there is no 13416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * surface, or we are in the process of running an exit animation 13426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * that will remove the surface, or its app token has been hidden. 13436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 13446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean isVisibleLw() { 13456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final AppWindowToken atoken = mAppToken; 13466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mSurface != null && mPolicyVisibility && !mAttachedHidden 13476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && (atoken == null || !atoken.hiddenRequested) 13486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && !mExiting && !mDestroying; 13496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 13516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 13526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Like {@link #isVisibleLw}, but also counts a window that is currently 13536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * "hidden" behind the keyguard as visible. This allows us to apply 13546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * things like window flags that impact the keyguard. 13556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * XXX I am starting to think we need to have ANOTHER visibility flag 13566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * for this "hidden behind keyguard" state rather than overloading 13576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * mPolicyVisibility. Ungh. 13586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 13596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean isVisibleOrBehindKeyguardLw() { 1360bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (mRootToken.waitingToShow && 1361bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 1362bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn return false; 1363bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn } 13646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final AppWindowToken atoken = mAppToken; 1365bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn final boolean animating = atoken != null 1366bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn ? (atoken.animation != null) : false; 1367bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn return mSurface != null && !mDestroying && !mExiting 13686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && (atoken == null ? mPolicyVisibility : !atoken.hiddenRequested) 1369bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn && ((!mAttachedHidden && mViewVisibility == View.VISIBLE 1370bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn && !mRootToken.hidden) 1371bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn || mAnimation != null || animating); 13726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 13746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 13756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Is this window visible, ignoring its app token? It is not visible 13766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * if there is no surface, or we are in the process of running an exit animation 13776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * that will remove the surface. 13786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 13796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean isWinVisibleLw() { 13806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final AppWindowToken atoken = mAppToken; 13816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mSurface != null && mPolicyVisibility && !mAttachedHidden 13826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && (atoken == null || !atoken.hiddenRequested || atoken.animating) 13836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && !mExiting && !mDestroying; 13846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 13866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 13876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * The same as isVisible(), but follows the current hidden state of 13886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * the associated app token, not the pending requested hidden state. 13896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 13906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean isVisibleNow() { 13916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mSurface != null && mPolicyVisibility && !mAttachedHidden 13926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && !mRootToken.hidden && !mExiting && !mDestroying; 13936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 13946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 13956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 13966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Can this window possibly be a drag/drop target? The test here is 13976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * a combination of the above "visible now" with the check that the 13986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Input Manager uses when discarding windows from input consideration. 13996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 14006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean isPotentialDragTarget() { 1401cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown return isVisibleNow() && !mRemoved 1402cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown && mInputChannel != null && mInputWindowHandle != null; 14036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 14046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 14056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 14066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Same as isVisible(), but we also count it as visible between the 14076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * call to IWindowSession.add() and the first relayout(). 14086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 14096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean isVisibleOrAdding() { 14106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final AppWindowToken atoken = mAppToken; 14116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return ((mSurface != null && !mReportDestroySurface) 14126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || (!mRelayoutCalled && mViewVisibility == View.VISIBLE)) 14136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && mPolicyVisibility && !mAttachedHidden 14146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && (atoken == null || !atoken.hiddenRequested) 14156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && !mExiting && !mDestroying; 14166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 14176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 14186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 14196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Is this window currently on-screen? It is on-screen either if it 14206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * is visible or it is currently running an animation before no longer 14216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * being visible. 14226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 14236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean isOnScreen() { 14246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final AppWindowToken atoken = mAppToken; 14256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (atoken != null) { 14266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mSurface != null && mPolicyVisibility && !mDestroying 14276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && ((!mAttachedHidden && !atoken.hiddenRequested) 14286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || mAnimation != null || atoken.animation != null); 14296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else { 14306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mSurface != null && mPolicyVisibility && !mDestroying 14316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && (!mAttachedHidden || mAnimation != null); 14326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 14336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 14346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 14356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 14366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Like isOnScreen(), but we don't return true if the window is part 14376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * of a transition that has not yet been started. 14386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 14396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean isReadyForDisplay() { 14406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mRootToken.waitingToShow && 14416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 14426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 14436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 14446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mSurface != null && mPolicyVisibility && !mDestroying 14456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && ((!mAttachedHidden && mViewVisibility == View.VISIBLE 14466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && !mRootToken.hidden) 1447ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner || mAnimation != null 1448ad3a9bb628e912b39e10f8d8a8bde0badefd8bd0Craig Mautner || ((mAppToken != null) && (mAppToken.animation != null))); 14496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 14506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 14516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** Is the window or its container currently animating? */ 14526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean isAnimating() { 14536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final WindowState attached = mAttachedWindow; 14546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final AppWindowToken atoken = mAppToken; 14556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mAnimation != null 14566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || (attached != null && attached.mAnimation != null) 14576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || (atoken != null && 14586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn (atoken.animation != null 14596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || atoken.inPendingTransaction)); 14606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 14616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 14626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** Is this window currently animating? */ 14636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean isWindowAnimating() { 14646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mAnimation != null; 14656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 14666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 14676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 14686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Like isOnScreen, but returns false if the surface hasn't yet 14696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * been drawn. 14706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 14716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean isDisplayedLw() { 14726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final AppWindowToken atoken = mAppToken; 14736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mSurface != null && mPolicyVisibility && !mDestroying 14746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && !mDrawPending && !mCommitDrawPending 14756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && ((!mAttachedHidden && 14766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn (atoken == null || !atoken.hiddenRequested)) 14776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || mAnimating); 14786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 14796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1480cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn public boolean isGoneForLayoutLw() { 1481cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn final AppWindowToken atoken = mAppToken; 1482cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn return mViewVisibility == View.GONE 1483cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn || !mRelayoutCalled 1484cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn || (atoken == null && mRootToken.hidden) 1485b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn || (atoken != null && (atoken.hiddenRequested || atoken.hidden)) 1486cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn || mAttachedHidden 1487cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn || mExiting || mDestroying; 1488cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn } 1489cfbf7dedaddd825b608e87d3dcf46adf80a46976Dianne Hackborn 14906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 14916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Returns true if the window has a surface that it has drawn a 14926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * complete UI in to. 14936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 14946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean isDrawnLw() { 14956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final AppWindowToken atoken = mAppToken; 14966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mSurface != null && !mDestroying 14976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && !mDrawPending && !mCommitDrawPending; 14986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 14996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 15006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 15016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Return true if the window is opaque and fully drawn. This indicates 15026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * it may obscure windows behind it. 15036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 15046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean isOpaqueDrawn() { 15056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return (mAttrs.format == PixelFormat.OPAQUE 15066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || mAttrs.type == TYPE_WALLPAPER) 15076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && mSurface != null && mAnimation == null 15086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && (mAppToken == null || mAppToken.animation == null) 15096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && !mDrawPending && !mCommitDrawPending; 15106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 15126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** 15136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Return whether this window is wanting to have a translation 15146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * animation applied to it for an in-progress move. (Only makes 15156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * sense to call from performLayoutAndPlaceSurfacesLockedInner().) 15166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 15176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean shouldAnimateMove() { 15186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mContentChanged && !mExiting && !mLastHidden && !mService.mDisplayFrozen 15196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && (mFrame.top != mLastFrame.top 15206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || mFrame.left != mLastFrame.left) 15216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && (mAttachedWindow == null || !mAttachedWindow.shouldAnimateMove()) 1522bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn && mService.mPolicy.isScreenOnFully(); 15236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 15256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean isFullscreen(int screenWidth, int screenHeight) { 1526ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn return mFrame.left <= 0 && mFrame.top <= 0 && 1527ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn mFrame.right >= screenWidth && mFrame.bottom >= screenHeight; 15286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 15306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void removeLocked() { 15316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn disposeInputChannel(); 15326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 15336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAttachedWindow != null) { 15346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(WindowManagerService.TAG, "Removing " + this + " from " + mAttachedWindow); 15356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mAttachedWindow.mChildWindows.remove(this); 15366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15376d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn destroyDeferredSurfaceLocked(); 15386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn destroySurfaceLocked(); 15396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSession.windowRemovedLocked(); 15406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 15416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mClient.asBinder().unlinkToDeath(mDeathRecipient, 0); 15426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RuntimeException e) { 15436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Ignore if it has already been removed (usually because 15446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // we are doing this as part of processing a death note.) 15456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1547cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown 1548cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown void setInputChannel(InputChannel inputChannel) { 1549cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (mInputChannel != null) { 1550cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown throw new IllegalStateException("Window already has an input channel."); 1551cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown } 1552cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown 1553cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown mInputChannel = inputChannel; 1554cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown mInputWindowHandle.inputChannel = inputChannel; 1555cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown } 1556cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown 15576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void disposeInputChannel() { 15586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mInputChannel != null) { 15596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputManager.unregisterInputChannel(mInputChannel); 15606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 15616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputChannel.dispose(); 15626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputChannel = null; 15636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1564cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown 1565cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown mInputWindowHandle.inputChannel = null; 15666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 15686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private class DeathRecipient implements IBinder.DeathRecipient { 15696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void binderDied() { 15706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 15716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized(mService.mWindowMap) { 15726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState win = mService.windowForClientLocked(mSession, mClient, false); 15736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.i(WindowManagerService.TAG, "WIN DEATH: " + win); 15746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (win != null) { 15756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.removeWindowLocked(mSession, win); 15766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (IllegalArgumentException ex) { 15796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This will happen if the window has already been 15806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // removed. 15816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 15856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /** Returns true if this window desires key events. */ 15866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public final boolean canReceiveKeys() { 15876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return isVisibleOrAdding() 15886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && (mViewVisibility == View.VISIBLE) 15896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn && ((mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == 0); 15906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 15926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean hasDrawnLw() { 15936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mHasDrawn; 15946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 15966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean showLw(boolean doAnimation) { 15976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return showLw(doAnimation, true); 15986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 15996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 16006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean showLw(boolean doAnimation, boolean requestAnim) { 16016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mPolicyVisibility && mPolicyVisibilityAfterAnim) { 16026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 16036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16045fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, "Policy visibility true: " + this); 16056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (doAnimation) { 16065fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, "doAnimation: mPolicyVisibility=" 16076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mPolicyVisibility + " mAnimation=" + mAnimation); 1608bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (mService.mDisplayFrozen || !mService.mPolicy.isScreenOnFully()) { 16096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn doAnimation = false; 16106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else if (mPolicyVisibility && mAnimation == null) { 16116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Check for the case where we are currently visible and 16126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // not animating; we do not want to do animation at such a 16136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // point to become visible when we already are. 16146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn doAnimation = false; 16156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mPolicyVisibility = true; 16186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mPolicyVisibilityAfterAnim = true; 16196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (doAnimation) { 16206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.applyAnimationLocked(this, WindowManagerPolicy.TRANSIT_ENTER, true); 16216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (requestAnim) { 16234a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown mService.scheduleAnimationLocked(); 16246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return true; 16266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 16286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean hideLw(boolean doAnimation) { 16296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return hideLw(doAnimation, true); 16306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 16326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean hideLw(boolean doAnimation, boolean requestAnim) { 16336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (doAnimation) { 1634bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (mService.mDisplayFrozen || !mService.mPolicy.isScreenOnFully()) { 16356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn doAnimation = false; 16366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean current = doAnimation ? mPolicyVisibilityAfterAnim 16396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn : mPolicyVisibility; 16406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!current) { 16416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 16426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (doAnimation) { 16446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.applyAnimationLocked(this, WindowManagerPolicy.TRANSIT_EXIT, false); 16456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAnimation == null) { 16466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn doAnimation = false; 16476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (doAnimation) { 16506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mPolicyVisibilityAfterAnim = false; 16516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else { 16525fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, "Policy visibility false: " + this); 16536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mPolicyVisibilityAfterAnim = false; 16546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mPolicyVisibility = false; 16556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Window is no longer visible -- make sure if we were waiting 16566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // for it to be displayed before enabling the display, that 16576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // we allow the display to be enabled now. 16586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.enableScreenIfNeededLocked(); 16596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mService.mCurrentFocus == this) { 16606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mFocusMayChange = true; 16616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (requestAnim) { 16644a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown mService.scheduleAnimationLocked(); 16656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return true; 16676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1669ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn private static void applyInsets(Region outRegion, Rect frame, Rect inset) { 1670ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn outRegion.set( 1671ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn frame.left + inset.left, frame.top + inset.top, 1672ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn frame.right - inset.right, frame.bottom - inset.bottom); 1673e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1674e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 16756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void getTouchableRegion(Region outRegion) { 1676ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn final Rect frame = mFrame; 16776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn switch (mTouchableInsets) { 16786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn default: 16796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME: 16806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn outRegion.set(frame); 16816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 1682e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT: 1683ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn applyInsets(outRegion, frame, mGivenContentInsets); 16846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 1685e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_VISIBLE: 1686ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn applyInsets(outRegion, frame, mGivenVisibleInsets); 16876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 16886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION: { 16896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final Region givenTouchableRegion = mGivenTouchableRegion; 16906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn outRegion.set(givenTouchableRegion); 16916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn outRegion.translate(frame.left, frame.top); 16926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 16936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 16966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1697a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn void dump(PrintWriter pw, String prefix, boolean dumpAll) { 16986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mSession="); pw.print(mSession); 16996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mClient="); pw.println(mClient.asBinder()); 17006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mAttrs="); pw.println(mAttrs); 1701a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("Requested w="); pw.print(mRequestedWidth); 1702a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" h="); pw.print(mRequestedHeight); 1703a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mLayoutSeq="); pw.println(mLayoutSeq); 17046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAttachedWindow != null || mLayoutAttached) { 17056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mAttachedWindow="); pw.print(mAttachedWindow); 17066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mLayoutAttached="); pw.println(mLayoutAttached); 17076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 17086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mIsImWindow || mIsWallpaper || mIsFloatingLayer) { 17096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mIsImWindow="); pw.print(mIsImWindow); 17106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mIsWallpaper="); pw.print(mIsWallpaper); 17116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mIsFloatingLayer="); pw.print(mIsFloatingLayer); 17126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mWallpaperVisible="); pw.println(mWallpaperVisible); 17136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1714a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 1715a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mBaseLayer="); pw.print(mBaseLayer); 1716a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mSubLayer="); pw.print(mSubLayer); 1717a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mAnimLayer="); pw.print(mLayer); pw.print("+"); 1718a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print((mTargetAppToken != null ? mTargetAppToken.animLayerAdjustment 1719a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn : (mAppToken != null ? mAppToken.animLayerAdjustment : 0))); 1720a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print("="); pw.print(mAnimLayer); 1721a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mLastLayer="); pw.println(mLastLayer); 1722a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 17236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mSurface != null) { 1724a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 1725a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mSurface="); pw.println(mSurface); 1726a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 17276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("Surface: shown="); pw.print(mSurfaceShown); 17286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" layer="); pw.print(mSurfaceLayer); 17296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" alpha="); pw.print(mSurfaceAlpha); 17306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" rect=("); pw.print(mSurfaceX); 17316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(","); pw.print(mSurfaceY); 17326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(") "); pw.print(mSurfaceW); 17336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" x "); pw.println(mSurfaceH); 17346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 17356d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (mPendingDestroySurface != null) { 17366d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn pw.print(prefix); pw.print("mPendingDestroySurface="); 17376d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn pw.println(mPendingDestroySurface); 17386d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 1739a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 1740a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mToken="); pw.println(mToken); 1741a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mRootToken="); pw.println(mRootToken); 1742a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mAppToken != null) { 1743a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mAppToken="); pw.println(mAppToken); 1744a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 1745a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mTargetAppToken != null) { 1746a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mTargetAppToken="); pw.println(mTargetAppToken); 1747a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 1748a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mViewVisibility=0x"); 1749a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(Integer.toHexString(mViewVisibility)); 1750a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mLastHidden="); pw.print(mLastHidden); 1751a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mHaveFrame="); pw.print(mHaveFrame); 1752a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mObscured="); pw.println(mObscured); 17539a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn pw.print(prefix); pw.print("mSeq="); pw.print(mSeq); 17549a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn pw.print(" mSystemUiVisibility=0x"); 17559a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn pw.println(Integer.toHexString(mSystemUiVisibility)); 17566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 17576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mPolicyVisibility || !mPolicyVisibilityAfterAnim || mAttachedHidden) { 17586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mPolicyVisibility="); 17596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(mPolicyVisibility); 17606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mPolicyVisibilityAfterAnim="); 17616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(mPolicyVisibilityAfterAnim); 17626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mAttachedHidden="); pw.println(mAttachedHidden); 17636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1764b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn if (!mRelayoutCalled || mLayoutNeeded) { 1765b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn pw.print(prefix); pw.print("mRelayoutCalled="); pw.print(mRelayoutCalled); 1766b7ff51bde92b76757a002bb5b1889f5790986513Dianne Hackborn pw.print(" mLayoutNeeded="); pw.println(mLayoutNeeded); 17676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 17686d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (mSurfaceResized || mSurfaceDestroyDeferred) { 17696d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn pw.print(prefix); pw.print("mSurfaceResized="); pw.print(mSurfaceResized); 17706d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn pw.print(" mSurfaceDestroyDeferred="); pw.println(mSurfaceDestroyDeferred); 17716d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 17726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mXOffset != 0 || mYOffset != 0) { 17736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("Offsets x="); pw.print(mXOffset); 17746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" y="); pw.println(mYOffset); 17756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1776a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 1777a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mGivenContentInsets="); 1778a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn mGivenContentInsets.printShortString(pw); 1779a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mGivenVisibleInsets="); 1780a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn mGivenVisibleInsets.printShortString(pw); 1781a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 1782a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mTouchableInsets != 0 || mGivenInsetsPending) { 1783a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mTouchableInsets="); pw.print(mTouchableInsets); 1784a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mGivenInsetsPending="); pw.println(mGivenInsetsPending); 1785a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 1786a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mConfiguration="); pw.println(mConfiguration); 17876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 17886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mShownFrame="); 1789b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn mShownFrame.printShortString(pw); pw.println(); 1790a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 1791a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw); 1792a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" last="); mLastFrame.printShortString(pw); 1793a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 1794a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 1795ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (mEnforceSizeCompat) { 1796ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn pw.print(prefix); pw.print("mCompatFrame="); mCompatFrame.printShortString(pw); 1797ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn pw.println(); 1798ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } 1799a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 1800a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mContainingFrame="); 1801a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn mContainingFrame.printShortString(pw); 1802a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mParentFrame="); 1803a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn mParentFrame.printShortString(pw); 1804a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mDisplayFrame="); 1805a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn mDisplayFrame.printShortString(pw); 1806a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 1807a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mContentFrame="); mContentFrame.printShortString(pw); 1808a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mVisibleFrame="); mVisibleFrame.printShortString(pw); 1809a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 1810a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mContentInsets="); mContentInsets.printShortString(pw); 1811a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" last="); mLastContentInsets.printShortString(pw); 1812a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mVisibleInsets="); mVisibleInsets.printShortString(pw); 1813a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" last="); mLastVisibleInsets.printShortString(pw); 1814a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 1815a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 18166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mAnimating || mLocalAnimating || mAnimationIsEntrance 18176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || mAnimation != null) { 18186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mAnimating="); pw.print(mAnimating); 18196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mLocalAnimating="); pw.print(mLocalAnimating); 18206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mAnimationIsEntrance="); pw.print(mAnimationIsEntrance); 18216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mAnimation="); pw.println(mAnimation); 18226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 18236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mHasTransformation || mHasLocalTransformation) { 18246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("XForm: has="); 18256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(mHasTransformation); 18266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" hasLocal="); pw.print(mHasLocalTransformation); 18276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" "); mTransformation.printShortString(pw); 18286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.println(); 18296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 18306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) { 18316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha); 18326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mAlpha="); pw.print(mAlpha); 18336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mLastAlpha="); pw.println(mLastAlpha); 18346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1835e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (mHaveMatrix || mGlobalScale != 1) { 1836e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn pw.print(prefix); pw.print("mGlobalScale="); pw.print(mGlobalScale); 1837e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn pw.print(" mDsDx="); pw.print(mDsDx); 18386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mDtDx="); pw.print(mDtDx); 18396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mDsDy="); pw.print(mDsDy); 18406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mDtDy="); pw.println(mDtDy); 18416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1842a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 1843a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(prefix); pw.print("mDrawPending="); pw.print(mDrawPending); 1844a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mCommitDrawPending="); pw.print(mCommitDrawPending); 1845a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mReadyToShow="); pw.print(mReadyToShow); 1846a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mHasDrawn="); pw.println(mHasDrawn); 1847a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 18486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mExiting || mRemoveOnExit || mDestroying || mRemoved) { 18496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mExiting="); pw.print(mExiting); 18506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mRemoveOnExit="); pw.print(mRemoveOnExit); 18516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mDestroying="); pw.print(mDestroying); 18526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mRemoved="); pw.println(mRemoved); 18536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 18546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mOrientationChanging || mAppFreezing || mTurnOnScreen) { 18556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mOrientationChanging="); 18566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(mOrientationChanging); 18576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mAppFreezing="); pw.print(mAppFreezing); 18586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mTurnOnScreen="); pw.println(mTurnOnScreen); 18596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 18606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mHScale != 1 || mVScale != 1) { 18616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mHScale="); pw.print(mHScale); 18626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mVScale="); pw.println(mVScale); 18636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 18646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mWallpaperX != -1 || mWallpaperY != -1) { 18656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mWallpaperX="); pw.print(mWallpaperX); 18666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mWallpaperY="); pw.println(mWallpaperY); 18676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 18686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mWallpaperXStep != -1 || mWallpaperYStep != -1) { 18696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("mWallpaperXStep="); pw.print(mWallpaperXStep); 18706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" mWallpaperYStep="); pw.println(mWallpaperYStep); 18716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 18726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 18736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 18746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn String makeInputChannelName() { 18756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return Integer.toHexString(System.identityHashCode(this)) 18766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " " + mAttrs.getTitle(); 18776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 18786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 18796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn @Override 18806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public String toString() { 18816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mStringNameCache == null || mLastTitle != mAttrs.getTitle() 18826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn || mWasPaused != mToken.paused) { 18836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLastTitle = mAttrs.getTitle(); 18846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mWasPaused = mToken.paused; 18856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mStringNameCache = "Window{" + Integer.toHexString(System.identityHashCode(this)) 18866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + " " + mLastTitle + " paused=" + mWasPaused + "}"; 18876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 18886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mStringNameCache; 18896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1890cef37fb481d16eda2b304887a8738ed599bc1b21satok} 1891