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