WindowStateAnimator.java revision 3a67f35f5e912b9c1ec44adbdc5531427318b12d
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; 6c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; 7c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 8d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.CLEAR_ORIENTATION_CHANGE_COMPLETE; 97d8df3905d294127cc58100912a57c816bfb2502Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_TURN_ON_SCREEN; 10d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner 11c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.content.Context; 12c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.graphics.Matrix; 13c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.graphics.PixelFormat; 147358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport android.graphics.Point; 157358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport android.graphics.PointF; 16c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.graphics.Rect; 1748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautnerimport android.graphics.Region; 18a51a9564fd53b661446cd63eea23208656acc678Craig Mautnerimport android.os.Debug; 19c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.os.RemoteException; 20a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.util.Slog; 21c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.view.Surface; 227358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport android.view.SurfaceSession; 23a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.WindowManager; 24a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.WindowManagerPolicy; 25c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.view.WindowManager.LayoutParams; 26a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.animation.Animation; 27c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.view.animation.AnimationUtils; 28a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.animation.Transformation; 29a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 30a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport com.android.server.wm.WindowManagerService.H; 31a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 32a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport java.io.PrintWriter; 337358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport java.util.ArrayList; 34a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 35a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner/** 36c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Keep track of animations and surface operations for a single WindowState. 37c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner **/ 38a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerclass WindowStateAnimator { 39c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_VISIBILITY = WindowManagerService.DEBUG_VISIBILITY; 40c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_ANIM = WindowManagerService.DEBUG_ANIM; 41c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_LAYERS = WindowManagerService.DEBUG_LAYERS; 42c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_STARTING_WINDOW = WindowManagerService.DEBUG_STARTING_WINDOW; 43c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean SHOW_TRANSACTIONS = WindowManagerService.SHOW_TRANSACTIONS; 44c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean SHOW_LIGHT_TRANSACTIONS = WindowManagerService.SHOW_LIGHT_TRANSACTIONS; 45c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean SHOW_SURFACE_ALLOC = WindowManagerService.SHOW_SURFACE_ALLOC; 46c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean localLOGV = WindowManagerService.localLOGV; 47c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner static final boolean DEBUG_ORIENTATION = WindowManagerService.DEBUG_ORIENTATION; 487358fbfeb2febb60085067fcacc192f429b06545Craig Mautner static final boolean DEBUG_SURFACE_TRACE = WindowManagerService.DEBUG_SURFACE_TRACE; 49c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 50c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final String TAG = "WindowStateAnimator"; 51a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 52a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowManagerService mService; 53a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowState mWin; 54a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowState mAttachedWindow; 55e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner final WindowAnimator mAnimator; 56c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Session mSession; 57c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowManagerPolicy mPolicy; 58c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Context mContext; 59a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 60a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Currently running animation. 61a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mAnimating; 62a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mLocalAnimating; 63a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner Animation mAnimation; 64a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mAnimationIsEntrance; 65a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mHasTransformation; 66a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mHasLocalTransformation; 67a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final Transformation mTransformation = new Transformation(); 68a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mWasAnimating; // Were we animating going into the most recent animation step? 69c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimLayer; 70c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mLastLayer; 71c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 72c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface mSurface; 73c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface mPendingDestroySurface; 74c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mReportDestroySurface; 75c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfacePendingDestroy; 76c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 77c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 78c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Set when we have changed the size of the surface, to know that 79c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * we must tell them application to resize (and thus redraw itself). 80c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 81c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceResized; 82c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 83c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 84c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Set if the client has asked that the destroy of its surface be delayed 85c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * until it explicitly says it is okay. 86c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 87c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceDestroyDeferred; 88c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 897d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mShownAlpha = 0; 907d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mAlpha = 0; 917d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mLastAlpha = 0; 92c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 93c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Used to save animation distances between the time they are calculated and when they are 94c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // used. 95c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimDw; 96c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimDh; 97c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mDsDx=1, mDtDx=0, mDsDy=0, mDtDy=1; 98c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1; 99c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 100c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mHaveMatrix; 101c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 102c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // For debugging, this is the last information given to the surface flinger. 103c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceShown; 104c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mSurfaceX, mSurfaceY, mSurfaceW, mSurfaceH; 105c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mSurfaceLayer; 106c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mSurfaceAlpha; 107c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 108c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Set to true if, when the window gets displayed, it should perform 109c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // an enter animation. 110c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mEnterAnimationPending; 111a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 112749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set when there is no Surface */ 113749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int NO_SURFACE = 0; 114749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set after the Surface has been created but before the window has been drawn. During 115749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * this time the surface is hidden. */ 116749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int DRAW_PENDING = 1; 117749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set after the window has finished drawing for the first time but before its surface 118749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * is shown. The surface will be displayed when the next layout is run. */ 119749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int COMMIT_DRAW_PENDING = 2; 120749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set during the time after the window's drawing has been committed, and before its 121749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * surface is actually shown. It is used to delay showing the surface until all windows in a 122749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * token are ready to be shown. */ 123749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int READY_TO_SHOW = 3; 124749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** Set when the window has been shown in the screen the first time. */ 125749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int HAS_DRAWN = 4; 126749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner int mDrawState; 127749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner 128749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** Was this window last hidden? */ 129749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner boolean mLastHidden; 130a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 131bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner int mAttrFlags; 132bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner int mAttrType; 133bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner 134a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public WindowStateAnimator(final WindowManagerService service, final WindowState win, 135a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowState attachedWindow) { 136a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService = service; 137a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin = win; 138a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAttachedWindow = attachedWindow; 139e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner mAnimator = mService.mAnimator; 140c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSession = win.mSession; 141c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPolicy = mService.mPolicy; 142c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mContext = mService.mContext; 143bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner mAttrFlags = win.mAttrs.flags; 144bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner mAttrType = win.mAttrs.type; 145a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 146a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 147a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void setAnimation(Animation anim) { 148bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner if (localLOGV) Slog.v(TAG, "Setting animation in " + this + ": " + anim); 149a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = false; 150a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 151a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = anim; 152a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION); 153a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.scaleCurrentDuration(mService.mWindowAnimationScale); 154a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Start out animation gone if window is gone, or visible if window is visible. 155a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 156749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mTransformation.setAlpha(mLastHidden ? 0 : 1); 157a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = true; 158a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 159a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 160a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void clearAnimation() { 161a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 162a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 163a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 164a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 165a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 166a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 167a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 168a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 169a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner /** Is the window or its container currently animating? */ 170a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean isAnimating() { 171a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowState attached = mAttachedWindow; 172a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final AppWindowToken atoken = mWin.mAppToken; 173a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return mAnimation != null 174a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner || (attached != null && attached.mWinAnimator.mAnimation != null) 175a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner || (atoken != null && 176594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner (atoken.mAppAnimator.animation != null 177a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner || atoken.inPendingTransaction)); 178a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 179a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 180a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner /** Is this window currently animating? */ 181a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean isWindowAnimating() { 182a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return mAnimation != null; 183a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 184a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 185a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner void cancelExitAnimationForNextAnimationLocked() { 186a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 187a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 188a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 1894d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mLocalAnimating = false; 190c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner destroySurfaceLocked(); 191a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 192a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 193a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 194a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner private boolean stepAnimation(long currentTime) { 195a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if ((mAnimation == null) || !mLocalAnimating) { 196a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 197a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 198a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 199a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final boolean more = mAnimation.getTransformation(currentTime, mTransformation); 200c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 201c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Stepped animation in " + this + 202a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner ": more=" + more + ", xform=" + mTransformation); 203a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return more; 204a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 205a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 206a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // This must be called while inside a transaction. Returns true if 207a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // there is more animation to run. 208a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean stepAnimationLocked(long currentTime) { 209a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Save the animation state as it was before this step so WindowManagerService can tell if 210a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we just started or just stopped animating by comparing mWasAnimating with isAnimating(). 211a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWasAnimating = mAnimating; 212a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mService.okToDisplay()) { 213a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // We will run animations as long as the display isn't frozen. 214a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 215a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.isDrawnLw() && mAnimation != null) { 216a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = true; 217a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = true; 218a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mLocalAnimating) { 219c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 220c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Starting animation in " + this + 221a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " @ " + currentTime + ": ww=" + mWin.mFrame.width() + 222a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " wh=" + mWin.mFrame.height() + 223c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner " dw=" + mAnimDw + " dh=" + mAnimDh + 224a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " scale=" + mService.mWindowAnimationScale); 225c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimation.initialize(mWin.mFrame.width(), mWin.mFrame.height(), 226c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimDw, mAnimDh); 227a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.setStartTime(currentTime); 228a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = true; 229a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 230a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 231a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if ((mAnimation != null) && mLocalAnimating) { 232a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (stepAnimation(currentTime)) { 233a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return true; 234a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 235a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 236c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 237c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Finished animation in " + this + 238a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " @ " + currentTime); 239a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner //WindowManagerService.this.dump(); 240a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 241a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = false; 242a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if ((!mLocalAnimating || mAnimationIsEntrance) && mWin.mAppToken != null 243594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner && mWin.mAppToken.mAppAnimator.animation != null) { 244a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // When our app token is animating, we kind-of pretend like 245a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we are as well. Note the mLocalAnimating mAnimationIsEntrance 246a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // part of this check means that we will only do this if 247a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // our window is not currently exiting, or it is not 248a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // locally animating itself. The idea being that one that 249a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // is exiting and doing a local animation should be removed 250a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // once that animation is done. 251a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 252a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = true; 253a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 254a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 255a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (mHasTransformation) { 256a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Little trick to get through the path below to act like 257a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we have finished an animation. 258a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 259a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (isAnimating()) { 260a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 261a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 262a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (mAnimation != null) { 263a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // If the display is frozen, and there is a pending animation, 264a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // clear it and make sure we run the cleanup code. 265a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 266a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 267a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 268a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mAnimating && !mLocalAnimating) { 269a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 270a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 271a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 272c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Done animating, clean up. 273c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 274c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Animation done in " + this + ": exiting=" + mWin.mExiting 275a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ", reportedVisible=" 276a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.reportedVisible : false)); 277a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 278a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = false; 279a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 280a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 281a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 282a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 283a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 284e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner if (mAnimator.mWindowDetachedWallpaper == mWin) { 285e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner mAnimator.mWindowDetachedWallpaper = null; 286a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 287c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer = mWin.mLayer; 288a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mIsImWindow) { 289c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer += mService.mInputMethodAnimLayerAdjustment; 290a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (mWin.mIsWallpaper) { 291c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer += mService.mWallpaperAnimLayerAdjustment; 292a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 293c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_LAYERS) Slog.v(TAG, "Stepping win " + this 294c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " anim layer: " + mAnimLayer); 295a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = false; 296a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = false; 297a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mPolicyVisibility != mWin.mPolicyVisibilityAfterAnim) { 298a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowState.DEBUG_VISIBILITY) { 299c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "Policy visibility changing after anim in " + this + ": " 300a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + mWin.mPolicyVisibilityAfterAnim); 301a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 302a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mPolicyVisibility = mWin.mPolicyVisibilityAfterAnim; 303a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mLayoutNeeded = true; 304a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mWin.mPolicyVisibility) { 305a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mService.mCurrentFocus == mWin) { 306a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mFocusMayChange = true; 307a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 308a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Window is no longer visible -- make sure if we were waiting 309a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // for it to be displayed before enabling the display, that 310a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we allow the display to be enabled now. 311a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.enableScreenIfNeededLocked(); 312a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 313a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 314a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 315749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState == HAS_DRAWN 316a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING 317a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken != null 318a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken.firstWindowDrawn 319a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken.startingData != null) { 320c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Finish starting " 321a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + mWin.mToken + ": first real window done animating"); 322a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mFinishedStarting.add(mWin.mAppToken); 323a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mH.sendEmptyMessage(H.FINISHED_STARTING); 324a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 325a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 326a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner finishExit(); 327d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner mAnimator.mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; 328d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner if (WindowManagerService.DEBUG_LAYOUT_REPEATS) mService.debugLayoutRepeats( 329d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner "WindowStateAnimator", mAnimator.mPendingLayoutChanges); 330a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 331a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mAppToken != null) { 332a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mAppToken.updateReportedVisibilityLocked(); 333a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 334a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 335a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 336a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 337a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 338a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner void finishExit() { 339a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v( 340c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "finishExit in " + this 341a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ": exiting=" + mWin.mExiting 342a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + " remove=" + mWin.mRemoveOnExit 343a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + " windowAnimating=" + isWindowAnimating()); 344a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 345a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final int N = mWin.mChildWindows.size(); 346a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner for (int i=0; i<N; i++) { 347a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mChildWindows.get(i).mWinAnimator.finishExit(); 348a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 349a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 350a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mWin.mExiting) { 351a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return; 352a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 353a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 354a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (isWindowAnimating()) { 355a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return; 356a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 357a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 358a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 359c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Exit animation finished in " + this 360a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ": remove=" + mWin.mRemoveOnExit); 361c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 362a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mDestroySurface.add(mWin); 363a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mDestroying = true; 364a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowState.SHOW_TRANSACTIONS) WindowManagerService.logSurface( 365a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin, "HIDE (finishExit)", null); 366c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 367a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner try { 368c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.hide(); 369a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } catch (RuntimeException e) { 370c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error hiding surface in " + this, e); 371a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 372749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = true; 373a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 374a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mExiting = false; 375a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mRemoveOnExit) { 376a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mPendingRemove.add(mWin); 377a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mRemoveOnExit = false; 378a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 379a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 380a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 381a608b882327fbb393bde3854953cd322a6fea675Craig Mautner boolean finishDrawingLocked() { 382749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState == DRAW_PENDING) { 38383339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner if (DEBUG_ANIM || SHOW_TRANSACTIONS || DEBUG_ORIENTATION) Slog.v( 38483339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner TAG, "finishDrawingLocked: mDrawState=COMMIT_DRAW_PENDING " + this + " in " 38583339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner + mSurface); 386749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = COMMIT_DRAW_PENDING; 387a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return true; 388a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 389a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return false; 390a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 391a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 392a608b882327fbb393bde3854953cd322a6fea675Craig Mautner // This must be called while inside a transaction. 393a608b882327fbb393bde3854953cd322a6fea675Craig Mautner boolean commitFinishDrawingLocked(long currentTime) { 394749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState != COMMIT_DRAW_PENDING) { 395a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return false; 396a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 39783339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner if (DEBUG_ANIM) 39883339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner Slog.i(TAG, "commitFinishDrawingLocked: mDrawState=READY_TO_SHOW " + mSurface); 399749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = READY_TO_SHOW; 400a608b882327fbb393bde3854953cd322a6fea675Craig Mautner final boolean starting = mWin.mAttrs.type == TYPE_APPLICATION_STARTING; 401a608b882327fbb393bde3854953cd322a6fea675Craig Mautner final AppWindowToken atoken = mWin.mAppToken; 402a608b882327fbb393bde3854953cd322a6fea675Craig Mautner if (atoken == null || atoken.allDrawn || starting) { 403a608b882327fbb393bde3854953cd322a6fea675Craig Mautner performShowLocked(); 404a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 405a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return true; 406a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 407a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 4087d8df3905d294127cc58100912a57c816bfb2502Craig Mautner static class SurfaceTrace extends Surface { 4097d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private final static String SURFACE_TAG = "SurfaceTrace"; 4107d8df3905d294127cc58100912a57c816bfb2502Craig Mautner final static ArrayList<SurfaceTrace> sSurfaces = new ArrayList<SurfaceTrace>(); 4117358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4127d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private float mSurfaceTraceAlpha = 0; 4137358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private int mLayer; 4147358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private PointF mPosition = new PointF(); 4157d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private Point mSize; 4167358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private boolean mShown = false; 4177358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private String mName = "Not named"; 4187358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4197d8df3905d294127cc58100912a57c816bfb2502Craig Mautner public SurfaceTrace(SurfaceSession s, 4207358fbfeb2febb60085067fcacc192f429b06545Craig Mautner int pid, int display, int w, int h, int format, int flags) throws 4217358fbfeb2febb60085067fcacc192f429b06545Craig Mautner OutOfResourcesException { 4227358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super(s, pid, display, w, h, format, flags); 4237358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mSize = new Point(w, h); 4247d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " 425a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 4267358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4277358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4287d8df3905d294127cc58100912a57c816bfb2502Craig Mautner public SurfaceTrace(SurfaceSession s, 4297358fbfeb2febb60085067fcacc192f429b06545Craig Mautner int pid, String name, int display, int w, int h, int format, int flags) 4307358fbfeb2febb60085067fcacc192f429b06545Craig Mautner throws OutOfResourcesException { 4317358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super(s, pid, name, display, w, h, format, flags); 4327358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mName = name; 4337358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mSize = new Point(w, h); 4347d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " 435a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 4367358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4377358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4387358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4397358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setAlpha(float alpha) { 4407358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setAlpha(alpha); 4417d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurfaceTraceAlpha = alpha; 4427d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "setAlpha: " + this + ". Called by " 443a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 4447358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4457358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4467358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4477358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setLayer(int zorder) { 4487358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setLayer(zorder); 4497358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mLayer = zorder; 4507d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "setLayer: " + this + ". Called by " 451a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 4527358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4537358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.remove(this); 4547358fbfeb2febb60085067fcacc192f429b06545Craig Mautner int i; 4557358fbfeb2febb60085067fcacc192f429b06545Craig Mautner for (i = sSurfaces.size() - 1; i >= 0; i--) { 4567d8df3905d294127cc58100912a57c816bfb2502Craig Mautner SurfaceTrace s = sSurfaces.get(i); 4577358fbfeb2febb60085067fcacc192f429b06545Craig Mautner if (s.mLayer < zorder) { 4587358fbfeb2febb60085067fcacc192f429b06545Craig Mautner break; 4597358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4607358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4617358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.add(i + 1, this); 4627358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4637358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4647358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4657358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setPosition(float x, float y) { 4667358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setPosition(x, y); 4677358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mPosition = new PointF(x, y); 4687d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "setPosition: " + this + ". Called by " 469a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 4707358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4717358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4727358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4737358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setSize(int w, int h) { 4747358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setSize(w, h); 4757358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mSize = new Point(w, h); 4767d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "setSize: " + this + ". Called by " 477a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 4787358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4797358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4807358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4817358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void hide() { 4827358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.hide(); 4837358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mShown = false; 4847d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "hide: " + this + ". Called by " 485a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 4867358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4877358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4887358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void show() { 4897358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.show(); 4907358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mShown = true; 4917d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "show: " + this + ". Called by " 492a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 4937358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4947358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4957358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4967358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void destroy() { 4977358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.destroy(); 4987d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "destroy: " + this + ". Called by " 499a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 5007358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.remove(this); 5017358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5027358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 503acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner @Override 504acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner public void release() { 505acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner super.release(); 506acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner Slog.v(SURFACE_TAG, "release: " + this + ". Called by " 507a51a9564fd53b661446cd63eea23208656acc678Craig Mautner + Debug.getCallers(3)); 508acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner sSurfaces.remove(this); 509acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 510acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 5117358fbfeb2febb60085067fcacc192f429b06545Craig Mautner static void dumpAllSurfaces() { 5127358fbfeb2febb60085067fcacc192f429b06545Craig Mautner final int N = sSurfaces.size(); 5137358fbfeb2febb60085067fcacc192f429b06545Craig Mautner for (int i = 0; i < N; i++) { 5147358fbfeb2febb60085067fcacc192f429b06545Craig Mautner Slog.i(TAG, "SurfaceDump: " + sSurfaces.get(i)); 5157358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5167358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5177358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5187358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5197358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public String toString() { 520fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner return "Surface " + Integer.toHexString(System.identityHashCode(this)) + " " 521fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner + mName + ": shown=" + mShown + " layer=" + mLayer 5227d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y 5237358fbfeb2febb60085067fcacc192f429b06545Craig Mautner + " " + mSize.x + "x" + mSize.y; 5247358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5257358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5267358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 527c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface createSurfaceLocked() { 528c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface == null) { 529c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mReportDestroySurface = false; 530c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfacePendingDestroy = false; 53183339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner if (DEBUG_ANIM || DEBUG_ORIENTATION) Slog.i(TAG, 53283339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner "createSurface " + this + ": mDrawState=DRAW_PENDING"); 533749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = DRAW_PENDING; 534c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken != null) { 535c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.allDrawn = false; 536c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 537c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 538c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.makeWindowFreezingScreenIfNeededLocked(mWin); 539c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 540c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int flags = 0; 541c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowManager.LayoutParams attrs = mWin.mAttrs; 542c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 543c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((attrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) { 544c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner flags |= Surface.SECURE; 545c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 546c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowState.DEBUG_VISIBILITY) Slog.v( 547c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Creating surface in session " 548c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSession.mSurfaceSession + " window " + this 549c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " w=" + mWin.mCompatFrame.width() 550c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " h=" + mWin.mCompatFrame.height() + " format=" 551c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + attrs.format + " flags=" + flags); 552c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 553c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int w = mWin.mCompatFrame.width(); 554c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int h = mWin.mCompatFrame.height(); 555c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((attrs.flags & LayoutParams.FLAG_SCALED) != 0) { 556c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // for a scaled surface, we always want the requested 557c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // size. 558c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w = mWin.mRequestedWidth; 559c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner h = mWin.mRequestedHeight; 560c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 561c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 562c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Something is wrong and SurfaceFlinger will not like this, 563c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // try to revert to sane values 564c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w <= 0) w = 1; 565c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (h <= 0) h = 1; 566c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 567c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 568c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = 0; 5697d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurfaceAlpha = 0; 570c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceX = 0; 571c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceY = 0; 572c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceW = w; 573c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceH = h; 574c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 575c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean isHwAccelerated = (attrs.flags & 576c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0; 577c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : attrs.format; 578c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!PixelFormat.formatHasAlpha(attrs.format)) { 579c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner flags |= Surface.OPAQUE; 580c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 5817358fbfeb2febb60085067fcacc192f429b06545Craig Mautner if (DEBUG_SURFACE_TRACE) { 5827d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurface = new SurfaceTrace( 5837358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mSession.mSurfaceSession, mSession.mPid, 5847358fbfeb2febb60085067fcacc192f429b06545Craig Mautner attrs.getTitle().toString(), 5857358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 0, w, h, format, flags); 5867358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } else { 5877358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mSurface = new Surface( 588c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSession.mSurfaceSession, mSession.mPid, 589c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attrs.getTitle().toString(), 590c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 0, w, h, format, flags); 5917358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 592c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = true; 593c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG, 594c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner " CREATE SURFACE " 595c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSurface + " IN SESSION " 596c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSession.mSurfaceSession 597c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": pid=" + mSession.mPid + " format=" 598c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + attrs.format + " flags=0x" 599c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + Integer.toHexString(flags) 600c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " / " + this); 601c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (Surface.OutOfResourcesException e) { 602c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = false; 603c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "OutOfResourcesException creating surface"); 604c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "create", true); 605749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 606c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return null; 607c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (Exception e) { 608c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = false; 609c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.e(TAG, "Exception creating surface", e); 610749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 611c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return null; 612c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 613c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 614c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 615c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Got surface: " + mSurface 616c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ", set left=" + mWin.mFrame.left + " top=" + mWin.mFrame.top 617c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ", animLayer=" + mAnimLayer); 618c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) { 619c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.i(TAG, ">>> OPEN TRANSACTION createSurfaceLocked"); 620c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "CREATE pos=(" 621c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.mFrame.left + "," + mWin.mFrame.top + ") (" 622c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.mCompatFrame.width() + "x" + mWin.mCompatFrame.height() 623c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "), layer=" + mAnimLayer + " HIDE", null); 624c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 625c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface.openTransaction(); 626c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 627c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 628c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceX = mWin.mFrame.left + mWin.mXOffset; 629c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceY = mWin.mFrame.top + mWin.mYOffset; 630c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setPosition(mSurfaceX, mSurfaceY); 631c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = mAnimLayer; 632c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setLayer(mAnimLayer); 6337d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurface.setAlpha(0); 634c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 635c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.hide(); 636c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((mWin.mAttrs.flags&WindowManager.LayoutParams.FLAG_DITHER) != 0) { 637c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, "DITHER", null); 638c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setFlags(Surface.SURFACE_DITHER, Surface.SURFACE_DITHER); 639c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 640c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 641c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error creating surface in " + w, e); 642c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "create-init", true); 643c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 644749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = true; 645c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } finally { 646c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface.closeTransaction(); 647c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 648c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "<<< CLOSE TRANSACTION createSurfaceLocked"); 649c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 650c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 651c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Created surface " + this); 652c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 653c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return mSurface; 654c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 655c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 656c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void destroySurfaceLocked() { 657c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken != null && mWin == mWin.mAppToken.startingWindow) { 658c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.startingDisplayed = false; 659c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 660c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 661749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 662c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 663c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 664c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int i = mWin.mChildWindows.size(); 665c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner while (i > 0) { 666c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner i--; 667c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowState c = mWin.mChildWindows.get(i); 668c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mAttachedHidden = true; 669c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 670c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 671c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mReportDestroySurface) { 672c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mReportDestroySurface = false; 673c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfacePendingDestroy = true; 674c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 675c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mClient.dispatchGetNewSurface(); 676c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // We'll really destroy on the next time around. 677c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return; 678c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RemoteException e) { 679c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 680c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 681c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 682c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 683c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) { 684c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 685c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 686c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 687c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 688c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 689c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Window " + this + " destroying surface " 690c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSurface + ", session " + mSession, e); 691c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 692c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurfaceDestroyDeferred) { 693c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null && mPendingDestroySurface != mSurface) { 694c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 695c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 696c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 697c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 698c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 699c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 700c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 701c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); 702c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 703c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface.destroy(); 704c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 705c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface = mSurface; 706c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 707c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 708c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 709c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 710c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 711c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 712c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 713c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 714c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY", e); 715c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 716c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.destroy(); 717c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 718c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 719c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Exception thrown when destroying Window " + this 720c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " surface " + mSurface + " session " + mSession 721c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": " + e.toString()); 722c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 723c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 724c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 725c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface = null; 726c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface =false; 727c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 728c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 729c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 730c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void destroyDeferredSurfaceLocked() { 731c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 732c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 733c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 734c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 735c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 736c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 737c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 738c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 739c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); 740c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 741c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface.destroy(); 742c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 743c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 744d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.w(TAG, "Exception thrown when destroying Window " 745c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + this + " surface " + mPendingDestroySurface 746c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " session " + mSession + ": " + e.toString()); 747c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 748c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceDestroyDeferred = false; 749c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface = null; 750c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 751c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 752c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void computeShownFrameLocked() { 753c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean selfTransformation = mHasLocalTransformation; 754c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Transformation attachedTransformation = 755c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner (mAttachedWindow != null && mAttachedWindow.mWinAnimator.mHasLocalTransformation) 756c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner ? mAttachedWindow.mWinAnimator.mTransformation : null; 757594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final AppWindowAnimator appAnimator = 758594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner mWin.mAppToken == null ? null : mWin.mAppToken.mAppAnimator; 759594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner Transformation appTransformation = (appAnimator != null && appAnimator.hasTransformation) 760594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner ? appAnimator.transformation : null; 761c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 762c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Wallpapers are animated based on the "real" window they 763c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // are currently targeting. 764c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAttrs.type == TYPE_WALLPAPER && mService.mLowerWallpaperTarget == null 765c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && mService.mWallpaperTarget != null) { 766c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mService.mWallpaperTarget.mWinAnimator.mHasLocalTransformation && 767c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mWallpaperTarget.mWinAnimator.mAnimation != null && 768c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner !mService.mWallpaperTarget.mWinAnimator.mAnimation.getDetachWallpaper()) { 769c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attachedTransformation = mService.mWallpaperTarget.mWinAnimator.mTransformation; 770c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER && attachedTransformation != null) { 771c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "WP target attached xform: " + attachedTransformation); 772c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 773c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 774594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final AppWindowAnimator wpAppAnimator = mService.mWallpaperTarget.mAppToken == null 775594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner ? null : mService.mWallpaperTarget.mAppToken.mAppAnimator; 776594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (wpAppAnimator != null && 777594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner wpAppAnimator.hasTransformation && 778594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner wpAppAnimator.animation != null && 779594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner !wpAppAnimator.animation.getDetachWallpaper()) { 780594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner appTransformation = wpAppAnimator.transformation; 781c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER && appTransformation != null) { 782c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "WP target app xform: " + appTransformation); 783c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 784c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 785c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 786c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 787c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean screenAnimation = mService.mAnimator.mScreenRotationAnimation != null 788c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && mService.mAnimator.mScreenRotationAnimation.isAnimating(); 789c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation || attachedTransformation != null 790c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || appTransformation != null || screenAnimation) { 791c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // cache often used attributes locally 792c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Rect frame = mWin.mFrame; 793c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float tmpFloats[] = mService.mTmpFloats; 794c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Matrix tmpMatrix = mWin.mTmpMatrix; 795c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 796c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Compute the desired transformation. 797c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 798c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are doing a screen animation, the global rotation 799c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // applied to windows can result in windows that are carefully 800c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // aligned with each other to slightly separate, allowing you 801c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // to see what is behind them. An unsightly mess. This... 802c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // thing... magically makes it call good: scale each window 803c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // slightly (two pixels larger in each dimension, from the 804c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // window's center). 805c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float w = frame.width(); 806c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float h = frame.height(); 807c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w>=1 && h>=1) { 808c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.setScale(1 + 2/w, 1 + 2/h, w/2, h/2); 809c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 810c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.reset(); 811c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 812c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 813c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.reset(); 814c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 815c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postScale(mWin.mGlobalScale, mWin.mGlobalScale); 816c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation) { 817c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(mTransformation.getMatrix()); 818c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 819c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postTranslate(frame.left + mWin.mXOffset, frame.top + mWin.mYOffset); 820c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attachedTransformation != null) { 821c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(attachedTransformation.getMatrix()); 822c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 823c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (appTransformation != null) { 824c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(appTransformation.getMatrix()); 825c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 826c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 827c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat( 828c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mAnimator.mScreenRotationAnimation.getEnterTransformation().getMatrix()); 829c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 830c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 831c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // "convert" it into SurfaceFlinger's format 832c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // (a 2x2 matrix + an offset) 833c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Here we must not transform the position of the surface 834c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // since it is already included in the transformation. 835c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Transform: " + matrix); 836c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 837c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mHaveMatrix = true; 838c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.getValues(tmpFloats); 839c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx = tmpFloats[Matrix.MSCALE_X]; 840c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDx = tmpFloats[Matrix.MSKEW_Y]; 841c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy = tmpFloats[Matrix.MSKEW_X]; 842c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDy = tmpFloats[Matrix.MSCALE_Y]; 843c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float x = tmpFloats[Matrix.MTRANS_X]; 844c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float y = tmpFloats[Matrix.MTRANS_Y]; 845c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int w = frame.width(); 846c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int h = frame.height(); 847c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mShownFrame.set(x, y, x+w, y+h); 848c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 849c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Now set the alpha... but because our current hardware 850c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // can't do alpha transformation on a non-opaque surface, 851c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // turn it off if we are running an animation that is also 852c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // transforming since it is more important to have that 853c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // animation be smooth. 854c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha = mAlpha; 855c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!mService.mLimitedAlphaCompositing 856c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || (!PixelFormat.formatHasAlpha(mWin.mAttrs.format) 857c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDsDy, mDtDy) 858c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && x == frame.left && y == frame.top))) { 859c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Applying alpha transform"); 860c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation) { 861c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= mTransformation.getAlpha(); 862c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 863c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attachedTransformation != null) { 864c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= attachedTransformation.getAlpha(); 865c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 866c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (appTransformation != null) { 867c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= appTransformation.getAlpha(); 868c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 869c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 870c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= 871c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mAnimator.mScreenRotationAnimation.getEnterTransformation().getAlpha(); 872c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 873c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 874c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Not applying alpha transform"); 875c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 876c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 877c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 878c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "computeShownFrameLocked: Animating " + this + 879c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner ": " + mWin.mShownFrame + 880c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner ", alpha=" + mTransformation.getAlpha() + ", mShownAlpha=" + mShownAlpha); 881c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return; 8824d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner } else if (mWin.mIsWallpaper && 8834d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner (mAnimator.mPendingActions & WindowAnimator.WALLPAPER_ACTION_PENDING) != 0) { 8844d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner return; 885c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 886c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 887c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 8884d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner TAG, "computeShownFrameLocked: " + this + 8894d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner " not attached, mAlpha=" + mAlpha); 890c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mShownFrame.set(mWin.mFrame); 891c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mXOffset != 0 || mWin.mYOffset != 0) { 892c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mShownFrame.offset(mWin.mXOffset, mWin.mYOffset); 893c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 894c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha = mAlpha; 895c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mHaveMatrix = false; 896c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx = mWin.mGlobalScale; 897c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDx = 0; 898c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy = 0; 899c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDy = mWin.mGlobalScale; 900c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 901d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner 902acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner void setSurfaceBoundaries(final boolean recoveringMemory) { 903c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowState w = mWin; 904c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int width, height; 905c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { 906c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // for a scaled surface, we just want to use 907c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // the requested size. 908c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = w.mRequestedWidth; 909c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = w.mRequestedHeight; 910c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 911c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = w.mCompatFrame.width(); 912c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = w.mCompatFrame.height(); 913c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 914c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 915c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (width < 1) { 916c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = 1; 917c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 918c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (height < 1) { 919c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = 1; 920c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 921c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean surfaceResized = mSurfaceW != width || mSurfaceH != height; 922c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (surfaceResized) { 923c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceW = width; 924c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceH = height; 925c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 926c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 9274d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner final float left = w.mShownFrame.left; 9284d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner final float top = w.mShownFrame.top; 9294d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner if (mSurfaceX != left || mSurfaceY != top) { 930c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 931c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 9324d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner "POS " + left + ", " + top, null); 9334d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mSurfaceX = left; 9344d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mSurfaceY = top; 9354d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner mSurface.setPosition(left, top); 936c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 937c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error positioning surface of " + w 9384d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + " pos=(" + left 9394d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + "," + top + ")", e); 940c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 941c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "position", true); 942c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 943c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 944c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 945c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 946c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (surfaceResized) { 947c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 948c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 949c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "SIZE " + width + "x" + height, null); 950c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceResized = true; 951c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setSize(width, height); 952acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner mAnimator.mPendingLayoutChanges |= 953acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; 9543a67f35f5e912b9c1ec44adbdc5531427318b12dCraig Mautner if ((w.mAttrs.flags & LayoutParams.FLAG_DIM_BEHIND) != 0) { 9553a67f35f5e912b9c1ec44adbdc5531427318b12dCraig Mautner mAnimator.startDimming(this, w.mExiting ? 0 : w.mAttrs.dimAmount, 9563a67f35f5e912b9c1ec44adbdc5531427318b12dCraig Mautner mService.mAppDisplayWidth, mService.mAppDisplayHeight); 9573a67f35f5e912b9c1ec44adbdc5531427318b12dCraig Mautner } 958c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 959c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If something goes wrong with the surface (such 960c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // as running out of memory), don't take down the 961c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // entire system. 962c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.e(TAG, "Error resizing surface of " + w 963c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " size=(" + width + "x" + height + ")", e); 964c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 965c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "size", true); 966c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 967c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 968c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 969acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 970acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 971acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner public void prepareSurfaceLocked(final boolean recoveringMemory) { 972acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner final WindowState w = mWin; 973acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner if (mSurface == null) { 974acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner if (w.mOrientationChanging) { 975acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner if (DEBUG_ORIENTATION) { 976acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner Slog.v(TAG, "Orientation change skips hidden " + w); 977acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 978acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner w.mOrientationChanging = false; 979acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 980acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner return; 981acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner } 982acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 983acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner boolean displayed = false; 984acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 985acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner computeShownFrameLocked(); 986acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner 987acaf9cca865902e6f1823e771f4234bfda53cfd1Craig Mautner setSurfaceBoundaries(recoveringMemory); 988c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 989de6198ebd7f9ea5b7940d38bf5839dfbc6a192c4Craig Mautner if (w.mAttachedHidden || !w.isReadyForDisplay()) { 990749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (!mLastHidden) { 991c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //dump(); 992749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = true; 993c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 994c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "HIDE (performLayout)", null); 995c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 996c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 997c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 998c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.hide(); 999c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1000c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Exception hiding surface in " + w); 1001c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1002c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1003c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1004c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are waiting for this window to handle an 1005c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // orientation change, well, it is hidden, so 1006c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // doesn't really matter. Note that this does 1007c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // introduce a potential glitch if the window 1008c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // becomes unhidden before it has drawn for the 1009c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // new orientation. 1010c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mOrientationChanging) { 1011c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mOrientationChanging = false; 1012c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, 1013c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Orientation change skips hidden " + w); 1014c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1015c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else if (mLastLayer != mAnimLayer 1016c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastAlpha != mShownAlpha 1017c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDsDx != mDsDx 1018c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDtDx != mDtDx 1019c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDsDy != mDsDy 1020c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDtDy != mDtDy 1021c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || w.mLastHScale != w.mHScale 1022c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || w.mLastVScale != w.mVScale 1023749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner || mLastHidden) { 1024c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner displayed = true; 1025c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastAlpha = mShownAlpha; 1026c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastLayer = mAnimLayer; 1027c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDsDx = mDsDx; 1028c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDtDx = mDtDx; 1029c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDsDy = mDsDy; 1030c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDtDy = mDtDy; 1031c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mLastHScale = w.mHScale; 1032c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mLastVScale = w.mVScale; 1033c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1034c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "alpha=" + mShownAlpha + " layer=" + mAnimLayer 1035c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " matrix=[" + (mDsDx*w.mHScale) 1036c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "," + (mDtDx*w.mVScale) 1037c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "][" + (mDsDy*w.mHScale) 1038c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "," + (mDtDy*w.mVScale) + "]", null); 1039c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 1040c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1041c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceAlpha = mShownAlpha; 1042c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setAlpha(mShownAlpha); 1043c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = w.mWinAnimator.mAnimLayer; 1044c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setLayer(w.mWinAnimator.mAnimLayer); 1045c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setMatrix( 1046c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx*w.mHScale, mDtDx*w.mVScale, 1047c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy*w.mHScale, mDtDy*w.mVScale); 1048749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner 1049749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mLastHidden && mDrawState == HAS_DRAWN) { 1050749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1051749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner "SHOW (performLayout)", null); 1052749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w 1053749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner + " during relayout"); 1054749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (showSurfaceRobustlyLocked()) { 1055749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = false; 1056749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } else { 1057749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner w.mOrientationChanging = false; 1058749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1059749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1060749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mSurface != null) { 1061749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner w.mToken.hasVisible = true; 1062749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1063c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1064c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error updating surface in " + w, e); 1065c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 1066c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "update", true); 1067c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1068c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1069c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1070c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 107183339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner if (DEBUG_ANIM) { 107283339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner Slog.v(TAG, "prepareSurface: No changes in animation for " + mWin); 107383339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner } 1074c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner displayed = true; 1075c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1076c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1077c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (displayed) { 1078c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mOrientationChanging) { 1079c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!w.isDrawnLw()) { 1080d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner mAnimator.mBulkUpdateParams |= CLEAR_ORIENTATION_CHANGE_COMPLETE; 1081c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, 1082c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Orientation continue waiting for draw in " + w); 1083c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1084c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mOrientationChanging = false; 1085c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation change complete in " + w); 1086c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1087c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1088c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mToken.hasVisible = true; 1089c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1090c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1091c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 109248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner void setTransparentRegionHint(final Region region) { 10931f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner if (mSurface == null) { 10941f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true"); 10951f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner return; 10961f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner } 109748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 109848ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner ">>> OPEN TRANSACTION setTransparentRegion"); 109948ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Surface.openTransaction(); 110048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner try { 110148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, 110248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner "transparentRegionHint=" + region, null); 110348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner mSurface.setTransparentRegionHint(region); 110448ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } finally { 110548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Surface.closeTransaction(); 110648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 110748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner "<<< CLOSE TRANSACTION setTransparentRegion"); 110848ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 110948ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 111048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner 111148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner void setWallpaperOffset(int left, int top) { 111248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Surface.openTransaction(); 111348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner try { 111448ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner mSurfaceX = left; 111548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner mSurfaceY = top; 111648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner mSurface.setPosition(left, top); 111748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } catch (RuntimeException e) { 111848ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Slog.w(TAG, "Error positioning surface of " + mWin 111948ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner + " pos=(" + left + "," + top + ")", e); 112048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 112148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Surface.closeTransaction(); 112248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 112348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner 1124c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // This must be called while inside a transaction. 1125c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean performShowLocked() { 1126c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) { 1127c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 1128c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 1129c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 1130c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 1131c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1132d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.v(TAG, "performShow on " + this 1133749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner + ": mDrawState=" + mDrawState + " readyForDisplay=" 1134c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.isReadyForDisplay() 1135c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " starting=" + (mWin.mAttrs.type == TYPE_APPLICATION_STARTING), e); 1136c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1137749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState == READY_TO_SHOW && mWin.isReadyForDisplay()) { 1138c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) 1139c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "SHOW (performShowLocked)", null); 1140d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + this 1141c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " during animation: policyVis=" + mWin.mPolicyVisibility 1142c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " attHidden=" + mWin.mAttachedHidden 1143c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok.hiddenRequested=" 1144c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hiddenRequested : false) 1145c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok.hidden=" 1146c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hidden : false) 1147c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " animating=" + mAnimating 1148c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok animating=" 1149594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.mAppAnimator.animating : false)); 1150c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1151c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.enableScreenIfNeededLocked(); 1152c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1153c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner applyEnterAnimationLocked(); 1154c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1155de6198ebd7f9ea5b7940d38bf5839dfbc6a192c4Craig Mautner // Force the show in the next prepareSurfaceLocked() call. 1156c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastAlpha = -1; 115783339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner if (DEBUG_ANIM) Slog.v(TAG, "performShowLocked: mDrawState=HAS_DRAWN"); 1158749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = HAS_DRAWN; 1159de6198ebd7f9ea5b7940d38bf5839dfbc6a192c4Craig Mautner mService.scheduleAnimationLocked(); 1160c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1161c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int i = mWin.mChildWindows.size(); 1162c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner while (i > 0) { 1163c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner i--; 1164c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowState c = mWin.mChildWindows.get(i); 1165c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (c.mAttachedHidden) { 1166c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mAttachedHidden = false; 1167c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (c.mWinAnimator.mSurface != null) { 1168c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mWinAnimator.performShowLocked(); 1169c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // It hadn't been shown, which means layout not 1170c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // performed on it, so now we want to make sure to 1171c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // do a layout. If called from within the transaction 1172c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // loop, this will cause it to restart with a new 1173c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // layout. 1174c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mLayoutNeeded = true; 1175c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1176c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1177c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1178c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1179c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAttrs.type != TYPE_APPLICATION_STARTING 1180c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && mWin.mAppToken != null) { 1181c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.firstWindowDrawn = true; 1182c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1183c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken.startingData != null) { 1184c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_STARTING_WINDOW || 1185d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 1186c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Finish starting " + mWin.mToken 1187c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": first real window is shown, no animation"); 1188c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If this initial window is animating, stop it -- we 1189c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // will do an animation to reveal it from behind the 1190c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // starting window, so there is no need for it to also 1191c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // be doing its own stuff. 11924d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner clearAnimation(); 1193c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mFinishedStarting.add(mWin.mAppToken); 1194c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mH.sendEmptyMessage(H.FINISHED_STARTING); 1195c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1196c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.updateReportedVisibilityLocked(); 1197c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1198c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1199c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1200c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1201c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1202c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return false; 1203c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1204c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1205c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 1206c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Have the surface flinger show a surface, robustly dealing with 1207c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * error conditions. In particular, if there is not enough memory 1208c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * to show the surface, then we will try to get rid of other surfaces 1209c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * in order to succeed. 1210c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * 1211c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @return Returns true if the surface was successfully shown. 1212c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 1213c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean showSurfaceRobustlyLocked() { 1214c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1215c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 1216c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = true; 1217c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.show(); 1218c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mTurnOnScreen) { 1219c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) Slog.v(TAG, 1220c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Show surface turning screen on: " + mWin); 1221c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mTurnOnScreen = false; 12227d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN; 1223c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1224c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1225c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1226c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1227c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Failure showing surface " + mSurface + " in " + mWin, e); 1228c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1229c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1230c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "show", true); 1231c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1232c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return false; 1233c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1234c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1235c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void applyEnterAnimationLocked() { 1236c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final int transit; 1237c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mEnterAnimationPending) { 1238c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mEnterAnimationPending = false; 1239c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner transit = WindowManagerPolicy.TRANSIT_ENTER; 1240c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1241c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner transit = WindowManagerPolicy.TRANSIT_SHOW; 1242c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1243c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1244c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner applyAnimationLocked(transit, true); 1245c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1246c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 124748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner // TODO(cmautner): Move back to WindowState? 1248c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 1249c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Choose the correct animation and set it to the passed WindowState. 1250c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @param transit If WindowManagerPolicy.TRANSIT_PREVIEW_DONE and the app window has been drawn 1251c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * then the animation will be app_starting_exit. Any other value loads the animation from 1252c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * the switch statement below. 1253c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @param isEntrance The animation type the last time this was called. Used to keep from 1254c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * loading the same animation twice. 1255c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @return true if an animation has been loaded. 1256c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 1257c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean applyAnimationLocked(int transit, boolean isEntrance) { 1258c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mLocalAnimating && mAnimationIsEntrance == isEntrance) { 1259c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are trying to apply an animation, but already running 1260c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // an animation of the same type, then just leave that one alone. 1261c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1262c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1263c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1264c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Only apply an animation if the display isn't frozen. If it is 1265c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // frozen, there is no reason to animate and it can cause strange 1266c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // artifacts when we unfreeze the display if some different animation 1267c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // is running. 1268c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mService.okToDisplay()) { 1269c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int anim = mPolicy.selectAnimationLw(mWin, transit); 1270c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int attr = -1; 1271c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Animation a = null; 1272c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (anim != 0) { 1273c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner a = AnimationUtils.loadAnimation(mContext, anim); 1274c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1275c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner switch (transit) { 1276c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_ENTER: 1277c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation; 1278c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1279c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_EXIT: 1280c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation; 1281c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1282c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_SHOW: 1283c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation; 1284c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1285c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_HIDE: 1286c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation; 1287c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1288c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1289c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attr >= 0) { 1290c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner a = mService.loadAnimation(mWin.mAttrs, attr); 1291c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1292c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1293d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 1294c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "applyAnimation: win=" + this 1295c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " anim=" + anim + " attr=0x" + Integer.toHexString(attr) 12964d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner + " a=" + a 1297c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " mAnimation=" + mAnimation 129883339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner + " isEntrance=" + isEntrance + " Callers " + Debug.getCallers(3)); 1299c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (a != null) { 1300c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_ANIM) { 1301c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 1302c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 1303c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 1304c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 1305c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1306d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.v(TAG, "Loaded animation " + a + " for " + this, e); 1307c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1308c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner setAnimation(a); 1309c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimationIsEntrance = isEntrance; 1310c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1311c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1312c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner clearAnimation(); 1313c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1314c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1315c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return mAnimation != null; 1316c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1317c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1318a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void dump(PrintWriter pw, String prefix, boolean dumpAll) { 1319a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimating || mLocalAnimating || mAnimationIsEntrance 1320a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner || mAnimation != null) { 1321a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(prefix); pw.print("mAnimating="); pw.print(mAnimating); 1322a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mLocalAnimating="); pw.print(mLocalAnimating); 1323a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mAnimationIsEntrance="); pw.print(mAnimationIsEntrance); 1324a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mAnimation="); pw.println(mAnimation); 1325a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1326a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mHasTransformation || mHasLocalTransformation) { 1327a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(prefix); pw.print("XForm: has="); 1328a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(mHasTransformation); 1329a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" hasLocal="); pw.print(mHasLocalTransformation); 1330a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" "); mTransformation.printShortString(pw); 1331a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.println(); 1332a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1333c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 1334c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (dumpAll) { 1335c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mSurface="); pw.println(mSurface); 1336749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner pw.print(prefix); pw.print("mDrawState="); pw.print(mDrawState); 1337749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner pw.print(" mLastHidden="); pw.println(mLastHidden); 1338c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1339c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("Surface: shown="); pw.print(mSurfaceShown); 1340c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" layer="); pw.print(mSurfaceLayer); 1341c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" alpha="); pw.print(mSurfaceAlpha); 1342c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" rect=("); pw.print(mSurfaceX); 1343c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(","); pw.print(mSurfaceY); 1344c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(") "); pw.print(mSurfaceW); 1345c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" x "); pw.println(mSurfaceH); 1346c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1347c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 1348c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mPendingDestroySurface="); 1349c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.println(mPendingDestroySurface); 1350c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1351c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurfaceResized || mSurfaceDestroyDeferred) { 1352c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mSurfaceResized="); pw.print(mSurfaceResized); 1353c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mSurfaceDestroyDeferred="); pw.println(mSurfaceDestroyDeferred); 1354c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1355c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) { 1356c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha); 1357c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mAlpha="); pw.print(mAlpha); 1358c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mLastAlpha="); pw.println(mLastAlpha); 1359c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1360c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mHaveMatrix || mWin.mGlobalScale != 1) { 1361c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mGlobalScale="); pw.print(mWin.mGlobalScale); 1362c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDsDx="); pw.print(mDsDx); 1363c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDtDx="); pw.print(mDtDx); 1364c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDsDy="); pw.print(mDsDy); 1365c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDtDy="); pw.println(mDtDy); 1366c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1367a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1368a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 1369c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner @Override 1370c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner public String toString() { 1371c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner StringBuffer sb = new StringBuffer("WindowStateAnimator ("); 1372c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner sb.append(mWin.mLastTitle + "): "); 1373c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner sb.append("mSurface " + mSurface); 1374c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner sb.append(", mAnimation " + mAnimation); 1375c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner return sb.toString(); 1376c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner } 1377a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner} 1378