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; 6b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_ANIM; 7b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_LAYERS; 8b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_ORIENTATION; 9b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_STARTING_WINDOW; 10b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_SURFACE_TRACE; 11b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautnerimport static com.android.server.wm.WindowManagerService.SHOW_TRANSACTIONS; 12b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; 13b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautnerimport static com.android.server.wm.WindowManagerService.SHOW_LIGHT_TRANSACTIONS; 14b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautnerimport static com.android.server.wm.WindowManagerService.SHOW_SURFACE_ALLOC; 15b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautnerimport static com.android.server.wm.WindowManagerService.localLOGV; 162639da500e3d53ea3a17d888b1c0001d043c6b98Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE; 177d8df3905d294127cc58100912a57c816bfb2502Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_TURN_ON_SCREEN; 18d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner 19c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.content.Context; 20c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.graphics.Matrix; 21c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.graphics.PixelFormat; 227358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport android.graphics.Point; 237358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport android.graphics.PointF; 24c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.graphics.Rect; 25581068131c192a8c495fac00d3c61807580c7ecaCraig Mautnerimport android.graphics.RectF; 2648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautnerimport android.graphics.Region; 27a51a9564fd53b661446cd63eea23208656acc678Craig Mautnerimport android.os.Debug; 28a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.util.Slog; 29545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganovimport android.view.Display; 3059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.DisplayInfo; 31152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganovimport android.view.MagnificationSpec; 32a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkinimport android.view.Surface.OutOfResourcesException; 333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl; 347358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport android.view.SurfaceSession; 35a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.WindowManager; 36a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.WindowManagerPolicy; 37c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.view.WindowManager.LayoutParams; 38a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.animation.Animation; 39c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.view.animation.AnimationUtils; 40a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.animation.Transformation; 41a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 42a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport com.android.server.wm.WindowManagerService.H; 43a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 44a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport java.io.PrintWriter; 457358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport java.util.ArrayList; 46a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 4759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerclass WinAnimatorList extends ArrayList<WindowStateAnimator> { 4859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner} 4959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 50a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner/** 51c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Keep track of animations and surface operations for a single WindowState. 52c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner **/ 53a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerclass WindowStateAnimator { 54c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final String TAG = "WindowStateAnimator"; 55a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 56918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner // Unchanging local convenience fields. 57a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowManagerService mService; 58a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowState mWin; 59322e40315609acd5a608440bc469d873e09559caCraig Mautner final WindowStateAnimator mAttachedWinAnimator; 60e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner final WindowAnimator mAnimator; 618863cca57d8c901a2da0edc422b653ae68849313Craig Mautner AppWindowAnimator mAppAnimator; 62c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Session mSession; 63c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowManagerPolicy mPolicy; 64c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Context mContext; 65918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner final boolean mIsWallpaper; 66a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 67a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // If this is a universe background window, this is the transformation 68a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // it is applying to the rest of the universe. 69a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final Transformation mUniverseTransform = new Transformation(); 70a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 71a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Currently running animation. 72a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mAnimating; 73a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mLocalAnimating; 74a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner Animation mAnimation; 75a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mAnimationIsEntrance; 76a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mHasTransformation; 77a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mHasLocalTransformation; 78a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final Transformation mTransformation = new Transformation(); 79a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mWasAnimating; // Were we animating going into the most recent animation step? 80c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimLayer; 81c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mLastLayer; 82c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 8329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian SurfaceControl mSurfaceControl; 843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl mPendingDestroySurface; 85c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 86c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 87c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Set when we have changed the size of the surface, to know that 88c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * we must tell them application to resize (and thus redraw itself). 89c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 90c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceResized; 91c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 92c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 93c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Set if the client has asked that the destroy of its surface be delayed 94c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * until it explicitly says it is okay. 95c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 96c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceDestroyDeferred; 97c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 987d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mShownAlpha = 0; 997d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mAlpha = 0; 1007d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mLastAlpha = 0; 101c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 102c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Used to save animation distances between the time they are calculated and when they are 103c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // used. 104c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimDw; 105c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimDh; 106c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mDsDx=1, mDtDx=0, mDsDy=0, mDtDy=1; 107c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1; 108c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 109c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mHaveMatrix; 110c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 111c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // For debugging, this is the last information given to the surface flinger. 112c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceShown; 113c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mSurfaceX, mSurfaceY, mSurfaceW, mSurfaceH; 114c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mSurfaceLayer; 115c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mSurfaceAlpha; 116c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 117c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Set to true if, when the window gets displayed, it should perform 118c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // an enter animation. 119c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mEnterAnimationPending; 120a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 121749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set when there is no Surface */ 122749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int NO_SURFACE = 0; 123749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set after the Surface has been created but before the window has been drawn. During 124749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * this time the surface is hidden. */ 125749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int DRAW_PENDING = 1; 126749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set after the window has finished drawing for the first time but before its surface 127749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * is shown. The surface will be displayed when the next layout is run. */ 128749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int COMMIT_DRAW_PENDING = 2; 129749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set during the time after the window's drawing has been committed, and before its 130749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * surface is actually shown. It is used to delay showing the surface until all windows in a 131749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * token are ready to be shown. */ 132749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int READY_TO_SHOW = 3; 133749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** Set when the window has been shown in the screen the first time. */ 134749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int HAS_DRAWN = 4; 1356fbda63e68513ece4409dac845588711ab25c39dCraig Mautner static String drawStateToString(int state) { 1366fbda63e68513ece4409dac845588711ab25c39dCraig Mautner switch (state) { 1376fbda63e68513ece4409dac845588711ab25c39dCraig Mautner case NO_SURFACE: return "NO_SURFACE"; 1386fbda63e68513ece4409dac845588711ab25c39dCraig Mautner case DRAW_PENDING: return "DRAW_PENDING"; 1396fbda63e68513ece4409dac845588711ab25c39dCraig Mautner case COMMIT_DRAW_PENDING: return "COMMIT_DRAW_PENDING"; 1406fbda63e68513ece4409dac845588711ab25c39dCraig Mautner case READY_TO_SHOW: return "READY_TO_SHOW"; 1416fbda63e68513ece4409dac845588711ab25c39dCraig Mautner case HAS_DRAWN: return "HAS_DRAWN"; 1426fbda63e68513ece4409dac845588711ab25c39dCraig Mautner default: return Integer.toString(state); 1436fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 1446fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 145749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner int mDrawState; 146749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner 147749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** Was this window last hidden? */ 148749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner boolean mLastHidden; 149a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 150bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner int mAttrFlags; 151bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner int mAttrType; 152bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner 153b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner final int mLayerStack; 154b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner 155918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner public WindowStateAnimator(final WindowState win) { 156918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner final WindowManagerService service = win.mService; 157918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner 158a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService = service; 159918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner mAnimator = service.mAnimator; 160918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner mPolicy = service.mPolicy; 161918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner mContext = service.mContext; 16259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner final DisplayInfo displayInfo = win.mDisplayContent.getDisplayInfo(); 16359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner mAnimDw = displayInfo.appWidth; 16459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner mAnimDh = displayInfo.appHeight; 165918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner 166a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin = win; 167322e40315609acd5a608440bc469d873e09559caCraig Mautner mAttachedWinAnimator = win.mAttachedWindow == null 168322e40315609acd5a608440bc469d873e09559caCraig Mautner ? null : win.mAttachedWindow.mWinAnimator; 169322e40315609acd5a608440bc469d873e09559caCraig Mautner mAppAnimator = win.mAppToken == null ? null : win.mAppToken.mAppAnimator; 170c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSession = win.mSession; 171bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner mAttrFlags = win.mAttrs.flags; 172bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner mAttrType = win.mAttrs.type; 173918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner mIsWallpaper = win.mIsWallpaper; 174b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner mLayerStack = win.mDisplayContent.getDisplay().getLayerStack(); 175a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 176a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 177a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void setAnimation(Animation anim) { 178bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner if (localLOGV) Slog.v(TAG, "Setting animation in " + this + ": " + anim); 179a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = false; 180a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 181a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = anim; 182a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION); 183a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.scaleCurrentDuration(mService.mWindowAnimationScale); 184a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Start out animation gone if window is gone, or visible if window is visible. 185a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 186749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mTransformation.setAlpha(mLastHidden ? 0 : 1); 187a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = true; 188a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 189a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 190a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void clearAnimation() { 191a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 192a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 193a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 194a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 195a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 196a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 197a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 198a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 199a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner /** Is the window or its container currently animating? */ 200a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean isAnimating() { 201a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return mAnimation != null 202322e40315609acd5a608440bc469d873e09559caCraig Mautner || (mAttachedWinAnimator != null && mAttachedWinAnimator.mAnimation != null) 203322e40315609acd5a608440bc469d873e09559caCraig Mautner || (mAppAnimator != null && 204322e40315609acd5a608440bc469d873e09559caCraig Mautner (mAppAnimator.animation != null 205322e40315609acd5a608440bc469d873e09559caCraig Mautner || mAppAnimator.mAppToken.inPendingTransaction)); 206a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 207a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 2080afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner /** Is the window animating the DummyAnimation? */ 2090afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner boolean isDummyAnimation() { 210322e40315609acd5a608440bc469d873e09559caCraig Mautner return mAppAnimator != null 211322e40315609acd5a608440bc469d873e09559caCraig Mautner && mAppAnimator.animation == AppWindowAnimator.sDummyAnimation; 2120afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 2130afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner 214a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner /** Is this window currently animating? */ 215a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean isWindowAnimating() { 216a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return mAnimation != null; 217a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 218a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 219a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner void cancelExitAnimationForNextAnimationLocked() { 220a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 221a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 222a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 2234d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mLocalAnimating = false; 224968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner destroySurfaceLocked(); 225a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 226a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 227a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 228a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner private boolean stepAnimation(long currentTime) { 229a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if ((mAnimation == null) || !mLocalAnimating) { 230a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 231a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 232a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 233a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final boolean more = mAnimation.getTransformation(currentTime, mTransformation); 2349e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner if (false && DEBUG_ANIM) Slog.v( 235c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Stepped animation in " + this + 236a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner ": more=" + more + ", xform=" + mTransformation); 237a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return more; 238a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 239a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 240a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // This must be called while inside a transaction. Returns true if 241a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // there is more animation to run. 242a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean stepAnimationLocked(long currentTime) { 243a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Save the animation state as it was before this step so WindowManagerService can tell if 244a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we just started or just stopped animating by comparing mWasAnimating with isAnimating(). 245a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWasAnimating = mAnimating; 246a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mService.okToDisplay()) { 247a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // We will run animations as long as the display isn't frozen. 248a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 249a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.isDrawnLw() && mAnimation != null) { 250a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = true; 251a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = true; 252a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mLocalAnimating) { 253c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 254c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Starting animation in " + this + 255a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " @ " + currentTime + ": ww=" + mWin.mFrame.width() + 256a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " wh=" + mWin.mFrame.height() + 257c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner " dw=" + mAnimDw + " dh=" + mAnimDh + 258a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " scale=" + mService.mWindowAnimationScale); 259c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimation.initialize(mWin.mFrame.width(), mWin.mFrame.height(), 260c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimDw, mAnimDh); 26159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner final DisplayInfo displayInfo = mWin.mDisplayContent.getDisplayInfo(); 26259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner mAnimDw = displayInfo.appWidth; 26359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner mAnimDh = displayInfo.appHeight; 264a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.setStartTime(currentTime); 265a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = true; 266a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 267a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 268a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if ((mAnimation != null) && mLocalAnimating) { 269a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (stepAnimation(currentTime)) { 270a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return true; 271a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 272a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 273c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 274c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Finished animation in " + this + 275a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " @ " + currentTime); 276a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner //WindowManagerService.this.dump(); 277a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 278a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = false; 279322e40315609acd5a608440bc469d873e09559caCraig Mautner if ((!mLocalAnimating || mAnimationIsEntrance) && mAppAnimator != null 280322e40315609acd5a608440bc469d873e09559caCraig Mautner && mAppAnimator.animation != null) { 281a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // When our app token is animating, we kind-of pretend like 282a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we are as well. Note the mLocalAnimating mAnimationIsEntrance 283a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // part of this check means that we will only do this if 284a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // our window is not currently exiting, or it is not 285a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // locally animating itself. The idea being that one that 286a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // is exiting and doing a local animation should be removed 287a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // once that animation is done. 288a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 289a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = true; 290a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 291a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 292a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (mHasTransformation) { 293a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Little trick to get through the path below to act like 294a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we have finished an animation. 295a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 296a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (isAnimating()) { 297a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 298a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 299a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (mAnimation != null) { 300a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // If the display is frozen, and there is a pending animation, 301a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // clear it and make sure we run the cleanup code. 302a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 303a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 304a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 305a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mAnimating && !mLocalAnimating) { 306a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 307a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 308a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 309c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Done animating, clean up. 310c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 311c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Animation done in " + this + ": exiting=" + mWin.mExiting 312a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ", reportedVisible=" 313a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.reportedVisible : false)); 314a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 315a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = false; 316a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 317a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 318a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 319a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 320a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 321e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner if (mAnimator.mWindowDetachedWallpaper == mWin) { 322e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner mAnimator.mWindowDetachedWallpaper = null; 323a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 324c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer = mWin.mLayer; 325a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mIsImWindow) { 326c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer += mService.mInputMethodAnimLayerAdjustment; 327918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner } else if (mIsWallpaper) { 328c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer += mService.mWallpaperAnimLayerAdjustment; 329a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 330c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_LAYERS) Slog.v(TAG, "Stepping win " + this 331c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " anim layer: " + mAnimLayer); 332a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = false; 333a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = false; 334a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mPolicyVisibility != mWin.mPolicyVisibilityAfterAnim) { 335b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner if (DEBUG_VISIBILITY) { 336c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "Policy visibility changing after anim in " + this + ": " 337a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + mWin.mPolicyVisibilityAfterAnim); 338a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 339a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mPolicyVisibility = mWin.mPolicyVisibilityAfterAnim; 34019d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner mWin.mDisplayContent.layoutNeeded = true; 341a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mWin.mPolicyVisibility) { 342a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mService.mCurrentFocus == mWin) { 3435845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner if (WindowManagerService.DEBUG_FOCUS_LIGHT) Slog.i(TAG, 3445845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner "setAnimationLocked: setting mFocusMayChange true"); 345a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mFocusMayChange = true; 346a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 347a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Window is no longer visible -- make sure if we were waiting 348a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // for it to be displayed before enabling the display, that 349a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we allow the display to be enabled now. 350a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.enableScreenIfNeededLocked(); 351a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 352a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 353a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 354749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState == HAS_DRAWN 355a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING 356a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken != null 357a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken.firstWindowDrawn 358a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken.startingData != null) { 359c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Finish starting " 360a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + mWin.mToken + ": first real window done animating"); 361a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mFinishedStarting.add(mWin.mAppToken); 362a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mH.sendEmptyMessage(H.FINISHED_STARTING); 36381defc794b0079c7f557b5d7c3924039ac0e9156Craig Mautner } else if (mAttrType == LayoutParams.TYPE_STATUS_BAR && mWin.mPolicyVisibility) { 36481defc794b0079c7f557b5d7c3924039ac0e9156Craig Mautner // Upon completion of a not-visible to visible status bar animation a relayout is 36581defc794b0079c7f557b5d7c3924039ac0e9156Craig Mautner // required. 36681defc794b0079c7f557b5d7c3924039ac0e9156Craig Mautner mWin.mDisplayContent.layoutNeeded = true; 367a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 368a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 369a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner finishExit(); 37076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner final int displayId = mWin.mDisplayContent.getDisplayId(); 37176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner mAnimator.setPendingLayoutChanges(displayId, WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM); 372d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner if (WindowManagerService.DEBUG_LAYOUT_REPEATS) mService.debugLayoutRepeats( 37366f78d7a979775efb148873797bac4584ddb3b83Craig Mautner "WindowStateAnimator", mAnimator.getPendingLayoutChanges(displayId)); 374a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 375a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mAppToken != null) { 376a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mAppToken.updateReportedVisibilityLocked(); 377a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 378a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 379a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 380a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 381a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 382a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner void finishExit() { 383a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v( 384c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "finishExit in " + this 385a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ": exiting=" + mWin.mExiting 386a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + " remove=" + mWin.mRemoveOnExit 387a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + " windowAnimating=" + isWindowAnimating()); 388a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 389a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final int N = mWin.mChildWindows.size(); 390a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner for (int i=0; i<N; i++) { 391a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mChildWindows.get(i).mWinAnimator.finishExit(); 392a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 393a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 394a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mWin.mExiting) { 395a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return; 396a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 397a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 398a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (isWindowAnimating()) { 399a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return; 400a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 401a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 402a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 403c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Exit animation finished in " + this 404a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ": remove=" + mWin.mRemoveOnExit); 40529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 406a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mDestroySurface.add(mWin); 407a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mDestroying = true; 408b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner if (SHOW_TRANSACTIONS) WindowManagerService.logSurface( 409a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin, "HIDE (finishExit)", null); 4100afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner hide(); 411a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 412a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mExiting = false; 413a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mRemoveOnExit) { 414a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mPendingRemove.add(mWin); 415a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mRemoveOnExit = false; 416a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 417968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mAnimator.hideWallpapersLocked(mWin); 4180afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 4190afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner 4200afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner void hide() { 4210afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner if (!mLastHidden) { 4220afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner //dump(); 4230afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner mLastHidden = true; 4240afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, 4250afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner "HIDE (performLayout)", null); 42629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 4270afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner mSurfaceShown = false; 4280afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner try { 42929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.hide(); 4300afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } catch (RuntimeException e) { 4310afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner Slog.w(TAG, "Exception hiding surface in " + mWin); 4320afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 4330afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 4340afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 435a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 436a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 437a608b882327fbb393bde3854953cd322a6fea675Craig Mautner boolean finishDrawingLocked() { 4386fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_STARTING_WINDOW && 4396fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 4406fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.v(TAG, "Finishing drawing window " + mWin + ": mDrawState=" 4416fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + drawStateToString(mDrawState)); 4426fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 443749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState == DRAW_PENDING) { 444ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner if (DEBUG_SURFACE_TRACE || DEBUG_ANIM || SHOW_TRANSACTIONS || DEBUG_ORIENTATION) 445ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner Slog.v(TAG, "finishDrawingLocked: mDrawState=COMMIT_DRAW_PENDING " + this + " in " 44629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian + mSurfaceControl); 4476fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_STARTING_WINDOW && 4486fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 4496fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.v(TAG, "Draw state now committed in " + mWin); 4506fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 451749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = COMMIT_DRAW_PENDING; 452a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return true; 453a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 454a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return false; 455a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 456a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 457a608b882327fbb393bde3854953cd322a6fea675Craig Mautner // This must be called while inside a transaction. 458a608b882327fbb393bde3854953cd322a6fea675Craig Mautner boolean commitFinishDrawingLocked(long currentTime) { 4596fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_STARTING_WINDOW && 4606fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 4616fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.i(TAG, "commitFinishDrawingLocked: " + mWin + " cur mDrawState=" 4626fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + drawStateToString(mDrawState)); 4636fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 464749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState != COMMIT_DRAW_PENDING) { 465a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return false; 466a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 4676fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_SURFACE_TRACE || DEBUG_ANIM) { 46829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian Slog.i(TAG, "commitFinishDrawingLocked: mDrawState=READY_TO_SHOW " + mSurfaceControl); 4696fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 470749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = READY_TO_SHOW; 471a608b882327fbb393bde3854953cd322a6fea675Craig Mautner final boolean starting = mWin.mAttrs.type == TYPE_APPLICATION_STARTING; 472a608b882327fbb393bde3854953cd322a6fea675Craig Mautner final AppWindowToken atoken = mWin.mAppToken; 473a608b882327fbb393bde3854953cd322a6fea675Craig Mautner if (atoken == null || atoken.allDrawn || starting) { 474a608b882327fbb393bde3854953cd322a6fea675Craig Mautner performShowLocked(); 475a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 476a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return true; 477a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 478a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 4793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian static class SurfaceTrace extends SurfaceControl { 4807d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private final static String SURFACE_TAG = "SurfaceTrace"; 4817d8df3905d294127cc58100912a57c816bfb2502Craig Mautner final static ArrayList<SurfaceTrace> sSurfaces = new ArrayList<SurfaceTrace>(); 4827358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4837d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private float mSurfaceTraceAlpha = 0; 4847358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private int mLayer; 48585afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn private final PointF mPosition = new PointF(); 48685afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn private final Point mSize = new Point(); 48785afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn private final Rect mWindowCrop = new Rect(); 4887358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private boolean mShown = false; 48998365d7663cbd82979a5700faf0050220b01084dJeff Brown private int mLayerStack; 490a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin private final String mName; 4917358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4927d8df3905d294127cc58100912a57c816bfb2502Craig Mautner public SurfaceTrace(SurfaceSession s, 49364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown String name, int w, int h, int format, int flags) 4947358fbfeb2febb60085067fcacc192f429b06545Craig Mautner throws OutOfResourcesException { 49564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown super(s, name, w, h, format, flags); 49698365d7663cbd82979a5700faf0050220b01084dJeff Brown mName = name != null ? name : "Not named"; 49785afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn mSize.set(w, h); 4987d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " 499a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 5007358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5017358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5027358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5037358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setAlpha(float alpha) { 50446ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner if (mSurfaceTraceAlpha != alpha) { 50546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setAlpha(" + alpha + "): OLD:" + this + ". Called by " 50698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 50746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner mSurfaceTraceAlpha = alpha; 50898129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 50946ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setAlpha(alpha); 5107358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5117358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5127358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5137358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setLayer(int zorder) { 51498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (zorder != mLayer) { 51546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setLayer(" + zorder + "): OLD:" + this + ". Called by " 51698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 51746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner mLayer = zorder; 51898129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 51946ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setLayer(zorder); 5207358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5217358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.remove(this); 5227358fbfeb2febb60085067fcacc192f429b06545Craig Mautner int i; 5237358fbfeb2febb60085067fcacc192f429b06545Craig Mautner for (i = sSurfaces.size() - 1; i >= 0; i--) { 5247d8df3905d294127cc58100912a57c816bfb2502Craig Mautner SurfaceTrace s = sSurfaces.get(i); 5257358fbfeb2febb60085067fcacc192f429b06545Craig Mautner if (s.mLayer < zorder) { 5267358fbfeb2febb60085067fcacc192f429b06545Craig Mautner break; 5277358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5287358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5297358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.add(i + 1, this); 5307358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5317358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5327358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5337358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setPosition(float x, float y) { 53498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (x != mPosition.x || y != mPosition.y) { 53546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setPosition(" + x + "," + y + "): OLD:" + this 53646ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner + ". Called by " + Debug.getCallers(3)); 53766d7730903a0163711e3d037c2350d6a13368004Craig Mautner mPosition.set(x, y); 53898129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 53946ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setPosition(x, y); 5407358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5417358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5427358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5437358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setSize(int w, int h) { 54498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (w != mSize.x || h != mSize.y) { 54546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setSize(" + w + "," + h + "): OLD:" + this + ". Called by " 54698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 54746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner mSize.set(w, h); 54898129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 54946ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setSize(w, h); 5507358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5517358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5527358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 55385afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn public void setWindowCrop(Rect crop) { 554ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner if (crop != null) { 55598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (!crop.equals(mWindowCrop)) { 55646ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setWindowCrop(" + crop.toShortString() + "): OLD:" + this 55746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner + ". Called by " + Debug.getCallers(3)); 55866d7730903a0163711e3d037c2350d6a13368004Craig Mautner mWindowCrop.set(crop); 55998129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 560ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner } 56146ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setWindowCrop(crop); 56285afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn } 56385afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn 56485afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn @Override 56598365d7663cbd82979a5700faf0050220b01084dJeff Brown public void setLayerStack(int layerStack) { 56698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (layerStack != mLayerStack) { 56746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setLayerStack(" + layerStack + "): OLD:" + this 56846ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner + ". Called by " + Debug.getCallers(3)); 56966d7730903a0163711e3d037c2350d6a13368004Craig Mautner mLayerStack = layerStack; 57098129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 57146ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setLayerStack(layerStack); 5729de4936c99b979f6010440b043edc6d6142d1980Craig Mautner } 5739de4936c99b979f6010440b043edc6d6142d1980Craig Mautner 5749de4936c99b979f6010440b043edc6d6142d1980Craig Mautner @Override 5757358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void hide() { 57698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (mShown) { 57746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "hide: OLD:" + this + ". Called by " + Debug.getCallers(3)); 57866d7730903a0163711e3d037c2350d6a13368004Craig Mautner mShown = false; 57998129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 58046ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.hide(); 5817358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 58246ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner 5837358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5847358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void show() { 58598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (!mShown) { 58646ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "show: OLD:" + this + ". Called by " + Debug.getCallers(3)); 58766d7730903a0163711e3d037c2350d6a13368004Craig Mautner mShown = true; 58898129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 58946ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.show(); 5907358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5917358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5927358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5937358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void destroy() { 5947358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.destroy(); 59546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "destroy: " + this + ". Called by " + Debug.getCallers(3)); 5967358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.remove(this); 5977358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5987358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 599acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner @Override 600acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner public void release() { 601acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner super.release(); 602acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner Slog.v(SURFACE_TAG, "release: " + this + ". Called by " 603a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 604acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner sSurfaces.remove(this); 605acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 606acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 6077358fbfeb2febb60085067fcacc192f429b06545Craig Mautner static void dumpAllSurfaces() { 6087358fbfeb2febb60085067fcacc192f429b06545Craig Mautner final int N = sSurfaces.size(); 6097358fbfeb2febb60085067fcacc192f429b06545Craig Mautner for (int i = 0; i < N; i++) { 6107358fbfeb2febb60085067fcacc192f429b06545Craig Mautner Slog.i(TAG, "SurfaceDump: " + sSurfaces.get(i)); 6117358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6127358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6137358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 6147358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 6157358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public String toString() { 616fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner return "Surface " + Integer.toHexString(System.identityHashCode(this)) + " " 61798365d7663cbd82979a5700faf0050220b01084dJeff Brown + mName + " (" + mLayerStack + "): shown=" + mShown + " layer=" + mLayer 6187d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y 61985afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn + " " + mSize.x + "x" + mSize.y 62085afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn + " crop=" + mWindowCrop.toShortString(); 6217358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6227358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6237358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 6243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl createSurfaceLocked() { 62529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl == null) { 62683339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner if (DEBUG_ANIM || DEBUG_ORIENTATION) Slog.i(TAG, 62783339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner "createSurface " + this + ": mDrawState=DRAW_PENDING"); 628749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = DRAW_PENDING; 629c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken != null) { 6307636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner if (mWin.mAppToken.mAppAnimator.animation == null) { 6317636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner mWin.mAppToken.allDrawn = false; 6327636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner mWin.mAppToken.deferClearAllDrawn = false; 6337636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner } else { 6347636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner // Currently animating, persist current state of allDrawn until animation 6357636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner // is complete. 6367636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner mWin.mAppToken.deferClearAllDrawn = true; 6377636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner } 638c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 639c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 640c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.makeWindowFreezingScreenIfNeededLocked(mWin); 641c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 6423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian int flags = SurfaceControl.HIDDEN; 643c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowManager.LayoutParams attrs = mWin.mAttrs; 644c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 645c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((attrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) { 6463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian flags |= SurfaceControl.SECURE; 647c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 648b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner if (DEBUG_VISIBILITY) Slog.v( 649c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Creating surface in session " 650c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSession.mSurfaceSession + " window " + this 651c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " w=" + mWin.mCompatFrame.width() 652c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " h=" + mWin.mCompatFrame.height() + " format=" 653c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + attrs.format + " flags=" + flags); 654c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 655c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int w = mWin.mCompatFrame.width(); 656c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int h = mWin.mCompatFrame.height(); 657c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((attrs.flags & LayoutParams.FLAG_SCALED) != 0) { 658c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // for a scaled surface, we always want the requested 659c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // size. 660c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w = mWin.mRequestedWidth; 661c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner h = mWin.mRequestedHeight; 662c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 663c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 664c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Something is wrong and SurfaceFlinger will not like this, 665c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // try to revert to sane values 666c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w <= 0) w = 1; 667c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (h <= 0) h = 1; 668c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 669c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 670c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = 0; 6717d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurfaceAlpha = 0; 672c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceX = 0; 673c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceY = 0; 674c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceW = w; 675c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceH = h; 67685afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn mWin.mLastSystemDecorRect.set(0, 0, 0, 0); 677c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 678c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean isHwAccelerated = (attrs.flags & 679c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0; 680c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : attrs.format; 681c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!PixelFormat.formatHasAlpha(attrs.format)) { 6823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian flags |= SurfaceControl.OPAQUE; 683c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 6847358fbfeb2febb60085067fcacc192f429b06545Craig Mautner if (DEBUG_SURFACE_TRACE) { 68529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl = new SurfaceTrace( 68664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown mSession.mSurfaceSession, 6877358fbfeb2febb60085067fcacc192f429b06545Craig Mautner attrs.getTitle().toString(), 68864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown w, h, format, flags); 6897358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } else { 69029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl = new SurfaceControl( 69164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown mSession.mSurfaceSession, 692c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attrs.getTitle().toString(), 69364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown w, h, format, flags); 6947358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 695c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = true; 696c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG, 697c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner " CREATE SURFACE " 69829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian + mSurfaceControl + " IN SESSION " 699c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSession.mSurfaceSession 700c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": pid=" + mSession.mPid + " format=" 701c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + attrs.format + " flags=0x" 702c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + Integer.toHexString(flags) 703c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " / " + this); 704a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin } catch (OutOfResourcesException e) { 705c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = false; 706c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "OutOfResourcesException creating surface"); 707c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "create", true); 708749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 709c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return null; 710c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (Exception e) { 711c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = false; 712c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.e(TAG, "Exception creating surface", e); 713749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 714c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return null; 715c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 716c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 717c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 71829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian TAG, "Got surface: " + mSurfaceControl 719c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ", set left=" + mWin.mFrame.left + " top=" + mWin.mFrame.top 720c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ", animLayer=" + mAnimLayer); 721c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) { 722c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.i(TAG, ">>> OPEN TRANSACTION createSurfaceLocked"); 723c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "CREATE pos=(" 724c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.mFrame.left + "," + mWin.mFrame.top + ") (" 725c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.mCompatFrame.width() + "x" + mWin.mCompatFrame.height() 726c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "), layer=" + mAnimLayer + " HIDE", null); 727c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 7283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.openTransaction(); 729c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 730c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 731c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceX = mWin.mFrame.left + mWin.mXOffset; 732c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceY = mWin.mFrame.top + mWin.mYOffset; 73329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setPosition(mSurfaceX, mSurfaceY); 734c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = mAnimLayer; 73529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setLayerStack(mLayerStack); 73629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setLayer(mAnimLayer); 73729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setAlpha(0); 738c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 739c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 740c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error creating surface in " + w, e); 741c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "create-init", true); 742c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 743749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = true; 744c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } finally { 7453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.closeTransaction(); 746c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 747c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "<<< CLOSE TRANSACTION createSurfaceLocked"); 748c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 749c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 750c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Created surface " + this); 751c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 75229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian return mSurfaceControl; 753c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 754c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 755968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner void destroySurfaceLocked() { 756c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken != null && mWin == mWin.mAppToken.startingWindow) { 757c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.startingDisplayed = false; 758c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 759c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 76029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 761c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 762c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int i = mWin.mChildWindows.size(); 763c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner while (i > 0) { 764c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner i--; 765c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowState c = mWin.mChildWindows.get(i); 766c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mAttachedHidden = true; 767c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 768c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 769c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 770c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) { 771c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 772c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 773c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 774c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 775c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 776c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Window " + this + " destroying surface " 77729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian + mSurfaceControl + ", session " + mSession, e); 778c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 779c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurfaceDestroyDeferred) { 78029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null && mPendingDestroySurface != mSurfaceControl) { 781c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 782c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 783c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 784c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 785c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 786c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 787c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 788c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); 789c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 790c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface.destroy(); 791c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 79229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mPendingDestroySurface = mSurfaceControl; 793c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 794c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 795c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 796c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 797c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 798c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 799c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 800c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 801c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY", e); 802c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 80329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.destroy(); 804c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 805968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mAnimator.hideWallpapersLocked(mWin); 806c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 807c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Exception thrown when destroying Window " + this 80829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian + " surface " + mSurfaceControl + " session " + mSession 809c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": " + e.toString()); 810c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 811c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 812c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 81329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl = null; 814e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner mWin.mHasSurface = false; 815bf08af3323117e15a65b74e66b7499d31537f9e1Craig Mautner mDrawState = NO_SURFACE; 816c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 817c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 818c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 819968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner void destroyDeferredSurfaceLocked() { 820c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 821c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 822c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 823c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 824c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 825c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 826c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 827c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 828c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); 829c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 830c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface.destroy(); 831968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mAnimator.hideWallpapersLocked(mWin); 832c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 833c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 834d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.w(TAG, "Exception thrown when destroying Window " 835c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + this + " surface " + mPendingDestroySurface 836c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " session " + mSession + ": " + e.toString()); 837c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 838c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceDestroyDeferred = false; 839c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface = null; 840c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 841c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 842c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void computeShownFrameLocked() { 843c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean selfTransformation = mHasLocalTransformation; 844c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Transformation attachedTransformation = 845322e40315609acd5a608440bc469d873e09559caCraig Mautner (mAttachedWinAnimator != null && mAttachedWinAnimator.mHasLocalTransformation) 846322e40315609acd5a608440bc469d873e09559caCraig Mautner ? mAttachedWinAnimator.mTransformation : null; 847322e40315609acd5a608440bc469d873e09559caCraig Mautner Transformation appTransformation = (mAppAnimator != null && mAppAnimator.hasTransformation) 848322e40315609acd5a608440bc469d873e09559caCraig Mautner ? mAppAnimator.transformation : null; 849c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 850c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Wallpapers are animated based on the "real" window they 851c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // are currently targeting. 852798adeffb0b9c22707b493895453e7dd2f608b75Craig Mautner final WindowState wallpaperTarget = mService.mWallpaperTarget; 853798adeffb0b9c22707b493895453e7dd2f608b75Craig Mautner if (mIsWallpaper && wallpaperTarget != null && mService.mAnimateWallpaperWithTarget) { 854798adeffb0b9c22707b493895453e7dd2f608b75Craig Mautner final WindowStateAnimator wallpaperAnimator = wallpaperTarget.mWinAnimator; 855918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (wallpaperAnimator.mHasLocalTransformation && 856918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner wallpaperAnimator.mAnimation != null && 857918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner !wallpaperAnimator.mAnimation.getDetachWallpaper()) { 858918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner attachedTransformation = wallpaperAnimator.mTransformation; 859c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER && attachedTransformation != null) { 860c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "WP target attached xform: " + attachedTransformation); 861c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 862c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 863798adeffb0b9c22707b493895453e7dd2f608b75Craig Mautner final AppWindowAnimator wpAppAnimator = wallpaperTarget.mAppToken == null ? 864798adeffb0b9c22707b493895453e7dd2f608b75Craig Mautner null : wallpaperTarget.mAppToken.mAppAnimator; 865798adeffb0b9c22707b493895453e7dd2f608b75Craig Mautner if (wpAppAnimator != null && wpAppAnimator.hasTransformation 866918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner && wpAppAnimator.animation != null 867918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner && !wpAppAnimator.animation.getDetachWallpaper()) { 868594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner appTransformation = wpAppAnimator.transformation; 869c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER && appTransformation != null) { 870c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "WP target app xform: " + appTransformation); 871c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 872c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 873c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 874c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 875a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final int displayId = mWin.getDisplayId(); 876a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final ScreenRotationAnimation screenRotationAnimation = 877a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mAnimator.getScreenRotationAnimationLocked(displayId); 878a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final boolean screenAnimation = 879a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner screenRotationAnimation != null && screenRotationAnimation.isAnimating(); 880c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation || attachedTransformation != null 881c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || appTransformation != null || screenAnimation) { 882c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // cache often used attributes locally 883c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Rect frame = mWin.mFrame; 884c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float tmpFloats[] = mService.mTmpFloats; 885c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Matrix tmpMatrix = mWin.mTmpMatrix; 886c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 887c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Compute the desired transformation. 8884b16969b006613bff4901a6e979f29a0f501430bDianne Hackborn if (screenAnimation && screenRotationAnimation.isRotating()) { 889c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are doing a screen animation, the global rotation 890c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // applied to windows can result in windows that are carefully 891c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // aligned with each other to slightly separate, allowing you 892c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // to see what is behind them. An unsightly mess. This... 893c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // thing... magically makes it call good: scale each window 894c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // slightly (two pixels larger in each dimension, from the 895c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // window's center). 896c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float w = frame.width(); 897c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float h = frame.height(); 898c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w>=1 && h>=1) { 899c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.setScale(1 + 2/w, 1 + 2/h, w/2, h/2); 900c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 901c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.reset(); 902c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 903c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 904c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.reset(); 905c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 906c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postScale(mWin.mGlobalScale, mWin.mGlobalScale); 907c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation) { 908c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(mTransformation.getMatrix()); 909c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 910c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postTranslate(frame.left + mWin.mXOffset, frame.top + mWin.mYOffset); 911c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attachedTransformation != null) { 912c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(attachedTransformation.getMatrix()); 913c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 914c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (appTransformation != null) { 915c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(appTransformation.getMatrix()); 916c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 917a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mAnimator.mUniverseBackground != null) { 918a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.postConcat(mAnimator.mUniverseBackground.mUniverseTransform.getMatrix()); 919a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 920c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 921a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner tmpMatrix.postConcat(screenRotationAnimation.getEnterTransformation().getMatrix()); 922c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 923545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov //TODO (multidisplay): Magnification is supported only for the default display. 924545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov if (mService.mDisplayMagnifier != null 925545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov && mWin.getDisplayId() == Display.DEFAULT_DISPLAY) { 926545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov MagnificationSpec spec = mService.mDisplayMagnifier 927545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov .getMagnificationSpecForWindowLocked(mWin); 928152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov if (spec != null && !spec.isNop()) { 929152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov tmpMatrix.postScale(spec.scale, spec.scale); 930152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov tmpMatrix.postTranslate(spec.offsetX, spec.offsetY); 931152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov } 9321cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 933c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 934c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // "convert" it into SurfaceFlinger's format 935c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // (a 2x2 matrix + an offset) 936c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Here we must not transform the position of the surface 937c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // since it is already included in the transformation. 938c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Transform: " + matrix); 939c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 940c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mHaveMatrix = true; 941c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.getValues(tmpFloats); 942c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx = tmpFloats[Matrix.MSCALE_X]; 943c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDx = tmpFloats[Matrix.MSKEW_Y]; 944c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy = tmpFloats[Matrix.MSKEW_X]; 945c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDy = tmpFloats[Matrix.MSCALE_Y]; 946c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float x = tmpFloats[Matrix.MTRANS_X]; 947c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float y = tmpFloats[Matrix.MTRANS_Y]; 948c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int w = frame.width(); 949c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int h = frame.height(); 950c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mShownFrame.set(x, y, x+w, y+h); 951c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 952c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Now set the alpha... but because our current hardware 953c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // can't do alpha transformation on a non-opaque surface, 954c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // turn it off if we are running an animation that is also 955c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // transforming since it is more important to have that 956c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // animation be smooth. 957c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha = mAlpha; 958c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!mService.mLimitedAlphaCompositing 959c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || (!PixelFormat.formatHasAlpha(mWin.mAttrs.format) 960c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDsDy, mDtDy) 961c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && x == frame.left && y == frame.top))) { 962c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Applying alpha transform"); 963c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation) { 964c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= mTransformation.getAlpha(); 965c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 966c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attachedTransformation != null) { 967c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= attachedTransformation.getAlpha(); 968c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 969c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (appTransformation != null) { 970c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= appTransformation.getAlpha(); 971c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 972a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mAnimator.mUniverseBackground != null) { 973a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mShownAlpha *= mAnimator.mUniverseBackground.mUniverseTransform.getAlpha(); 974a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 975c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 976a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mShownAlpha *= screenRotationAnimation.getEnterTransformation().getAlpha(); 977c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 978c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 979c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Not applying alpha transform"); 980c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 981c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 982a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner if ((DEBUG_SURFACE_TRACE || WindowManagerService.localLOGV) 983a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner && (mShownAlpha == 1.0 || mShownAlpha == 0.0)) Slog.v( 984a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner TAG, "computeShownFrameLocked: Animating " + this + " mAlpha=" + mAlpha 985a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " self=" + (selfTransformation ? mTransformation.getAlpha() : "null") 986a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " attached=" + (attachedTransformation == null ? 987a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner "null" : attachedTransformation.getAlpha()) 988a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " app=" + (appTransformation == null ? "null" : appTransformation.getAlpha()) 989a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " screen=" + (screenAnimation ? 990a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner screenRotationAnimation.getEnterTransformation().getAlpha() : "null")); 991c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return; 992968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner } else if (mIsWallpaper && mService.mInnerFields.mWallpaperActionPending) { 9934d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner return; 994c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 995c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 996c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 9974d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner TAG, "computeShownFrameLocked: " + this + 9984d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner " not attached, mAlpha=" + mAlpha); 9991cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 10001cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov final boolean applyUniverseTransformation = (mAnimator.mUniverseBackground != null 10011cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov && mWin.mAttrs.type != WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND 10021cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov && mWin.mBaseLayer < mAnimator.mAboveUniverseLayer); 1003545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov MagnificationSpec spec = null; 1004545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov //TODO (multidisplay): Magnification is supported only for the default display. 1005545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov if (mService.mDisplayMagnifier != null && mWin.getDisplayId() == Display.DEFAULT_DISPLAY) { 1006545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov spec = mService.mDisplayMagnifier.getMagnificationSpecForWindowLocked(mWin); 1007545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov } 10081cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (applyUniverseTransformation || spec != null) { 1009a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final Rect frame = mWin.mFrame; 1010a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final float tmpFloats[] = mService.mTmpFloats; 1011a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final Matrix tmpMatrix = mWin.mTmpMatrix; 10121cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1013a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.setScale(mWin.mGlobalScale, mWin.mGlobalScale); 1014a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.postTranslate(frame.left + mWin.mXOffset, frame.top + mWin.mYOffset); 10151cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 10161cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (applyUniverseTransformation) { 10171cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov tmpMatrix.postConcat(mAnimator.mUniverseBackground.mUniverseTransform.getMatrix()); 10181cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 10191cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 10201cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (spec != null && !spec.isNop()) { 1021152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov tmpMatrix.postScale(spec.scale, spec.scale); 1022152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov tmpMatrix.postTranslate(spec.offsetX, spec.offsetY); 10231cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 10241cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1025a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.getValues(tmpFloats); 10261cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1027a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mHaveMatrix = true; 1028a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDx = tmpFloats[Matrix.MSCALE_X]; 1029a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDx = tmpFloats[Matrix.MSKEW_Y]; 1030a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDy = tmpFloats[Matrix.MSKEW_X]; 1031a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDy = tmpFloats[Matrix.MSCALE_Y]; 1032a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn float x = tmpFloats[Matrix.MTRANS_X]; 1033a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn float y = tmpFloats[Matrix.MTRANS_Y]; 1034a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn int w = frame.width(); 1035a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn int h = frame.height(); 10361cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mWin.mShownFrame.set(x, y, x + w, y + h); 10371cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 10381cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mShownAlpha = mAlpha; 10391cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (applyUniverseTransformation) { 10401cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mShownAlpha *= mAnimator.mUniverseBackground.mUniverseTransform.getAlpha(); 10411cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1042a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else { 1043a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mWin.mShownFrame.set(mWin.mFrame); 1044a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mWin.mXOffset != 0 || mWin.mYOffset != 0) { 1045a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mWin.mShownFrame.offset(mWin.mXOffset, mWin.mYOffset); 1046a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1047a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mShownAlpha = mAlpha; 1048a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mHaveMatrix = false; 1049a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDx = mWin.mGlobalScale; 1050a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDx = 0; 1051a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDy = 0; 1052a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDy = mWin.mGlobalScale; 1053a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1054a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1055a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 1056a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn void applyDecorRect(final Rect decorRect) { 1057a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final WindowState w = mWin; 1058a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Compute the offset of the window in relation to the decor rect. 1059a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final int offX = w.mXOffset + w.mFrame.left; 1060a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final int offY = w.mYOffset + w.mFrame.top; 1061a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Initialize the decor rect to the entire frame. 1062a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mFrame.width(), w.mFrame.height()); 1063a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Intersect with the decor rect, offsetted by window position. 1064a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.intersect(decorRect.left-offX, decorRect.top-offY, 1065a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn decorRect.right-offX, decorRect.bottom-offY); 1066a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // If size compatibility is being applied to the window, the 1067a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // surface is scaled relative to the screen. Also apply this 1068a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // scaling to the crop rect. We aren't using the standard rect 1069a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // scale function because we want to round things to make the crop 1070a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // always round to a larger rect to ensure we don't crop too 1071a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // much and hide part of the window that should be seen. 1072a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (w.mEnforceSizeCompat && w.mInvGlobalScale != 1.0f) { 1073a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final float scale = w.mInvGlobalScale; 1074a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.left = (int) (w.mSystemDecorRect.left * scale - 0.5f); 1075a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.top = (int) (w.mSystemDecorRect.top * scale - 0.5f); 1076a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.right = (int) ((w.mSystemDecorRect.right+1) * scale - 0.5f); 1077a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.bottom = (int) ((w.mSystemDecorRect.bottom+1) * scale - 0.5f); 1078a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1079c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1080d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner 10813e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn void updateSurfaceWindowCrop(final boolean recoveringMemory) { 10823e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn final WindowState w = mWin; 108369b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner DisplayInfo displayInfo = w.mDisplayContent.getDisplayInfo(); 10843e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn 10853e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // Need to recompute a new system decor rect each time. 10863e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { 10873e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // Currently can't do this cropping for scaled windows. We'll 10883e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // just keep the crop rect the same as the source surface. 10893e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mRequestedWidth, w.mRequestedHeight); 109069b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner } else if (!w.isDefaultDisplay()) { 109128e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown // On a different display there is no system decor. Crop the window 109228e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown // by the screen boundaries. 10933671410b9e09e1c5ec05dfc58651a8efaa7790ddJeff Brown w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height()); 109428e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown w.mSystemDecorRect.intersect(-w.mCompatFrame.left, -w.mCompatFrame.top, 109528e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown displayInfo.logicalWidth - w.mCompatFrame.left, 109628e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown displayInfo.logicalHeight - w.mCompatFrame.top); 10973e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } else if (w.mLayer >= mService.mSystemDecorLayer) { 10983e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // Above the decor layer is easy, just use the entire window. 1099a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Unless we have a universe background... in which case all the 1100a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // windows need to be cropped by the screen, so they don't cover 1101a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // the universe background. 1102a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mAnimator.mUniverseBackground == null) { 1103a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), 1104a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mCompatFrame.height()); 1105a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else { 1106a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn applyDecorRect(mService.mScreenRect); 1107a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 11084664623c304cf162b9a78f3aee3290a92e54b628John Spurlock } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND 11094664623c304cf162b9a78f3aee3290a92e54b628John Spurlock || w.mDecorFrame.isEmpty()) { 11104664623c304cf162b9a78f3aee3290a92e54b628John Spurlock // The universe background isn't cropped, nor windows without policy decor. 11113e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), 11123e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mCompatFrame.height()); 11133e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } else { 11144664623c304cf162b9a78f3aee3290a92e54b628John Spurlock // Crop to the system decor specified by policy. 11154664623c304cf162b9a78f3aee3290a92e54b628John Spurlock applyDecorRect(w.mDecorFrame); 11163e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11173e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn 11183e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (!w.mSystemDecorRect.equals(w.mLastSystemDecorRect)) { 11193e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mLastSystemDecorRect.set(w.mSystemDecorRect); 11203e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn try { 11213e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 11223e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn "CROP " + w.mSystemDecorRect.toShortString(), null); 112329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setWindowCrop(w.mSystemDecorRect); 11243e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } catch (RuntimeException e) { 11253e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn Slog.w(TAG, "Error setting crop surface of " + w 11263e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn + " crop=" + w.mSystemDecorRect.toShortString(), e); 11273e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (!recoveringMemory) { 11283e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn mService.reclaimSomeSurfaceMemoryLocked(this, "crop", true); 11293e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11303e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11313e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11323e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11333e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn 1134a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner void setSurfaceBoundariesLocked(final boolean recoveringMemory) { 1135c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowState w = mWin; 1136c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int width, height; 1137c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { 1138c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // for a scaled surface, we just want to use 1139c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // the requested size. 1140c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = w.mRequestedWidth; 1141c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = w.mRequestedHeight; 1142c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1143c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = w.mCompatFrame.width(); 1144c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = w.mCompatFrame.height(); 1145c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1146c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1147c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (width < 1) { 1148c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = 1; 1149c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1150c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (height < 1) { 1151c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = 1; 1152c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1153c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean surfaceResized = mSurfaceW != width || mSurfaceH != height; 1154c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (surfaceResized) { 1155c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceW = width; 1156c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceH = height; 1157c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1158c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 11594d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner final float left = w.mShownFrame.left; 11604d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner final float top = w.mShownFrame.top; 11614d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner if (mSurfaceX != left || mSurfaceY != top) { 1162c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1163c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 11644d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner "POS " + left + ", " + top, null); 11654d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mSurfaceX = left; 11664d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mSurfaceY = top; 116729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setPosition(left, top); 1168c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1169c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error positioning surface of " + w 11704d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + " pos=(" + left 11714d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + "," + top + ")", e); 1172c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 1173c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "position", true); 1174c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1175c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1176c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1177c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1178c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (surfaceResized) { 1179c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1180c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1181c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "SIZE " + width + "x" + height, null); 1182c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceResized = true; 118329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setSize(width, height); 118476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner final int displayId = w.mDisplayContent.getDisplayId(); 118576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner mAnimator.setPendingLayoutChanges(displayId, 118676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER); 11873a67f35f5e912b9c1ec44adbdc5531427318b12dCraig Mautner if ((w.mAttrs.flags & LayoutParams.FLAG_DIM_BEHIND) != 0) { 118805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner w.getStack().startDimmingIfNeeded(this); 11893a67f35f5e912b9c1ec44adbdc5531427318b12dCraig Mautner } 1190c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1191c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If something goes wrong with the surface (such 1192c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // as running out of memory), don't take down the 1193c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // entire system. 1194c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.e(TAG, "Error resizing surface of " + w 1195c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " size=(" + width + "x" + height + ")", e); 1196c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 1197c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "size", true); 1198c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1199c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1200c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 120185afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn 12023e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn updateSurfaceWindowCrop(recoveringMemory); 1203acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1204acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1205acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner public void prepareSurfaceLocked(final boolean recoveringMemory) { 1206acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner final WindowState w = mWin; 120729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl == null) { 1208acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner if (w.mOrientationChanging) { 1209acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner if (DEBUG_ORIENTATION) { 1210acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner Slog.v(TAG, "Orientation change skips hidden " + w); 1211acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1212acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner w.mOrientationChanging = false; 1213acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1214acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner return; 1215acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1216acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1217acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner boolean displayed = false; 1218acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1219acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner computeShownFrameLocked(); 1220acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1221a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner setSurfaceBoundariesLocked(recoveringMemory); 1222c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1223918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (mIsWallpaper && !mWin.mWallpaperVisible) { 12240fa77c1e0fc218040efc570936e988dbeece399cCraig Mautner // Wallpaper is no longer visible and there is no wp target => hide it. 12250fa77c1e0fc218040efc570936e988dbeece399cCraig Mautner hide(); 122672669d18016446d874e4fa1005464e36375124e4Craig Mautner } else if (w.mAttachedHidden || !w.isOnScreen()) { 12270afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner hide(); 1228968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mAnimator.hideWallpapersLocked(w); 1229b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner 1230c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are waiting for this window to handle an 1231c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // orientation change, well, it is hidden, so 1232c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // doesn't really matter. Note that this does 1233c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // introduce a potential glitch if the window 1234c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // becomes unhidden before it has drawn for the 1235c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // new orientation. 1236c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mOrientationChanging) { 1237c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mOrientationChanging = false; 1238c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, 1239c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Orientation change skips hidden " + w); 1240c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1241c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else if (mLastLayer != mAnimLayer 1242c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastAlpha != mShownAlpha 1243c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDsDx != mDsDx 1244c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDtDx != mDtDx 1245c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDsDy != mDsDy 1246c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDtDy != mDtDy 1247c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || w.mLastHScale != w.mHScale 1248c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || w.mLastVScale != w.mVScale 1249749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner || mLastHidden) { 1250c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner displayed = true; 1251c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastAlpha = mShownAlpha; 1252c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastLayer = mAnimLayer; 1253c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDsDx = mDsDx; 1254c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDtDx = mDtDx; 1255c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDsDy = mDsDy; 1256c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDtDy = mDtDy; 1257c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mLastHScale = w.mHScale; 1258c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mLastVScale = w.mVScale; 1259c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1260c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "alpha=" + mShownAlpha + " layer=" + mAnimLayer 1261c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " matrix=[" + (mDsDx*w.mHScale) 1262c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "," + (mDtDx*w.mVScale) 1263c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "][" + (mDsDy*w.mHScale) 1264c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "," + (mDtDy*w.mVScale) + "]", null); 126529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 1266c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1267c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceAlpha = mShownAlpha; 126829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setAlpha(mShownAlpha); 1269ad5725d7985a784056b02b97ab76357a667a6ad4Craig Mautner mSurfaceLayer = mAnimLayer; 127029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setLayer(mAnimLayer); 127129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setMatrix( 1272c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx*w.mHScale, mDtDx*w.mVScale, 1273c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy*w.mHScale, mDtDy*w.mVScale); 1274749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner 1275749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mLastHidden && mDrawState == HAS_DRAWN) { 1276749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1277749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner "SHOW (performLayout)", null); 1278749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w 1279749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner + " during relayout"); 1280749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (showSurfaceRobustlyLocked()) { 1281749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = false; 1282918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (mIsWallpaper) { 1283507a2ee12b6d1d683e4a5806804c472b3fe32e61Craig Mautner mService.dispatchWallpaperVisibility(w, true); 1284507a2ee12b6d1d683e4a5806804c472b3fe32e61Craig Mautner } 12858efb0a4d811fc18ac8ef32f7d597aa6fafb3acecCraig Mautner // This draw means the difference between unique content and mirroring. 12868efb0a4d811fc18ac8ef32f7d597aa6fafb3acecCraig Mautner // Run another pass through performLayout to set mHasContent in the 12878efb0a4d811fc18ac8ef32f7d597aa6fafb3acecCraig Mautner // LogicalDisplay. 12888efb0a4d811fc18ac8ef32f7d597aa6fafb3acecCraig Mautner mAnimator.setPendingLayoutChanges(w.getDisplayId(), 12898efb0a4d811fc18ac8ef32f7d597aa6fafb3acecCraig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM); 1290749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } else { 1291749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner w.mOrientationChanging = false; 1292749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1293749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 129429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 1295749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner w.mToken.hasVisible = true; 1296749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1297c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1298c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error updating surface in " + w, e); 1299c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 1300c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "update", true); 1301c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1302c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1303c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1304c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 13059e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner if (DEBUG_ANIM && isAnimating()) { 13069e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner Slog.v(TAG, "prepareSurface: No changes in animation for " + this); 130783339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner } 1308c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner displayed = true; 1309c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1310c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1311c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (displayed) { 1312c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mOrientationChanging) { 1313c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!w.isDrawnLw()) { 13142639da500e3d53ea3a17d888b1c0001d043c6b98Craig Mautner mAnimator.mBulkUpdateParams &= ~SET_ORIENTATION_CHANGE_COMPLETE; 1315a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn mAnimator.mLastWindowFreezeSource = w; 1316c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, 1317c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Orientation continue waiting for draw in " + w); 1318c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1319c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mOrientationChanging = false; 1320c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation change complete in " + w); 1321c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1322c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1323c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mToken.hasVisible = true; 1324c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1325c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1326c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1327ef6550195f2f403e5ace27d49ae4f7f38d29cf4aCraig Mautner void setTransparentRegionHintLocked(final Region region) { 132829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl == null) { 13291f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true"); 13301f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner return; 13311f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner } 133248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 133348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner ">>> OPEN TRANSACTION setTransparentRegion"); 13343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.openTransaction(); 133548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner try { 133648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, 133748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner "transparentRegionHint=" + region, null); 133829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setTransparentRegionHint(region); 133948ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } finally { 13403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.closeTransaction(); 134148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 134248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner "<<< CLOSE TRANSACTION setTransparentRegion"); 134348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 134448ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 134548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner 1346581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner void setWallpaperOffset(RectF shownFrame) { 1347581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner final int left = (int) shownFrame.left; 1348581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner final int top = (int) shownFrame.top; 1349581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner if (mSurfaceX != left || mSurfaceY != top) { 1350581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner mSurfaceX = left; 1351581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner mSurfaceY = top; 1352581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner if (mAnimating) { 1353581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner // If this window (or its app token) is animating, then the position 1354581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner // of the surface will be re-computed on the next animation frame. 1355581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner // We can't poke it directly here because it depends on whatever 1356581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner // transformation is being applied by the animation. 1357581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner return; 1358581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner } 13593e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 1360581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner ">>> OPEN TRANSACTION setWallpaperOffset"); 13613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.openTransaction(); 1362581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner try { 1363581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, 1364581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner "POS " + left + ", " + top, null); 136529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setPosition(mWin.mFrame.left + left, mWin.mFrame.top + top); 1366581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner updateSurfaceWindowCrop(false); 1367581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner } catch (RuntimeException e) { 1368581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner Slog.w(TAG, "Error positioning surface of " + mWin 1369581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner + " pos=(" + left + "," + top + ")", e); 1370581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner } finally { 13713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.closeTransaction(); 1372581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 1373581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner "<<< CLOSE TRANSACTION setWallpaperOffset"); 1374581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner } 137548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 137648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 137748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner 1378c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // This must be called while inside a transaction. 1379c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean performShowLocked() { 13805962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner if (mWin.isHiddenFromUserLocked()) { 138188400d3a31139c40c4014faf86c243647087ef6cCraig Mautner Slog.w(TAG, "current user violation " + mService.mCurrentUserId + " trying to display " 1382a2d7b1117abc23a3ff0ccda15a2f9138aaa7f4fcCraig Mautner + this + ", type " + mWin.mAttrs.type + ", belonging to " + mWin.mOwnerUid); 13839dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautner return false; 13849dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautner } 13856fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_VISIBILITY || (DEBUG_STARTING_WINDOW && 13866fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING)) { 1387c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 1388c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 1389c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 1390c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 1391c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1392d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.v(TAG, "performShow on " + this 1393749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner + ": mDrawState=" + mDrawState + " readyForDisplay=" 13946e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn + mWin.isReadyForDisplayIgnoringKeyguard() 13956fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " starting=" + (mWin.mAttrs.type == TYPE_APPLICATION_STARTING) 1396c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " during animation: policyVis=" + mWin.mPolicyVisibility 1397c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " attHidden=" + mWin.mAttachedHidden 1398c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok.hiddenRequested=" 1399c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hiddenRequested : false) 1400c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok.hidden=" 1401c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hidden : false) 1402c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " animating=" + mAnimating 1403c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok animating=" 1404322e40315609acd5a608440bc469d873e09559caCraig Mautner + (mAppAnimator != null ? mAppAnimator.animating : false), e); 14056fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 14066fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (mDrawState == READY_TO_SHOW && mWin.isReadyForDisplayIgnoringKeyguard()) { 14076fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) 14086fbda63e68513ece4409dac845588711ab25c39dCraig Mautner WindowManagerService.logSurface(mWin, "SHOW (performShowLocked)", null); 14096fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_VISIBILITY || (DEBUG_STARTING_WINDOW && 14106fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING)) { 14116fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.v(TAG, "Showing " + this 14126fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " during animation: policyVis=" + mWin.mPolicyVisibility 14136fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " attHidden=" + mWin.mAttachedHidden 14146fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " tok.hiddenRequested=" 14156fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hiddenRequested : false) 14166fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " tok.hidden=" 14176fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hidden : false) 14186fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " animating=" + mAnimating 14196fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " tok animating=" 1420322e40315609acd5a608440bc469d873e09559caCraig Mautner + (mAppAnimator != null ? mAppAnimator.animating : false)); 14216fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 1422c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1423c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.enableScreenIfNeededLocked(); 1424c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1425c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner applyEnterAnimationLocked(); 1426c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1427de6198ebd7f9ea5b7940d38bf5839dfbc6a192c4Craig Mautner // Force the show in the next prepareSurfaceLocked() call. 1428c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastAlpha = -1; 1429ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner if (DEBUG_SURFACE_TRACE || DEBUG_ANIM) 1430ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner Slog.v(TAG, "performShowLocked: mDrawState=HAS_DRAWN in " + this); 1431749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = HAS_DRAWN; 1432968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mService.scheduleAnimationLocked(); 1433c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1434c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int i = mWin.mChildWindows.size(); 1435c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner while (i > 0) { 1436c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner i--; 1437c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowState c = mWin.mChildWindows.get(i); 1438c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (c.mAttachedHidden) { 1439c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mAttachedHidden = false; 144029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (c.mWinAnimator.mSurfaceControl != null) { 1441c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mWinAnimator.performShowLocked(); 1442c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // It hadn't been shown, which means layout not 1443c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // performed on it, so now we want to make sure to 1444c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // do a layout. If called from within the transaction 1445c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // loop, this will cause it to restart with a new 1446c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // layout. 144719d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner c.mDisplayContent.layoutNeeded = true; 1448c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1449c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1450c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1451c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1452c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAttrs.type != TYPE_APPLICATION_STARTING 1453c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && mWin.mAppToken != null) { 1454c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.firstWindowDrawn = true; 1455c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1456c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken.startingData != null) { 1457c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_STARTING_WINDOW || 1458d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 1459c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Finish starting " + mWin.mToken 1460c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": first real window is shown, no animation"); 1461c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If this initial window is animating, stop it -- we 1462c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // will do an animation to reveal it from behind the 1463c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // starting window, so there is no need for it to also 1464c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // be doing its own stuff. 14654d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner clearAnimation(); 1466c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mFinishedStarting.add(mWin.mAppToken); 1467c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mH.sendEmptyMessage(H.FINISHED_STARTING); 1468c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1469c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.updateReportedVisibilityLocked(); 1470c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1471c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1472c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1473c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1474c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1475c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return false; 1476c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1477c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1478c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 1479c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Have the surface flinger show a surface, robustly dealing with 1480c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * error conditions. In particular, if there is not enough memory 1481c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * to show the surface, then we will try to get rid of other surfaces 1482c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * in order to succeed. 1483c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * 1484c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @return Returns true if the surface was successfully shown. 1485c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 1486c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean showSurfaceRobustlyLocked() { 1487c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 148829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 1489c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = true; 149029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.show(); 1491c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mTurnOnScreen) { 1492c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) Slog.v(TAG, 1493c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Show surface turning screen on: " + mWin); 1494c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mTurnOnScreen = false; 14957d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN; 1496c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1497c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1498c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1499c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 150029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian Slog.w(TAG, "Failure showing surface " + mSurfaceControl + " in " + mWin, e); 1501c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1502c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1503c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "show", true); 1504c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1505c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return false; 1506c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1507c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1508c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void applyEnterAnimationLocked() { 1509c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final int transit; 1510c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mEnterAnimationPending) { 1511c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mEnterAnimationPending = false; 1512c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner transit = WindowManagerPolicy.TRANSIT_ENTER; 1513c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1514c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner transit = WindowManagerPolicy.TRANSIT_SHOW; 1515c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1516c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner applyAnimationLocked(transit, true); 1517545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov //TODO (multidisplay): Magnification is supported only for the default display. 1518545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov if (mService.mDisplayMagnifier != null 1519545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov && mWin.getDisplayId() == Display.DEFAULT_DISPLAY) { 1520545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov mService.mDisplayMagnifier.onWindowTransitionLocked(mWin, transit); 1521152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov } 1522c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1523c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1524c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 1525c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Choose the correct animation and set it to the passed WindowState. 15264b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner * @param transit If AppTransition.TRANSIT_PREVIEW_DONE and the app window has been drawn 1527c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * then the animation will be app_starting_exit. Any other value loads the animation from 1528c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * the switch statement below. 1529c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @param isEntrance The animation type the last time this was called. Used to keep from 1530c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * loading the same animation twice. 1531c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @return true if an animation has been loaded. 1532c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 1533c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean applyAnimationLocked(int transit, boolean isEntrance) { 1534c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mLocalAnimating && mAnimationIsEntrance == isEntrance) { 1535c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are trying to apply an animation, but already running 1536c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // an animation of the same type, then just leave that one alone. 1537c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1538c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1539c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1540c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Only apply an animation if the display isn't frozen. If it is 1541c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // frozen, there is no reason to animate and it can cause strange 1542c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // artifacts when we unfreeze the display if some different animation 1543c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // is running. 1544c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mService.okToDisplay()) { 1545c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int anim = mPolicy.selectAnimationLw(mWin, transit); 1546c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int attr = -1; 1547c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Animation a = null; 1548c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (anim != 0) { 15494c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn a = anim != -1 ? AnimationUtils.loadAnimation(mContext, anim) : null; 1550c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1551c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner switch (transit) { 1552c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_ENTER: 1553c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation; 1554c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1555c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_EXIT: 1556c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation; 1557c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1558c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_SHOW: 1559c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation; 1560c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1561c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_HIDE: 1562c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation; 1563c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1564c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1565c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attr >= 0) { 1566164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner a = mService.mAppTransition.loadAnimation(mWin.mAttrs, attr); 1567c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1568c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1569d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 1570c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "applyAnimation: win=" + this 1571c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " anim=" + anim + " attr=0x" + Integer.toHexString(attr) 15724d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + " a=" + a 15738863cca57d8c901a2da0edc422b653ae68849313Craig Mautner + " transit=" + transit 157483339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner + " isEntrance=" + isEntrance + " Callers " + Debug.getCallers(3)); 1575c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (a != null) { 1576c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_ANIM) { 1577c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 1578c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 1579c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 1580c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 1581c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1582d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.v(TAG, "Loaded animation " + a + " for " + this, e); 1583c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1584c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner setAnimation(a); 1585c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimationIsEntrance = isEntrance; 1586c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1587c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1588c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner clearAnimation(); 1589c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1590c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1591c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return mAnimation != null; 1592c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1593c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1594a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void dump(PrintWriter pw, String prefix, boolean dumpAll) { 1595a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimating || mLocalAnimating || mAnimationIsEntrance 1596a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner || mAnimation != null) { 1597a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(prefix); pw.print("mAnimating="); pw.print(mAnimating); 1598a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mLocalAnimating="); pw.print(mLocalAnimating); 1599a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mAnimationIsEntrance="); pw.print(mAnimationIsEntrance); 1600a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mAnimation="); pw.println(mAnimation); 1601a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1602a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mHasTransformation || mHasLocalTransformation) { 1603a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(prefix); pw.print("XForm: has="); 1604a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(mHasTransformation); 1605a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" hasLocal="); pw.print(mHasLocalTransformation); 1606a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" "); mTransformation.printShortString(pw); 1607a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.println(); 1608a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 160929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 1610c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (dumpAll) { 161129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian pw.print(prefix); pw.print("mSurface="); pw.println(mSurfaceControl); 16126fbda63e68513ece4409dac845588711ab25c39dCraig Mautner pw.print(prefix); pw.print("mDrawState="); 16136fbda63e68513ece4409dac845588711ab25c39dCraig Mautner pw.print(drawStateToString(mDrawState)); 1614749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner pw.print(" mLastHidden="); pw.println(mLastHidden); 1615c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1616c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("Surface: shown="); pw.print(mSurfaceShown); 1617c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" layer="); pw.print(mSurfaceLayer); 1618c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" alpha="); pw.print(mSurfaceAlpha); 1619c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" rect=("); pw.print(mSurfaceX); 1620c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(","); pw.print(mSurfaceY); 1621c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(") "); pw.print(mSurfaceW); 1622c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" x "); pw.println(mSurfaceH); 1623c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1624c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 1625c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mPendingDestroySurface="); 1626c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.println(mPendingDestroySurface); 1627c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1628c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurfaceResized || mSurfaceDestroyDeferred) { 1629c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mSurfaceResized="); pw.print(mSurfaceResized); 1630c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mSurfaceDestroyDeferred="); pw.println(mSurfaceDestroyDeferred); 1631c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1632a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND) { 1633a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn pw.print(prefix); pw.print("mUniverseTransform="); 1634a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mUniverseTransform.printShortString(pw); 1635a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn pw.println(); 1636a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1637c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) { 1638c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha); 1639c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mAlpha="); pw.print(mAlpha); 1640c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mLastAlpha="); pw.println(mLastAlpha); 1641c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1642c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mHaveMatrix || mWin.mGlobalScale != 1) { 1643c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mGlobalScale="); pw.print(mWin.mGlobalScale); 1644c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDsDx="); pw.print(mDsDx); 1645c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDtDx="); pw.print(mDtDx); 1646c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDsDy="); pw.print(mDsDy); 1647c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDtDy="); pw.println(mDtDy); 1648c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1649a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1650a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 1651c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner @Override 1652c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner public String toString() { 1653529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn StringBuffer sb = new StringBuffer("WindowStateAnimator{"); 1654529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(this))); 1655529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append(' '); 1656529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append(mWin.mAttrs.getTitle()); 1657529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append('}'); 1658c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner return sb.toString(); 1659c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner } 1660a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner} 1661