WindowStateAnimator.java revision 7d8df3905d294127cc58100912a57c816bfb2502
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; 18c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.os.RemoteException; 19a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.util.Slog; 20c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.view.Surface; 217358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport android.view.SurfaceSession; 22a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.WindowManager; 23a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.WindowManagerPolicy; 24c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.view.WindowManager.LayoutParams; 25a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.animation.Animation; 26c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautnerimport android.view.animation.AnimationUtils; 27a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport android.view.animation.Transformation; 28a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 29a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport com.android.server.wm.WindowManagerService.H; 30a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 31a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerimport java.io.PrintWriter; 327358fbfeb2febb60085067fcacc192f429b06545Craig Mautnerimport java.util.ArrayList; 33a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 34a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner/** 35c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Keep track of animations and surface operations for a single WindowState. 36c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner **/ 37a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautnerclass WindowStateAnimator { 38c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_VISIBILITY = WindowManagerService.DEBUG_VISIBILITY; 39c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_ANIM = WindowManagerService.DEBUG_ANIM; 40c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_LAYERS = WindowManagerService.DEBUG_LAYERS; 41c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean DEBUG_STARTING_WINDOW = WindowManagerService.DEBUG_STARTING_WINDOW; 42c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean SHOW_TRANSACTIONS = WindowManagerService.SHOW_TRANSACTIONS; 43c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean SHOW_LIGHT_TRANSACTIONS = WindowManagerService.SHOW_LIGHT_TRANSACTIONS; 44c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean SHOW_SURFACE_ALLOC = WindowManagerService.SHOW_SURFACE_ALLOC; 45c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final boolean localLOGV = WindowManagerService.localLOGV; 46c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner static final boolean DEBUG_ORIENTATION = WindowManagerService.DEBUG_ORIENTATION; 477358fbfeb2febb60085067fcacc192f429b06545Craig Mautner static final boolean DEBUG_SURFACE_TRACE = WindowManagerService.DEBUG_SURFACE_TRACE; 48c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 49c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner static final String TAG = "WindowStateAnimator"; 50a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 51a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowManagerService mService; 52a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowState mWin; 53a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowState mAttachedWindow; 54e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner final WindowAnimator mAnimator; 55c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Session mSession; 56c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowManagerPolicy mPolicy; 57c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Context mContext; 58a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 59a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Currently running animation. 60a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mAnimating; 61a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mLocalAnimating; 62a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner Animation mAnimation; 63a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mAnimationIsEntrance; 64a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mHasTransformation; 65a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mHasLocalTransformation; 66a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final Transformation mTransformation = new Transformation(); 67a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean mWasAnimating; // Were we animating going into the most recent animation step? 68c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimLayer; 69c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mLastLayer; 70c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 71c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface mSurface; 72c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface mPendingDestroySurface; 73c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mReportDestroySurface; 74c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfacePendingDestroy; 75c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 76c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 77c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Set when we have changed the size of the surface, to know that 78c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * we must tell them application to resize (and thus redraw itself). 79c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 80c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceResized; 81c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 82c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 83c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Set if the client has asked that the destroy of its surface be delayed 84c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * until it explicitly says it is okay. 85c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 86c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceDestroyDeferred; 87c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 887d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mShownAlpha = 0; 897d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mAlpha = 0; 907d8df3905d294127cc58100912a57c816bfb2502Craig Mautner float mLastAlpha = 0; 91c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 92c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Used to save animation distances between the time they are calculated and when they are 93c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // used. 94c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimDw; 95c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mAnimDh; 96c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mDsDx=1, mDtDx=0, mDsDy=0, mDtDy=1; 97c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1; 98c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 99c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mHaveMatrix; 100c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 101c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // For debugging, this is the last information given to the surface flinger. 102c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mSurfaceShown; 103c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mSurfaceX, mSurfaceY, mSurfaceW, mSurfaceH; 104c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int mSurfaceLayer; 105c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float mSurfaceAlpha; 106c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 107c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Set to true if, when the window gets displayed, it should perform 108c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // an enter animation. 109c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean mEnterAnimationPending; 110a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 111749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set when there is no Surface */ 112749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int NO_SURFACE = 0; 113749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set after the Surface has been created but before the window has been drawn. During 114749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * this time the surface is hidden. */ 115749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int DRAW_PENDING = 1; 116749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set after the window has finished drawing for the first time but before its surface 117749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * is shown. The surface will be displayed when the next layout is run. */ 118749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int COMMIT_DRAW_PENDING = 2; 119749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** This is set during the time after the window's drawing has been committed, and before its 120749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * surface is actually shown. It is used to delay showing the surface until all windows in a 121749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner * token are ready to be shown. */ 122749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int READY_TO_SHOW = 3; 123749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** Set when the window has been shown in the screen the first time. */ 124749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner static final int HAS_DRAWN = 4; 125749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner int mDrawState; 126749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner 127749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner /** Was this window last hidden? */ 128749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner boolean mLastHidden; 129a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 130bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner int mAttrFlags; 131bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner int mAttrType; 132bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner 133a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public WindowStateAnimator(final WindowManagerService service, final WindowState win, 134a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowState attachedWindow) { 135a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService = service; 136a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin = win; 137a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAttachedWindow = attachedWindow; 138e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner mAnimator = mService.mAnimator; 139c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSession = win.mSession; 140c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPolicy = mService.mPolicy; 141c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mContext = mService.mContext; 142bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner mAttrFlags = win.mAttrs.flags; 143bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner mAttrType = win.mAttrs.type; 144a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 145a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 146a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void setAnimation(Animation anim) { 147bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner if (localLOGV) Slog.v(TAG, "Setting animation in " + this + ": " + anim); 148a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = false; 149a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 150a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = anim; 151a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION); 152a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.scaleCurrentDuration(mService.mWindowAnimationScale); 153a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Start out animation gone if window is gone, or visible if window is visible. 154a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 155749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mTransformation.setAlpha(mLastHidden ? 0 : 1); 156a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = true; 157a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 158a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 159a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void clearAnimation() { 160a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 161a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 162a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 163a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 164a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 165a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 166a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 167a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 168a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner /** Is the window or its container currently animating? */ 169a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean isAnimating() { 170a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final WindowState attached = mAttachedWindow; 171a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final AppWindowToken atoken = mWin.mAppToken; 172a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return mAnimation != null 173a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner || (attached != null && attached.mWinAnimator.mAnimation != null) 174a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner || (atoken != null && 175594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner (atoken.mAppAnimator.animation != null 176a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner || atoken.inPendingTransaction)); 177a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 178a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 179a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner /** Is this window currently animating? */ 180a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean isWindowAnimating() { 181a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return mAnimation != null; 182a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 183a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 184a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner void cancelExitAnimationForNextAnimationLocked() { 185a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 186a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 187a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 188c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner destroySurfaceLocked(); 189a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 190a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 191a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 192a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner private boolean stepAnimation(long currentTime) { 193a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if ((mAnimation == null) || !mLocalAnimating) { 194a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 195a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 196a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 197a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final boolean more = mAnimation.getTransformation(currentTime, mTransformation); 198c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 199c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Stepped animation in " + this + 200a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner ": more=" + more + ", xform=" + mTransformation); 201a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return more; 202a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 203a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 204a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // This must be called while inside a transaction. Returns true if 205a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // there is more animation to run. 206a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner boolean stepAnimationLocked(long currentTime) { 207a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Save the animation state as it was before this step so WindowManagerService can tell if 208a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we just started or just stopped animating by comparing mWasAnimating with isAnimating(). 209a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWasAnimating = mAnimating; 210a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mService.okToDisplay()) { 211a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // We will run animations as long as the display isn't frozen. 212a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 213a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.isDrawnLw() && mAnimation != null) { 214a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = true; 215a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = true; 216a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mLocalAnimating) { 217c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 218c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Starting animation in " + this + 219a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " @ " + currentTime + ": ww=" + mWin.mFrame.width() + 220a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " wh=" + mWin.mFrame.height() + 221c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner " dw=" + mAnimDw + " dh=" + mAnimDh + 222a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " scale=" + mService.mWindowAnimationScale); 223c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimation.initialize(mWin.mFrame.width(), mWin.mFrame.height(), 224c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimDw, mAnimDh); 225a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.setStartTime(currentTime); 226a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = true; 227a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 228a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 229a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if ((mAnimation != null) && mLocalAnimating) { 230a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (stepAnimation(currentTime)) { 231a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return true; 232a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 233a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 234c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 235c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Finished animation in " + this + 236a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner " @ " + currentTime); 237a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner //WindowManagerService.this.dump(); 238a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 239a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = false; 240a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if ((!mLocalAnimating || mAnimationIsEntrance) && mWin.mAppToken != null 241594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner && mWin.mAppToken.mAppAnimator.animation != null) { 242a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // When our app token is animating, we kind-of pretend like 243a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we are as well. Note the mLocalAnimating mAnimationIsEntrance 244a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // part of this check means that we will only do this if 245a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // our window is not currently exiting, or it is not 246a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // locally animating itself. The idea being that one that 247a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // is exiting and doing a local animation should be removed 248a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // once that animation is done. 249a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 250a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = true; 251a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 252a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 253a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (mHasTransformation) { 254a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Little trick to get through the path below to act like 255a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we have finished an animation. 256a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 257a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (isAnimating()) { 258a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 259a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 260a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (mAnimation != null) { 261a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // If the display is frozen, and there is a pending animation, 262a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // clear it and make sure we run the cleanup code. 263a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = true; 264a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = true; 265a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 266a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 267a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 268a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 269a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mAnimating && !mLocalAnimating) { 270a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 271a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 272a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 273c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Done animating, clean up. 274c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_ANIM) Slog.v( 275c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Animation done in " + this + ": exiting=" + mWin.mExiting 276a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ", reportedVisible=" 277a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.reportedVisible : false)); 278a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 279a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimating = false; 280a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mLocalAnimating = false; 281a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimation != null) { 282a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation.cancel(); 283a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mAnimation = null; 284a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 285e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner if (mAnimator.mWindowDetachedWallpaper == mWin) { 286e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner mAnimator.mWindowDetachedWallpaper = null; 287a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 288c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer = mWin.mLayer; 289a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mIsImWindow) { 290c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer += mService.mInputMethodAnimLayerAdjustment; 291a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } else if (mWin.mIsWallpaper) { 292c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimLayer += mService.mWallpaperAnimLayerAdjustment; 293a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 294c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_LAYERS) Slog.v(TAG, "Stepping win " + this 295c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " anim layer: " + mAnimLayer); 296a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasTransformation = false; 297a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mHasLocalTransformation = false; 298a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mPolicyVisibility != mWin.mPolicyVisibilityAfterAnim) { 299a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowState.DEBUG_VISIBILITY) { 300c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "Policy visibility changing after anim in " + this + ": " 301a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + mWin.mPolicyVisibilityAfterAnim); 302a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 303a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mPolicyVisibility = mWin.mPolicyVisibilityAfterAnim; 304a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mLayoutNeeded = true; 305a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mWin.mPolicyVisibility) { 306a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mService.mCurrentFocus == mWin) { 307a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mFocusMayChange = true; 308a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 309a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // Window is no longer visible -- make sure if we were waiting 310a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // for it to be displayed before enabling the display, that 311a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner // we allow the display to be enabled now. 312a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.enableScreenIfNeededLocked(); 313a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 314a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 315a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mTransformation.clear(); 316749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState == HAS_DRAWN 317a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING 318a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken != null 319a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken.firstWindowDrawn 320a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner && mWin.mAppToken.startingData != null) { 321c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Finish starting " 322a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + mWin.mToken + ": first real window done animating"); 323a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mFinishedStarting.add(mWin.mAppToken); 324a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mH.sendEmptyMessage(H.FINISHED_STARTING); 325a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 326a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 327a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner finishExit(); 328d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner mAnimator.mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; 329d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner if (WindowManagerService.DEBUG_LAYOUT_REPEATS) mService.debugLayoutRepeats( 330d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner "WindowStateAnimator", mAnimator.mPendingLayoutChanges); 331a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 332a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mAppToken != null) { 333a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mAppToken.updateReportedVisibilityLocked(); 334a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 335a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 336a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return false; 337a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 338a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 339a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner void finishExit() { 340a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v( 341c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "finishExit in " + this 342a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ": exiting=" + mWin.mExiting 343a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + " remove=" + mWin.mRemoveOnExit 344a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + " windowAnimating=" + isWindowAnimating()); 345a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 346a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final int N = mWin.mChildWindows.size(); 347a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner for (int i=0; i<N; i++) { 348a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mChildWindows.get(i).mWinAnimator.finishExit(); 349a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 350a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 351a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (!mWin.mExiting) { 352a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return; 353a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 354a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 355a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (isWindowAnimating()) { 356a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner return; 357a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 358a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 359a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 360c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Exit animation finished in " + this 361a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner + ": remove=" + mWin.mRemoveOnExit); 362c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 363a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mDestroySurface.add(mWin); 364a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mDestroying = true; 365a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (WindowState.SHOW_TRANSACTIONS) WindowManagerService.logSurface( 366a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin, "HIDE (finishExit)", null); 367c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 368a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner try { 369c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.hide(); 370a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } catch (RuntimeException e) { 371c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error hiding surface in " + this, e); 372a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 373749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = true; 374a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 375a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mExiting = false; 376a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mWin.mRemoveOnExit) { 377a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mService.mPendingRemove.add(mWin); 378a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner mWin.mRemoveOnExit = false; 379a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 380a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 381a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 382a608b882327fbb393bde3854953cd322a6fea675Craig Mautner boolean finishDrawingLocked() { 383749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState == DRAW_PENDING) { 38448ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) Slog.v( 385a608b882327fbb393bde3854953cd322a6fea675Craig Mautner TAG, "finishDrawingLocked: " + this + " in " + 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) { 394a608b882327fbb393bde3854953cd322a6fea675Craig Mautner //Slog.i(TAG, "commitFinishDrawingLocked: " + mSurface); 395749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState != COMMIT_DRAW_PENDING) { 396a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return false; 397a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 398749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = READY_TO_SHOW; 399a608b882327fbb393bde3854953cd322a6fea675Craig Mautner final boolean starting = mWin.mAttrs.type == TYPE_APPLICATION_STARTING; 400a608b882327fbb393bde3854953cd322a6fea675Craig Mautner final AppWindowToken atoken = mWin.mAppToken; 401a608b882327fbb393bde3854953cd322a6fea675Craig Mautner if (atoken == null || atoken.allDrawn || starting) { 402a608b882327fbb393bde3854953cd322a6fea675Craig Mautner performShowLocked(); 403a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 404a608b882327fbb393bde3854953cd322a6fea675Craig Mautner return true; 405a608b882327fbb393bde3854953cd322a6fea675Craig Mautner } 406a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 4077d8df3905d294127cc58100912a57c816bfb2502Craig Mautner static class SurfaceTrace extends Surface { 4087d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private final static String SURFACE_TAG = "SurfaceTrace"; 4097d8df3905d294127cc58100912a57c816bfb2502Craig Mautner final static ArrayList<SurfaceTrace> sSurfaces = new ArrayList<SurfaceTrace>(); 4107358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4117d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private float mSurfaceTraceAlpha = 0; 4127358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private int mLayer; 4137358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private PointF mPosition = new PointF(); 4147d8df3905d294127cc58100912a57c816bfb2502Craig Mautner private Point mSize; 4157358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private boolean mShown = false; 4167358fbfeb2febb60085067fcacc192f429b06545Craig Mautner private String mName = "Not named"; 4177358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4187d8df3905d294127cc58100912a57c816bfb2502Craig Mautner public SurfaceTrace(SurfaceSession s, 4197358fbfeb2febb60085067fcacc192f429b06545Craig Mautner int pid, int display, int w, int h, int format, int flags) throws 4207358fbfeb2febb60085067fcacc192f429b06545Craig Mautner OutOfResourcesException { 4217358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super(s, pid, display, w, h, format, flags); 4227358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mSize = new Point(w, h); 4237d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " 4247d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + WindowManagerService.getCallers(3)); 4257358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4267358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4277d8df3905d294127cc58100912a57c816bfb2502Craig Mautner public SurfaceTrace(SurfaceSession s, 4287358fbfeb2febb60085067fcacc192f429b06545Craig Mautner int pid, String name, int display, int w, int h, int format, int flags) 4297358fbfeb2febb60085067fcacc192f429b06545Craig Mautner throws OutOfResourcesException { 4307358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super(s, pid, name, display, w, h, format, flags); 4317358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mName = name; 4327358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mSize = new Point(w, h); 4337d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " 4347d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + WindowManagerService.getCallers(3)); 4357358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4367358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4377358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4387358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setAlpha(float alpha) { 4397358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setAlpha(alpha); 4407d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurfaceTraceAlpha = alpha; 4417d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "setAlpha: " + this + ". Called by " 4427d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + WindowManagerService.getCallers(3)); 4437358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4447358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4457358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4467358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setLayer(int zorder) { 4477358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setLayer(zorder); 4487358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mLayer = zorder; 4497d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "setLayer: " + this + ". Called by " 4507d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + WindowManagerService.getCallers(3)); 4517358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4527358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.remove(this); 4537358fbfeb2febb60085067fcacc192f429b06545Craig Mautner int i; 4547358fbfeb2febb60085067fcacc192f429b06545Craig Mautner for (i = sSurfaces.size() - 1; i >= 0; i--) { 4557d8df3905d294127cc58100912a57c816bfb2502Craig Mautner SurfaceTrace s = sSurfaces.get(i); 4567358fbfeb2febb60085067fcacc192f429b06545Craig Mautner if (s.mLayer < zorder) { 4577358fbfeb2febb60085067fcacc192f429b06545Craig Mautner break; 4587358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4597358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4607358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.add(i + 1, this); 4617358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4627358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4637358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4647358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setPosition(float x, float y) { 4657358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setPosition(x, y); 4667358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mPosition = new PointF(x, y); 4677d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "setPosition: " + this + ". Called by " 4687d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + WindowManagerService.getCallers(3)); 4697358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4707358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4717358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4727358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void setSize(int w, int h) { 4737358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.setSize(w, h); 4747358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mSize = new Point(w, h); 4757d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "setSize: " + this + ". Called by " 4767d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + WindowManagerService.getCallers(3)); 4777358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4787358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4797358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4807358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void hide() { 4817358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.hide(); 4827358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mShown = false; 4837d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "hide: " + this + ". Called by " 4847d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + WindowManagerService.getCallers(3)); 4857358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4867358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4877358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void show() { 4887358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.show(); 4897358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mShown = true; 4907d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "show: " + this + ". Called by " 4917d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + WindowManagerService.getCallers(3)); 4927358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 4937358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 4947358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 4957358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public void destroy() { 4967358fbfeb2febb60085067fcacc192f429b06545Craig Mautner super.destroy(); 4977d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.v(SURFACE_TAG, "destroy: " + this + ". Called by " 4987d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + WindowManagerService.getCallers(3)); 4997358fbfeb2febb60085067fcacc192f429b06545Craig Mautner sSurfaces.remove(this); 5007358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5017358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5027358fbfeb2febb60085067fcacc192f429b06545Craig Mautner static void dumpAllSurfaces() { 5037358fbfeb2febb60085067fcacc192f429b06545Craig Mautner final int N = sSurfaces.size(); 5047358fbfeb2febb60085067fcacc192f429b06545Craig Mautner for (int i = 0; i < N; i++) { 5057358fbfeb2febb60085067fcacc192f429b06545Craig Mautner Slog.i(TAG, "SurfaceDump: " + sSurfaces.get(i)); 5067358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5077358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5087358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 5097358fbfeb2febb60085067fcacc192f429b06545Craig Mautner @Override 5107358fbfeb2febb60085067fcacc192f429b06545Craig Mautner public String toString() { 5117358fbfeb2febb60085067fcacc192f429b06545Craig Mautner return "Surface " + mName + ": shown=" + mShown + " layer=" + mLayer 5127d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y 5137358fbfeb2febb60085067fcacc192f429b06545Craig Mautner + " " + mSize.x + "x" + mSize.y; 5147358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5157358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 5167358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 517c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface createSurfaceLocked() { 518c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface == null) { 519c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mReportDestroySurface = false; 520c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfacePendingDestroy = false; 52148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (DEBUG_ORIENTATION) Slog.i(TAG, 522c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "createSurface " + this + ": DRAW NOW PENDING"); 523749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = DRAW_PENDING; 524c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken != null) { 525c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.allDrawn = false; 526c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 527c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 528c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.makeWindowFreezingScreenIfNeededLocked(mWin); 529c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 530c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int flags = 0; 531c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowManager.LayoutParams attrs = mWin.mAttrs; 532c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 533c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((attrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) { 534c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner flags |= Surface.SECURE; 535c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 536c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowState.DEBUG_VISIBILITY) Slog.v( 537c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Creating surface in session " 538c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSession.mSurfaceSession + " window " + this 539c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " w=" + mWin.mCompatFrame.width() 540c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " h=" + mWin.mCompatFrame.height() + " format=" 541c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + attrs.format + " flags=" + flags); 542c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 543c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int w = mWin.mCompatFrame.width(); 544c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int h = mWin.mCompatFrame.height(); 545c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((attrs.flags & LayoutParams.FLAG_SCALED) != 0) { 546c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // for a scaled surface, we always want the requested 547c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // size. 548c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w = mWin.mRequestedWidth; 549c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner h = mWin.mRequestedHeight; 550c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 551c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 552c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Something is wrong and SurfaceFlinger will not like this, 553c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // try to revert to sane values 554c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w <= 0) w = 1; 555c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (h <= 0) h = 1; 556c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 557c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 558c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = 0; 5597d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurfaceAlpha = 0; 560c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceX = 0; 561c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceY = 0; 562c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceW = w; 563c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceH = h; 564c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 565c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean isHwAccelerated = (attrs.flags & 566c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0; 567c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : attrs.format; 568c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!PixelFormat.formatHasAlpha(attrs.format)) { 569c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner flags |= Surface.OPAQUE; 570c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 5717358fbfeb2febb60085067fcacc192f429b06545Craig Mautner if (DEBUG_SURFACE_TRACE) { 5727d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurface = new SurfaceTrace( 5737358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mSession.mSurfaceSession, mSession.mPid, 5747358fbfeb2febb60085067fcacc192f429b06545Craig Mautner attrs.getTitle().toString(), 5757358fbfeb2febb60085067fcacc192f429b06545Craig Mautner 0, w, h, format, flags); 5767358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } else { 5777358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mSurface = new Surface( 578c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSession.mSurfaceSession, mSession.mPid, 579c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attrs.getTitle().toString(), 580c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 0, w, h, format, flags); 5817358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 582c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = true; 583c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG, 584c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner " CREATE SURFACE " 585c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSurface + " IN SESSION " 586c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSession.mSurfaceSession 587c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": pid=" + mSession.mPid + " format=" 588c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + attrs.format + " flags=0x" 589c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + Integer.toHexString(flags) 590c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " / " + this); 591c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (Surface.OutOfResourcesException e) { 592c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = false; 593c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "OutOfResourcesException creating surface"); 594c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "create", true); 595749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 596c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return null; 597c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (Exception e) { 598c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface = false; 599c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.e(TAG, "Exception creating surface", e); 600749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 601c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return null; 602c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 603c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 604c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 605c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Got surface: " + mSurface 606c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ", set left=" + mWin.mFrame.left + " top=" + mWin.mFrame.top 607c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ", animLayer=" + mAnimLayer); 608c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) { 609c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.i(TAG, ">>> OPEN TRANSACTION createSurfaceLocked"); 610c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "CREATE pos=(" 611c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.mFrame.left + "," + mWin.mFrame.top + ") (" 612c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.mCompatFrame.width() + "x" + mWin.mCompatFrame.height() 613c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "), layer=" + mAnimLayer + " HIDE", null); 614c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 615c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface.openTransaction(); 616c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 617c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 618c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceX = mWin.mFrame.left + mWin.mXOffset; 619c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceY = mWin.mFrame.top + mWin.mYOffset; 620c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setPosition(mSurfaceX, mSurfaceY); 621c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = mAnimLayer; 622c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setLayer(mAnimLayer); 6237d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mSurface.setAlpha(0); 624c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 625c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.hide(); 626c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((mWin.mAttrs.flags&WindowManager.LayoutParams.FLAG_DITHER) != 0) { 627c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, "DITHER", null); 628c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setFlags(Surface.SURFACE_DITHER, Surface.SURFACE_DITHER); 629c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 630c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 631c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error creating surface in " + w, e); 632c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "create-init", true); 633c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 634749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = true; 635c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } finally { 636c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Surface.closeTransaction(); 637c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 638c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "<<< CLOSE TRANSACTION createSurfaceLocked"); 639c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 640c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 641c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "Created surface " + this); 642c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 643c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return mSurface; 644c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 645c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 646c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void destroySurfaceLocked() { 647c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken != null && mWin == mWin.mAppToken.startingWindow) { 648c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.startingDisplayed = false; 649c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 650c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 651749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = NO_SURFACE; 652c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 653c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 654c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int i = mWin.mChildWindows.size(); 655c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner while (i > 0) { 656c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner i--; 657c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowState c = mWin.mChildWindows.get(i); 658c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mAttachedHidden = true; 659c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 660c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 661c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mReportDestroySurface) { 662c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mReportDestroySurface = false; 663c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfacePendingDestroy = true; 664c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 665c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mClient.dispatchGetNewSurface(); 666c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // We'll really destroy on the next time around. 667c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return; 668c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RemoteException e) { 669c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 670c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 671c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 672c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 673c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) { 674c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 675c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 676c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 677c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 678c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 679c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Window " + this + " destroying surface " 680c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mSurface + ", session " + mSession, e); 681c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 682c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurfaceDestroyDeferred) { 683c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null && mPendingDestroySurface != mSurface) { 684c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 685c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 686c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 687c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 688c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 689c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 690c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 691c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); 692c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 693c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface.destroy(); 694c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 695c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface = mSurface; 696c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 697c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 698c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 699c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 700c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 701c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 702c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 703c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 704c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY", e); 705c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 706c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.destroy(); 707c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 708c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 709c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Exception thrown when destroying Window " + this 710c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " surface " + mSurface + " session " + mSession 711c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": " + e.toString()); 712c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 713c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 714c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 715c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface = null; 716c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner mWin.mHasSurface =false; 717c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 718c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 719c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 720c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void destroyDeferredSurfaceLocked() { 721c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 722c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 723c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 724c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 725c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 726c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 727c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 728c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 729c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "DESTROY PENDING", e); 730c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 731c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface.destroy(); 732c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 733c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 734d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.w(TAG, "Exception thrown when destroying Window " 735c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + this + " surface " + mPendingDestroySurface 736c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " session " + mSession + ": " + e.toString()); 737c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 738c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceDestroyDeferred = false; 739c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mPendingDestroySurface = null; 740c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 741c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 742c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void computeShownFrameLocked() { 743c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean selfTransformation = mHasLocalTransformation; 744c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Transformation attachedTransformation = 745c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner (mAttachedWindow != null && mAttachedWindow.mWinAnimator.mHasLocalTransformation) 746c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner ? mAttachedWindow.mWinAnimator.mTransformation : null; 747594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final AppWindowAnimator appAnimator = 748594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner mWin.mAppToken == null ? null : mWin.mAppToken.mAppAnimator; 749594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner Transformation appTransformation = (appAnimator != null && appAnimator.hasTransformation) 750594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner ? appAnimator.transformation : null; 751c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 752c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Wallpapers are animated based on the "real" window they 753c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // are currently targeting. 754c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAttrs.type == TYPE_WALLPAPER && mService.mLowerWallpaperTarget == null 755c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && mService.mWallpaperTarget != null) { 756c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mService.mWallpaperTarget.mWinAnimator.mHasLocalTransformation && 757c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mWallpaperTarget.mWinAnimator.mAnimation != null && 758c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner !mService.mWallpaperTarget.mWinAnimator.mAnimation.getDetachWallpaper()) { 759c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attachedTransformation = mService.mWallpaperTarget.mWinAnimator.mTransformation; 760c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER && attachedTransformation != null) { 761c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "WP target attached xform: " + attachedTransformation); 762c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 763c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 764594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final AppWindowAnimator wpAppAnimator = mService.mWallpaperTarget.mAppToken == null 765594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner ? null : mService.mWallpaperTarget.mAppToken.mAppAnimator; 766594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (wpAppAnimator != null && 767594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner wpAppAnimator.hasTransformation && 768594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner wpAppAnimator.animation != null && 769594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner !wpAppAnimator.animation.getDetachWallpaper()) { 770594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner appTransformation = wpAppAnimator.transformation; 771c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER && appTransformation != null) { 772c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "WP target app xform: " + appTransformation); 773c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 774c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 775c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 776c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 777c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean screenAnimation = mService.mAnimator.mScreenRotationAnimation != null 778c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && mService.mAnimator.mScreenRotationAnimation.isAnimating(); 779c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation || attachedTransformation != null 780c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || appTransformation != null || screenAnimation) { 781c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // cache often used attributes locally 782c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Rect frame = mWin.mFrame; 783c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float tmpFloats[] = mService.mTmpFloats; 784c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final Matrix tmpMatrix = mWin.mTmpMatrix; 785c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 786c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Compute the desired transformation. 787c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 788c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are doing a screen animation, the global rotation 789c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // applied to windows can result in windows that are carefully 790c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // aligned with each other to slightly separate, allowing you 791c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // to see what is behind them. An unsightly mess. This... 792c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // thing... magically makes it call good: scale each window 793c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // slightly (two pixels larger in each dimension, from the 794c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // window's center). 795c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float w = frame.width(); 796c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final float h = frame.height(); 797c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w>=1 && h>=1) { 798c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.setScale(1 + 2/w, 1 + 2/h, w/2, h/2); 799c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 800c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.reset(); 801c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 802c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 803c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.reset(); 804c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 805c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postScale(mWin.mGlobalScale, mWin.mGlobalScale); 806c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation) { 807c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(mTransformation.getMatrix()); 808c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 809c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postTranslate(frame.left + mWin.mXOffset, frame.top + mWin.mYOffset); 810c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attachedTransformation != null) { 811c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(attachedTransformation.getMatrix()); 812c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 813c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (appTransformation != null) { 814c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat(appTransformation.getMatrix()); 815c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 816c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 817c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.postConcat( 818c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mAnimator.mScreenRotationAnimation.getEnterTransformation().getMatrix()); 819c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 820c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 821c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // "convert" it into SurfaceFlinger's format 822c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // (a 2x2 matrix + an offset) 823c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Here we must not transform the position of the surface 824c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // since it is already included in the transformation. 825c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Transform: " + matrix); 826c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 827c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mHaveMatrix = true; 828c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner tmpMatrix.getValues(tmpFloats); 829c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx = tmpFloats[Matrix.MSCALE_X]; 830c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDx = tmpFloats[Matrix.MSKEW_Y]; 831c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy = tmpFloats[Matrix.MSKEW_X]; 832c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDy = tmpFloats[Matrix.MSCALE_Y]; 833c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float x = tmpFloats[Matrix.MTRANS_X]; 834c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner float y = tmpFloats[Matrix.MTRANS_Y]; 835c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int w = frame.width(); 836c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int h = frame.height(); 837c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mShownFrame.set(x, y, x+w, y+h); 838c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 839c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Now set the alpha... but because our current hardware 840c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // can't do alpha transformation on a non-opaque surface, 841c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // turn it off if we are running an animation that is also 842c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // transforming since it is more important to have that 843c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // animation be smooth. 844c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha = mAlpha; 845c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!mService.mLimitedAlphaCompositing 846c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || (!PixelFormat.formatHasAlpha(mWin.mAttrs.format) 847c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDsDy, mDtDy) 848c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && x == frame.left && y == frame.top))) { 849c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Applying alpha transform"); 850c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (selfTransformation) { 851c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= mTransformation.getAlpha(); 852c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 853c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attachedTransformation != null) { 854c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= attachedTransformation.getAlpha(); 855c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 856c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (appTransformation != null) { 857c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= appTransformation.getAlpha(); 858c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 859c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (screenAnimation) { 860c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha *= 861c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mAnimator.mScreenRotationAnimation.getEnterTransformation().getAlpha(); 862c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 863c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 864c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //Slog.i(TAG, "Not applying alpha transform"); 865c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 866c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 867c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 868c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "computeShownFrameLocked: Animating " + this + 869c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner ": " + mWin.mShownFrame + 870c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner ", alpha=" + mTransformation.getAlpha() + ", mShownAlpha=" + mShownAlpha); 871c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return; 872c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 873c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 874c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.localLOGV) Slog.v( 875c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner TAG, "computeShownFrameLocked: " + this + 876c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner " not attached, mAlpha=" + mAlpha); 877c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mShownFrame.set(mWin.mFrame); 878c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mXOffset != 0 || mWin.mYOffset != 0) { 879c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mShownFrame.offset(mWin.mXOffset, mWin.mYOffset); 880c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 881c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mShownAlpha = mAlpha; 882c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mHaveMatrix = false; 883c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx = mWin.mGlobalScale; 884c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDx = 0; 885c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy = 0; 886c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDtDy = mWin.mGlobalScale; 887c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 888d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner 889c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner public void prepareSurfaceLocked(final boolean recoveringMemory) { 890c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final WindowState w = mWin; 891c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface == null) { 892c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mOrientationChanging) { 893c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) { 894c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.v(TAG, "Orientation change skips hidden " + w); 895c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 896c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mOrientationChanging = false; 897c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 898c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return; 899c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 900c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 901c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean displayed = false; 902c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 903c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner computeShownFrameLocked(); 904c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 905c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int width, height; 906c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { 907c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // for a scaled surface, we just want to use 908c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // the requested size. 909c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = w.mRequestedWidth; 910c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = w.mRequestedHeight; 911c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 912c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = w.mCompatFrame.width(); 913c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = w.mCompatFrame.height(); 914c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 915c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 916c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (width < 1) { 917c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner width = 1; 918c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 919c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (height < 1) { 920c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner height = 1; 921c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 922c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final boolean surfaceResized = mSurfaceW != width || mSurfaceH != height; 923c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (surfaceResized) { 924c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceW = width; 925c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceH = height; 926c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 927c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 928c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurfaceX != w.mShownFrame.left 929c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mSurfaceY != w.mShownFrame.top) { 930c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 931c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 932c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "POS " + w.mShownFrame.left 933c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ", " + w.mShownFrame.top, null); 934c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceX = w.mShownFrame.left; 935c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceY = w.mShownFrame.top; 936c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setPosition(w.mShownFrame.left, w.mShownFrame.top); 937c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 938c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error positioning surface of " + w 939c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " pos=(" + w.mShownFrame.left 940c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "," + w.mShownFrame.top + ")", e); 941c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 942c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "position", true); 943c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 944c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 945c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 946c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 947c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (surfaceResized) { 948c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 949c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 950c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "SIZE " + width + "x" + height, null); 951c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceResized = true; 952c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setSize(width, height); 953c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 954c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If something goes wrong with the surface (such 955c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // as running out of memory), don't take down the 956c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // entire system. 957c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.e(TAG, "Error resizing surface of " + w 958c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " size=(" + width + "x" + height + ")", e); 959c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 960c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "size", true); 961c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 962c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 963c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 964c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 965c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mAttachedHidden || !w.isReadyForDisplay()) { 966749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (!mLastHidden) { 967c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner //dump(); 968749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = true; 969c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 970c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "HIDE (performLayout)", null); 971c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 972c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = false; 973c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 974c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.hide(); 975c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 976c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Exception hiding surface in " + w); 977c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 978c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 979c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 980c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are waiting for this window to handle an 981c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // orientation change, well, it is hidden, so 982c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // doesn't really matter. Note that this does 983c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // introduce a potential glitch if the window 984c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // becomes unhidden before it has drawn for the 985c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // new orientation. 986c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mOrientationChanging) { 987c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mOrientationChanging = false; 988c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, 989c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Orientation change skips hidden " + w); 990c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 991c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else if (mLastLayer != mAnimLayer 992c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastAlpha != mShownAlpha 993c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDsDx != mDsDx 994c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDtDx != mDtDx 995c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDsDy != mDsDy 996c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || mLastDtDy != mDtDy 997c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || w.mLastHScale != w.mHScale 998c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner || w.mLastVScale != w.mVScale 999749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner || mLastHidden) { 1000c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner displayed = true; 1001c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastAlpha = mShownAlpha; 1002c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastLayer = mAnimLayer; 1003c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDsDx = mDsDx; 1004c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDtDx = mDtDx; 1005c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDsDy = mDsDy; 1006c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastDtDy = mDtDy; 1007c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mLastHScale = w.mHScale; 1008c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mLastVScale = w.mVScale; 1009c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1010c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "alpha=" + mShownAlpha + " layer=" + mAnimLayer 1011c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " matrix=[" + (mDsDx*w.mHScale) 1012c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "," + (mDtDx*w.mVScale) 1013c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "][" + (mDsDy*w.mHScale) 1014c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + "," + (mDtDy*w.mVScale) + "]", null); 1015c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 1016c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1017c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceAlpha = mShownAlpha; 1018c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setAlpha(mShownAlpha); 1019c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceLayer = w.mWinAnimator.mAnimLayer; 1020c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setLayer(w.mWinAnimator.mAnimLayer); 1021c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.setMatrix( 1022c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDx*w.mHScale, mDtDx*w.mVScale, 1023c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mDsDy*w.mHScale, mDtDy*w.mVScale); 1024749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner 1025749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mLastHidden && mDrawState == HAS_DRAWN) { 1026749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, 1027749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner "SHOW (performLayout)", null); 1028749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w 1029749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner + " during relayout"); 1030749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (showSurfaceRobustlyLocked()) { 1031749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = false; 1032749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } else { 1033749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner w.mOrientationChanging = false; 1034749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1035749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1036749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mSurface != null) { 1037749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner w.mToken.hasVisible = true; 1038749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner } 1039c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1040c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Error updating surface in " + w, e); 1041c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!recoveringMemory) { 1042c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "update", true); 1043c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1044c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1045c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1046c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1047c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner displayed = true; 1048c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1049c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1050c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (displayed) { 1051c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (w.mOrientationChanging) { 1052c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!w.isDrawnLw()) { 1053d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner mAnimator.mBulkUpdateParams |= CLEAR_ORIENTATION_CHANGE_COMPLETE; 1054c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, 1055c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Orientation continue waiting for draw in " + w); 1056c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1057c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mOrientationChanging = false; 1058c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation change complete in " + w); 1059c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1060c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1061c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner w.mToken.hasVisible = true; 1062c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1063c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1064c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 106548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner void setTransparentRegionHint(final Region region) { 10661f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner if (mSurface == null) { 10671f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true"); 10681f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner return; 10691f4e0ccba08e4abb55a38a8b5936dbb244475fb9Craig Mautner } 107048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 107148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner ">>> OPEN TRANSACTION setTransparentRegion"); 107248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Surface.openTransaction(); 107348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner try { 107448ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, 107548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner "transparentRegionHint=" + region, null); 107648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner mSurface.setTransparentRegionHint(region); 107748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } finally { 107848ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Surface.closeTransaction(); 107948ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 108048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner "<<< CLOSE TRANSACTION setTransparentRegion"); 108148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 108248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 108348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner 108448ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner void setWallpaperOffset(int left, int top) { 108548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Surface.openTransaction(); 108648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner try { 108748ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner mSurfaceX = left; 108848ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner mSurfaceY = top; 108948ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner mSurface.setPosition(left, top); 109048ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } catch (RuntimeException e) { 109148ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Slog.w(TAG, "Error positioning surface of " + mWin 109248ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner + " pos=(" + left + "," + top + ")", e); 109348ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 109448ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner Surface.closeTransaction(); 109548ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner } 109648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner 1097c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // This must be called while inside a transaction. 1098c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean performShowLocked() { 1099c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) { 1100c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 1101c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 1102c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 1103c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 1104c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1105d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.v(TAG, "performShow on " + this 1106749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner + ": mDrawState=" + mDrawState + " readyForDisplay=" 1107c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + mWin.isReadyForDisplay() 1108c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " starting=" + (mWin.mAttrs.type == TYPE_APPLICATION_STARTING), e); 1109c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1110749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner if (mDrawState == READY_TO_SHOW && mWin.isReadyForDisplay()) { 1111c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) 1112c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowManagerService.logSurface(mWin, "SHOW (performShowLocked)", null); 1113d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + this 1114c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " during animation: policyVis=" + mWin.mPolicyVisibility 1115c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " attHidden=" + mWin.mAttachedHidden 1116c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok.hiddenRequested=" 1117c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hiddenRequested : false) 1118c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok.hidden=" 1119c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.hidden : false) 1120c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " animating=" + mAnimating 1121c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " tok animating=" 1122594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner + (mWin.mAppToken != null ? mWin.mAppToken.mAppAnimator.animating : false)); 1123c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!showSurfaceRobustlyLocked()) { 1124c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return false; 1125c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1126c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1127c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.enableScreenIfNeededLocked(); 1128c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1129c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner applyEnterAnimationLocked(); 1130c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1131c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mLastAlpha = -1; 1132749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mLastHidden = false; 1133749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner mDrawState = HAS_DRAWN; 1134c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1135c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int i = mWin.mChildWindows.size(); 1136c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner while (i > 0) { 1137c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner i--; 1138c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner WindowState c = mWin.mChildWindows.get(i); 1139c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (c.mAttachedHidden) { 1140c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mAttachedHidden = false; 1141c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (c.mWinAnimator.mSurface != null) { 1142c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner c.mWinAnimator.performShowLocked(); 1143c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // It hadn't been shown, which means layout not 1144c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // performed on it, so now we want to make sure to 1145c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // do a layout. If called from within the transaction 1146c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // loop, this will cause it to restart with a new 1147c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // layout. 1148c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mLayoutNeeded = true; 1149c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1150c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1151c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1152c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1153c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAttrs.type != TYPE_APPLICATION_STARTING 1154c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner && mWin.mAppToken != null) { 1155c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.firstWindowDrawn = true; 1156c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1157c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mAppToken.startingData != null) { 1158c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_STARTING_WINDOW || 1159d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 1160c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Finish starting " + mWin.mToken 1161c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + ": first real window is shown, no animation"); 1162c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If this initial window is animating, stop it -- we 1163c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // will do an animation to reveal it from behind the 1164c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // starting window, so there is no need for it to also 1165c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // be doing its own stuff. 1166c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mAnimation != null) { 1167c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimation.cancel(); 1168c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimation = null; 1169c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Make sure we clean up the animation. 1170c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimating = true; 1171c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1172c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mFinishedStarting.add(mWin.mAppToken); 1173c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.mH.sendEmptyMessage(H.FINISHED_STARTING); 1174c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1175c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mAppToken.updateReportedVisibilityLocked(); 1176c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1177c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1178c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1179c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1180c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1181c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return false; 1182c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1183c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1184c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 1185c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Have the surface flinger show a surface, robustly dealing with 1186c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * error conditions. In particular, if there is not enough memory 1187c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * to show the surface, then we will try to get rid of other surfaces 1188c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * in order to succeed. 1189c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * 1190c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @return Returns true if the surface was successfully shown. 1191c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 1192c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean showSurfaceRobustlyLocked() { 1193c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner try { 1194c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 1195c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurfaceShown = true; 1196c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mSurface.show(); 1197c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mWin.mTurnOnScreen) { 1198c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (DEBUG_VISIBILITY) Slog.v(TAG, 1199c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "Show surface turning screen on: " + mWin); 1200c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mWin.mTurnOnScreen = false; 12017d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN; 1202c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1203c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1204c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1205c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } catch (RuntimeException e) { 1206c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Slog.w(TAG, "Failure showing surface " + mSurface + " in " + mWin, e); 1207c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1208c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1209c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mService.reclaimSomeSurfaceMemoryLocked(this, "show", true); 1210c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1211c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return false; 1212c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1213c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1214c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner void applyEnterAnimationLocked() { 1215c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner final int transit; 1216c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mEnterAnimationPending) { 1217c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mEnterAnimationPending = false; 1218c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner transit = WindowManagerPolicy.TRANSIT_ENTER; 1219c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1220c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner transit = WindowManagerPolicy.TRANSIT_SHOW; 1221c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1222c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1223c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner applyAnimationLocked(transit, true); 1224c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1225c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 122648ba1e7f530dab01bd2e733b6466246380720a92Craig Mautner // TODO(cmautner): Move back to WindowState? 1227c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner /** 1228c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * Choose the correct animation and set it to the passed WindowState. 1229c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @param transit If WindowManagerPolicy.TRANSIT_PREVIEW_DONE and the app window has been drawn 1230c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * then the animation will be app_starting_exit. Any other value loads the animation from 1231c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * the switch statement below. 1232c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @param isEntrance The animation type the last time this was called. Used to keep from 1233c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * loading the same animation twice. 1234c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner * @return true if an animation has been loaded. 1235c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner */ 1236c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner boolean applyAnimationLocked(int transit, boolean isEntrance) { 1237c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mLocalAnimating && mAnimationIsEntrance == isEntrance) { 1238c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // If we are trying to apply an animation, but already running 1239c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // an animation of the same type, then just leave that one alone. 1240c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return true; 1241c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1242c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1243c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // Only apply an animation if the display isn't frozen. If it is 1244c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // frozen, there is no reason to animate and it can cause strange 1245c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // artifacts when we unfreeze the display if some different animation 1246c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner // is running. 1247c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mService.okToDisplay()) { 1248c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int anim = mPolicy.selectAnimationLw(mWin, transit); 1249c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner int attr = -1; 1250c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner Animation a = null; 1251c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (anim != 0) { 1252c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner a = AnimationUtils.loadAnimation(mContext, anim); 1253c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1254c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner switch (transit) { 1255c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_ENTER: 1256c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation; 1257c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1258c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_EXIT: 1259c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation; 1260c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1261c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_SHOW: 1262c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation; 1263c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1264c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner case WindowManagerPolicy.TRANSIT_HIDE: 1265c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation; 1266c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner break; 1267c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1268c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (attr >= 0) { 1269c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner a = mService.loadAnimation(mWin.mAttrs, attr); 1270c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1271c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1272d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 1273c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner "applyAnimation: win=" + this 1274c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " anim=" + anim + " attr=0x" + Integer.toHexString(attr) 1275c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " mAnimation=" + mAnimation 1276c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner + " isEntrance=" + isEntrance); 1277c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (a != null) { 1278c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (WindowManagerService.DEBUG_ANIM) { 1279c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner RuntimeException e = null; 1280c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (!WindowManagerService.HIDE_STACK_CRAWLS) { 1281c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e = new RuntimeException(); 1282c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner e.fillInStackTrace(); 1283c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1284d87946ba48b62a6a83fd971ef7c4c419407db836Craig Mautner Slog.v(TAG, "Loaded animation " + a + " for " + this, e); 1285c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1286c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner setAnimation(a); 1287c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner mAnimationIsEntrance = isEntrance; 1288c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1289c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } else { 1290c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner clearAnimation(); 1291c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1292c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1293c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner return mAnimation != null; 1294c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1295c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 1296a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner public void dump(PrintWriter pw, String prefix, boolean dumpAll) { 1297a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mAnimating || mLocalAnimating || mAnimationIsEntrance 1298a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner || mAnimation != null) { 1299a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(prefix); pw.print("mAnimating="); pw.print(mAnimating); 1300a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mLocalAnimating="); pw.print(mLocalAnimating); 1301a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mAnimationIsEntrance="); pw.print(mAnimationIsEntrance); 1302a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" mAnimation="); pw.println(mAnimation); 1303a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1304a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner if (mHasTransformation || mHasLocalTransformation) { 1305a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(prefix); pw.print("XForm: has="); 1306a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(mHasTransformation); 1307a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" hasLocal="); pw.print(mHasLocalTransformation); 1308a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.print(" "); mTransformation.printShortString(pw); 1309a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner pw.println(); 1310a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1311c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurface != null) { 1312c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (dumpAll) { 1313c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mSurface="); pw.println(mSurface); 1314749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner pw.print(prefix); pw.print("mDrawState="); pw.print(mDrawState); 1315749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner pw.print(" mLastHidden="); pw.println(mLastHidden); 1316c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1317c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("Surface: shown="); pw.print(mSurfaceShown); 1318c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" layer="); pw.print(mSurfaceLayer); 1319c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" alpha="); pw.print(mSurfaceAlpha); 1320c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" rect=("); pw.print(mSurfaceX); 1321c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(","); pw.print(mSurfaceY); 1322c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(") "); pw.print(mSurfaceW); 1323c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" x "); pw.println(mSurfaceH); 1324c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1325c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mPendingDestroySurface != null) { 1326c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mPendingDestroySurface="); 1327c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.println(mPendingDestroySurface); 1328c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1329c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mSurfaceResized || mSurfaceDestroyDeferred) { 1330c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mSurfaceResized="); pw.print(mSurfaceResized); 1331c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mSurfaceDestroyDeferred="); pw.println(mSurfaceDestroyDeferred); 1332c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1333c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) { 1334c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha); 1335c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mAlpha="); pw.print(mAlpha); 1336c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mLastAlpha="); pw.println(mLastAlpha); 1337c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1338c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner if (mHaveMatrix || mWin.mGlobalScale != 1) { 1339c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(prefix); pw.print("mGlobalScale="); pw.print(mWin.mGlobalScale); 1340c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDsDx="); pw.print(mDsDx); 1341c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDtDx="); pw.print(mDtDx); 1342c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDsDy="); pw.print(mDsDy); 1343c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner pw.print(" mDtDy="); pw.println(mDtDy); 1344c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner } 1345a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner } 1346a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 1347c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner @Override 1348c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner public String toString() { 1349c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner StringBuffer sb = new StringBuffer("WindowStateAnimator ("); 1350c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner sb.append(mWin.mLastTitle + "): "); 1351c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner sb.append("mSurface " + mSurface); 1352c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner sb.append(", mAnimation " + mAnimation); 1353c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner return sb.toString(); 1354c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner } 1355a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner} 1356