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); 363a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 364a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 365a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner finishExit(); 36676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner final int displayId = mWin.mDisplayContent.getDisplayId(); 36776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner mAnimator.setPendingLayoutChanges(displayId, WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM); 368d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner if (WindowManagerService.DEBUG_LAYOUT_REPEATS) mService.debugLayoutRepeats( 36966f78d7a979775efb148873797bac4584ddb3b83Craig Mautner "WindowStateAnimator", mAnimator.getPendingLayoutChanges(displayId)); 370a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 371a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mAppToken != null) { 372a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mAppToken.updateReportedVisibilityLocked(); 373a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 374a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 375a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 376a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 377a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 378a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner void finishExit() { 379a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v( 380c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "finishExit in " + this 381a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ": exiting=" + mWin.mExiting 382a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + " remove=" + mWin.mRemoveOnExit 383a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + " windowAnimating=" + isWindowAnimating()); 384a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 385a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final int N = mWin.mChildWindows.size(); 386a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner for (int i=0; i<N; i++) { 387a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mChildWindows.get(i).mWinAnimator.finishExit(); 388a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 389a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 390a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mWin.mExiting) { 391a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return; 392a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 393a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 394a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (isWindowAnimating()) { 395a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return; 396a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 397a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 398a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 399c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Exit animation finished in " + this 400a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ": remove=" + mWin.mRemoveOnExit); 40129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 402a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mDestroySurface.add(mWin); 403a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mDestroying = true; 404b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner if (SHOW_TRANSACTIONS) WindowManagerService.logSurface( 405a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin, "HIDE (finishExit)", null); 4060afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner hide(); 407a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 408a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mExiting = false; 409a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mRemoveOnExit) { 410a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mPendingRemove.add(mWin); 411a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mRemoveOnExit = false; 412a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 413968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mAnimator.hideWallpapersLocked(mWin); 4140afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 4150afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner 4160afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner void hide() { 4170afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner if (!mLastHidden) { 4180afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner //dump(); 4190afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner mLastHidden = true; 4200afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, 4210afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner "HIDE (performLayout)", null); 42229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 4230afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner mSurfaceShown = false; 4240afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner try { 42529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.hide(); 4260afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } catch (RuntimeException e) { 4270afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner Slog.w(TAG, "Exception hiding surface in " + mWin); 4280afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 4290afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 4300afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 431a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 432a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 433a608b882327fbb393bde3854953cd322a6fea675Craig Mautner boolean finishDrawingLocked() { 4346fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_STARTING_WINDOW && 4356fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 4366fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.v(TAG, "Finishing drawing window " + mWin + ": mDrawState=" 4376fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + drawStateToString(mDrawState)); 4386fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 439749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState == DRAW_PENDING) { 440ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner if (DEBUG_SURFACE_TRACE || DEBUG_ANIM || SHOW_TRANSACTIONS || DEBUG_ORIENTATION) 441ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner Slog.v(TAG, "finishDrawingLocked: mDrawState=COMMIT_DRAW_PENDING " + this + " in " 44229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian + mSurfaceControl); 4436fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_STARTING_WINDOW && 4446fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 4456fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.v(TAG, "Draw state now committed in " + mWin); 4466fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 447749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = COMMIT_DRAW_PENDING; 448a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return true; 449a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 450a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return false; 451a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 452a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 453a608b882327fbb393bde3854953cd322a6fea675Craig Mautner // This must be called while inside a transaction. 454a608b882327fbb393bde3854953cd322a6fea675Craig Mautner boolean commitFinishDrawingLocked(long currentTime) { 4556fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_STARTING_WINDOW && 4566fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 4576fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.i(TAG, "commitFinishDrawingLocked: " + mWin + " cur mDrawState=" 4586fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + drawStateToString(mDrawState)); 4596fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 460749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState != COMMIT_DRAW_PENDING) { 461a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return false; 462a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 4636fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_SURFACE_TRACE || DEBUG_ANIM) { 46429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian Slog.i(TAG, "commitFinishDrawingLocked: mDrawState=READY_TO_SHOW " + mSurfaceControl); 4656fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 466749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = READY_TO_SHOW; 467a608b882327fbb393bde3854953cd322a6fea675Craig Mautner final boolean starting = mWin.mAttrs.type == TYPE_APPLICATION_STARTING; 468a608b882327fbb393bde3854953cd322a6fea675Craig Mautner final AppWindowToken atoken = mWin.mAppToken; 469a608b882327fbb393bde3854953cd322a6fea675Craig Mautner if (atoken == null || atoken.allDrawn || starting) { 470a608b882327fbb393bde3854953cd322a6fea675Craig Mautner performShowLocked(); 471a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 472a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return true; 473a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 474a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 4753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian static class SurfaceTrace extends SurfaceControl { 4767d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private final static String SURFACE_TAG = "SurfaceTrace"; 4777d8df3905d294127cc58100912a57c816bfb2502Craig Mautner final static ArrayList<SurfaceTrace> sSurfaces = new ArrayList<SurfaceTrace>(); 4787358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4797d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private float mSurfaceTraceAlpha = 0; 4807358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private int mLayer; 48185afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn private final PointF mPosition = new PointF(); 48285afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn private final Point mSize = new Point(); 48385afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn private final Rect mWindowCrop = new Rect(); 4847358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private boolean mShown = false; 48598365d7663cbd82979a5700faf0050220b01084dJeff Brown private int mLayerStack; 486a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin private final String mName; 4877358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4887d8df3905d294127cc58100912a57c816bfb2502Craig Mautner public SurfaceTrace(SurfaceSession s, 48964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown String name, int w, int h, int format, int flags) 4907358fbfeb2febb60085067fcacc192f429b06545Craig Mautner throws OutOfResourcesException { 49164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown super(s, name, w, h, format, flags); 49298365d7663cbd82979a5700faf0050220b01084dJeff Brown mName = name != null ? name : "Not named"; 49385afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn mSize.set(w, h); 4947d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " 495a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 4967358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4977358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4987358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4997358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setAlpha(float alpha) { 50046ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner if (mSurfaceTraceAlpha != alpha) { 50146ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setAlpha(" + alpha + "): OLD:" + this + ". Called by " 50298129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 50346ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner mSurfaceTraceAlpha = alpha; 50498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 50546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setAlpha(alpha); 5067358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5077358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5087358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5097358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setLayer(int zorder) { 51098129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (zorder != mLayer) { 51146ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setLayer(" + zorder + "): OLD:" + this + ". Called by " 51298129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 51346ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner mLayer = zorder; 51498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 51546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setLayer(zorder); 5167358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5177358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.remove(this); 5187358fbfeb2febb60085067fcacc192f429b06545Craig Mautner int i; 5197358fbfeb2febb60085067fcacc192f429b06545Craig Mautner for (i = sSurfaces.size() - 1; i >= 0; i--) { 5207d8df3905d294127cc58100912a57c816bfb2502Craig Mautner SurfaceTrace s = sSurfaces.get(i); 5217358fbfeb2febb60085067fcacc192f429b06545Craig Mautner if (s.mLayer < zorder) { 5227358fbfeb2febb60085067fcacc192f429b06545Craig Mautner break; 5237358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5247358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5257358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.add(i + 1, this); 5267358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5277358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5287358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5297358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setPosition(float x, float y) { 53098129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (x != mPosition.x || y != mPosition.y) { 53146ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setPosition(" + x + "," + y + "): OLD:" + this 53246ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner + ". Called by " + Debug.getCallers(3)); 53366d7730903a0163711e3d037c2350d6a13368004Craig Mautner mPosition.set(x, y); 53498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 53546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setPosition(x, y); 5367358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5377358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5387358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5397358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setSize(int w, int h) { 54098129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (w != mSize.x || h != mSize.y) { 54146ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setSize(" + w + "," + h + "): OLD:" + this + ". Called by " 54298129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn + Debug.getCallers(3)); 54346ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner mSize.set(w, h); 54498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 54546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setSize(w, h); 5467358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5477358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5487358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 54985afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn public void setWindowCrop(Rect crop) { 550ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner if (crop != null) { 55198129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (!crop.equals(mWindowCrop)) { 55246ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setWindowCrop(" + crop.toShortString() + "): OLD:" + this 55346ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner + ". Called by " + Debug.getCallers(3)); 55466d7730903a0163711e3d037c2350d6a13368004Craig Mautner mWindowCrop.set(crop); 55598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 556ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner } 55746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setWindowCrop(crop); 55885afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn } 55985afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn 56085afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn @Override 56198365d7663cbd82979a5700faf0050220b01084dJeff Brown public void setLayerStack(int layerStack) { 56298129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (layerStack != mLayerStack) { 56346ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "setLayerStack(" + layerStack + "): OLD:" + this 56446ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner + ". Called by " + Debug.getCallers(3)); 56566d7730903a0163711e3d037c2350d6a13368004Craig Mautner mLayerStack = layerStack; 56698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 56746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.setLayerStack(layerStack); 5689de4936c99b979f6010440b043edc6d6142d1980Craig Mautner } 5699de4936c99b979f6010440b043edc6d6142d1980Craig Mautner 5709de4936c99b979f6010440b043edc6d6142d1980Craig Mautner @Override 5717358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void hide() { 57298129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (mShown) { 57346ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "hide: OLD:" + this + ". Called by " + Debug.getCallers(3)); 57466d7730903a0163711e3d037c2350d6a13368004Craig Mautner mShown = false; 57598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 57646ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.hide(); 5777358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 57846ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner 5797358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5807358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void show() { 58198129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if (!mShown) { 58246ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "show: OLD:" + this + ". Called by " + Debug.getCallers(3)); 58366d7730903a0163711e3d037c2350d6a13368004Craig Mautner mShown = true; 58498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn } 58546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner super.show(); 5867358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5877358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5887358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5897358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void destroy() { 5907358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.destroy(); 59146ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner Slog.v(SURFACE_TAG, "destroy: " + this + ". Called by " + Debug.getCallers(3)); 5927358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.remove(this); 5937358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5947358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 595acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner @Override 596acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner public void release() { 597acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner super.release(); 598acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner Slog.v(SURFACE_TAG, "release: " + this + ". Called by " 599a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 600acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner sSurfaces.remove(this); 601acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 602acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 6037358fbfeb2febb60085067fcacc192f429b06545Craig Mautner static void dumpAllSurfaces() { 6047358fbfeb2febb60085067fcacc192f429b06545Craig Mautner final int N = sSurfaces.size(); 6057358fbfeb2febb60085067fcacc192f429b06545Craig Mautner for (int i = 0; i < N; i++) { 6067358fbfeb2febb60085067fcacc192f429b06545Craig Mautner Slog.i(TAG, "SurfaceDump: " + sSurfaces.get(i)); 6077358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6087358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6097358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 6107358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 6117358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public String toString() { 612fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner return "Surface " + Integer.toHexString(System.identityHashCode(this)) + " " 61398365d7663cbd82979a5700faf0050220b01084dJeff Brown + mName + " (" + mLayerStack + "): shown=" + mShown + " layer=" + mLayer 6147d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y 61585afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn + " " + mSize.x + "x" + mSize.y 61685afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn + " crop=" + mWindowCrop.toShortString(); 6177358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6187358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 6197358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 6203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl createSurfaceLocked() { 62129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl == null) { 62283339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner if (DEBUG_ANIM || DEBUG_ORIENTATION) Slog.i(TAG, 62383339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner "createSurface " + this + ": mDrawState=DRAW_PENDING"); 624749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = DRAW_PENDING; 625c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken != null) { 6267636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner if (mWin.mAppToken.mAppAnimator.animation == null) { 6277636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner mWin.mAppToken.allDrawn = false; 6287636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner mWin.mAppToken.deferClearAllDrawn = false; 6297636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner } else { 6307636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner // Currently animating, persist current state of allDrawn until animation 6317636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner // is complete. 6327636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner mWin.mAppToken.deferClearAllDrawn = true; 6337636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner } 634c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 635c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 636c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.makeWindowFreezingScreenIfNeededLocked(mWin); 637c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 6383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian int flags = SurfaceControl.HIDDEN; 639c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowManager.LayoutParams attrs = mWin.mAttrs; 640c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 641c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((attrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) { 6423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian flags |= SurfaceControl.SECURE; 643c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 644b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner if (DEBUG_VISIBILITY) Slog.v( 645c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Creating surface in session " 646c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSession.mSurfaceSession + " window " + this 647c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " w=" + mWin.mCompatFrame.width() 648c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " h=" + mWin.mCompatFrame.height() + " format=" 649c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + attrs.format + " flags=" + flags); 650c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 651c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int w = mWin.mCompatFrame.width(); 652c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int h = mWin.mCompatFrame.height(); 653c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((attrs.flags & LayoutParams.FLAG_SCALED) != 0) { 654c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // for a scaled surface, we always want the requested 655c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // size. 656c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w = mWin.mRequestedWidth; 657c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner h = mWin.mRequestedHeight; 658c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 659c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 660c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Something is wrong and SurfaceFlinger will not like this, 661c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // try to revert to sane values 662c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w <= 0) w = 1; 663c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (h <= 0) h = 1; 664c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 665c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 666c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = 0; 6677d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurfaceAlpha = 0; 668c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceX = 0; 669c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceY = 0; 670c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceW = w; 671c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceH = h; 67285afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn mWin.mLastSystemDecorRect.set(0, 0, 0, 0); 673c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 674c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean isHwAccelerated = (attrs.flags & 675c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0; 676c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : attrs.format; 677c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!PixelFormat.formatHasAlpha(attrs.format)) { 6783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian flags |= SurfaceControl.OPAQUE; 679c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 6807358fbfeb2febb60085067fcacc192f429b06545Craig Mautner if (DEBUG_SURFACE_TRACE) { 68129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl = new SurfaceTrace( 68264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown mSession.mSurfaceSession, 6837358fbfeb2febb60085067fcacc192f429b06545Craig Mautner attrs.getTitle().toString(), 68464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown w, h, format, flags); 6857358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } else { 68629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl = new SurfaceControl( 68764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown mSession.mSurfaceSession, 688c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attrs.getTitle().toString(), 68964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown w, h, format, flags); 6907358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 691c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = true; 692c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG, 693c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner " CREATE SURFACE " 69429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian + mSurfaceControl + " IN SESSION " 695c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSession.mSurfaceSession 696c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": pid=" + mSession.mPid + " format=" 697c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + attrs.format + " flags=0x" 698c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + Integer.toHexString(flags) 699c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " / " + this); 700a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin } catch (OutOfResourcesException e) { 701c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = false; 702c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "OutOfResourcesException creating surface"); 703c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "create", true); 704749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 705c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return null; 706c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (Exception e) { 707c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = false; 708c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.e(TAG, "Exception creating surface", e); 709749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 710c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return null; 711c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 712c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 713c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 71429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian TAG, "Got surface: " + mSurfaceControl 715c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ", set left=" + mWin.mFrame.left + " top=" + mWin.mFrame.top 716c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ", animLayer=" + mAnimLayer); 717c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) { 718c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.i(TAG, ">>> OPEN TRANSACTION createSurfaceLocked"); 719c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "CREATE pos=(" 720c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.mFrame.left + "," + mWin.mFrame.top + ") (" 721c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.mCompatFrame.width() + "x" + mWin.mCompatFrame.height() 722c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "), layer=" + mAnimLayer + " HIDE", null); 723c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 7243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.openTransaction(); 725c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 726c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 727c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceX = mWin.mFrame.left + mWin.mXOffset; 728c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceY = mWin.mFrame.top + mWin.mYOffset; 72929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setPosition(mSurfaceX, mSurfaceY); 730c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = mAnimLayer; 73129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setLayerStack(mLayerStack); 73229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setLayer(mAnimLayer); 73329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setAlpha(0); 734c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 735c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 736c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error creating surface in " + w, e); 737c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "create-init", true); 738c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 739749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = true; 740c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } finally { 7413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.closeTransaction(); 742c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 743c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "<<< CLOSE TRANSACTION createSurfaceLocked"); 744c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 745c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 746c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Created surface " + this); 747c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 74829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian return mSurfaceControl; 749c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 750c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 751968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner void destroySurfaceLocked() { 752c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken != null && mWin == mWin.mAppToken.startingWindow) { 753c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.startingDisplayed = false; 754c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 755c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 75629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 757c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 758c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int i = mWin.mChildWindows.size(); 759c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner while (i > 0) { 760c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner i--; 761c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowState c = mWin.mChildWindows.get(i); 762c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mAttachedHidden = true; 763c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 764c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 765c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 766c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) { 767c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 768c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 769c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 770c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 771c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 772c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Window " + this + " destroying surface " 77329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian + mSurfaceControl + ", session " + mSession, e); 774c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 775c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurfaceDestroyDeferred) { 77629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null && mPendingDestroySurface != mSurfaceControl) { 777c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 778c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 779c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 780c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 781c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 782c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 783c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 784c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); 785c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 786c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface.destroy(); 787c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 78829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mPendingDestroySurface = mSurfaceControl; 789c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 790c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 791c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 792c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 793c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 794c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 795c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 796c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 797c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY", e); 798c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 79929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.destroy(); 800c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 801968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mAnimator.hideWallpapersLocked(mWin); 802c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 803c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Exception thrown when destroying Window " + this 80429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian + " surface " + mSurfaceControl + " session " + mSession 805c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": " + e.toString()); 806c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 807c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 808c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 80929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl = null; 810e8552142494bbb4438a8748707f74b1ce241ea48Craig Mautner mWin.mHasSurface = false; 811bf08af3323117e15a65b74e66b7499d31537f9e1Craig Mautner mDrawState = NO_SURFACE; 812c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 813c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 814c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 815968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner void destroyDeferredSurfaceLocked() { 816c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 817c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 818c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 819c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 820c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 821c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 822c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 823c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 824c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); 825c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 826c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface.destroy(); 827968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mAnimator.hideWallpapersLocked(mWin); 828c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 829c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 830d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.w(TAG, "Exception thrown when destroying Window " 831c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + this + " surface " + mPendingDestroySurface 832c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " session " + mSession + ": " + e.toString()); 833c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 834c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceDestroyDeferred = false; 835c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface = null; 836c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 837c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 838c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void computeShownFrameLocked() { 839c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean selfTransformation = mHasLocalTransformation; 840c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Transformation attachedTransformation = 841322e40315609acd5a608440bc469d873e09559caCraig Mautner (mAttachedWinAnimator != null && mAttachedWinAnimator.mHasLocalTransformation) 842322e40315609acd5a608440bc469d873e09559caCraig Mautner ? mAttachedWinAnimator.mTransformation : null; 843322e40315609acd5a608440bc469d873e09559caCraig Mautner Transformation appTransformation = (mAppAnimator != null && mAppAnimator.hasTransformation) 844322e40315609acd5a608440bc469d873e09559caCraig Mautner ? mAppAnimator.transformation : null; 845c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 846c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Wallpapers are animated based on the "real" window they 847c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // are currently targeting. 848968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner if (mIsWallpaper && mService.mLowerWallpaperTarget == null 849968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner && mService.mWallpaperTarget != null) { 850968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final WindowStateAnimator wallpaperAnimator = mService.mWallpaperTarget.mWinAnimator; 851918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (wallpaperAnimator.mHasLocalTransformation && 852918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner wallpaperAnimator.mAnimation != null && 853918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner !wallpaperAnimator.mAnimation.getDetachWallpaper()) { 854918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner attachedTransformation = wallpaperAnimator.mTransformation; 855c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER && attachedTransformation != null) { 856c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "WP target attached xform: " + attachedTransformation); 857c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 858c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 859968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final AppWindowAnimator wpAppAnimator = mAnimator.getWallpaperAppAnimator(); 860918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (wpAppAnimator != null && wpAppAnimator.hasTransformation 861918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner && wpAppAnimator.animation != null 862918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner && !wpAppAnimator.animation.getDetachWallpaper()) { 863594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner appTransformation = wpAppAnimator.transformation; 864c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER && appTransformation != null) { 865c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "WP target app xform: " + appTransformation); 866c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 867c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 868c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 869c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 870a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final int displayId = mWin.getDisplayId(); 871a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final ScreenRotationAnimation screenRotationAnimation = 872a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mAnimator.getScreenRotationAnimationLocked(displayId); 873a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final boolean screenAnimation = 874a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner screenRotationAnimation != null && screenRotationAnimation.isAnimating(); 875c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation || attachedTransformation != null 876c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || appTransformation != null || screenAnimation) { 877c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // cache often used attributes locally 878c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Rect frame = mWin.mFrame; 879c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float tmpFloats[] = mService.mTmpFloats; 880c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Matrix tmpMatrix = mWin.mTmpMatrix; 881c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 882c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Compute the desired transformation. 8834b16969b006613bff4901a6e979f29a0f501430bDianne Hackborn if (screenAnimation && screenRotationAnimation.isRotating()) { 884c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are doing a screen animation, the global rotation 885c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // applied to windows can result in windows that are carefully 886c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // aligned with each other to slightly separate, allowing you 887c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // to see what is behind them. An unsightly mess. This... 888c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // thing... magically makes it call good: scale each window 889c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // slightly (two pixels larger in each dimension, from the 890c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // window's center). 891c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float w = frame.width(); 892c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float h = frame.height(); 893c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w>=1 && h>=1) { 894c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.setScale(1 + 2/w, 1 + 2/h, w/2, h/2); 895c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 896c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.reset(); 897c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 898c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 899c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.reset(); 900c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 901c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postScale(mWin.mGlobalScale, mWin.mGlobalScale); 902c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation) { 903c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(mTransformation.getMatrix()); 904c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 905c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postTranslate(frame.left + mWin.mXOffset, frame.top + mWin.mYOffset); 906c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attachedTransformation != null) { 907c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(attachedTransformation.getMatrix()); 908c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 909c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (appTransformation != null) { 910c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(appTransformation.getMatrix()); 911c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 912a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mAnimator.mUniverseBackground != null) { 913a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.postConcat(mAnimator.mUniverseBackground.mUniverseTransform.getMatrix()); 914a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 915c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 916a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner tmpMatrix.postConcat(screenRotationAnimation.getEnterTransformation().getMatrix()); 917c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 918545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov //TODO (multidisplay): Magnification is supported only for the default display. 919545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov if (mService.mDisplayMagnifier != null 920545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov && mWin.getDisplayId() == Display.DEFAULT_DISPLAY) { 921545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov MagnificationSpec spec = mService.mDisplayMagnifier 922545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov .getMagnificationSpecForWindowLocked(mWin); 923152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov if (spec != null && !spec.isNop()) { 924152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov tmpMatrix.postScale(spec.scale, spec.scale); 925152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov tmpMatrix.postTranslate(spec.offsetX, spec.offsetY); 926152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov } 9271cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 928c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 929c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // "convert" it into SurfaceFlinger's format 930c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // (a 2x2 matrix + an offset) 931c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Here we must not transform the position of the surface 932c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // since it is already included in the transformation. 933c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Transform: " + matrix); 934c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 935c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mHaveMatrix = true; 936c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.getValues(tmpFloats); 937c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx = tmpFloats[Matrix.MSCALE_X]; 938c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDx = tmpFloats[Matrix.MSKEW_Y]; 939c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy = tmpFloats[Matrix.MSKEW_X]; 940c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDy = tmpFloats[Matrix.MSCALE_Y]; 941c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float x = tmpFloats[Matrix.MTRANS_X]; 942c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float y = tmpFloats[Matrix.MTRANS_Y]; 943c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int w = frame.width(); 944c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int h = frame.height(); 945c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mShownFrame.set(x, y, x+w, y+h); 946c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 947c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Now set the alpha... but because our current hardware 948c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // can't do alpha transformation on a non-opaque surface, 949c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // turn it off if we are running an animation that is also 950c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // transforming since it is more important to have that 951c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // animation be smooth. 952c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha = mAlpha; 953c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!mService.mLimitedAlphaCompositing 954c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || (!PixelFormat.formatHasAlpha(mWin.mAttrs.format) 955c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDsDy, mDtDy) 956c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && x == frame.left && y == frame.top))) { 957c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Applying alpha transform"); 958c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation) { 959c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= mTransformation.getAlpha(); 960c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 961c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attachedTransformation != null) { 962c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= attachedTransformation.getAlpha(); 963c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 964c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (appTransformation != null) { 965c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= appTransformation.getAlpha(); 966c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 967a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mAnimator.mUniverseBackground != null) { 968a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mShownAlpha *= mAnimator.mUniverseBackground.mUniverseTransform.getAlpha(); 969a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 970c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 971a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mShownAlpha *= screenRotationAnimation.getEnterTransformation().getAlpha(); 972c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 973c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 974c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Not applying alpha transform"); 975c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 976c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 977a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner if ((DEBUG_SURFACE_TRACE || WindowManagerService.localLOGV) 978a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner && (mShownAlpha == 1.0 || mShownAlpha == 0.0)) Slog.v( 979a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner TAG, "computeShownFrameLocked: Animating " + this + " mAlpha=" + mAlpha 980a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " self=" + (selfTransformation ? mTransformation.getAlpha() : "null") 981a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " attached=" + (attachedTransformation == null ? 982a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner "null" : attachedTransformation.getAlpha()) 983a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " app=" + (appTransformation == null ? "null" : appTransformation.getAlpha()) 984a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner + " screen=" + (screenAnimation ? 985a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner screenRotationAnimation.getEnterTransformation().getAlpha() : "null")); 986c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return; 987968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner } else if (mIsWallpaper && mService.mInnerFields.mWallpaperActionPending) { 9884d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner return; 989c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 990c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 991c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 9924d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner TAG, "computeShownFrameLocked: " + this + 9934d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner " not attached, mAlpha=" + mAlpha); 9941cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 9951cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov final boolean applyUniverseTransformation = (mAnimator.mUniverseBackground != null 9961cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov && mWin.mAttrs.type != WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND 9971cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov && mWin.mBaseLayer < mAnimator.mAboveUniverseLayer); 998545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov MagnificationSpec spec = null; 999545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov //TODO (multidisplay): Magnification is supported only for the default display. 1000545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov if (mService.mDisplayMagnifier != null && mWin.getDisplayId() == Display.DEFAULT_DISPLAY) { 1001545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov spec = mService.mDisplayMagnifier.getMagnificationSpecForWindowLocked(mWin); 1002545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov } 10031cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (applyUniverseTransformation || spec != null) { 1004a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final Rect frame = mWin.mFrame; 1005a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final float tmpFloats[] = mService.mTmpFloats; 1006a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final Matrix tmpMatrix = mWin.mTmpMatrix; 10071cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1008a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.setScale(mWin.mGlobalScale, mWin.mGlobalScale); 1009a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.postTranslate(frame.left + mWin.mXOffset, frame.top + mWin.mYOffset); 10101cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 10111cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (applyUniverseTransformation) { 10121cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov tmpMatrix.postConcat(mAnimator.mUniverseBackground.mUniverseTransform.getMatrix()); 10131cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 10141cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 10151cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (spec != null && !spec.isNop()) { 1016152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov tmpMatrix.postScale(spec.scale, spec.scale); 1017152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov tmpMatrix.postTranslate(spec.offsetX, spec.offsetY); 10181cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 10191cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1020a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn tmpMatrix.getValues(tmpFloats); 10211cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1022a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mHaveMatrix = true; 1023a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDx = tmpFloats[Matrix.MSCALE_X]; 1024a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDx = tmpFloats[Matrix.MSKEW_Y]; 1025a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDy = tmpFloats[Matrix.MSKEW_X]; 1026a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDy = tmpFloats[Matrix.MSCALE_Y]; 1027a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn float x = tmpFloats[Matrix.MTRANS_X]; 1028a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn float y = tmpFloats[Matrix.MTRANS_Y]; 1029a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn int w = frame.width(); 1030a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn int h = frame.height(); 10311cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mWin.mShownFrame.set(x, y, x + w, y + h); 10321cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 10331cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mShownAlpha = mAlpha; 10341cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (applyUniverseTransformation) { 10351cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mShownAlpha *= mAnimator.mUniverseBackground.mUniverseTransform.getAlpha(); 10361cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1037a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else { 1038a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mWin.mShownFrame.set(mWin.mFrame); 1039a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mWin.mXOffset != 0 || mWin.mYOffset != 0) { 1040a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mWin.mShownFrame.offset(mWin.mXOffset, mWin.mYOffset); 1041a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1042a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mShownAlpha = mAlpha; 1043a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mHaveMatrix = false; 1044a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDx = mWin.mGlobalScale; 1045a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDx = 0; 1046a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDsDy = 0; 1047a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mDtDy = mWin.mGlobalScale; 1048a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1049a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1050a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 1051a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn void applyDecorRect(final Rect decorRect) { 1052a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final WindowState w = mWin; 1053a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Compute the offset of the window in relation to the decor rect. 1054a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final int offX = w.mXOffset + w.mFrame.left; 1055a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final int offY = w.mYOffset + w.mFrame.top; 1056a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Initialize the decor rect to the entire frame. 1057a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mFrame.width(), w.mFrame.height()); 1058a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Intersect with the decor rect, offsetted by window position. 1059a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.intersect(decorRect.left-offX, decorRect.top-offY, 1060a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn decorRect.right-offX, decorRect.bottom-offY); 1061a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // If size compatibility is being applied to the window, the 1062a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // surface is scaled relative to the screen. Also apply this 1063a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // scaling to the crop rect. We aren't using the standard rect 1064a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // scale function because we want to round things to make the crop 1065a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // always round to a larger rect to ensure we don't crop too 1066a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // much and hide part of the window that should be seen. 1067a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (w.mEnforceSizeCompat && w.mInvGlobalScale != 1.0f) { 1068a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final float scale = w.mInvGlobalScale; 1069a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.left = (int) (w.mSystemDecorRect.left * scale - 0.5f); 1070a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.top = (int) (w.mSystemDecorRect.top * scale - 0.5f); 1071a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.right = (int) ((w.mSystemDecorRect.right+1) * scale - 0.5f); 1072a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.bottom = (int) ((w.mSystemDecorRect.bottom+1) * scale - 0.5f); 1073a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1074c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1075d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner 10763e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn void updateSurfaceWindowCrop(final boolean recoveringMemory) { 10773e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn final WindowState w = mWin; 107869b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner DisplayInfo displayInfo = w.mDisplayContent.getDisplayInfo(); 10793e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn 10803e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // Need to recompute a new system decor rect each time. 10813e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { 10823e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // Currently can't do this cropping for scaled windows. We'll 10833e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // just keep the crop rect the same as the source surface. 10843e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mRequestedWidth, w.mRequestedHeight); 108569b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner } else if (!w.isDefaultDisplay()) { 108628e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown // On a different display there is no system decor. Crop the window 108728e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown // by the screen boundaries. 10883671410b9e09e1c5ec05dfc58651a8efaa7790ddJeff Brown w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height()); 108928e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown w.mSystemDecorRect.intersect(-w.mCompatFrame.left, -w.mCompatFrame.top, 109028e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown displayInfo.logicalWidth - w.mCompatFrame.left, 109128e0b09a3d22de80cca05499e98a23d5dd82fa15Jeff Brown displayInfo.logicalHeight - w.mCompatFrame.top); 10923e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } else if (w.mLayer >= mService.mSystemDecorLayer) { 10933e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn // Above the decor layer is easy, just use the entire window. 1094a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Unless we have a universe background... in which case all the 1095a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // windows need to be cropped by the screen, so they don't cover 1096a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // the universe background. 1097a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mAnimator.mUniverseBackground == null) { 1098a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), 1099a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn w.mCompatFrame.height()); 1100a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else { 1101a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn applyDecorRect(mService.mScreenRect); 1102a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 11034664623c304cf162b9a78f3aee3290a92e54b628John Spurlock } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND 11044664623c304cf162b9a78f3aee3290a92e54b628John Spurlock || w.mDecorFrame.isEmpty()) { 11054664623c304cf162b9a78f3aee3290a92e54b628John Spurlock // The universe background isn't cropped, nor windows without policy decor. 11063e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), 11073e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mCompatFrame.height()); 11083e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } else { 11094664623c304cf162b9a78f3aee3290a92e54b628John Spurlock // Crop to the system decor specified by policy. 11104664623c304cf162b9a78f3aee3290a92e54b628John Spurlock applyDecorRect(w.mDecorFrame); 11113e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11123e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn 11133e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (!w.mSystemDecorRect.equals(w.mLastSystemDecorRect)) { 11143e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn w.mLastSystemDecorRect.set(w.mSystemDecorRect); 11153e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn try { 11163e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 11173e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn "CROP " + w.mSystemDecorRect.toShortString(), null); 111829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setWindowCrop(w.mSystemDecorRect); 11193e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } catch (RuntimeException e) { 11203e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn Slog.w(TAG, "Error setting crop surface of " + w 11213e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn + " crop=" + w.mSystemDecorRect.toShortString(), e); 11223e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (!recoveringMemory) { 11233e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn mService.reclaimSomeSurfaceMemoryLocked(this, "crop", true); 11243e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11253e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11263e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11273e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn } 11283e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn 1129a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner void setSurfaceBoundariesLocked(final boolean recoveringMemory) { 1130c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowState w = mWin; 1131c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int width, height; 1132c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { 1133c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // for a scaled surface, we just want to use 1134c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // the requested size. 1135c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = w.mRequestedWidth; 1136c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = w.mRequestedHeight; 1137c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1138c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = w.mCompatFrame.width(); 1139c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = w.mCompatFrame.height(); 1140c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1141c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1142c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (width < 1) { 1143c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = 1; 1144c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1145c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (height < 1) { 1146c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = 1; 1147c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1148c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean surfaceResized = mSurfaceW != width || mSurfaceH != height; 1149c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (surfaceResized) { 1150c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceW = width; 1151c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceH = height; 1152c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1153c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 11544d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner final float left = w.mShownFrame.left; 11554d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner final float top = w.mShownFrame.top; 11564d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner if (mSurfaceX != left || mSurfaceY != top) { 1157c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1158c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 11594d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner "POS " + left + ", " + top, null); 11604d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mSurfaceX = left; 11614d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mSurfaceY = top; 116229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setPosition(left, top); 1163c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1164c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error positioning surface of " + w 11654d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + " pos=(" + left 11664d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + "," + top + ")", e); 1167c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 1168c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "position", true); 1169c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1170c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1171c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1172c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1173c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (surfaceResized) { 1174c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1175c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1176c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "SIZE " + width + "x" + height, null); 1177c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceResized = true; 117829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setSize(width, height); 117976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner final int displayId = w.mDisplayContent.getDisplayId(); 118076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner mAnimator.setPendingLayoutChanges(displayId, 118176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER); 11823a67f35f5e912b9c1ec44adbdc5531427318b12dCraig Mautner if ((w.mAttrs.flags & LayoutParams.FLAG_DIM_BEHIND) != 0) { 118305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner w.getStack().startDimmingIfNeeded(this); 11843a67f35f5e912b9c1ec44adbdc5531427318b12dCraig Mautner } 1185c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1186c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If something goes wrong with the surface (such 1187c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // as running out of memory), don't take down the 1188c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // entire system. 1189c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.e(TAG, "Error resizing surface of " + w 1190c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " size=(" + width + "x" + height + ")", e); 1191c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 1192c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "size", true); 1193c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1194c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1195c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 119685afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn 11973e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn updateSurfaceWindowCrop(recoveringMemory); 1198acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1199acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1200acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner public void prepareSurfaceLocked(final boolean recoveringMemory) { 1201acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner final WindowState w = mWin; 120229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl == null) { 1203acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner if (w.mOrientationChanging) { 1204acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner if (DEBUG_ORIENTATION) { 1205acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner Slog.v(TAG, "Orientation change skips hidden " + w); 1206acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1207acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner w.mOrientationChanging = false; 1208acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1209acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner return; 1210acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 1211acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1212acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner boolean displayed = false; 1213acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1214acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner computeShownFrameLocked(); 1215acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 1216a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner setSurfaceBoundariesLocked(recoveringMemory); 1217c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1218918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (mIsWallpaper && !mWin.mWallpaperVisible) { 12190fa77c1e0fc218040efc570936e988dbeece399cCraig Mautner // Wallpaper is no longer visible and there is no wp target => hide it. 12200fa77c1e0fc218040efc570936e988dbeece399cCraig Mautner hide(); 122172669d18016446d874e4fa1005464e36375124e4Craig Mautner } else if (w.mAttachedHidden || !w.isOnScreen()) { 12220afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner hide(); 1223968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mAnimator.hideWallpapersLocked(w); 1224b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner 1225c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are waiting for this window to handle an 1226c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // orientation change, well, it is hidden, so 1227c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // doesn't really matter. Note that this does 1228c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // introduce a potential glitch if the window 1229c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // becomes unhidden before it has drawn for the 1230c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // new orientation. 1231c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mOrientationChanging) { 1232c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mOrientationChanging = false; 1233c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, 1234c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Orientation change skips hidden " + w); 1235c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1236c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else if (mLastLayer != mAnimLayer 1237c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastAlpha != mShownAlpha 1238c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDsDx != mDsDx 1239c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDtDx != mDtDx 1240c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDsDy != mDsDy 1241c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDtDy != mDtDy 1242c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || w.mLastHScale != w.mHScale 1243c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || w.mLastVScale != w.mVScale 1244749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner || mLastHidden) { 1245c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner displayed = true; 1246c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastAlpha = mShownAlpha; 1247c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastLayer = mAnimLayer; 1248c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDsDx = mDsDx; 1249c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDtDx = mDtDx; 1250c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDsDy = mDsDy; 1251c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDtDy = mDtDy; 1252c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mLastHScale = w.mHScale; 1253c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mLastVScale = w.mVScale; 1254c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1255c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "alpha=" + mShownAlpha + " layer=" + mAnimLayer 1256c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " matrix=[" + (mDsDx*w.mHScale) 1257c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "," + (mDtDx*w.mVScale) 1258c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "][" + (mDsDy*w.mHScale) 1259c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "," + (mDtDy*w.mVScale) + "]", null); 126029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 1261c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1262c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceAlpha = mShownAlpha; 126329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setAlpha(mShownAlpha); 1264ad5725d7985a784056b02b97ab76357a667a6ad4Craig Mautner mSurfaceLayer = mAnimLayer; 126529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setLayer(mAnimLayer); 126629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setMatrix( 1267c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx*w.mHScale, mDtDx*w.mVScale, 1268c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy*w.mHScale, mDtDy*w.mVScale); 1269749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner 1270749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mLastHidden && mDrawState == HAS_DRAWN) { 1271749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1272749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner "SHOW (performLayout)", null); 1273749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w 1274749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner + " during relayout"); 1275749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (showSurfaceRobustlyLocked()) { 1276749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = false; 1277918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (mIsWallpaper) { 1278507a2ee12b6d1d683e4a5806804c472b3fe32e61Craig Mautner mService.dispatchWallpaperVisibility(w, true); 1279507a2ee12b6d1d683e4a5806804c472b3fe32e61Craig Mautner } 12808efb0a4d811fc18ac8ef32f7d597aa6fafb3acecCraig Mautner // This draw means the difference between unique content and mirroring. 12818efb0a4d811fc18ac8ef32f7d597aa6fafb3acecCraig Mautner // Run another pass through performLayout to set mHasContent in the 12828efb0a4d811fc18ac8ef32f7d597aa6fafb3acecCraig Mautner // LogicalDisplay. 12838efb0a4d811fc18ac8ef32f7d597aa6fafb3acecCraig Mautner mAnimator.setPendingLayoutChanges(w.getDisplayId(), 12848efb0a4d811fc18ac8ef32f7d597aa6fafb3acecCraig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM); 1285749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } else { 1286749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner w.mOrientationChanging = false; 1287749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1288749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 128929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 1290749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner w.mToken.hasVisible = true; 1291749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1292c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1293c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error updating surface in " + w, e); 1294c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 1295c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "update", true); 1296c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1297c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1298c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1299c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 13009e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner if (DEBUG_ANIM && isAnimating()) { 13019e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner Slog.v(TAG, "prepareSurface: No changes in animation for " + this); 130283339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner } 1303c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner displayed = true; 1304c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1305c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1306c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (displayed) { 1307c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mOrientationChanging) { 1308c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!w.isDrawnLw()) { 13092639da500e3d53ea3a17d888b1c0001d043c6b98Craig Mautner mAnimator.mBulkUpdateParams &= ~SET_ORIENTATION_CHANGE_COMPLETE; 1310a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn mAnimator.mLastWindowFreezeSource = w; 1311c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, 1312c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Orientation continue waiting for draw in " + w); 1313c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1314c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mOrientationChanging = false; 1315c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation change complete in " + w); 1316c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1317c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1318c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mToken.hasVisible = true; 1319c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1320c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1321c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1322ef6550195f2f403e5ace27d49ae4f7f38d29cf4aCraig Mautner void setTransparentRegionHintLocked(final Region region) { 132329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl == null) { 13241f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true"); 13251f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner return; 13261f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner } 132748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 132848ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner ">>> OPEN TRANSACTION setTransparentRegion"); 13293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.openTransaction(); 133048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner try { 133148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, 133248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner "transparentRegionHint=" + region, null); 133329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setTransparentRegionHint(region); 133448ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } finally { 13353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.closeTransaction(); 133648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 133748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner "<<< CLOSE TRANSACTION setTransparentRegion"); 133848ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 133948ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 134048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner 1341581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner void setWallpaperOffset(RectF shownFrame) { 1342581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner final int left = (int) shownFrame.left; 1343581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner final int top = (int) shownFrame.top; 1344581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner if (mSurfaceX != left || mSurfaceY != top) { 1345581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner mSurfaceX = left; 1346581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner mSurfaceY = top; 1347581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner if (mAnimating) { 1348581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner // If this window (or its app token) is animating, then the position 1349581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner // of the surface will be re-computed on the next animation frame. 1350581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner // We can't poke it directly here because it depends on whatever 1351581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner // transformation is being applied by the animation. 1352581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner return; 1353581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner } 13543e52fc25154540faf3c0cb927ff45532cdebdddfDianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 1355581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner ">>> OPEN TRANSACTION setWallpaperOffset"); 13563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.openTransaction(); 1357581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner try { 1358581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, 1359581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner "POS " + left + ", " + top, null); 136029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.setPosition(mWin.mFrame.left + left, mWin.mFrame.top + top); 1361581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner updateSurfaceWindowCrop(false); 1362581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner } catch (RuntimeException e) { 1363581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner Slog.w(TAG, "Error positioning surface of " + mWin 1364581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner + " pos=(" + left + "," + top + ")", e); 1365581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner } finally { 13663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.closeTransaction(); 1367581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 1368581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner "<<< CLOSE TRANSACTION setWallpaperOffset"); 1369581068131c192a8c495fac00d3c61807580c7ecaCraig Mautner } 137048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 137148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 137248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner 1373c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // This must be called while inside a transaction. 1374c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean performShowLocked() { 13755962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner if (mWin.isHiddenFromUserLocked()) { 137688400d3a31139c40c4014faf86c243647087ef6cCraig Mautner Slog.w(TAG, "current user violation " + mService.mCurrentUserId + " trying to display " 1377a2d7b1117abc23a3ff0ccda15a2f9138aaa7f4fcCraig Mautner + this + ", type " + mWin.mAttrs.type + ", belonging to " + mWin.mOwnerUid); 13789dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautner return false; 13799dc52bc44c94854fcd3384a045b4b862e30e25deCraig Mautner } 13806fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_VISIBILITY || (DEBUG_STARTING_WINDOW && 13816fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING)) { 1382c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 1383c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 1384c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 1385c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 1386c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1387d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.v(TAG, "performShow on " + this 1388749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner + ": mDrawState=" + mDrawState + " readyForDisplay=" 13896e2281d44c9b71a03a50ed24d654927111cd2b72Dianne Hackborn + mWin.isReadyForDisplayIgnoringKeyguard() 13906fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " starting=" + (mWin.mAttrs.type == TYPE_APPLICATION_STARTING) 1391c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " during animation: policyVis=" + mWin.mPolicyVisibility 1392c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " attHidden=" + mWin.mAttachedHidden 1393c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok.hiddenRequested=" 1394c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hiddenRequested : false) 1395c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok.hidden=" 1396c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hidden : false) 1397c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " animating=" + mAnimating 1398c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok animating=" 1399322e40315609acd5a608440bc469d873e09559caCraig Mautner + (mAppAnimator != null ? mAppAnimator.animating : false), e); 14006fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 14016fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (mDrawState == READY_TO_SHOW && mWin.isReadyForDisplayIgnoringKeyguard()) { 14026fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) 14036fbda63e68513ece4409dac845588711ab25c39dCraig Mautner WindowManagerService.logSurface(mWin, "SHOW (performShowLocked)", null); 14046fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (DEBUG_VISIBILITY || (DEBUG_STARTING_WINDOW && 14056fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING)) { 14066fbda63e68513ece4409dac845588711ab25c39dCraig Mautner Slog.v(TAG, "Showing " + this 14076fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " during animation: policyVis=" + mWin.mPolicyVisibility 14086fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " attHidden=" + mWin.mAttachedHidden 14096fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " tok.hiddenRequested=" 14106fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hiddenRequested : false) 14116fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " tok.hidden=" 14126fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hidden : false) 14136fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " animating=" + mAnimating 14146fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " tok animating=" 1415322e40315609acd5a608440bc469d873e09559caCraig Mautner + (mAppAnimator != null ? mAppAnimator.animating : false)); 14166fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 1417c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1418c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.enableScreenIfNeededLocked(); 1419c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1420c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner applyEnterAnimationLocked(); 1421c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1422de6198ebd7f9ea5b7940d38bf5839dfbc6a192c4Craig Mautner // Force the show in the next prepareSurfaceLocked() call. 1423c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastAlpha = -1; 1424ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner if (DEBUG_SURFACE_TRACE || DEBUG_ANIM) 1425ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner Slog.v(TAG, "performShowLocked: mDrawState=HAS_DRAWN in " + this); 1426749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = HAS_DRAWN; 1427968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mService.scheduleAnimationLocked(); 1428c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1429c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int i = mWin.mChildWindows.size(); 1430c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner while (i > 0) { 1431c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner i--; 1432c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowState c = mWin.mChildWindows.get(i); 1433c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (c.mAttachedHidden) { 1434c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mAttachedHidden = false; 143529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (c.mWinAnimator.mSurfaceControl != null) { 1436c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mWinAnimator.performShowLocked(); 1437c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // It hadn't been shown, which means layout not 1438c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // performed on it, so now we want to make sure to 1439c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // do a layout. If called from within the transaction 1440c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // loop, this will cause it to restart with a new 1441c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // layout. 144219d59bc5ad877e9b1544ab13a08282b7b384fefbCraig Mautner c.mDisplayContent.layoutNeeded = true; 1443c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1444c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1445c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1446c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1447c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAttrs.type != TYPE_APPLICATION_STARTING 1448c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && mWin.mAppToken != null) { 1449c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.firstWindowDrawn = true; 1450c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1451c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken.startingData != null) { 1452c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_STARTING_WINDOW || 1453d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 1454c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Finish starting " + mWin.mToken 1455c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": first real window is shown, no animation"); 1456c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If this initial window is animating, stop it -- we 1457c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // will do an animation to reveal it from behind the 1458c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // starting window, so there is no need for it to also 1459c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // be doing its own stuff. 14604d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner clearAnimation(); 1461c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mFinishedStarting.add(mWin.mAppToken); 1462c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mH.sendEmptyMessage(H.FINISHED_STARTING); 1463c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1464c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.updateReportedVisibilityLocked(); 1465c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1466c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1467c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1468c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1469c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1470c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return false; 1471c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1472c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1473c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 1474c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Have the surface flinger show a surface, robustly dealing with 1475c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * error conditions. In particular, if there is not enough memory 1476c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * to show the surface, then we will try to get rid of other surfaces 1477c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * in order to succeed. 1478c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * 1479c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @return Returns true if the surface was successfully shown. 1480c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 1481c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean showSurfaceRobustlyLocked() { 1482c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 148329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 1484c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = true; 148529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian mSurfaceControl.show(); 1486c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mTurnOnScreen) { 1487c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) Slog.v(TAG, 1488c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Show surface turning screen on: " + mWin); 1489c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mTurnOnScreen = false; 14907d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN; 1491c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1492c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1493c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1494c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 149529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian Slog.w(TAG, "Failure showing surface " + mSurfaceControl + " in " + mWin, e); 1496c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1497c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1498c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "show", true); 1499c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1500c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return false; 1501c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1502c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1503c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void applyEnterAnimationLocked() { 1504c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final int transit; 1505c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mEnterAnimationPending) { 1506c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mEnterAnimationPending = false; 1507c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner transit = WindowManagerPolicy.TRANSIT_ENTER; 1508c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1509c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner transit = WindowManagerPolicy.TRANSIT_SHOW; 1510c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1511c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner applyAnimationLocked(transit, true); 1512545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov //TODO (multidisplay): Magnification is supported only for the default display. 1513545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov if (mService.mDisplayMagnifier != null 1514545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov && mWin.getDisplayId() == Display.DEFAULT_DISPLAY) { 1515545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov mService.mDisplayMagnifier.onWindowTransitionLocked(mWin, transit); 1516152e9bb81aa5b2ab4637f4b2dae04b3ce89fa891Svetoslav Ganov } 1517c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1518c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1519c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 1520c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Choose the correct animation and set it to the passed WindowState. 15214b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner * @param transit If AppTransition.TRANSIT_PREVIEW_DONE and the app window has been drawn 1522c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * then the animation will be app_starting_exit. Any other value loads the animation from 1523c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * the switch statement below. 1524c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @param isEntrance The animation type the last time this was called. Used to keep from 1525c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * loading the same animation twice. 1526c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @return true if an animation has been loaded. 1527c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 1528c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean applyAnimationLocked(int transit, boolean isEntrance) { 1529c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mLocalAnimating && mAnimationIsEntrance == isEntrance) { 1530c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are trying to apply an animation, but already running 1531c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // an animation of the same type, then just leave that one alone. 1532c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1533c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1534c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1535c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Only apply an animation if the display isn't frozen. If it is 1536c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // frozen, there is no reason to animate and it can cause strange 1537c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // artifacts when we unfreeze the display if some different animation 1538c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // is running. 1539c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mService.okToDisplay()) { 1540c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int anim = mPolicy.selectAnimationLw(mWin, transit); 1541c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int attr = -1; 1542c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Animation a = null; 1543c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (anim != 0) { 15444c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn a = anim != -1 ? AnimationUtils.loadAnimation(mContext, anim) : null; 1545c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1546c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner switch (transit) { 1547c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_ENTER: 1548c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation; 1549c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1550c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_EXIT: 1551c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation; 1552c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1553c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_SHOW: 1554c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation; 1555c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1556c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_HIDE: 1557c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation; 1558c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1559c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1560c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attr >= 0) { 1561164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner a = mService.mAppTransition.loadAnimation(mWin.mAttrs, attr); 1562c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1563c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1564d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 1565c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "applyAnimation: win=" + this 1566c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " anim=" + anim + " attr=0x" + Integer.toHexString(attr) 15674d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + " a=" + a 15688863cca57d8c901a2da0edc422b653ae68849313Craig Mautner + " transit=" + transit 156983339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner + " isEntrance=" + isEntrance + " Callers " + Debug.getCallers(3)); 1570c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (a != null) { 1571c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_ANIM) { 1572c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 1573c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 1574c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 1575c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 1576c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1577d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.v(TAG, "Loaded animation " + a + " for " + this, e); 1578c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1579c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner setAnimation(a); 1580c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimationIsEntrance = isEntrance; 1581c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1582c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1583c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner clearAnimation(); 1584c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1585c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1586c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return mAnimation != null; 1587c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1588c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1589a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void dump(PrintWriter pw, String prefix, boolean dumpAll) { 1590a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimating || mLocalAnimating || mAnimationIsEntrance 1591a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner || mAnimation != null) { 1592a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(prefix); pw.print("mAnimating="); pw.print(mAnimating); 1593a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mLocalAnimating="); pw.print(mLocalAnimating); 1594a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mAnimationIsEntrance="); pw.print(mAnimationIsEntrance); 1595a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mAnimation="); pw.println(mAnimation); 1596a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1597a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mHasTransformation || mHasLocalTransformation) { 1598a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(prefix); pw.print("XForm: has="); 1599a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(mHasTransformation); 1600a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" hasLocal="); pw.print(mHasLocalTransformation); 1601a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" "); mTransformation.printShortString(pw); 1602a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.println(); 1603a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 160429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (mSurfaceControl != null) { 1605c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (dumpAll) { 160629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian pw.print(prefix); pw.print("mSurface="); pw.println(mSurfaceControl); 16076fbda63e68513ece4409dac845588711ab25c39dCraig Mautner pw.print(prefix); pw.print("mDrawState="); 16086fbda63e68513ece4409dac845588711ab25c39dCraig Mautner pw.print(drawStateToString(mDrawState)); 1609749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner pw.print(" mLastHidden="); pw.println(mLastHidden); 1610c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1611c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("Surface: shown="); pw.print(mSurfaceShown); 1612c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" layer="); pw.print(mSurfaceLayer); 1613c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" alpha="); pw.print(mSurfaceAlpha); 1614c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" rect=("); pw.print(mSurfaceX); 1615c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(","); pw.print(mSurfaceY); 1616c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(") "); pw.print(mSurfaceW); 1617c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" x "); pw.println(mSurfaceH); 1618c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1619c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 1620c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mPendingDestroySurface="); 1621c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.println(mPendingDestroySurface); 1622c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1623c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurfaceResized || mSurfaceDestroyDeferred) { 1624c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mSurfaceResized="); pw.print(mSurfaceResized); 1625c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mSurfaceDestroyDeferred="); pw.println(mSurfaceDestroyDeferred); 1626c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1627a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND) { 1628a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn pw.print(prefix); pw.print("mUniverseTransform="); 1629a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn mUniverseTransform.printShortString(pw); 1630a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn pw.println(); 1631a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 1632c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) { 1633c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha); 1634c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mAlpha="); pw.print(mAlpha); 1635c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mLastAlpha="); pw.println(mLastAlpha); 1636c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1637c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mHaveMatrix || mWin.mGlobalScale != 1) { 1638c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mGlobalScale="); pw.print(mWin.mGlobalScale); 1639c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDsDx="); pw.print(mDsDx); 1640c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDtDx="); pw.print(mDtDx); 1641c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDsDy="); pw.print(mDsDy); 1642c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDtDy="); pw.println(mDtDy); 1643c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1644a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1645a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 1646c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner @Override 1647c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner public String toString() { 1648529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn StringBuffer sb = new StringBuffer("WindowStateAnimator{"); 1649529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(this))); 1650529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append(' '); 1651529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append(mWin.mAttrs.getTitle()); 1652529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn sb.append('}'); 1653c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner return sb.toString(); 1654c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner } 1655a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner} 1656