1a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner// Copyright 2012 Google Inc. All Rights Reserved. 2a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 3a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerpackage com.android.server.wm; 4a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 5c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; 62639da500e3d53ea3a17d888b1c0001d043c6b98Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE; 77d8df3905d294127cc58100912a57c816bfb2502Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_TURN_ON_SCREEN; 8d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner 9c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.content.Context; 10c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.graphics.Matrix; 11c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.graphics.PixelFormat; 127358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport android.graphics.Point; 137358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport android.graphics.PointF; 14c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.graphics.Rect; 1548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautnerimport android.graphics.Region; 16a51a9564fd53b661446cd63eea23208656acc678Craig Mautnerimport android.os.Debug; 17a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.util.Slog; 1859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.DisplayInfo; 19c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.view.Surface; 207358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport android.view.SurfaceSession; 21a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.WindowManager; 22a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.WindowManagerPolicy; 23c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.view.WindowManager.LayoutParams; 24a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.animation.Animation; 25c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.view.animation.AnimationUtils; 26a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.animation.Transformation; 27a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 28a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport com.android.server.wm.WindowManagerService.H; 29a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 30a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport java.io.PrintWriter; 317358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport java.util.ArrayList; 32a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 3359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerclass WinAnimatorList extends ArrayList<WindowStateAnimator> { 34a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner public WinAnimatorList() { 35a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner super(); 36a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 37a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner 38a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner public WinAnimatorList(WinAnimatorList other) { 39a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner super(other); 40a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 4159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner} 4259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 43a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner/** 44c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Keep track of animations and surface operations for a single WindowState. 45c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner **/ 46a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerclass WindowStateAnimator { 47c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_VISIBILITY = WindowManagerService.DEBUG_VISIBILITY; 48c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_ANIM = WindowManagerService.DEBUG_ANIM; 49c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_LAYERS = WindowManagerService.DEBUG_LAYERS; 50c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_STARTING_WINDOW = WindowManagerService.DEBUG_STARTING_WINDOW; 51c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean SHOW_TRANSACTIONS = WindowManagerService.SHOW_TRANSACTIONS; 52c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean SHOW_LIGHT_TRANSACTIONS = WindowManagerService.SHOW_LIGHT_TRANSACTIONS; 53c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean SHOW_SURFACE_ALLOC = WindowManagerService.SHOW_SURFACE_ALLOC; 54c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean localLOGV = WindowManagerService.localLOGV; 55c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner static final boolean DEBUG_ORIENTATION = WindowManagerService.DEBUG_ORIENTATION; 567358fbfeb2febb60085067fcacc192f429b06545Craig Mautner static final boolean DEBUG_SURFACE_TRACE = WindowManagerService.DEBUG_SURFACE_TRACE; 57c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 58c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final String TAG = "WindowStateAnimator"; 59a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 60918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner // Unchanging local convenience fields. 61a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowManagerService mService; 62a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowState mWin; 63322e40315609acd5a608440bc469d873e09559caCraig Mautner final WindowStateAnimator mAttachedWinAnimator; 64e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner final WindowAnimator mAnimator; 658863cca57d8c901a2da0edc422b653ae68849313Craig Mautner AppWindowAnimator mAppAnimator; 66c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Session mSession; 67c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowManagerPolicy mPolicy; 68c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Context mContext; 69918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner final boolean mIsWallpaper; 70a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 71a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // If this is a universe background window, this is the transformation 72a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // it is applying to the rest of the universe. 73a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final Transformation mUniverseTransform = new Transformation(); 74a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 75a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Currently running animation. 76a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mAnimating; 77a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mLocalAnimating; 78a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner Animation mAnimation; 79a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mAnimationIsEntrance; 80a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mHasTransformation; 81a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mHasLocalTransformation; 82a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final Transformation mTransformation = new Transformation(); 83a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mWasAnimating; // Were we animating going into the most recent animation step? 84c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimLayer; 85c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mLastLayer; 86c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 87c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface mSurface; 88c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface mPendingDestroySurface; 89c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 90c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 91c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Set when we have changed the size of the surface, to know that 92c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * we must tell them application to resize (and thus redraw itself). 93c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 94c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceResized; 95c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 96c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 97c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Set if the client has asked that the destroy of its surface be delayed 98c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * until it explicitly says it is okay. 99c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 100c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceDestroyDeferred; 101c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1027d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mShownAlpha = 0; 1037d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mAlpha = 0; 1047d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mLastAlpha = 0; 105c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 106c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Used to save animation distances between the time they are calculated and when they are 107c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // used. 108c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimDw; 109c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimDh; 110c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mDsDx=1, mDtDx=0, mDsDy=0, mDtDy=1; 111c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1; 112c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 113c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mHaveMatrix; 114c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 115c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // For debugging, this is the last information given to the surface flinger. 116c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceShown; 117c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mSurfaceX, mSurfaceY, mSurfaceW, mSurfaceH; 118c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mSurfaceLayer; 119c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mSurfaceAlpha; 120c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 121c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Set to true if, when the window gets displayed, it should perform 122c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // an enter animation. 123c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mEnterAnimationPending; 124a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 125749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set when there is no Surface */ 126749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int NO_SURFACE = 0; 127749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set after the Surface has been created but before the window has been drawn. During 128749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * this time the surface is hidden. */ 129749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int DRAW_PENDING = 1; 130749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set after the window has finished drawing for the first time but before its surface 131749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * is shown. The surface will be displayed when the next layout is run. */ 132749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int COMMIT_DRAW_PENDING = 2; 133749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set during the time after the window's drawing has been committed, and before its 134749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * surface is actually shown. It is used to delay showing the surface until all windows in a 135749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * token are ready to be shown. */ 136749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int READY_TO_SHOW = 3; 137749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** Set when the window has been shown in the screen the first time. */ 138749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int HAS_DRAWN = 4; 1396fbda63e68513ece4409dac845588711ab25c39dCraig Mautner static String drawStateToString(int state) { 1406fbda63e68513ece4409dac845588711ab25c39dCraig Mautner switch (state) { 1416fbda63e68513ece4409dac845588711ab25c39dCraig Mautner case NO_SURFACE: return "NO_SURFACE"; 1426fbda63e68513ece4409dac845588711ab25c39dCraig Mautner case DRAW_PENDING: return "DRAW_PENDING"; 1436fbda63e68513ece4409dac845588711ab25c39dCraig Mautner case COMMIT_DRAW_PENDING: return "COMMIT_DRAW_PENDING"; 1446fbda63e68513ece4409dac845588711ab25c39dCraig Mautner case READY_TO_SHOW: return "READY_TO_SHOW"; 1456fbda63e68513ece4409dac845588711ab25c39dCraig Mautner case HAS_DRAWN: return "HAS_DRAWN"; 1466fbda63e68513ece4409dac845588711ab25c39dCraig Mautner default: return Integer.toString(state); 1476fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 1486fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 149749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner int mDrawState; 150749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner 151749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** Was this window last hidden? */ 152749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner boolean mLastHidden; 153a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 154bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner int mAttrFlags; 155bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner int mAttrType; 156bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner 157b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner final int mLayerStack; 158b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner 159918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner public WindowStateAnimator(final WindowState win) { 160918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner final WindowManagerService service = win.mService; 161918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner 162a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService = service; 163918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner mAnimator = service.mAnimator; 164918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner mPolicy = service.mPolicy; 165918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner mContext = service.mContext; 16659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner final DisplayInfo displayInfo = win.mDisplayContent.getDisplayInfo(); 16759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner mAnimDw = displayInfo.appWidth; 16859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner mAnimDh = displayInfo.appHeight; 169918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner 170a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin = win; 171322e40315609acd5a608440bc469d873e09559caCraig Mautner mAttachedWinAnimator = win.mAttachedWindow == null 172322e40315609acd5a608440bc469d873e09559caCraig Mautner ? null : win.mAttachedWindow.mWinAnimator; 173322e40315609acd5a608440bc469d873e09559caCraig Mautner mAppAnimator = win.mAppToken == null ? null : win.mAppToken.mAppAnimator; 174c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSession = win.mSession; 175bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner mAttrFlags = win.mAttrs.flags; 176bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner mAttrType = win.mAttrs.type; 177918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner mIsWallpaper = win.mIsWallpaper; 178b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner mLayerStack = win.mDisplayContent.getDisplay().getLayerStack(); 179a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 180a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 181a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void setAnimation(Animation anim) { 182bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner if (localLOGV) Slog.v(TAG, "Setting animation in " + this + ": " + anim); 183a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = false; 184a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 185a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = anim; 186a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION); 187a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.scaleCurrentDuration(mService.mWindowAnimationScale); 188a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Start out animation gone if window is gone, or visible if window is visible. 189a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 190749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mTransformation.setAlpha(mLastHidden ? 0 : 1); 191a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = true; 192a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 193a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 194a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void clearAnimation() { 195a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 196a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 197a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 198a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 199a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 200a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 201a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 202a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 203a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner /** Is the window or its container currently animating? */ 204a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean isAnimating() { 205a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return mAnimation != null 206322e40315609acd5a608440bc469d873e09559caCraig Mautner || (mAttachedWinAnimator != null && mAttachedWinAnimator.mAnimation != null) 207322e40315609acd5a608440bc469d873e09559caCraig Mautner || (mAppAnimator != null && 208322e40315609acd5a608440bc469d873e09559caCraig Mautner (mAppAnimator.animation != null 209322e40315609acd5a608440bc469d873e09559caCraig Mautner || mAppAnimator.mAppToken.inPendingTransaction)); 210a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 211a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 2120afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner /** Is the window animating the DummyAnimation? */ 2130afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner boolean isDummyAnimation() { 214322e40315609acd5a608440bc469d873e09559caCraig Mautner return mAppAnimator != null 215322e40315609acd5a608440bc469d873e09559caCraig Mautner && mAppAnimator.animation == AppWindowAnimator.sDummyAnimation; 2160afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 2170afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner 218a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner /** Is this window currently animating? */ 219a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean isWindowAnimating() { 220a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return mAnimation != null; 221a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 222a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 223a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner void cancelExitAnimationForNextAnimationLocked() { 224a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 225a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 226a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 2274d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mLocalAnimating = false; 22898129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn destroySurfaceLocked(true); 229a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 230a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 231a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 232a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner private boolean stepAnimation(long currentTime) { 233a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if ((mAnimation == null) || !mLocalAnimating) { 234a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 235a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 236a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 237a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final boolean more = mAnimation.getTransformation(currentTime, mTransformation); 2389e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner if (false && DEBUG_ANIM) Slog.v( 239c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Stepped animation in " + this + 240a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner ": more=" + more + ", xform=" + mTransformation); 241a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return more; 242a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 243a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 244a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // This must be called while inside a transaction. Returns true if 245a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // there is more animation to run. 246a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean stepAnimationLocked(long currentTime) { 247a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Save the animation state as it was before this step so WindowManagerService can tell if 248a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we just started or just stopped animating by comparing mWasAnimating with isAnimating(). 249a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWasAnimating = mAnimating; 250a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mService.okToDisplay()) { 251a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // We will run animations as long as the display isn't frozen. 252a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 253a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.isDrawnLw() && mAnimation != null) { 254a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = true; 255a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = true; 256a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mLocalAnimating) { 257c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 258c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Starting animation in " + this + 259a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " @ " + currentTime + ": ww=" + mWin.mFrame.width() + 260a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " wh=" + mWin.mFrame.height() + 261c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner " dw=" + mAnimDw + " dh=" + mAnimDh + 262a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " scale=" + mService.mWindowAnimationScale); 263c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimation.initialize(mWin.mFrame.width(), mWin.mFrame.height(), 264c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimDw, mAnimDh); 26559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner final DisplayInfo displayInfo = mWin.mDisplayContent.getDisplayInfo(); 26659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner mAnimDw = displayInfo.appWidth; 26759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner mAnimDh = displayInfo.appHeight; 268a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.setStartTime(currentTime); 269a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = true; 270a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 271a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 272a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if ((mAnimation != null) && mLocalAnimating) { 273a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (stepAnimation(currentTime)) { 274a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return true; 275a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 276a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 277c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 278c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Finished animation in " + this + 279a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " @ " + currentTime); 280a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner //WindowManagerService.this.dump(); 281a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 282a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = false; 283322e40315609acd5a608440bc469d873e09559caCraig Mautner if ((!mLocalAnimating || mAnimationIsEntrance) && mAppAnimator != null 284322e40315609acd5a608440bc469d873e09559caCraig Mautner && mAppAnimator.animation != null) { 285a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // When our app token is animating, we kind-of pretend like 286a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we are as well. Note the mLocalAnimating mAnimationIsEntrance 287a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // part of this check means that we will only do this if 288a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // our window is not currently exiting, or it is not 289a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // locally animating itself. The idea being that one that 290a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // is exiting and doing a local animation should be removed 291a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // once that animation is done. 292a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 293a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = true; 294a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 295a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 296a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (mHasTransformation) { 297a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Little trick to get through the path below to act like 298a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we have finished an animation. 299a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 300a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (isAnimating()) { 301a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 302a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 303a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (mAnimation != null) { 304a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // If the display is frozen, and there is a pending animation, 305a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // clear it and make sure we run the cleanup code. 306a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 307a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 308a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 309a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mAnimating && !mLocalAnimating) { 310a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 311a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 312a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 313c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Done animating, clean up. 314c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 315c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Animation done in " + this + ": exiting=" + mWin.mExiting 316a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ", reportedVisible=" 317a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.reportedVisible : false)); 318a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 319a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = false; 320a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 321a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 322a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 323a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 324a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 325e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner if (mAnimator.mWindowDetachedWallpaper == mWin) { 326e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner mAnimator.mWindowDetachedWallpaper = null; 327a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 328c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer = mWin.mLayer; 329a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mIsImWindow) { 330c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer += mService.mInputMethodAnimLayerAdjustment; 331918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner } else if (mIsWallpaper) { 332c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer += mService.mWallpaperAnimLayerAdjustment; 333a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 334c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_LAYERS) Slog.v(TAG, "Stepping win " + this 335c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " anim layer: " + mAnimLayer); 336a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = false; 337a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = false; 338a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mPolicyVisibility != mWin.mPolicyVisibilityAfterAnim) { 339a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowState.DEBUG_VISIBILITY) { 340c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "Policy visibility changing after anim in " + this + ": " 341a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + mWin.mPolicyVisibilityAfterAnim); 342a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 343a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mPolicyVisibility = mWin.mPolicyVisibilityAfterAnim; 34419d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner mWin.mDisplayContent.layoutNeeded = true; 345a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mWin.mPolicyVisibility) { 346a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mService.mCurrentFocus == mWin) { 347a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mFocusMayChange = true; 348a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 349a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Window is no longer visible -- make sure if we were waiting 350a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // for it to be displayed before enabling the display, that 351a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we allow the display to be enabled now. 352a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.enableScreenIfNeededLocked(); 353a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 354a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 355a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 356749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState == HAS_DRAWN 357a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING 358a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken != null 359a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken.firstWindowDrawn 360a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken.startingData != null) { 361c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Finish starting " 362a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + mWin.mToken + ": first real window done animating"); 363a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mFinishedStarting.add(mWin.mAppToken); 364a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mH.sendEmptyMessage(H.FINISHED_STARTING); 365a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 366a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 367a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner finishExit(); 36876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner final int displayId = mWin.mDisplayContent.getDisplayId(); 36976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner mAnimator.setPendingLayoutChanges(displayId, WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM); 370d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner if (WindowManagerService.DEBUG_LAYOUT_REPEATS) mService.debugLayoutRepeats( 37176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner "WindowStateAnimator", mAnimator.mPendingLayoutChanges.get(displayId)); 372a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 373a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mAppToken != null) { 374a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mAppToken.updateReportedVisibilityLocked(); 375a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 376a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 377a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 378a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 379a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 380a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner void finishExit() { 381a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v( 382c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "finishExit in " + this 383a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ": exiting=" + mWin.mExiting 384a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + " remove=" + mWin.mRemoveOnExit 385a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + " windowAnimating=" + isWindowAnimating()); 386a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 387a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final int N = mWin.mChildWindows.size(); 388a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner for (int i=0; i<N; i++) { 389a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mChildWindows.get(i).mWinAnimator.finishExit(); 390a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 391a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 392a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mWin.mExiting) { 393a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return; 394a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 395a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 396a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (isWindowAnimating()) { 397a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return; 398a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 399a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 400a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 401c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Exit animation finished in " + this 402a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ": remove=" + mWin.mRemoveOnExit); 403c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 404a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mDestroySurface.add(mWin); 405a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mDestroying = true; 406a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowState.SHOW_TRANSACTIONS) WindowManagerService.logSurface( 407a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin, "HIDE (finishExit)", null); 4080afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner hide(); 409a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 410a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mExiting = false; 411a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mRemoveOnExit) { 412a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mPendingRemove.add(mWin); 413a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mRemoveOnExit = false; 414a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 41598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn mAnimator.hideWallpapersLocked(mWin, true); 4160afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 4170afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner 4180afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner void hide() { 4190afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner if (!mLastHidden) { 4200afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner //dump(); 4210afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner mLastHidden = true; 4220afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, 4230afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner "HIDE (performLayout)", null); 4240afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner if (mSurface != null) { 4250afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner mSurfaceShown = false; 4260afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner try { 4270afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner mSurface.hide(); 4280afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } catch (RuntimeException e) { 4290afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner Slog.w(TAG, "Exception hiding surface in " + mWin); 4300afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 4310afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 4320afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 433a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 434a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 435a608b882327fbb393bde3854953cd322a6fea675Craig Mautner boolean finishDrawingLocked() { 4366fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_STARTING_WINDOW && 4376fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 4386fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.v(TAG, "Finishing drawing window " + mWin + ": mDrawState=" 4396fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + drawStateToString(mDrawState)); 4406fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 441749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState == DRAW_PENDING) { 442ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner if (DEBUG_SURFACE_TRACE || DEBUG_ANIM || SHOW_TRANSACTIONS || DEBUG_ORIENTATION) 443ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner Slog.v(TAG, "finishDrawingLocked: mDrawState=COMMIT_DRAW_PENDING " + this + " in " 44483339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner + mSurface); 4456fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_STARTING_WINDOW && 4466fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 4476fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.v(TAG, "Draw state now committed in " + mWin); 4486fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 449749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = COMMIT_DRAW_PENDING; 450a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return true; 451a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 452a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return false; 453a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 454a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 455a608b882327fbb393bde3854953cd322a6fea675Craig Mautner // This must be called while inside a transaction. 456a608b882327fbb393bde3854953cd322a6fea675Craig Mautner boolean commitFinishDrawingLocked(long currentTime) { 4576fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_STARTING_WINDOW && 4586fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 4596fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.i(TAG, "commitFinishDrawingLocked: " + mWin + " cur mDrawState=" 4606fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + drawStateToString(mDrawState)); 4616fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 462749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState != COMMIT_DRAW_PENDING) { 463a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return false; 464a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 4656fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_SURFACE_TRACE || DEBUG_ANIM) { 46683339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner Slog.i(TAG, "commitFinishDrawingLocked: mDrawState=READY_TO_SHOW " + mSurface); 4676fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 468749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = READY_TO_SHOW; 469a608b882327fbb393bde3854953cd322a6fea675Craig Mautner final boolean starting = mWin.mAttrs.type == TYPE_APPLICATION_STARTING; 470a608b882327fbb393bde3854953cd322a6fea675Craig Mautner final AppWindowToken atoken = mWin.mAppToken; 471a608b882327fbb393bde3854953cd322a6fea675Craig Mautner if (atoken == null || atoken.allDrawn || starting) { 472a608b882327fbb393bde3854953cd322a6fea675Craig Mautner performShowLocked(); 473a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 474a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return true; 475a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 476a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 4777d8df3905d294127cc58100912a57c816bfb2502Craig Mautner static class SurfaceTrace extends Surface { 4787d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private final static String SURFACE_TAG = "SurfaceTrace"; 4797d8df3905d294127cc58100912a57c816bfb2502Craig Mautner final static ArrayList<SurfaceTrace> sSurfaces = new ArrayList<SurfaceTrace>(); 4807358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4817d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private float mSurfaceTraceAlpha = 0; 4827358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private int mLayer; 48385afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn private final PointF mPosition = new PointF(); 48485afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn private final Point mSize = new Point(); 48585afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn private final Rect mWindowCrop = new Rect(); 4867358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private boolean mShown = false; 48798365d7663cbd82979a5700faf0050220b01084dJeff Brown private int mLayerStack; 48898365d7663cbd82979a5700faf0050220b01084dJeff Brown private String mName; 4897358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4907d8df3905d294127cc58100912a57c816bfb2502Craig Mautner public SurfaceTrace(SurfaceSession s, 49164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown String name, int w, int h, int format, int flags) 4927358fbfeb2febb60085067fcacc192f429b06545Craig Mautner throws OutOfResourcesException { 49364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown super(s, name, w, h, format, flags); 49498365d7663cbd82979a5700faf0050220b01084dJeff Brown mName = name != null ? name : "Not named"; 49585afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn mSize.set(w, h); 4967d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " 497a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 4987358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4997358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5007358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5017358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setAlpha(float alpha) { 5027358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setAlpha(alpha); 50398129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (alpha != mSurfaceTraceAlpha) { 50498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn Slog.v(SURFACE_TAG, "setAlpha: " + this + ". Called by " 50598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 50698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 5077d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurfaceTraceAlpha = alpha; 5087358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5097358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5107358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5117358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setLayer(int zorder) { 5127358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setLayer(zorder); 51398129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (zorder != mLayer) { 51498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn Slog.v(SURFACE_TAG, "setLayer: " + this + ". Called by " 51598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 51698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 5177358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mLayer = zorder; 5187358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5197358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.remove(this); 5207358fbfeb2febb60085067fcacc192f429b06545Craig Mautner int i; 5217358fbfeb2febb60085067fcacc192f429b06545Craig Mautner for (i = sSurfaces.size() - 1; i >= 0; i--) { 5227d8df3905d294127cc58100912a57c816bfb2502Craig Mautner SurfaceTrace s = sSurfaces.get(i); 5237358fbfeb2febb60085067fcacc192f429b06545Craig Mautner if (s.mLayer < zorder) { 5247358fbfeb2febb60085067fcacc192f429b06545Craig Mautner break; 5257358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5267358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5277358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.add(i + 1, this); 5287358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5297358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5307358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5317358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setPosition(float x, float y) { 5327358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setPosition(x, y); 53398129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (x != mPosition.x || y != mPosition.y) { 53498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn Slog.v(SURFACE_TAG, "setPosition: " + this + ". Called by " 53598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 53698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 53785afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn mPosition.set(x, y); 5387358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5397358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5407358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5417358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setSize(int w, int h) { 5427358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setSize(w, h); 54398129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (w != mSize.x || h != mSize.y) { 54498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn Slog.v(SURFACE_TAG, "setSize: " + this + ". Called by " 54598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 54698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 54785afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn mSize.set(w, h); 5487358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5497358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5507358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 55185afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn public void setWindowCrop(Rect crop) { 55285afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn super.setWindowCrop(crop); 553ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner if (crop != null) { 55498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (!crop.equals(mWindowCrop)) { 55598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn Slog.v(SURFACE_TAG, "setWindowCrop: " + this + ". Called by " 55698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 55798129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 558ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner mWindowCrop.set(crop); 559ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner } 56085afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn } 56185afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn 56285afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn @Override 56398365d7663cbd82979a5700faf0050220b01084dJeff Brown public void setLayerStack(int layerStack) { 56498365d7663cbd82979a5700faf0050220b01084dJeff Brown super.setLayerStack(layerStack); 56598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (layerStack != mLayerStack) { 56698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn Slog.v(SURFACE_TAG, "setLayerStack: " + this + ". Called by " + Debug.getCallers(3)); 56798129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 56898365d7663cbd82979a5700faf0050220b01084dJeff Brown mLayerStack = layerStack; 5699de4936c99b979f6010440b043edc6d6142d1980Craig Mautner } 5709de4936c99b979f6010440b043edc6d6142d1980Craig Mautner 5719de4936c99b979f6010440b043edc6d6142d1980Craig Mautner @Override 5727358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void hide() { 5737358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.hide(); 57498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (mShown) { 57598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn Slog.v(SURFACE_TAG, "hide: " + this + ". Called by " 57698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 57798129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 5787358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mShown = false; 5797358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5807358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5817358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void show() { 5827358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.show(); 58398129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (!mShown) { 58498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn Slog.v(SURFACE_TAG, "show: " + this + ". Called by " 58598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 58698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 5877358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mShown = true; 5887358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5897358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5907358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5917358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void destroy() { 5927358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.destroy(); 5937d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "destroy: " + this + ". Called by " 594a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 5957358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.remove(this); 5967358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5977358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 598acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner @Override 599acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner public void release() { 600acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner super.release(); 601acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner Slog.v(SURFACE_TAG, "release: " + this + ". Called by " 602a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 603acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner sSurfaces.remove(this); 604acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 605acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 6067358fbfeb2febb60085067fcacc192f429b06545Craig Mautner static void dumpAllSurfaces() { 6077358fbfeb2febb60085067fcacc192f429b06545Craig Mautner final int N = sSurfaces.size(); 6087358fbfeb2febb60085067fcacc192f429b06545Craig Mautner for (int i = 0; i < N; i++) { 6097358fbfeb2febb60085067fcacc192f429b06545Craig Mautner Slog.i(TAG, "SurfaceDump: " + sSurfaces.get(i)); 6107358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6117358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6127358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 6137358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 6147358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public String toString() { 615fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner return "Surface " + Integer.toHexString(System.identityHashCode(this)) + " " 61698365d7663cbd82979a5700faf0050220b01084dJeff Brown + mName + " (" + mLayerStack + "): shown=" + mShown + " layer=" + mLayer 6177d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y 61885afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn + " " + mSize.x + "x" + mSize.y 61985afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn + " crop=" + mWindowCrop.toShortString(); 6207358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6217358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6227358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 623c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface createSurfaceLocked() { 624c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface == null) { 62583339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner if (DEBUG_ANIM || DEBUG_ORIENTATION) Slog.i(TAG, 62683339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner "createSurface " + this + ": mDrawState=DRAW_PENDING"); 627749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = DRAW_PENDING; 628c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken != null) { 629c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.allDrawn = false; 630c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 631c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 632c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.makeWindowFreezingScreenIfNeededLocked(mWin); 633c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 63464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown int flags = Surface.HIDDEN; 635c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowManager.LayoutParams attrs = mWin.mAttrs; 636c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 637c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((attrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) { 638c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner flags |= Surface.SECURE; 639c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 640c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowState.DEBUG_VISIBILITY) Slog.v( 641c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Creating surface in session " 642c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSession.mSurfaceSession + " window " + this 643c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " w=" + mWin.mCompatFrame.width() 644c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " h=" + mWin.mCompatFrame.height() + " format=" 645c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + attrs.format + " flags=" + flags); 646c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 647c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int w = mWin.mCompatFrame.width(); 648c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int h = mWin.mCompatFrame.height(); 649c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((attrs.flags & LayoutParams.FLAG_SCALED) != 0) { 650c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // for a scaled surface, we always want the requested 651c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // size. 652c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w = mWin.mRequestedWidth; 653c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner h = mWin.mRequestedHeight; 654c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 655c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 656c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Something is wrong and SurfaceFlinger will not like this, 657c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // try to revert to sane values 658c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w <= 0) w = 1; 659c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (h <= 0) h = 1; 660c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 661c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 662c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = 0; 6637d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurfaceAlpha = 0; 664c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceX = 0; 665c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceY = 0; 666c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceW = w; 667c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceH = h; 66885afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn mWin.mLastSystemDecorRect.set(0, 0, 0, 0); 669c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 670c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean isHwAccelerated = (attrs.flags & 671c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0; 672c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : attrs.format; 673c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!PixelFormat.formatHasAlpha(attrs.format)) { 674c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner flags |= Surface.OPAQUE; 675c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 6767358fbfeb2febb60085067fcacc192f429b06545Craig Mautner if (DEBUG_SURFACE_TRACE) { 6777d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurface = new SurfaceTrace( 67864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown mSession.mSurfaceSession, 6797358fbfeb2febb60085067fcacc192f429b06545Craig Mautner attrs.getTitle().toString(), 68064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown w, h, format, flags); 6817358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } else { 6827358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mSurface = new Surface( 68364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown mSession.mSurfaceSession, 684c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attrs.getTitle().toString(), 68564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown w, h, format, flags); 6867358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 687c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = true; 688c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG, 689c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner " CREATE SURFACE " 690c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSurface + " IN SESSION " 691c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSession.mSurfaceSession 692c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": pid=" + mSession.mPid + " format=" 693c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + attrs.format + " flags=0x" 694c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + Integer.toHexString(flags) 695c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " / " + this); 696c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (Surface.OutOfResourcesException e) { 697c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = false; 698c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "OutOfResourcesException creating surface"); 699c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "create", true); 700749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 701c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return null; 702c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (Exception e) { 703c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = false; 704c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.e(TAG, "Exception creating surface", e); 705749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 706c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return null; 707c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 708c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 709c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 710c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Got surface: " + mSurface 711c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ", set left=" + mWin.mFrame.left + " top=" + mWin.mFrame.top 712c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ", animLayer=" + mAnimLayer); 713c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) { 714c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.i(TAG, ">>> OPEN TRANSACTION createSurfaceLocked"); 715c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "CREATE pos=(" 716c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.mFrame.left + "," + mWin.mFrame.top + ") (" 717c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.mCompatFrame.width() + "x" + mWin.mCompatFrame.height() 718c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "), layer=" + mAnimLayer + " HIDE", null); 719c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 720c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface.openTransaction(); 721c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 722c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 723c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceX = mWin.mFrame.left + mWin.mXOffset; 724c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceY = mWin.mFrame.top + mWin.mYOffset; 725c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setPosition(mSurfaceX, mSurfaceY); 726c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = mAnimLayer; 72764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown mSurface.setLayerStack(mLayerStack); 728c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setLayer(mAnimLayer); 7297d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurface.setAlpha(0); 730c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 731c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 732c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error creating surface in " + w, e); 733c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "create-init", true); 734c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 735749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = true; 736c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } finally { 737c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface.closeTransaction(); 738c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 739c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "<<< CLOSE TRANSACTION createSurfaceLocked"); 740c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 741c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 742c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Created surface " + this); 743c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 744c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return mSurface; 745c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 746c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 74798129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn void destroySurfaceLocked(boolean fromAnimator) { 748c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken != null && mWin == mWin.mAppToken.startingWindow) { 749c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.startingDisplayed = false; 750c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 751c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 752c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 753c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 754c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int i = mWin.mChildWindows.size(); 755c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner while (i > 0) { 756c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner i--; 757c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowState c = mWin.mChildWindows.get(i); 758c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mAttachedHidden = true; 759c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 760c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 761c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 762c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) { 763c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 764c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 765c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 766c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 767c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 768c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Window " + this + " destroying surface " 769c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSurface + ", session " + mSession, e); 770c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 771c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurfaceDestroyDeferred) { 772c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null && mPendingDestroySurface != mSurface) { 773c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 774c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 775c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 776c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 777c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 778c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 779c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 780c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); 781c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 782c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface.destroy(); 783c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 784c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface = mSurface; 785c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 786c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 787c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 788c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 789c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 790c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 791c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 792c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 793c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY", e); 794c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 795c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.destroy(); 796c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 79798129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn mAnimator.hideWallpapersLocked(mWin, fromAnimator); 798c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 799c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Exception thrown when destroying Window " + this 800c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " surface " + mSurface + " session " + mSession 801c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": " + e.toString()); 802c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 803c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 804c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 805c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface = null; 806c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface =false; 807bf08af3323117e15a65b74e66b7499d31537f9e1Craig Mautner mDrawState = NO_SURFACE; 808c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 809c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 810c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 81198129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn void destroyDeferredSurfaceLocked(boolean fromAnimator) { 812c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 813c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 814c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 815c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 816c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 817c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 818c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 819c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 820c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); 821c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 822c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface.destroy(); 82398129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn mAnimator.hideWallpapersLocked(mWin, fromAnimator); 824c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 825c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 826d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.w(TAG, "Exception thrown when destroying Window " 827c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + this + " surface " + mPendingDestroySurface 828c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " session " + mSession + ": " + e.toString()); 829c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 830c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceDestroyDeferred = false; 831c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface = null; 832c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 833c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 834c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void computeShownFrameLocked() { 835c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean selfTransformation = mHasLocalTransformation; 836c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Transformation attachedTransformation = 837322e40315609acd5a608440bc469d873e09559caCraig Mautner (mAttachedWinAnimator != null && mAttachedWinAnimator.mHasLocalTransformation) 838322e40315609acd5a608440bc469d873e09559caCraig Mautner ? mAttachedWinAnimator.mTransformation : null; 839322e40315609acd5a608440bc469d873e09559caCraig Mautner Transformation appTransformation = (mAppAnimator != null && mAppAnimator.hasTransformation) 840322e40315609acd5a608440bc469d873e09559caCraig Mautner ? mAppAnimator.transformation : null; 841c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 842c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Wallpapers are animated based on the "real" window they 843c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // are currently targeting. 844918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (mIsWallpaper && mAnimator.mLowerWallpaperTarget == null 845918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner && mAnimator.mWallpaperTarget != null) { 846918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner final WindowStateAnimator wallpaperAnimator = mAnimator.mWallpaperTarget.mWinAnimator; 847918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (wallpaperAnimator.mHasLocalTransformation && 848918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner wallpaperAnimator.mAnimation != null && 849918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner !wallpaperAnimator.mAnimation.getDetachWallpaper()) { 850918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner attachedTransformation = wallpaperAnimator.mTransformation; 851c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER && attachedTransformation != null) { 852c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "WP target attached xform: " + attachedTransformation); 853c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 854c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 855918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner final AppWindowAnimator wpAppAnimator = mAnimator.mWpAppAnimator; 856918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (wpAppAnimator != null && wpAppAnimator.hasTransformation 857918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner && wpAppAnimator.animation != null 858918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner && !wpAppAnimator.animation.getDetachWallpaper()) { 859594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner appTransformation = wpAppAnimator.transformation; 860c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER && appTransformation != null) { 861c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "WP target app xform: " + appTransformation); 862c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 863c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 864c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 865c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 866a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final int displayId = mWin.getDisplayId(); 867a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final ScreenRotationAnimation screenRotationAnimation = 868a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mAnimator.getScreenRotationAnimationLocked(displayId); 869a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final boolean screenAnimation = 870a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner screenRotationAnimation != null && screenRotationAnimation.isAnimating(); 871c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation || attachedTransformation != null 872c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || appTransformation != null || screenAnimation) { 873c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // cache often used attributes locally 874c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Rect frame = mWin.mFrame; 875c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float tmpFloats[] = mService.mTmpFloats; 876c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Matrix tmpMatrix = mWin.mTmpMatrix; 877c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 878c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Compute the desired transformation. 879c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 880c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are doing a screen animation, the global rotation 881c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // applied to windows can result in windows that are carefully 882c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // aligned with each other to slightly separate, allowing you 883c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // to see what is behind them. An unsightly mess. This... 884c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // thing... magically makes it call good: scale each window 885c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // slightly (two pixels larger in each dimension, from the 886c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // window's center). 887c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float w = frame.width(); 888c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float h = frame.height(); 889c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w>=1 && h>=1) { 890c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.setScale(1 + 2/w, 1 + 2/h, w/2, h/2); 891c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 892c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.reset(); 893c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 894c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 895c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.reset(); 896c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 897c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postScale(mWin.mGlobalScale, mWin.mGlobalScale); 898c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation) { 899c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(mTransformation.getMatrix()); 900c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 901c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postTranslate(frame.left + mWin.mXOffset, frame.top + mWin.mYOffset); 902c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attachedTransformation != null) { 903c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(attachedTransformation.getMatrix()); 904c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 905c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (appTransformation != null) { 906c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(appTransformation.getMatrix()); 907c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 908a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mAnimator.mUniverseBackground != null) { 909a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.postConcat(mAnimator.mUniverseBackground.mUniverseTransform.getMatrix()); 910a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 911c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 912a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner tmpMatrix.postConcat(screenRotationAnimation.getEnterTransformation().getMatrix()); 913c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 9141cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov MagnificationSpec spec = mWin.getWindowMagnificationSpecLocked(); 9151cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (spec != null && !spec.isNop()) { 9161cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov tmpMatrix.postScale(spec.mScale, spec.mScale); 9171cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov tmpMatrix.postTranslate(spec.mOffsetX, spec.mOffsetY); 9181cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 919c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 920c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // "convert" it into SurfaceFlinger's format 921c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // (a 2x2 matrix + an offset) 922c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Here we must not transform the position of the surface 923c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // since it is already included in the transformation. 924c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Transform: " + matrix); 925c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 926c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mHaveMatrix = true; 927c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.getValues(tmpFloats); 928c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx = tmpFloats[Matrix.MSCALE_X]; 929c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDx = tmpFloats[Matrix.MSKEW_Y]; 930c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy = tmpFloats[Matrix.MSKEW_X]; 931c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDy = tmpFloats[Matrix.MSCALE_Y]; 932c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float x = tmpFloats[Matrix.MTRANS_X]; 933c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float y = tmpFloats[Matrix.MTRANS_Y]; 934c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int w = frame.width(); 935c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int h = frame.height(); 936c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mShownFrame.set(x, y, x+w, y+h); 937c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 938c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Now set the alpha... but because our current hardware 939c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // can't do alpha transformation on a non-opaque surface, 940c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // turn it off if we are running an animation that is also 941c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // transforming since it is more important to have that 942c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // animation be smooth. 943c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha = mAlpha; 944c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!mService.mLimitedAlphaCompositing 945c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || (!PixelFormat.formatHasAlpha(mWin.mAttrs.format) 946c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDsDy, mDtDy) 947c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && x == frame.left && y == frame.top))) { 948c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Applying alpha transform"); 949c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation) { 950c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= mTransformation.getAlpha(); 951c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 952c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attachedTransformation != null) { 953c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= attachedTransformation.getAlpha(); 954c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 955c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (appTransformation != null) { 956c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= appTransformation.getAlpha(); 957c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 958a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mAnimator.mUniverseBackground != null) { 959a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mShownAlpha *= mAnimator.mUniverseBackground.mUniverseTransform.getAlpha(); 960a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 961c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 962a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mShownAlpha *= screenRotationAnimation.getEnterTransformation().getAlpha(); 963c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 964c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 965c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Not applying alpha transform"); 966c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 967c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 968a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner if ((DEBUG_SURFACE_TRACE || WindowManagerService.localLOGV) 969a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner && (mShownAlpha == 1.0 || mShownAlpha == 0.0)) Slog.v( 970a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner TAG, "computeShownFrameLocked: Animating " + this + " mAlpha=" + mAlpha 971a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " self=" + (selfTransformation ? mTransformation.getAlpha() : "null") 972a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " attached=" + (attachedTransformation == null ? 973a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner "null" : attachedTransformation.getAlpha()) 974a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " app=" + (appTransformation == null ? "null" : appTransformation.getAlpha()) 975a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " screen=" + (screenAnimation ? 976a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner screenRotationAnimation.getEnterTransformation().getAlpha() : "null")); 977c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return; 978918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner } else if (mIsWallpaper && 9794d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner (mAnimator.mPendingActions & WindowAnimator.WALLPAPER_ACTION_PENDING) != 0) { 9804d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner return; 981c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 982c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 983c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 9844d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner TAG, "computeShownFrameLocked: " + this + 9854d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner " not attached, mAlpha=" + mAlpha); 9861cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 9871cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov final boolean applyUniverseTransformation = (mAnimator.mUniverseBackground != null 9881cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov && mWin.mAttrs.type != WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND 9891cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov && mWin.mBaseLayer < mAnimator.mAboveUniverseLayer); 9901cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov MagnificationSpec spec = mWin.getWindowMagnificationSpecLocked(); 9911cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (applyUniverseTransformation || spec != null) { 992a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final Rect frame = mWin.mFrame; 993a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final float tmpFloats[] = mService.mTmpFloats; 994a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final Matrix tmpMatrix = mWin.mTmpMatrix; 9951cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 996a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.setScale(mWin.mGlobalScale, mWin.mGlobalScale); 997a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.postTranslate(frame.left + mWin.mXOffset, frame.top + mWin.mYOffset); 9981cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 9991cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (applyUniverseTransformation) { 10001cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov tmpMatrix.postConcat(mAnimator.mUniverseBackground.mUniverseTransform.getMatrix()); 10011cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 10021cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 10031cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (spec != null && !spec.isNop()) { 10041cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov tmpMatrix.postScale(spec.mScale, spec.mScale); 10051cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov tmpMatrix.postTranslate(spec.mOffsetX, spec.mOffsetY); 10061cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 10071cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1008a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.getValues(tmpFloats); 10091cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1010a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mHaveMatrix = true; 1011a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDx = tmpFloats[Matrix.MSCALE_X]; 1012a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDx = tmpFloats[Matrix.MSKEW_Y]; 1013a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDy = tmpFloats[Matrix.MSKEW_X]; 1014a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDy = tmpFloats[Matrix.MSCALE_Y]; 1015a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn float x = tmpFloats[Matrix.MTRANS_X]; 1016a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn float y = tmpFloats[Matrix.MTRANS_Y]; 1017a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn int w = frame.width(); 1018a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn int h = frame.height(); 10191cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mWin.mShownFrame.set(x, y, x + w, y + h); 10201cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 10211cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mShownAlpha = mAlpha; 10221cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (applyUniverseTransformation) { 10231cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mShownAlpha *= mAnimator.mUniverseBackground.mUniverseTransform.getAlpha(); 10241cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1025a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else { 1026a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mWin.mShownFrame.set(mWin.mFrame); 1027a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mWin.mXOffset != 0 || mWin.mYOffset != 0) { 1028a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mWin.mShownFrame.offset(mWin.mXOffset, mWin.mYOffset); 1029a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1030a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mShownAlpha = mAlpha; 1031a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mHaveMatrix = false; 1032a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDx = mWin.mGlobalScale; 1033a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDx = 0; 1034a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDy = 0; 1035a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDy = mWin.mGlobalScale; 1036a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1037a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1038a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 1039a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn void applyDecorRect(final Rect decorRect) { 1040a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final WindowState w = mWin; 1041a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Compute the offset of the window in relation to the decor rect. 1042a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final int offX = w.mXOffset + w.mFrame.left; 1043a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final int offY = w.mYOffset + w.mFrame.top; 1044a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Initialize the decor rect to the entire frame. 1045a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mFrame.width(), w.mFrame.height()); 1046a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Intersect with the decor rect, offsetted by window position. 1047a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.intersect(decorRect.left-offX, decorRect.top-offY, 1048a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn decorRect.right-offX, decorRect.bottom-offY); 1049a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // If size compatibility is being applied to the window, the 1050a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // surface is scaled relative to the screen. Also apply this 1051a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // scaling to the crop rect. We aren't using the standard rect 1052a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // scale function because we want to round things to make the crop 1053a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // always round to a larger rect to ensure we don't crop too 1054a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // much and hide part of the window that should be seen. 1055a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (w.mEnforceSizeCompat && w.mInvGlobalScale != 1.0f) { 1056a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final float scale = w.mInvGlobalScale; 1057a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.left = (int) (w.mSystemDecorRect.left * scale - 0.5f); 1058a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.top = (int) (w.mSystemDecorRect.top * scale - 0.5f); 1059a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.right = (int) ((w.mSystemDecorRect.right+1) * scale - 0.5f); 1060a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.bottom = (int) ((w.mSystemDecorRect.bottom+1) * scale - 0.5f); 1061a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1062c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1063d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner 10643e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn void updateSurfaceWindowCrop(final boolean recoveringMemory) { 10653e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn final WindowState w = mWin; 106669b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner DisplayInfo displayInfo = w.mDisplayContent.getDisplayInfo(); 10673e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn 10683e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // Need to recompute a new system decor rect each time. 10693e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { 10703e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // Currently can't do this cropping for scaled windows. We'll 10713e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // just keep the crop rect the same as the source surface. 10723e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mRequestedWidth, w.mRequestedHeight); 107369b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner } else if (!w.isDefaultDisplay()) { 107428e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown // On a different display there is no system decor. Crop the window 107528e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown // by the screen boundaries. 10763671410b9e09e1c5ec05dfc58651a8efaa7790ddJeff Brown w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height()); 107728e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown w.mSystemDecorRect.intersect(-w.mCompatFrame.left, -w.mCompatFrame.top, 107828e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown displayInfo.logicalWidth - w.mCompatFrame.left, 107928e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown displayInfo.logicalHeight - w.mCompatFrame.top); 10803e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } else if (w.mLayer >= mService.mSystemDecorLayer) { 10813e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // Above the decor layer is easy, just use the entire window. 1082a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Unless we have a universe background... in which case all the 1083a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // windows need to be cropped by the screen, so they don't cover 1084a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // the universe background. 1085a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mAnimator.mUniverseBackground == null) { 1086a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), 1087a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mCompatFrame.height()); 1088a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else { 1089a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn applyDecorRect(mService.mScreenRect); 1090a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1091a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND) { 1092a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // The universe background isn't cropped. 10933e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), 10943e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mCompatFrame.height()); 10953e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } else { 1096a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn applyDecorRect(mService.mSystemDecorRect); 10973e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 10983e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn 10993e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (!w.mSystemDecorRect.equals(w.mLastSystemDecorRect)) { 11003e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mLastSystemDecorRect.set(w.mSystemDecorRect); 11013e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn try { 11023e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 11033e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn "CROP " + w.mSystemDecorRect.toShortString(), null); 11043e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn mSurface.setWindowCrop(w.mSystemDecorRect); 11053e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } catch (RuntimeException e) { 11063e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn Slog.w(TAG, "Error setting crop surface of " + w 11073e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn + " crop=" + w.mSystemDecorRect.toShortString(), e); 11083e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (!recoveringMemory) { 11093e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn mService.reclaimSomeSurfaceMemoryLocked(this, "crop", true); 11103e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11113e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11123e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11133e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11143e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn 1115a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner void setSurfaceBoundariesLocked(final boolean recoveringMemory) { 1116c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowState w = mWin; 1117c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int width, height; 1118c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { 1119c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // for a scaled surface, we just want to use 1120c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // the requested size. 1121c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = w.mRequestedWidth; 1122c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = w.mRequestedHeight; 1123c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1124c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = w.mCompatFrame.width(); 1125c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = w.mCompatFrame.height(); 1126c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1127c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1128c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (width < 1) { 1129c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = 1; 1130c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1131c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (height < 1) { 1132c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = 1; 1133c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1134c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean surfaceResized = mSurfaceW != width || mSurfaceH != height; 1135c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (surfaceResized) { 1136c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceW = width; 1137c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceH = height; 1138c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1139c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 11404d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner final float left = w.mShownFrame.left; 11414d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner final float top = w.mShownFrame.top; 11424d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner if (mSurfaceX != left || mSurfaceY != top) { 1143c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1144c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 11454d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner "POS " + left + ", " + top, null); 11464d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mSurfaceX = left; 11474d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mSurfaceY = top; 11484d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mSurface.setPosition(left, top); 1149c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1150c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error positioning surface of " + w 11514d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + " pos=(" + left 11524d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + "," + top + ")", e); 1153c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 1154c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "position", true); 1155c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1156c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1157c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1158c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1159c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (surfaceResized) { 1160c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1161c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1162c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "SIZE " + width + "x" + height, null); 1163c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceResized = true; 1164c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setSize(width, height); 116576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner final int displayId = w.mDisplayContent.getDisplayId(); 116676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner mAnimator.setPendingLayoutChanges(displayId, 116776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER); 11683a67f35f5e912b9c1ec44adbdc5531427318b12dCraig Mautner if ((w.mAttrs.flags & LayoutParams.FLAG_DIM_BEHIND) != 0) { 116959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner final DisplayInfo displayInfo = mWin.mDisplayContent.getDisplayInfo(); 1170a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mService.startDimmingLocked(this, w.mExiting ? 0 : w.mAttrs.dimAmount, 117159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner displayInfo.appWidth, displayInfo.appHeight); 11723a67f35f5e912b9c1ec44adbdc5531427318b12dCraig Mautner } 1173c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1174c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If something goes wrong with the surface (such 1175c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // as running out of memory), don't take down the 1176c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // entire system. 1177c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.e(TAG, "Error resizing surface of " + w 1178c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " size=(" + width + "x" + height + ")", e); 1179c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 1180c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "size", true); 1181c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1182c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1183c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 118485afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn 11853e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn updateSurfaceWindowCrop(recoveringMemory); 1186acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1187acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1188acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner public void prepareSurfaceLocked(final boolean recoveringMemory) { 1189acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner final WindowState w = mWin; 1190acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner if (mSurface == null) { 1191acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner if (w.mOrientationChanging) { 1192acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner if (DEBUG_ORIENTATION) { 1193acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner Slog.v(TAG, "Orientation change skips hidden " + w); 1194acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1195acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner w.mOrientationChanging = false; 1196acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1197acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner return; 1198acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1199acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1200acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner boolean displayed = false; 1201acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1202acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner computeShownFrameLocked(); 1203acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1204a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner setSurfaceBoundariesLocked(recoveringMemory); 1205c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1206918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (mIsWallpaper && !mWin.mWallpaperVisible) { 12070fa77c1e0fc218040efc570936e988dbeece399cCraig Mautner // Wallpaper is no longer visible and there is no wp target => hide it. 12080fa77c1e0fc218040efc570936e988dbeece399cCraig Mautner hide(); 12090fa77c1e0fc218040efc570936e988dbeece399cCraig Mautner } else if (w.mAttachedHidden || !w.isReadyForDisplay()) { 12100afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner hide(); 121198129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn mAnimator.hideWallpapersLocked(w, true); 1212b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner 1213c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are waiting for this window to handle an 1214c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // orientation change, well, it is hidden, so 1215c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // doesn't really matter. Note that this does 1216c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // introduce a potential glitch if the window 1217c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // becomes unhidden before it has drawn for the 1218c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // new orientation. 1219c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mOrientationChanging) { 1220c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mOrientationChanging = false; 1221c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, 1222c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Orientation change skips hidden " + w); 1223c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1224c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else if (mLastLayer != mAnimLayer 1225c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastAlpha != mShownAlpha 1226c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDsDx != mDsDx 1227c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDtDx != mDtDx 1228c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDsDy != mDsDy 1229c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDtDy != mDtDy 1230c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || w.mLastHScale != w.mHScale 1231c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || w.mLastVScale != w.mVScale 1232749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner || mLastHidden) { 1233c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner displayed = true; 1234c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastAlpha = mShownAlpha; 1235c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastLayer = mAnimLayer; 1236c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDsDx = mDsDx; 1237c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDtDx = mDtDx; 1238c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDsDy = mDsDy; 1239c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDtDy = mDtDy; 1240c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mLastHScale = w.mHScale; 1241c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mLastVScale = w.mVScale; 1242c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1243c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "alpha=" + mShownAlpha + " layer=" + mAnimLayer 1244c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " matrix=[" + (mDsDx*w.mHScale) 1245c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "," + (mDtDx*w.mVScale) 1246c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "][" + (mDsDy*w.mHScale) 1247c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "," + (mDtDy*w.mVScale) + "]", null); 1248c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 1249c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1250c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceAlpha = mShownAlpha; 1251c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setAlpha(mShownAlpha); 1252ad5725d7985a784056b02b97ab76357a667a6ad4Craig Mautner mSurfaceLayer = mAnimLayer; 1253ad5725d7985a784056b02b97ab76357a667a6ad4Craig Mautner mSurface.setLayer(mAnimLayer); 1254c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setMatrix( 1255c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx*w.mHScale, mDtDx*w.mVScale, 1256c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy*w.mHScale, mDtDy*w.mVScale); 1257749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner 1258749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mLastHidden && mDrawState == HAS_DRAWN) { 1259749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1260749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner "SHOW (performLayout)", null); 1261749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w 1262749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner + " during relayout"); 1263749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (showSurfaceRobustlyLocked()) { 1264749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = false; 1265918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (mIsWallpaper) { 1266507a2ee12b6d1d683e4a5806804c472b3fe32e61Craig Mautner mService.dispatchWallpaperVisibility(w, true); 1267507a2ee12b6d1d683e4a5806804c472b3fe32e61Craig Mautner } 1268749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } else { 1269749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner w.mOrientationChanging = false; 1270749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1271749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1272749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mSurface != null) { 1273749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner w.mToken.hasVisible = true; 1274749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1275c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1276c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error updating surface in " + w, e); 1277c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 1278c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "update", true); 1279c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1280c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1281c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1282c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 12839e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner if (DEBUG_ANIM && isAnimating()) { 12849e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner Slog.v(TAG, "prepareSurface: No changes in animation for " + this); 128583339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner } 1286c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner displayed = true; 1287c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1288c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1289c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (displayed) { 1290c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mOrientationChanging) { 1291c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!w.isDrawnLw()) { 12922639da500e3d53ea3a17d888b1c0001d043c6b98Craig Mautner mAnimator.mBulkUpdateParams &= ~SET_ORIENTATION_CHANGE_COMPLETE; 1293c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, 1294c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Orientation continue waiting for draw in " + w); 1295c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1296c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mOrientationChanging = false; 1297c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation change complete in " + w); 1298c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1299c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1300c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mToken.hasVisible = true; 1301c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1302c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1303c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 130448ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner void setTransparentRegionHint(final Region region) { 13051f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner if (mSurface == null) { 13061f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true"); 13071f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner return; 13081f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner } 130948ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 131048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner ">>> OPEN TRANSACTION setTransparentRegion"); 131148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Surface.openTransaction(); 131248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner try { 131348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, 131448ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner "transparentRegionHint=" + region, null); 131548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner mSurface.setTransparentRegionHint(region); 131648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } finally { 131748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Surface.closeTransaction(); 131848ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 131948ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner "<<< CLOSE TRANSACTION setTransparentRegion"); 132048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 132148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 132248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner 132348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner void setWallpaperOffset(int left, int top) { 13243e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn mSurfaceX = left; 13253e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn mSurfaceY = top; 13263e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (mAnimating) { 13273e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // If this window (or its app token) is animating, then the position 13283e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // of the surface will be re-computed on the next animation frame. 13293e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // We can't poke it directly here because it depends on whatever 13303e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // transformation is being applied by the animation. 13313e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn return; 13323e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 13333e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 13343e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn ">>> OPEN TRANSACTION setWallpaperOffset"); 133548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Surface.openTransaction(); 133648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner try { 13373e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, 13383e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn "POS " + left + ", " + top, null); 13393e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn mSurface.setPosition(mWin.mFrame.left + left, mWin.mFrame.top + top); 13403e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn updateSurfaceWindowCrop(false); 134148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } catch (RuntimeException e) { 134248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Slog.w(TAG, "Error positioning surface of " + mWin 134348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner + " pos=(" + left + "," + top + ")", e); 13443e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } finally { 13453e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn Surface.closeTransaction(); 13463e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 13473e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn "<<< CLOSE TRANSACTION setWallpaperOffset"); 134848ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 134948ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 135048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner 1351c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // This must be called while inside a transaction. 1352c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean performShowLocked() { 13535962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner if (mWin.isHiddenFromUserLocked()) { 135488400d3a31139c40c4014faf86c243647087ef6cCraig Mautner Slog.w(TAG, "current user violation " + mService.mCurrentUserId + " trying to display " 1355a2d7b1117abc23a3ff0ccda15a2f9138aaa7f4fcCraig Mautner + this + ", type " + mWin.mAttrs.type + ", belonging to " + mWin.mOwnerUid); 13569dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautner return false; 13579dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautner } 13586fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_VISIBILITY || (DEBUG_STARTING_WINDOW && 13596fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING)) { 1360c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 1361c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 1362c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 1363c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 1364c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1365d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.v(TAG, "performShow on " + this 1366749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner + ": mDrawState=" + mDrawState + " readyForDisplay=" 13676e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn + mWin.isReadyForDisplayIgnoringKeyguard() 13686fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " starting=" + (mWin.mAttrs.type == TYPE_APPLICATION_STARTING) 1369c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " during animation: policyVis=" + mWin.mPolicyVisibility 1370c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " attHidden=" + mWin.mAttachedHidden 1371c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok.hiddenRequested=" 1372c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hiddenRequested : false) 1373c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok.hidden=" 1374c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hidden : false) 1375c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " animating=" + mAnimating 1376c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok animating=" 1377322e40315609acd5a608440bc469d873e09559caCraig Mautner + (mAppAnimator != null ? mAppAnimator.animating : false), e); 13786fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 13796fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (mDrawState == READY_TO_SHOW && mWin.isReadyForDisplayIgnoringKeyguard()) { 13806fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) 13816fbda63e68513ece4409dac845588711ab25c39dCraig Mautner WindowManagerService.logSurface(mWin, "SHOW (performShowLocked)", null); 13826fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_VISIBILITY || (DEBUG_STARTING_WINDOW && 13836fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING)) { 13846fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.v(TAG, "Showing " + this 13856fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " during animation: policyVis=" + mWin.mPolicyVisibility 13866fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " attHidden=" + mWin.mAttachedHidden 13876fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " tok.hiddenRequested=" 13886fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hiddenRequested : false) 13896fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " tok.hidden=" 13906fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hidden : false) 13916fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " animating=" + mAnimating 13926fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " tok animating=" 1393322e40315609acd5a608440bc469d873e09559caCraig Mautner + (mAppAnimator != null ? mAppAnimator.animating : false)); 13946fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 1395c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1396c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.enableScreenIfNeededLocked(); 1397c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1398c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner applyEnterAnimationLocked(); 1399c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1400de6198ebd7f9ea5b7940d38bf5839dfbc6a192c4Craig Mautner // Force the show in the next prepareSurfaceLocked() call. 1401c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastAlpha = -1; 1402ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner if (DEBUG_SURFACE_TRACE || DEBUG_ANIM) 1403ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner Slog.v(TAG, "performShowLocked: mDrawState=HAS_DRAWN in " + this); 1404749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = HAS_DRAWN; 1405711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner mService.updateLayoutToAnimationLocked(); 1406c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1407c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int i = mWin.mChildWindows.size(); 1408c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner while (i > 0) { 1409c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner i--; 1410c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowState c = mWin.mChildWindows.get(i); 1411c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (c.mAttachedHidden) { 1412c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mAttachedHidden = false; 1413c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (c.mWinAnimator.mSurface != null) { 1414c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mWinAnimator.performShowLocked(); 1415c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // It hadn't been shown, which means layout not 1416c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // performed on it, so now we want to make sure to 1417c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // do a layout. If called from within the transaction 1418c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // loop, this will cause it to restart with a new 1419c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // layout. 142019d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner c.mDisplayContent.layoutNeeded = true; 1421c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1422c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1423c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1424c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1425c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAttrs.type != TYPE_APPLICATION_STARTING 1426c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && mWin.mAppToken != null) { 1427c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.firstWindowDrawn = true; 1428c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1429c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken.startingData != null) { 1430c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_STARTING_WINDOW || 1431d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 1432c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Finish starting " + mWin.mToken 1433c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": first real window is shown, no animation"); 1434c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If this initial window is animating, stop it -- we 1435c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // will do an animation to reveal it from behind the 1436c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // starting window, so there is no need for it to also 1437c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // be doing its own stuff. 14384d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner clearAnimation(); 1439c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mFinishedStarting.add(mWin.mAppToken); 1440c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mH.sendEmptyMessage(H.FINISHED_STARTING); 1441c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1442c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.updateReportedVisibilityLocked(); 1443c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1444c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1445c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1446c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1447c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1448c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return false; 1449c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1450c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1451c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 1452c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Have the surface flinger show a surface, robustly dealing with 1453c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * error conditions. In particular, if there is not enough memory 1454c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * to show the surface, then we will try to get rid of other surfaces 1455c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * in order to succeed. 1456c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * 1457c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @return Returns true if the surface was successfully shown. 1458c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 1459c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean showSurfaceRobustlyLocked() { 1460c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1461c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 1462c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = true; 1463c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.show(); 1464c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mTurnOnScreen) { 1465c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) Slog.v(TAG, 1466c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Show surface turning screen on: " + mWin); 1467c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mTurnOnScreen = false; 14687d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN; 1469c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1470c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1471c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1472c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1473c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Failure showing surface " + mSurface + " in " + mWin, e); 1474c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1475c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1476c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "show", true); 1477c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1478c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return false; 1479c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1480c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1481c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void applyEnterAnimationLocked() { 1482c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final int transit; 1483c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mEnterAnimationPending) { 1484c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mEnterAnimationPending = false; 1485c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner transit = WindowManagerPolicy.TRANSIT_ENTER; 1486c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1487c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner transit = WindowManagerPolicy.TRANSIT_SHOW; 1488c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1489c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner applyAnimationLocked(transit, true); 14901cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mService.scheduleNotifyWindowTranstionIfNeededLocked(mWin, transit); 1491c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1492c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 149348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner // TODO(cmautner): Move back to WindowState? 1494c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 1495c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Choose the correct animation and set it to the passed WindowState. 1496c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @param transit If WindowManagerPolicy.TRANSIT_PREVIEW_DONE and the app window has been drawn 1497c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * then the animation will be app_starting_exit. Any other value loads the animation from 1498c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * the switch statement below. 1499c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @param isEntrance The animation type the last time this was called. Used to keep from 1500c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * loading the same animation twice. 1501c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @return true if an animation has been loaded. 1502c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 1503c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean applyAnimationLocked(int transit, boolean isEntrance) { 1504c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mLocalAnimating && mAnimationIsEntrance == isEntrance) { 1505c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are trying to apply an animation, but already running 1506c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // an animation of the same type, then just leave that one alone. 1507c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1508c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1509c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1510c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Only apply an animation if the display isn't frozen. If it is 1511c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // frozen, there is no reason to animate and it can cause strange 1512c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // artifacts when we unfreeze the display if some different animation 1513c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // is running. 1514c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mService.okToDisplay()) { 1515c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int anim = mPolicy.selectAnimationLw(mWin, transit); 1516c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int attr = -1; 1517c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Animation a = null; 1518c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (anim != 0) { 15194c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn a = anim != -1 ? AnimationUtils.loadAnimation(mContext, anim) : null; 1520c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1521c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner switch (transit) { 1522c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_ENTER: 1523c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation; 1524c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1525c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_EXIT: 1526c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation; 1527c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1528c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_SHOW: 1529c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation; 1530c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1531c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_HIDE: 1532c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation; 1533c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1534c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1535c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attr >= 0) { 1536c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner a = mService.loadAnimation(mWin.mAttrs, attr); 1537c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1538c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1539d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 1540c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "applyAnimation: win=" + this 1541c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " anim=" + anim + " attr=0x" + Integer.toHexString(attr) 15424d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + " a=" + a 15438863cca57d8c901a2da0edc422b653ae68849313Craig Mautner + " transit=" + transit 154483339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner + " isEntrance=" + isEntrance + " Callers " + Debug.getCallers(3)); 1545c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (a != null) { 1546c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_ANIM) { 1547c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 1548c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 1549c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 1550c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 1551c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1552d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.v(TAG, "Loaded animation " + a + " for " + this, e); 1553c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1554c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner setAnimation(a); 1555c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimationIsEntrance = isEntrance; 1556c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1557c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1558c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner clearAnimation(); 1559c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1560c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1561c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return mAnimation != null; 1562c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1563c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1564a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void dump(PrintWriter pw, String prefix, boolean dumpAll) { 1565a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimating || mLocalAnimating || mAnimationIsEntrance 1566a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner || mAnimation != null) { 1567a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(prefix); pw.print("mAnimating="); pw.print(mAnimating); 1568a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mLocalAnimating="); pw.print(mLocalAnimating); 1569a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mAnimationIsEntrance="); pw.print(mAnimationIsEntrance); 1570a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mAnimation="); pw.println(mAnimation); 1571a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1572a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mHasTransformation || mHasLocalTransformation) { 1573a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(prefix); pw.print("XForm: has="); 1574a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(mHasTransformation); 1575a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" hasLocal="); pw.print(mHasLocalTransformation); 1576a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" "); mTransformation.printShortString(pw); 1577a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.println(); 1578a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1579c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 1580c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (dumpAll) { 1581c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mSurface="); pw.println(mSurface); 15826fbda63e68513ece4409dac845588711ab25c39dCraig Mautner pw.print(prefix); pw.print("mDrawState="); 15836fbda63e68513ece4409dac845588711ab25c39dCraig Mautner pw.print(drawStateToString(mDrawState)); 1584749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner pw.print(" mLastHidden="); pw.println(mLastHidden); 1585c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1586c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("Surface: shown="); pw.print(mSurfaceShown); 1587c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" layer="); pw.print(mSurfaceLayer); 1588c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" alpha="); pw.print(mSurfaceAlpha); 1589c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" rect=("); pw.print(mSurfaceX); 1590c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(","); pw.print(mSurfaceY); 1591c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(") "); pw.print(mSurfaceW); 1592c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" x "); pw.println(mSurfaceH); 1593c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1594c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 1595c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mPendingDestroySurface="); 1596c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.println(mPendingDestroySurface); 1597c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1598c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurfaceResized || mSurfaceDestroyDeferred) { 1599c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mSurfaceResized="); pw.print(mSurfaceResized); 1600c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mSurfaceDestroyDeferred="); pw.println(mSurfaceDestroyDeferred); 1601c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1602a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND) { 1603a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn pw.print(prefix); pw.print("mUniverseTransform="); 1604a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mUniverseTransform.printShortString(pw); 1605a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn pw.println(); 1606a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1607c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) { 1608c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha); 1609c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mAlpha="); pw.print(mAlpha); 1610c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mLastAlpha="); pw.println(mLastAlpha); 1611c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1612c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mHaveMatrix || mWin.mGlobalScale != 1) { 1613c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mGlobalScale="); pw.print(mWin.mGlobalScale); 1614c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDsDx="); pw.print(mDsDx); 1615c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDtDx="); pw.print(mDtDx); 1616c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDsDy="); pw.print(mDsDy); 1617c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDtDy="); pw.println(mDtDy); 1618c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1619a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1620a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 1621c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner @Override 1622c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner public String toString() { 1623529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn StringBuffer sb = new StringBuffer("WindowStateAnimator{"); 1624529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(this))); 1625529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append(' '); 1626529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append(mWin.mAttrs.getTitle()); 1627529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append('}'); 1628c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner return sb.toString(); 1629c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner } 1630a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner} 1631