WindowStateAnimator.java revision c2c0a61cf5f779b4726f089f28d966c03ccbba54
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2014 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.wm;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static com.android.server.wm.WindowManagerService.DEBUG_ANIM;
210795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopianimport static com.android.server.wm.WindowManagerService.DEBUG_LAYERS;
220795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopianimport static com.android.server.wm.WindowManagerService.DEBUG_ORIENTATION;
230795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopianimport static com.android.server.wm.WindowManagerService.DEBUG_STARTING_WINDOW;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static com.android.server.wm.WindowManagerService.DEBUG_SURFACE_TRACE;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static com.android.server.wm.WindowManagerService.SHOW_TRANSACTIONS;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static com.android.server.wm.WindowManagerService.SHOW_LIGHT_TRANSACTIONS;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static com.android.server.wm.WindowManagerService.SHOW_SURFACE_ALLOC;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static com.android.server.wm.WindowManagerService.localLOGV;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_TURN_ON_SCREEN;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Point;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PointF;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.RectF;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Slog;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Display;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.DisplayInfo;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MagnificationSpec;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface.OutOfResourcesException;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceControl;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceSession;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerPolicy;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager.LayoutParams;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation;
53e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehatimport android.view.animation.AnimationUtils;
54e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehatimport android.view.animation.Transformation;
55e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
56e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehatimport com.android.server.wm.WindowManagerService.H;
57e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
58e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehatimport java.io.PrintWriter;
59e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehatimport java.util.ArrayList;
60e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass WinAnimatorList extends ArrayList<WindowStateAnimator> {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Keep track of animations and surface operations for a single WindowState.
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project **/
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass WindowStateAnimator {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final String TAG = "WindowStateAnimator";
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Unchanging local convenience fields.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowManagerService mService;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowState mWin;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowStateAnimator mAttachedWinAnimator;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowAnimator mAnimator;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AppWindowAnimator mAppAnimator;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Session mSession;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowManagerPolicy mPolicy;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context mContext;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean mIsWallpaper;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If this is a universe background window, this is the transformation
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // it is applying to the rest of the universe.
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Transformation mUniverseTransform = new Transformation();
84e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
85e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    // Currently running animation.
86e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    boolean mAnimating;
87e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    boolean mLocalAnimating;
88e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    Animation mAnimation;
89e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    boolean mAnimationIsEntrance;
90e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    boolean mHasTransformation;
91e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    boolean mHasLocalTransformation;
92e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    final Transformation mTransformation = new Transformation();
93e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    boolean mWasAnimating;      // Were we animating going into the most recent animation step?
94e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    int mAnimLayer;
95e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    int mLastLayer;
96e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
97e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    SurfaceControl mSurfaceControl;
98e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    SurfaceControl mPendingDestroySurface;
99e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
100e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /**
101e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * Set when we have changed the size of the surface, to know that
102e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     * we must tell them application to resize (and thus redraw itself).
103e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat     */
104e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    boolean mSurfaceResized;
105e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set if the client has asked that the destroy of its surface be delayed
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * until it explicitly says it is okay.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSurfaceDestroyDeferred;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mShownAlpha = 0;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mAlpha = 0;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mLastAlpha = 0;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Used to save animation distances between the time they are calculated and when they are
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // used.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mAnimDw;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mAnimDh;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mDsDx=1, mDtDx=0, mDsDy=0, mDtDy=1;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mHaveMatrix;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging, this is the last information given to the surface flinger.
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSurfaceShown;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mSurfaceX, mSurfaceY, mSurfaceW, mSurfaceH;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSurfaceLayer;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mSurfaceAlpha;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Set to true if, when the window gets displayed, it should perform
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // an enter animation.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mEnterAnimationPending;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** This is set when there is no Surface */
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int NO_SURFACE = 0;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** This is set after the Surface has been created but before the window has been drawn. During
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this time the surface is hidden. */
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DRAW_PENDING = 1;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** This is set after the window has finished drawing for the first time but before its surface
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is shown.  The surface will be displayed when the next layout is run. */
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int COMMIT_DRAW_PENDING = 2;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** This is set during the time after the window's drawing has been committed, and before its
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * surface is actually shown.  It is used to delay showing the surface until all windows in a
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * token are ready to be shown. */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int READY_TO_SHOW = 3;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Set when the window has been shown in the screen the first time. */
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int HAS_DRAWN = 4;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static String drawStateToString(int state) {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (state) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case NO_SURFACE: return "NO_SURFACE";
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DRAW_PENDING: return "DRAW_PENDING";
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case COMMIT_DRAW_PENDING: return "COMMIT_DRAW_PENDING";
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case READY_TO_SHOW: return "READY_TO_SHOW";
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case HAS_DRAWN: return "HAS_DRAWN";
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default: return Integer.toString(state);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mDrawState;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Was this window last hidden? */
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLastHidden;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mAttrFlags;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mAttrType;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WindowStateAnimator(final WindowState win) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowManagerService service = win.mService;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService = service;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimator = service.mAnimator;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy = service.mPolicy;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = service.mContext;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final DisplayInfo displayInfo = win.getDisplayContent().getDisplayInfo();
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimDw = displayInfo.appWidth;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimDh = displayInfo.appHeight;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWin = win;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachedWinAnimator = win.mAttachedWindow == null
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? null : win.mAttachedWindow.mWinAnimator;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAppAnimator = win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSession = win.mSession;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttrFlags = win.mAttrs.flags;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttrType = win.mAttrs.type;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIsWallpaper = win.mIsWallpaper;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimation(Animation anim) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (localLOGV) Slog.v(TAG, "Setting animation in " + this + ": " + anim);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimating = false;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocalAnimating = false;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimation = anim;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimation.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimation.scaleCurrentDuration(mService.mWindowAnimationScale);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Start out animation gone if window is gone, or visible if window is visible.
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransformation.clear();
197e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat        mTransformation.setAlpha(mLastHidden ? 0 : 1);
198e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat        mHasLocalTransformation = true;
1990cb53209c32457540a0fabe5567f68606c158963San Mehat    }
200e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
2010cb53209c32457540a0fabe5567f68606c158963San Mehat    public void clearAnimation() {
202e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat        if (mAnimation != null) {
2030cb53209c32457540a0fabe5567f68606c158963San Mehat            mAnimating = true;
2040cb53209c32457540a0fabe5567f68606c158963San Mehat            mLocalAnimating = false;
205e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat            mAnimation.cancel();
2061fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat            mAnimation = null;
2070cb53209c32457540a0fabe5567f68606c158963San Mehat        }
208e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    }
2090cb53209c32457540a0fabe5567f68606c158963San Mehat
2100cb53209c32457540a0fabe5567f68606c158963San Mehat    /** Is the window or its container currently animating? */
2110cb53209c32457540a0fabe5567f68606c158963San Mehat    boolean isAnimating() {
2120cb53209c32457540a0fabe5567f68606c158963San Mehat        return mAnimation != null
213e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat                || (mAttachedWinAnimator != null && mAttachedWinAnimator.mAnimation != null)
214e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat                || (mAppAnimator != null &&
2150cb53209c32457540a0fabe5567f68606c158963San Mehat                        (mAppAnimator.animation != null
2160cb53209c32457540a0fabe5567f68606c158963San Mehat                                || mAppAnimator.mAppToken.inPendingTransaction));
217e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    }
218e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
219e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /** Is the window animating the DummyAnimation? */
220e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    boolean isDummyAnimation() {
221e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat        return mAppAnimator != null
222e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat                && mAppAnimator.animation == AppWindowAnimator.sDummyAnimation;
223e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    }
224e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
225e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    /** Is this window currently animating? */
2261fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat    boolean isWindowAnimating() {
2271fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat        return mAnimation != null;
2281fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat    }
2291fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat
2301fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat    void cancelExitAnimationForNextAnimationLocked() {
231e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat        if (mAnimation != null) {
232e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat            mAnimation.cancel();
2333e458241d9930465a20a861ecb42744355d48e48San Mehat            mAnimation = null;
2343e458241d9930465a20a861ecb42744355d48e48San Mehat            mLocalAnimating = false;
2353e458241d9930465a20a861ecb42744355d48e48San Mehat            destroySurfaceLocked();
2363e458241d9930465a20a861ecb42744355d48e48San Mehat        }
2373e458241d9930465a20a861ecb42744355d48e48San Mehat    }
2383e458241d9930465a20a861ecb42744355d48e48San Mehat
2393e458241d9930465a20a861ecb42744355d48e48San Mehat    private boolean stepAnimation(long currentTime) {
2403e458241d9930465a20a861ecb42744355d48e48San Mehat        if ((mAnimation == null) || !mLocalAnimating) {
2413e458241d9930465a20a861ecb42744355d48e48San Mehat            return false;
2423e458241d9930465a20a861ecb42744355d48e48San Mehat        }
2433e458241d9930465a20a861ecb42744355d48e48San Mehat        mTransformation.clear();
2443e458241d9930465a20a861ecb42744355d48e48San Mehat        final boolean more = mAnimation.getTransformation(currentTime, mTransformation);
2453e458241d9930465a20a861ecb42744355d48e48San Mehat        if (false && DEBUG_ANIM) Slog.v(
2463e458241d9930465a20a861ecb42744355d48e48San Mehat            TAG, "Stepped animation in " + this +
2471fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat            ": more=" + more + ", xform=" + mTransformation);
2481fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat        return more;
2491fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat    }
2503e458241d9930465a20a861ecb42744355d48e48San Mehat
2513e458241d9930465a20a861ecb42744355d48e48San Mehat    // This must be called while inside a transaction.  Returns true if
2523e458241d9930465a20a861ecb42744355d48e48San Mehat    // there is more animation to run.
2533e458241d9930465a20a861ecb42744355d48e48San Mehat    boolean stepAnimationLocked(long currentTime) {
2543e458241d9930465a20a861ecb42744355d48e48San Mehat        // Save the animation state as it was before this step so WindowManagerService can tell if
2553e458241d9930465a20a861ecb42744355d48e48San Mehat        // we just started or just stopped animating by comparing mWasAnimating with isAnimating().
2561fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat        mWasAnimating = mAnimating;
2573e458241d9930465a20a861ecb42744355d48e48San Mehat        final DisplayContent displayContent = mWin.getDisplayContent();
2581fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat        if (displayContent != null && mService.okToDisplay()) {
2591fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat            // We will run animations as long as the display isn't frozen.
2601fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat
2611fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat            if (mWin.isDrawnLw() && mAnimation != null) {
2621fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat                mHasTransformation = true;
2631fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat                mHasLocalTransformation = true;
2643e458241d9930465a20a861ecb42744355d48e48San Mehat                if (!mLocalAnimating) {
2653e458241d9930465a20a861ecb42744355d48e48San Mehat                    if (DEBUG_ANIM) Slog.v(
2663e458241d9930465a20a861ecb42744355d48e48San Mehat                        TAG, "Starting animation in " + this +
2673e458241d9930465a20a861ecb42744355d48e48San Mehat                        " @ " + currentTime + ": ww=" + mWin.mFrame.width() +
2683e458241d9930465a20a861ecb42744355d48e48San Mehat                        " wh=" + mWin.mFrame.height() +
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        " dw=" + mAnimDw + " dh=" + mAnimDh +
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        " scale=" + mService.mWindowAnimationScale);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAnimation.initialize(mWin.mFrame.width(), mWin.mFrame.height(),
2727d619f18a277ee3114624df7301db94db83936b9San Mehat                            mAnimDw, mAnimDh);
273e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat                    final DisplayInfo displayInfo = displayContent.getDisplayInfo();
2747d619f18a277ee3114624df7301db94db83936b9San Mehat                    mAnimDw = displayInfo.appWidth;
275e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat                    mAnimDh = displayInfo.appHeight;
276e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat                    mAnimation.setStartTime(currentTime);
277e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat                    mLocalAnimating = true;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAnimating = true;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mAnimation != null) && mLocalAnimating) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (stepAnimation(currentTime)) {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return true;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ANIM) Slog.v(
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    TAG, "Finished animation in " + this +
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " @ " + currentTime);
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //WindowManagerService.this.dump();
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHasLocalTransformation = false;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((!mLocalAnimating || mAnimationIsEntrance) && mAppAnimator != null
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && mAppAnimator.animation != null) {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // When our app token is animating, we kind-of pretend like
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // we are as well.  Note the mLocalAnimating mAnimationIsEntrance
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // part of this check means that we will only do this if
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // our window is not currently exiting, or it is not
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // locally animating itself.  The idea being that one that
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // is exiting and doing a local animation should be removed
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // once that animation is done.
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAnimating = true;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHasTransformation = true;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTransformation.clear();
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (mHasTransformation) {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Little trick to get through the path below to act like
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // we have finished an animation.
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAnimating = true;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (isAnimating()) {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAnimating = true;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mAnimation != null) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If the display is frozen, and there is a pending animation,
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // clear it and make sure we run the cleanup code.
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAnimating = true;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mAnimating && !mLocalAnimating) {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Done animating, clean up.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_ANIM) Slog.v(
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Animation done in " + this + ": exiting=" + mWin.mExiting
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + ", reportedVisible="
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + (mWin.mAppToken != null ? mWin.mAppToken.reportedVisible : false));
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimating = false;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocalAnimating = false;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAnimation != null) {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAnimation.cancel();
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAnimation = null;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAnimator.mWindowDetachedWallpaper == mWin) {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAnimator.mWindowDetachedWallpaper = null;
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimLayer = mWin.mLayer;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWin.mIsImWindow) {
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAnimLayer += mService.mInputMethodAnimLayerAdjustment;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mIsWallpaper) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAnimLayer += mService.mWallpaperAnimLayerAdjustment;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_LAYERS) Slog.v(TAG, "Stepping win " + this
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " anim layer: " + mAnimLayer);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHasTransformation = false;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHasLocalTransformation = false;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWin.mPolicyVisibility != mWin.mPolicyVisibilityAfterAnim) {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_VISIBILITY) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.v(TAG, "Policy visibility changing after anim in " + this + ": "
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + mWin.mPolicyVisibilityAfterAnim);
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWin.mPolicyVisibility = mWin.mPolicyVisibilityAfterAnim;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (displayContent != null) {
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                displayContent.layoutNeeded = true;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mWin.mPolicyVisibility) {
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mService.mCurrentFocus == mWin) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (WindowManagerService.DEBUG_FOCUS_LIGHT) Slog.i(TAG,
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "setAnimationLocked: setting mFocusMayChange true");
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mService.mFocusMayChange = true;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Window is no longer visible -- make sure if we were waiting
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // for it to be displayed before enabling the display, that
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // we allow the display to be enabled now.
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService.enableScreenIfNeededLocked();
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransformation.clear();
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDrawState == HAS_DRAWN
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && mWin.mAppToken != null
3710bca96bcbfe559f9330a01f723c5c9cba51ec05aMarco Nelissen                && mWin.mAppToken.firstWindowDrawn
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && mWin.mAppToken.startingData != null) {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Finish starting "
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mWin.mToken + ": first real window done animating");
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.mFinishedStarting.add(mWin.mAppToken);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.mH.sendEmptyMessage(H.FINISHED_STARTING);
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mAttrType == LayoutParams.TYPE_STATUS_BAR && mWin.mPolicyVisibility) {
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Upon completion of a not-visible to visible status bar animation a relayout is
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // required.
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (displayContent != null) {
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                displayContent.layoutNeeded = true;
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        finishExit();
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int displayId = mWin.getDisplayId();
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimator.setPendingLayoutChanges(displayId, WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (WindowManagerService.DEBUG_LAYOUT_REPEATS) mService.debugLayoutRepeats(
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "WindowStateAnimator", mAnimator.getPendingLayoutChanges(displayId));
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3910bca96bcbfe559f9330a01f723c5c9cba51ec05aMarco Nelissen        if (mWin.mAppToken != null) {
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWin.mAppToken.updateReportedVisibilityLocked();
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void finishExit() {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (WindowManagerService.DEBUG_ANIM) Slog.v(
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "finishExit in " + this
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ": exiting=" + mWin.mExiting
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " remove=" + mWin.mRemoveOnExit
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " windowAnimating=" + isWindowAnimating());
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = mWin.mChildWindows.size();
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWin.mChildWindows.get(i).mWinAnimator.finishExit();
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4100bca96bcbfe559f9330a01f723c5c9cba51ec05aMarco Nelissen        if (!mWin.mExiting) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isWindowAnimating()) {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (WindowManagerService.localLOGV) Slog.v(
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Exit animation finished in " + this
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ": remove=" + mWin.mRemoveOnExit);
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSurfaceControl != null) {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.mDestroySurface.add(mWin);
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWin.mDestroying = true;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWin, "HIDE (finishExit)", null);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            hide();
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWin.mExiting = false;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWin.mRemoveOnExit) {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.mPendingRemove.add(mWin);
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWin.mRemoveOnExit = false;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService.mPendingStacksRemove.add(mWin.getStack());
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimator.hideWallpapersLocked(mWin);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void hide() {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mLastHidden) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //dump();
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastHidden = true;
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin,
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "HIDE (performLayout)", null);
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSurfaceControl != null) {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSurfaceShown = false;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSurfaceControl.hide();
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RuntimeException e) {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Slog.w(TAG, "Exception hiding surface in " + mWin);
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean finishDrawingLocked() {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_STARTING_WINDOW &&
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Slog.v(TAG, "Finishing drawing window " + mWin + ": mDrawState="
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + drawStateToString(mDrawState));
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDrawState == DRAW_PENDING) {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_SURFACE_TRACE || DEBUG_ANIM || SHOW_TRANSACTIONS || DEBUG_ORIENTATION)
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.v(TAG, "finishDrawingLocked: mDrawState=COMMIT_DRAW_PENDING " + this + " in "
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + mSurfaceControl);
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_STARTING_WINDOW &&
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.v(TAG, "Draw state now committed in " + mWin);
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDrawState = COMMIT_DRAW_PENDING;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This must be called while inside a transaction.
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean commitFinishDrawingLocked(long currentTime) {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_STARTING_WINDOW &&
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Slog.i(TAG, "commitFinishDrawingLocked: " + mWin + " cur mDrawState="
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + drawStateToString(mDrawState));
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDrawState != COMMIT_DRAW_PENDING) {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_SURFACE_TRACE || DEBUG_ANIM) {
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Slog.i(TAG, "commitFinishDrawingLocked: mDrawState=READY_TO_SHOW " + mSurfaceControl);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDrawState = READY_TO_SHOW;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean starting = mWin.mAttrs.type == TYPE_APPLICATION_STARTING;
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AppWindowToken atoken = mWin.mAppToken;
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (atoken == null || atoken.allDrawn || starting) {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performShowLocked();
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class SurfaceTrace extends SurfaceControl {
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final static String SURFACE_TAG = "SurfaceTrace";
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final static ArrayList<SurfaceTrace> sSurfaces = new ArrayList<SurfaceTrace>();
499add868cebaf62cffe96e79764ea0b7f2320a03ebAmith Yamasani
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private float mSurfaceTraceAlpha = 0;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mLayer;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final PointF mPosition = new PointF();
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Point mSize = new Point();
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Rect mWindowCrop = new Rect();
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mShown = false;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mLayerStack;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mIsOpaque;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final String mName;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public SurfaceTrace(SurfaceSession s,
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       String name, int w, int h, int format, int flags)
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   throws OutOfResourcesException {
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(s, name, w, h, format, flags);
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mName = name != null ? name : "Not named";
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSize.set(w, h);
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by "
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + Debug.getCallers(3));
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setAlpha(float alpha) {
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSurfaceTraceAlpha != alpha) {
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.v(SURFACE_TAG, "setAlpha(" + alpha + "): OLD:" + this + ". Called by "
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Debug.getCallers(3));
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSurfaceTraceAlpha = alpha;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.setAlpha(alpha);
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setLayer(int zorder) {
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (zorder != mLayer) {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.v(SURFACE_TAG, "setLayer(" + zorder + "): OLD:" + this + ". Called by "
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Debug.getCallers(3));
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayer = zorder;
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.setLayer(zorder);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sSurfaces.remove(this);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i;
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i = sSurfaces.size() - 1; i >= 0; i--) {
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SurfaceTrace s = sSurfaces.get(i);
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s.mLayer < zorder) {
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sSurfaces.add(i + 1, this);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setPosition(float x, float y) {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (x != mPosition.x || y != mPosition.y) {
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.v(SURFACE_TAG, "setPosition(" + x + "," + y + "): OLD:" + this
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ". Called by " + Debug.getCallers(3));
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPosition.set(x, y);
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.setPosition(x, y);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setSize(int w, int h) {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (w != mSize.x || h != mSize.y) {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.v(SURFACE_TAG, "setSize(" + w + "," + h + "): OLD:" + this + ". Called by "
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Debug.getCallers(3));
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSize.set(w, h);
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.setSize(w, h);
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setWindowCrop(Rect crop) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (crop != null) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!crop.equals(mWindowCrop)) {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Slog.v(SURFACE_TAG, "setWindowCrop(" + crop.toShortString() + "): OLD:" + this
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ". Called by " + Debug.getCallers(3));
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWindowCrop.set(crop);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.setWindowCrop(crop);
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setLayerStack(int layerStack) {
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (layerStack != mLayerStack) {
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.v(SURFACE_TAG, "setLayerStack(" + layerStack + "): OLD:" + this
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ". Called by " + Debug.getCallers(3));
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayerStack = layerStack;
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.setLayerStack(layerStack);
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setOpaque(boolean isOpaque) {
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isOpaque != mIsOpaque) {
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.v(SURFACE_TAG, "setOpaque(" + isOpaque + "): OLD:" + this
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ". Called by " + Debug.getCallers(3));
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIsOpaque = isOpaque;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.setOpaque(isOpaque);
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void hide() {
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mShown) {
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.v(SURFACE_TAG, "hide: OLD:" + this + ". Called by " + Debug.getCallers(3));
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mShown = false;
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.hide();
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void show() {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mShown) {
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.v(SURFACE_TAG, "show: OLD:" + this + ". Called by " + Debug.getCallers(3));
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mShown = true;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.show();
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void destroy() {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.destroy();
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Slog.v(SURFACE_TAG, "destroy: " + this + ". Called by " + Debug.getCallers(3));
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sSurfaces.remove(this);
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
627c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
628c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void release() {
629c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.release();
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Slog.v(SURFACE_TAG, "release: " + this + ". Called by "
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + Debug.getCallers(3));
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sSurfaces.remove(this);
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static void dumpAllSurfaces() {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = sSurfaces.size();
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < N; i++) {
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.i(TAG, "SurfaceDump: " + sSurfaces.get(i));
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Surface " + Integer.toHexString(System.identityHashCode(this)) + " "
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mName + " (" + mLayerStack + "): shown=" + mShown + " layer=" + mLayer
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " " + mSize.x + "x" + mSize.y
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " crop=" + mWindowCrop.toShortString()
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " opaque=" + mIsOpaque;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SurfaceControl createSurfaceLocked() {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSurfaceControl == null) {
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_ANIM || DEBUG_ORIENTATION) Slog.i(TAG,
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "createSurface " + this + ": mDrawState=DRAW_PENDING");
657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mDrawState = DRAW_PENDING;
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWin.mAppToken != null) {
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWin.mAppToken.mAppAnimator.animation == null) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWin.mAppToken.allDrawn = false;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWin.mAppToken.deferClearAllDrawn = false;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Currently animating, persist current state of allDrawn until animation
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // is complete.
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWin.mAppToken.deferClearAllDrawn = true;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mService.makeWindowFreezingScreenIfNeededLocked(mWin);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags = SurfaceControl.HIDDEN;
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowManager.LayoutParams attrs = mWin.mAttrs;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((attrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                flags |= SurfaceControl.SECURE;
676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_VISIBILITY) Slog.v(
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Creating surface in session "
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + mSession.mSurfaceSession + " window " + this
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " w=" + mWin.mCompatFrame.width()
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " h=" + mWin.mCompatFrame.height() + " format="
682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                + attrs.format + " flags=" + flags);
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int w = mWin.mCompatFrame.width();
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int h = mWin.mCompatFrame.height();
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((attrs.flags & LayoutParams.FLAG_SCALED) != 0) {
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // for a scaled surface, we always want the requested
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // size.
689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                w = mWin.mRequestedWidth;
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                h = mWin.mRequestedHeight;
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Something is wrong and SurfaceFlinger will not like this,
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // try to revert to sane values
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (w <= 0) w = 1;
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (h <= 0) h = 1;
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceShown = false;
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceLayer = 0;
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceAlpha = 0;
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceX = 0;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceY = 0;
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceW = w;
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceH = h;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWin.mLastSystemDecorRect.set(0, 0, 0, 0);
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final boolean isHwAccelerated = (attrs.flags &
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0;
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : attrs.format;
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!PixelFormat.formatHasAlpha(attrs.format)) {
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags |= SurfaceControl.OPAQUE;
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_SURFACE_TRACE) {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSurfaceControl = new SurfaceTrace(
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mSession.mSurfaceSession,
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            attrs.getTitle().toString(),
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w, h, format, flags);
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSurfaceControl = new SurfaceControl(
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mSession.mSurfaceSession,
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attrs.getTitle().toString(),
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w, h, format, flags);
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWin.mHasSurface = true;
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG,
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "  CREATE SURFACE "
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + mSurfaceControl + " IN SESSION "
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + mSession.mSurfaceSession
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": pid=" + mSession.mPid + " format="
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + attrs.format + " flags=0x"
731c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + Integer.toHexString(flags)
732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + " / " + this);
733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } catch (OutOfResourcesException e) {
734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mWin.mHasSurface = false;
735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Slog.w(TAG, "OutOfResourcesException creating surface");
736c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mService.reclaimSomeSurfaceMemoryLocked(this, "create", true);
737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mDrawState = NO_SURFACE;
738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                return null;
739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } catch (Exception e) {
740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mWin.mHasSurface = false;
741c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Slog.e(TAG, "Exception creating surface", e);
742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mDrawState = NO_SURFACE;
743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                return null;
744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (WindowManagerService.localLOGV) Slog.v(
747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                TAG, "Got surface: " + mSurfaceControl
748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                + ", set left=" + mWin.mFrame.left + " top=" + mWin.mFrame.top
749c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                + ", animLayer=" + mAnimLayer);
750c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (SHOW_LIGHT_TRANSACTIONS) {
751c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Slog.i(TAG, ">>> OPEN TRANSACTION createSurfaceLocked");
752c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                WindowManagerService.logSurface(mWin, "CREATE pos=("
753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + mWin.mFrame.left + "," + mWin.mFrame.top + ") ("
754c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + mWin.mCompatFrame.width() + "x" + mWin.mCompatFrame.height()
755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + "), layer=" + mAnimLayer + " HIDE", null);
756c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SurfaceControl.openTransaction();
758c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            try {
759c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                try {
760c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    mSurfaceX = mWin.mFrame.left + mWin.mXOffset;
761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    mSurfaceY = mWin.mFrame.top + mWin.mYOffset;
762c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    mSurfaceControl.setPosition(mSurfaceX, mSurfaceY);
763c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    mSurfaceLayer = mAnimLayer;
764c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    final DisplayContent displayContent = mWin.getDisplayContent();
765c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (displayContent != null) {
766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        mSurfaceControl.setLayerStack(displayContent.getDisplay().getLayerStack());
767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
768c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    mSurfaceControl.setLayer(mAnimLayer);
769c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    mSurfaceControl.setAlpha(0);
770c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    mSurfaceShown = false;
771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                } catch (RuntimeException e) {
772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Slog.w(TAG, "Error creating surface in " + w, e);
773c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    mService.reclaimSomeSurfaceMemoryLocked(this, "create-init", true);
774c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
775c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mLastHidden = true;
776c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } finally {
777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SurfaceControl.closeTransaction();
778c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        "<<< CLOSE TRANSACTION createSurfaceLocked");
780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (WindowManagerService.localLOGV) Slog.v(
782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    TAG, "Created surface " + this);
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSurfaceControl;
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void destroySurfaceLocked() {
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWin.mAppToken != null && mWin == mWin.mAppToken.startingWindow) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWin.mAppToken.startingDisplayed = false;
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSurfaceControl != null) {
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i = mWin.mChildWindows.size();
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (i > 0) {
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState c = mWin.mChildWindows.get(i);
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                c.mAttachedHidden = true;
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_VISIBILITY) {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    RuntimeException e = null;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!WindowManagerService.HIDE_STACK_CRAWLS) {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        e = new RuntimeException();
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        e.fillInStackTrace();
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Slog.w(TAG, "Window " + this + " destroying surface "
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mSurfaceControl + ", session " + mSession, e);
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mSurfaceDestroyDeferred) {
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mSurfaceControl != null && mPendingDestroySurface != mSurfaceControl) {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mPendingDestroySurface != null) {
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) {
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                RuntimeException e = null;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!WindowManagerService.HIDE_STACK_CRAWLS) {
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    e = new RuntimeException();
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    e.fillInStackTrace();
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                WindowManagerService.logSurface(mWin, "DESTROY PENDING", e);
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mPendingDestroySurface.destroy();
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPendingDestroySurface = mSurfaceControl;
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        RuntimeException e = null;
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!WindowManagerService.HIDE_STACK_CRAWLS) {
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            e = new RuntimeException();
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            e.fillInStackTrace();
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        WindowManagerService.logSurface(mWin, "DESTROY", e);
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSurfaceControl.destroy();
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAnimator.hideWallpapersLocked(mWin);
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RuntimeException e) {
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Slog.w(TAG, "Exception thrown when destroying Window " + this
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " surface " + mSurfaceControl + " session " + mSession
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": " + e.toString());
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceShown = false;
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurfaceControl = null;
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWin.mHasSurface = false;
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDrawState = NO_SURFACE;
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void destroyDeferredSurfaceLocked() {
852e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat        try {
8533e458241d9930465a20a861ecb42744355d48e48San Mehat            if (mPendingDestroySurface != null) {
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) {
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    RuntimeException e = null;
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!WindowManagerService.HIDE_STACK_CRAWLS) {
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        e = new RuntimeException();
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        e.fillInStackTrace();
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8600bca96bcbfe559f9330a01f723c5c9cba51ec05aMarco Nelissen                    WindowManagerService.logSurface(mWin, "DESTROY PENDING", e);
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingDestroySurface.destroy();
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAnimator.hideWallpapersLocked(mWin);
864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Slog.w(TAG, "Exception thrown when destroying Window "
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + this + " surface " + mPendingDestroySurface
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " session " + mSession + ": " + e.toString());
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSurfaceDestroyDeferred = false;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPendingDestroySurface = null;
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void computeShownFrameLocked() {
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean selfTransformation = mHasLocalTransformation;
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Transformation attachedTransformation =
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (mAttachedWinAnimator != null && mAttachedWinAnimator.mHasLocalTransformation)
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? mAttachedWinAnimator.mTransformation : null;
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Transformation appTransformation = (mAppAnimator != null && mAppAnimator.hasTransformation)
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? mAppAnimator.transformation : null;
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Wallpapers are animated based on the "real" window they
883        // are currently targeting.
884        final WindowState wallpaperTarget = mService.mWallpaperTarget;
885        if (mIsWallpaper && wallpaperTarget != null && mService.mAnimateWallpaperWithTarget) {
886            final WindowStateAnimator wallpaperAnimator = wallpaperTarget.mWinAnimator;
887            if (wallpaperAnimator.mHasLocalTransformation &&
888                    wallpaperAnimator.mAnimation != null &&
889                    !wallpaperAnimator.mAnimation.getDetachWallpaper()) {
890                attachedTransformation = wallpaperAnimator.mTransformation;
891                if (WindowManagerService.DEBUG_WALLPAPER && attachedTransformation != null) {
892                    Slog.v(TAG, "WP target attached xform: " + attachedTransformation);
893                }
894            }
895            final AppWindowAnimator wpAppAnimator = wallpaperTarget.mAppToken == null ?
896                    null : wallpaperTarget.mAppToken.mAppAnimator;
897                if (wpAppAnimator != null && wpAppAnimator.hasTransformation
898                    && wpAppAnimator.animation != null
899                    && !wpAppAnimator.animation.getDetachWallpaper()) {
900                appTransformation = wpAppAnimator.transformation;
901                if (WindowManagerService.DEBUG_WALLPAPER && appTransformation != null) {
902                    Slog.v(TAG, "WP target app xform: " + appTransformation);
903                }
904            }
905        }
906
907        final int displayId = mWin.getDisplayId();
908        final ScreenRotationAnimation screenRotationAnimation =
909                mAnimator.getScreenRotationAnimationLocked(displayId);
910        final boolean screenAnimation =
911                screenRotationAnimation != null && screenRotationAnimation.isAnimating();
912        if (selfTransformation || attachedTransformation != null
913                || appTransformation != null || screenAnimation) {
914            // cache often used attributes locally
915            final Rect frame = mWin.mFrame;
916            final float tmpFloats[] = mService.mTmpFloats;
917            final Matrix tmpMatrix = mWin.mTmpMatrix;
918
919            // Compute the desired transformation.
920            if (screenAnimation && screenRotationAnimation.isRotating()) {
921                // If we are doing a screen animation, the global rotation
922                // applied to windows can result in windows that are carefully
923                // aligned with each other to slightly separate, allowing you
924                // to see what is behind them.  An unsightly mess.  This...
925                // thing...  magically makes it call good: scale each window
926                // slightly (two pixels larger in each dimension, from the
927                // window's center).
928                final float w = frame.width();
929                final float h = frame.height();
930                if (w>=1 && h>=1) {
931                    tmpMatrix.setScale(1 + 2/w, 1 + 2/h, w/2, h/2);
932                } else {
933                    tmpMatrix.reset();
934                }
935            } else {
936                tmpMatrix.reset();
937            }
938            tmpMatrix.postScale(mWin.mGlobalScale, mWin.mGlobalScale);
939            if (selfTransformation) {
940                tmpMatrix.postConcat(mTransformation.getMatrix());
941            }
942            tmpMatrix.postTranslate(frame.left + mWin.mXOffset, frame.top + mWin.mYOffset);
943            if (attachedTransformation != null) {
944                tmpMatrix.postConcat(attachedTransformation.getMatrix());
945            }
946            if (appTransformation != null) {
947                tmpMatrix.postConcat(appTransformation.getMatrix());
948            }
949            if (mAnimator.mUniverseBackground != null) {
950                tmpMatrix.postConcat(mAnimator.mUniverseBackground.mUniverseTransform.getMatrix());
951            }
952            if (screenAnimation) {
953                tmpMatrix.postConcat(screenRotationAnimation.getEnterTransformation().getMatrix());
954            }
955            //TODO (multidisplay): Magnification is supported only for the default display.
956            if (mService.mDisplayMagnifier != null && displayId == Display.DEFAULT_DISPLAY) {
957                MagnificationSpec spec = mService.mDisplayMagnifier
958                        .getMagnificationSpecForWindowLocked(mWin);
959                if (spec != null && !spec.isNop()) {
960                    tmpMatrix.postScale(spec.scale, spec.scale);
961                    tmpMatrix.postTranslate(spec.offsetX, spec.offsetY);
962                }
963            }
964
965            // "convert" it into SurfaceFlinger's format
966            // (a 2x2 matrix + an offset)
967            // Here we must not transform the position of the surface
968            // since it is already included in the transformation.
969            //Slog.i(TAG, "Transform: " + matrix);
970
971            mHaveMatrix = true;
972            tmpMatrix.getValues(tmpFloats);
973            mDsDx = tmpFloats[Matrix.MSCALE_X];
974            mDtDx = tmpFloats[Matrix.MSKEW_Y];
975            mDsDy = tmpFloats[Matrix.MSKEW_X];
976            mDtDy = tmpFloats[Matrix.MSCALE_Y];
977            float x = tmpFloats[Matrix.MTRANS_X];
978            float y = tmpFloats[Matrix.MTRANS_Y];
979            int w = frame.width();
980            int h = frame.height();
981            mWin.mShownFrame.set(x, y, x+w, y+h);
982
983            // Now set the alpha...  but because our current hardware
984            // can't do alpha transformation on a non-opaque surface,
985            // turn it off if we are running an animation that is also
986            // transforming since it is more important to have that
987            // animation be smooth.
988            mShownAlpha = mAlpha;
989            if (!mService.mLimitedAlphaCompositing
990                    || (!PixelFormat.formatHasAlpha(mWin.mAttrs.format)
991                    || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDsDy, mDtDy)
992                            && x == frame.left && y == frame.top))) {
993                //Slog.i(TAG, "Applying alpha transform");
994                if (selfTransformation) {
995                    mShownAlpha *= mTransformation.getAlpha();
996                }
997                if (attachedTransformation != null) {
998                    mShownAlpha *= attachedTransformation.getAlpha();
999                }
1000                if (appTransformation != null) {
1001                    mShownAlpha *= appTransformation.getAlpha();
1002                }
1003                if (mAnimator.mUniverseBackground != null) {
1004                    mShownAlpha *= mAnimator.mUniverseBackground.mUniverseTransform.getAlpha();
1005                }
1006                if (screenAnimation) {
1007                    mShownAlpha *= screenRotationAnimation.getEnterTransformation().getAlpha();
1008                }
1009            } else {
1010                //Slog.i(TAG, "Not applying alpha transform");
1011            }
1012
1013            if ((DEBUG_SURFACE_TRACE || WindowManagerService.localLOGV)
1014                    && (mShownAlpha == 1.0 || mShownAlpha == 0.0)) Slog.v(
1015                    TAG, "computeShownFrameLocked: Animating " + this + " mAlpha=" + mAlpha
1016                    + " self=" + (selfTransformation ? mTransformation.getAlpha() : "null")
1017                    + " attached=" + (attachedTransformation == null ?
1018                            "null" : attachedTransformation.getAlpha())
1019                    + " app=" + (appTransformation == null ? "null" : appTransformation.getAlpha())
1020                    + " screen=" + (screenAnimation ?
1021                            screenRotationAnimation.getEnterTransformation().getAlpha() : "null"));
1022            return;
1023        } else if (mIsWallpaper && mService.mInnerFields.mWallpaperActionPending) {
1024            return;
1025        }
1026
1027        if (WindowManagerService.localLOGV) Slog.v(
1028                TAG, "computeShownFrameLocked: " + this +
1029                " not attached, mAlpha=" + mAlpha);
1030
1031        final boolean applyUniverseTransformation = (mAnimator.mUniverseBackground != null
1032                && mWin.mAttrs.type != WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND
1033                && mWin.mBaseLayer < mAnimator.mAboveUniverseLayer);
1034        MagnificationSpec spec = null;
1035        //TODO (multidisplay): Magnification is supported only for the default display.
1036        if (mService.mDisplayMagnifier != null && displayId == Display.DEFAULT_DISPLAY) {
1037            spec = mService.mDisplayMagnifier.getMagnificationSpecForWindowLocked(mWin);
1038        }
1039        if (applyUniverseTransformation || spec != null) {
1040            final Rect frame = mWin.mFrame;
1041            final float tmpFloats[] = mService.mTmpFloats;
1042            final Matrix tmpMatrix = mWin.mTmpMatrix;
1043
1044            tmpMatrix.setScale(mWin.mGlobalScale, mWin.mGlobalScale);
1045            tmpMatrix.postTranslate(frame.left + mWin.mXOffset, frame.top + mWin.mYOffset);
1046
1047            if (applyUniverseTransformation) {
1048                tmpMatrix.postConcat(mAnimator.mUniverseBackground.mUniverseTransform.getMatrix());
1049            }
1050
1051            if (spec != null && !spec.isNop()) {
1052                tmpMatrix.postScale(spec.scale, spec.scale);
1053                tmpMatrix.postTranslate(spec.offsetX, spec.offsetY);
1054            }
1055
1056            tmpMatrix.getValues(tmpFloats);
1057
1058            mHaveMatrix = true;
1059            mDsDx = tmpFloats[Matrix.MSCALE_X];
1060            mDtDx = tmpFloats[Matrix.MSKEW_Y];
1061            mDsDy = tmpFloats[Matrix.MSKEW_X];
1062            mDtDy = tmpFloats[Matrix.MSCALE_Y];
1063            float x = tmpFloats[Matrix.MTRANS_X];
1064            float y = tmpFloats[Matrix.MTRANS_Y];
1065            int w = frame.width();
1066            int h = frame.height();
1067            mWin.mShownFrame.set(x, y, x + w, y + h);
1068
1069            mShownAlpha = mAlpha;
1070            if (applyUniverseTransformation) {
1071                mShownAlpha *= mAnimator.mUniverseBackground.mUniverseTransform.getAlpha();
1072            }
1073        } else {
1074            mWin.mShownFrame.set(mWin.mFrame);
1075            if (mWin.mXOffset != 0 || mWin.mYOffset != 0) {
1076                mWin.mShownFrame.offset(mWin.mXOffset, mWin.mYOffset);
1077            }
1078            mShownAlpha = mAlpha;
1079            mHaveMatrix = false;
1080            mDsDx = mWin.mGlobalScale;
1081            mDtDx = 0;
1082            mDsDy = 0;
1083            mDtDy = mWin.mGlobalScale;
1084        }
1085    }
1086
1087    void applyDecorRect(final Rect decorRect) {
1088        final WindowState w = mWin;
1089        // Compute the offset of the window in relation to the decor rect.
1090        final int offX = w.mXOffset + w.mFrame.left;
1091        final int offY = w.mYOffset + w.mFrame.top;
1092        // Initialize the decor rect to the entire frame.
1093        w.mSystemDecorRect.set(0, 0, w.mFrame.width(), w.mFrame.height());
1094        // Intersect with the decor rect, offsetted by window position.
1095        w.mSystemDecorRect.intersect(decorRect.left-offX, decorRect.top-offY,
1096                decorRect.right-offX, decorRect.bottom-offY);
1097        // If size compatibility is being applied to the window, the
1098        // surface is scaled relative to the screen.  Also apply this
1099        // scaling to the crop rect.  We aren't using the standard rect
1100        // scale function because we want to round things to make the crop
1101        // always round to a larger rect to ensure we don't crop too
1102        // much and hide part of the window that should be seen.
1103        if (w.mEnforceSizeCompat && w.mInvGlobalScale != 1.0f) {
1104            final float scale = w.mInvGlobalScale;
1105            w.mSystemDecorRect.left = (int) (w.mSystemDecorRect.left * scale - 0.5f);
1106            w.mSystemDecorRect.top = (int) (w.mSystemDecorRect.top * scale - 0.5f);
1107            w.mSystemDecorRect.right = (int) ((w.mSystemDecorRect.right+1) * scale - 0.5f);
1108            w.mSystemDecorRect.bottom = (int) ((w.mSystemDecorRect.bottom+1) * scale - 0.5f);
1109        }
1110    }
1111
1112    void updateSurfaceWindowCrop(final boolean recoveringMemory) {
1113        final WindowState w = mWin;
1114        final DisplayContent displayContent = w.getDisplayContent();
1115        if (displayContent == null) {
1116            return;
1117        }
1118        DisplayInfo displayInfo = displayContent.getDisplayInfo();
1119
1120        // Need to recompute a new system decor rect each time.
1121        if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) {
1122            // Currently can't do this cropping for scaled windows.  We'll
1123            // just keep the crop rect the same as the source surface.
1124            w.mSystemDecorRect.set(0, 0, w.mRequestedWidth, w.mRequestedHeight);
1125        } else if (!w.isDefaultDisplay()) {
1126            // On a different display there is no system decor.  Crop the window
1127            // by the screen boundaries.
1128            w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height());
1129            w.mSystemDecorRect.intersect(-w.mCompatFrame.left, -w.mCompatFrame.top,
1130                    displayInfo.logicalWidth - w.mCompatFrame.left,
1131                    displayInfo.logicalHeight - w.mCompatFrame.top);
1132        } else if (w.mLayer >= mService.mSystemDecorLayer) {
1133            // Above the decor layer is easy, just use the entire window.
1134            // Unless we have a universe background...  in which case all the
1135            // windows need to be cropped by the screen, so they don't cover
1136            // the universe background.
1137            if (mAnimator.mUniverseBackground == null) {
1138                w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(),
1139                        w.mCompatFrame.height());
1140            } else {
1141                applyDecorRect(mService.mScreenRect);
1142            }
1143        } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND
1144                || w.mDecorFrame.isEmpty()) {
1145            // The universe background isn't cropped, nor windows without policy decor.
1146            w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(),
1147                    w.mCompatFrame.height());
1148        } else {
1149            // Crop to the system decor specified by policy.
1150            applyDecorRect(w.mDecorFrame);
1151        }
1152
1153        if (!w.mSystemDecorRect.equals(w.mLastSystemDecorRect)) {
1154            w.mLastSystemDecorRect.set(w.mSystemDecorRect);
1155            try {
1156                if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w,
1157                        "CROP " + w.mSystemDecorRect.toShortString(), null);
1158                mSurfaceControl.setWindowCrop(w.mSystemDecorRect);
1159            } catch (RuntimeException e) {
1160                Slog.w(TAG, "Error setting crop surface of " + w
1161                        + " crop=" + w.mSystemDecorRect.toShortString(), e);
1162                if (!recoveringMemory) {
1163                    mService.reclaimSomeSurfaceMemoryLocked(this, "crop", true);
1164                }
1165            }
1166        }
1167    }
1168
1169    void setSurfaceBoundariesLocked(final boolean recoveringMemory) {
1170        final WindowState w = mWin;
1171        int width, height;
1172        if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) {
1173            // for a scaled surface, we just want to use
1174            // the requested size.
1175            width  = w.mRequestedWidth;
1176            height = w.mRequestedHeight;
1177        } else {
1178            width = w.mCompatFrame.width();
1179            height = w.mCompatFrame.height();
1180        }
1181
1182        if (width < 1) {
1183            width = 1;
1184        }
1185        if (height < 1) {
1186            height = 1;
1187        }
1188        final boolean surfaceResized = mSurfaceW != width || mSurfaceH != height;
1189        if (surfaceResized) {
1190            mSurfaceW = width;
1191            mSurfaceH = height;
1192        }
1193
1194        final float left = w.mShownFrame.left;
1195        final float top = w.mShownFrame.top;
1196        if (mSurfaceX != left || mSurfaceY != top) {
1197            try {
1198                if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w,
1199                        "POS " + left + ", " + top, null);
1200                mSurfaceX = left;
1201                mSurfaceY = top;
1202                mSurfaceControl.setPosition(left, top);
1203            } catch (RuntimeException e) {
1204                Slog.w(TAG, "Error positioning surface of " + w
1205                        + " pos=(" + left
1206                        + "," + top + ")", e);
1207                if (!recoveringMemory) {
1208                    mService.reclaimSomeSurfaceMemoryLocked(this, "position", true);
1209                }
1210            }
1211        }
1212
1213        if (surfaceResized) {
1214            try {
1215                if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w,
1216                        "SIZE " + width + "x" + height, null);
1217                mSurfaceResized = true;
1218                mSurfaceControl.setSize(width, height);
1219                mAnimator.setPendingLayoutChanges(w.getDisplayId(),
1220                        WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
1221                if ((w.mAttrs.flags & LayoutParams.FLAG_DIM_BEHIND) != 0) {
1222                    w.getStack().startDimmingIfNeeded(this);
1223                }
1224            } catch (RuntimeException e) {
1225                // If something goes wrong with the surface (such
1226                // as running out of memory), don't take down the
1227                // entire system.
1228                Slog.e(TAG, "Error resizing surface of " + w
1229                        + " size=(" + width + "x" + height + ")", e);
1230                if (!recoveringMemory) {
1231                    mService.reclaimSomeSurfaceMemoryLocked(this, "size", true);
1232                }
1233            }
1234        }
1235
1236        updateSurfaceWindowCrop(recoveringMemory);
1237    }
1238
1239    public void prepareSurfaceLocked(final boolean recoveringMemory) {
1240        final WindowState w = mWin;
1241        if (mSurfaceControl == null) {
1242            if (w.mOrientationChanging) {
1243                if (DEBUG_ORIENTATION) {
1244                    Slog.v(TAG, "Orientation change skips hidden " + w);
1245                }
1246                w.mOrientationChanging = false;
1247            }
1248            return;
1249        }
1250
1251        boolean displayed = false;
1252
1253        computeShownFrameLocked();
1254
1255        setSurfaceBoundariesLocked(recoveringMemory);
1256
1257        if (mIsWallpaper && !mWin.mWallpaperVisible) {
1258            // Wallpaper is no longer visible and there is no wp target => hide it.
1259            hide();
1260        } else if (w.mAttachedHidden || !w.isOnScreen()) {
1261            hide();
1262            mAnimator.hideWallpapersLocked(w);
1263
1264            // If we are waiting for this window to handle an
1265            // orientation change, well, it is hidden, so
1266            // doesn't really matter.  Note that this does
1267            // introduce a potential glitch if the window
1268            // becomes unhidden before it has drawn for the
1269            // new orientation.
1270            if (w.mOrientationChanging) {
1271                w.mOrientationChanging = false;
1272                if (DEBUG_ORIENTATION) Slog.v(TAG,
1273                        "Orientation change skips hidden " + w);
1274            }
1275        } else if (mLastLayer != mAnimLayer
1276                || mLastAlpha != mShownAlpha
1277                || mLastDsDx != mDsDx
1278                || mLastDtDx != mDtDx
1279                || mLastDsDy != mDsDy
1280                || mLastDtDy != mDtDy
1281                || w.mLastHScale != w.mHScale
1282                || w.mLastVScale != w.mVScale
1283                || mLastHidden) {
1284            displayed = true;
1285            mLastAlpha = mShownAlpha;
1286            mLastLayer = mAnimLayer;
1287            mLastDsDx = mDsDx;
1288            mLastDtDx = mDtDx;
1289            mLastDsDy = mDsDy;
1290            mLastDtDy = mDtDy;
1291            w.mLastHScale = w.mHScale;
1292            w.mLastVScale = w.mVScale;
1293            if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w,
1294                    "alpha=" + mShownAlpha + " layer=" + mAnimLayer
1295                    + " matrix=[" + (mDsDx*w.mHScale)
1296                    + "," + (mDtDx*w.mVScale)
1297                    + "][" + (mDsDy*w.mHScale)
1298                    + "," + (mDtDy*w.mVScale) + "]", null);
1299            if (mSurfaceControl != null) {
1300                try {
1301                    mSurfaceAlpha = mShownAlpha;
1302                    mSurfaceControl.setAlpha(mShownAlpha);
1303                    mSurfaceLayer = mAnimLayer;
1304                    mSurfaceControl.setLayer(mAnimLayer);
1305                    mSurfaceControl.setMatrix(
1306                        mDsDx*w.mHScale, mDtDx*w.mVScale,
1307                        mDsDy*w.mHScale, mDtDy*w.mVScale);
1308
1309                    if (mLastHidden && mDrawState == HAS_DRAWN) {
1310                        if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w,
1311                                "SHOW (performLayout)", null);
1312                        if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w
1313                                + " during relayout");
1314                        if (showSurfaceRobustlyLocked()) {
1315                            mLastHidden = false;
1316                            if (mIsWallpaper) {
1317                                mService.dispatchWallpaperVisibility(w, true);
1318                            }
1319                            // This draw means the difference between unique content and mirroring.
1320                            // Run another pass through performLayout to set mHasContent in the
1321                            // LogicalDisplay.
1322                            mAnimator.setPendingLayoutChanges(w.getDisplayId(),
1323                                    WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
1324                        } else {
1325                            w.mOrientationChanging = false;
1326                        }
1327                    }
1328                    if (mSurfaceControl != null) {
1329                        w.mToken.hasVisible = true;
1330                    }
1331                } catch (RuntimeException e) {
1332                    Slog.w(TAG, "Error updating surface in " + w, e);
1333                    if (!recoveringMemory) {
1334                        mService.reclaimSomeSurfaceMemoryLocked(this, "update", true);
1335                    }
1336                }
1337            }
1338        } else {
1339            if (DEBUG_ANIM && isAnimating()) {
1340                Slog.v(TAG, "prepareSurface: No changes in animation for " + this);
1341            }
1342            displayed = true;
1343        }
1344
1345        if (displayed) {
1346            if (w.mOrientationChanging) {
1347                if (!w.isDrawnLw()) {
1348                    mAnimator.mBulkUpdateParams &= ~SET_ORIENTATION_CHANGE_COMPLETE;
1349                    mAnimator.mLastWindowFreezeSource = w;
1350                    if (DEBUG_ORIENTATION) Slog.v(TAG,
1351                            "Orientation continue waiting for draw in " + w);
1352                } else {
1353                    w.mOrientationChanging = false;
1354                    if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation change complete in " + w);
1355                }
1356            }
1357            w.mToken.hasVisible = true;
1358        }
1359    }
1360
1361    void setTransparentRegionHintLocked(final Region region) {
1362        if (mSurfaceControl == null) {
1363            Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true");
1364            return;
1365        }
1366        if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setTransparentRegion");
1367        SurfaceControl.openTransaction();
1368        try {
1369            if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin,
1370                    "transparentRegionHint=" + region, null);
1371            mSurfaceControl.setTransparentRegionHint(region);
1372        } finally {
1373            SurfaceControl.closeTransaction();
1374            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
1375                    "<<< CLOSE TRANSACTION setTransparentRegion");
1376        }
1377    }
1378
1379    void setWallpaperOffset(RectF shownFrame) {
1380        final int left = (int) shownFrame.left;
1381        final int top = (int) shownFrame.top;
1382        if (mSurfaceX != left || mSurfaceY != top) {
1383            mSurfaceX = left;
1384            mSurfaceY = top;
1385            if (mAnimating) {
1386                // If this window (or its app token) is animating, then the position
1387                // of the surface will be re-computed on the next animation frame.
1388                // We can't poke it directly here because it depends on whatever
1389                // transformation is being applied by the animation.
1390                return;
1391            }
1392            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setWallpaperOffset");
1393            SurfaceControl.openTransaction();
1394            try {
1395                if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin,
1396                        "POS " + left + ", " + top, null);
1397                mSurfaceControl.setPosition(mWin.mFrame.left + left, mWin.mFrame.top + top);
1398                updateSurfaceWindowCrop(false);
1399            } catch (RuntimeException e) {
1400                Slog.w(TAG, "Error positioning surface of " + mWin
1401                        + " pos=(" + left + "," + top + ")", e);
1402            } finally {
1403                SurfaceControl.closeTransaction();
1404                if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
1405                        "<<< CLOSE TRANSACTION setWallpaperOffset");
1406            }
1407        }
1408    }
1409
1410    void setOpaque(boolean isOpaque) {
1411        if (mSurfaceControl == null) {
1412            return;
1413        }
1414        if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setOpaque");
1415        SurfaceControl.openTransaction();
1416        try {
1417            if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, "isOpaque=" + isOpaque,
1418                    null);
1419            mSurfaceControl.setOpaque(isOpaque);
1420        } finally {
1421            SurfaceControl.closeTransaction();
1422            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION setOpaque");
1423        }
1424    }
1425
1426    // This must be called while inside a transaction.
1427    boolean performShowLocked() {
1428        if (mWin.isHiddenFromUserLocked()) {
1429            Slog.w(TAG, "current user violation " + mService.mCurrentUserId + " trying to display "
1430                    + this + ", type " + mWin.mAttrs.type + ", belonging to " + mWin.mOwnerUid);
1431            return false;
1432        }
1433        if (DEBUG_VISIBILITY || (DEBUG_STARTING_WINDOW &&
1434                mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING)) {
1435            RuntimeException e = null;
1436            if (!WindowManagerService.HIDE_STACK_CRAWLS) {
1437                e = new RuntimeException();
1438                e.fillInStackTrace();
1439            }
1440            Slog.v(TAG, "performShow on " + this
1441                    + ": mDrawState=" + mDrawState + " readyForDisplay="
1442                    + mWin.isReadyForDisplayIgnoringKeyguard()
1443                    + " starting=" + (mWin.mAttrs.type == TYPE_APPLICATION_STARTING)
1444                    + " during animation: policyVis=" + mWin.mPolicyVisibility
1445                    + " attHidden=" + mWin.mAttachedHidden
1446                    + " tok.hiddenRequested="
1447                    + (mWin.mAppToken != null ? mWin.mAppToken.hiddenRequested : false)
1448                    + " tok.hidden="
1449                    + (mWin.mAppToken != null ? mWin.mAppToken.hidden : false)
1450                    + " animating=" + mAnimating
1451                    + " tok animating="
1452                    + (mAppAnimator != null ? mAppAnimator.animating : false), e);
1453        }
1454        if (mDrawState == READY_TO_SHOW && mWin.isReadyForDisplayIgnoringKeyguard()) {
1455            if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION)
1456                WindowManagerService.logSurface(mWin, "SHOW (performShowLocked)", null);
1457            if (DEBUG_VISIBILITY || (DEBUG_STARTING_WINDOW &&
1458                    mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING)) {
1459                Slog.v(TAG, "Showing " + this
1460                        + " during animation: policyVis=" + mWin.mPolicyVisibility
1461                        + " attHidden=" + mWin.mAttachedHidden
1462                        + " tok.hiddenRequested="
1463                        + (mWin.mAppToken != null ? mWin.mAppToken.hiddenRequested : false)
1464                        + " tok.hidden="
1465                        + (mWin.mAppToken != null ? mWin.mAppToken.hidden : false)
1466                        + " animating=" + mAnimating
1467                        + " tok animating="
1468                        + (mAppAnimator != null ? mAppAnimator.animating : false));
1469            }
1470
1471            mService.enableScreenIfNeededLocked();
1472
1473            applyEnterAnimationLocked();
1474
1475            // Force the show in the next prepareSurfaceLocked() call.
1476            mLastAlpha = -1;
1477            if (DEBUG_SURFACE_TRACE || DEBUG_ANIM)
1478                Slog.v(TAG, "performShowLocked: mDrawState=HAS_DRAWN in " + this);
1479            mDrawState = HAS_DRAWN;
1480            mService.scheduleAnimationLocked();
1481
1482            int i = mWin.mChildWindows.size();
1483            while (i > 0) {
1484                i--;
1485                WindowState c = mWin.mChildWindows.get(i);
1486                if (c.mAttachedHidden) {
1487                    c.mAttachedHidden = false;
1488                    if (c.mWinAnimator.mSurfaceControl != null) {
1489                        c.mWinAnimator.performShowLocked();
1490                        // It hadn't been shown, which means layout not
1491                        // performed on it, so now we want to make sure to
1492                        // do a layout.  If called from within the transaction
1493                        // loop, this will cause it to restart with a new
1494                        // layout.
1495                        final DisplayContent displayContent = c.getDisplayContent();
1496                        if (displayContent != null) {
1497                            displayContent.layoutNeeded = true;
1498                        }
1499                    }
1500                }
1501            }
1502
1503            if (mWin.mAttrs.type != TYPE_APPLICATION_STARTING
1504                    && mWin.mAppToken != null) {
1505                mWin.mAppToken.firstWindowDrawn = true;
1506
1507                if (mWin.mAppToken.startingData != null) {
1508                    if (WindowManagerService.DEBUG_STARTING_WINDOW ||
1509                            WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
1510                            "Finish starting " + mWin.mToken
1511                            + ": first real window is shown, no animation");
1512                    // If this initial window is animating, stop it -- we
1513                    // will do an animation to reveal it from behind the
1514                    // starting window, so there is no need for it to also
1515                    // be doing its own stuff.
1516                    clearAnimation();
1517                    mService.mFinishedStarting.add(mWin.mAppToken);
1518                    mService.mH.sendEmptyMessage(H.FINISHED_STARTING);
1519                }
1520                mWin.mAppToken.updateReportedVisibilityLocked();
1521            }
1522
1523            return true;
1524        }
1525
1526        return false;
1527    }
1528
1529    /**
1530     * Have the surface flinger show a surface, robustly dealing with
1531     * error conditions.  In particular, if there is not enough memory
1532     * to show the surface, then we will try to get rid of other surfaces
1533     * in order to succeed.
1534     *
1535     * @return Returns true if the surface was successfully shown.
1536     */
1537    boolean showSurfaceRobustlyLocked() {
1538        try {
1539            if (mSurfaceControl != null) {
1540                mSurfaceShown = true;
1541                mSurfaceControl.show();
1542                if (mWin.mTurnOnScreen) {
1543                    if (DEBUG_VISIBILITY) Slog.v(TAG,
1544                            "Show surface turning screen on: " + mWin);
1545                    mWin.mTurnOnScreen = false;
1546                    mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN;
1547                }
1548            }
1549            return true;
1550        } catch (RuntimeException e) {
1551            Slog.w(TAG, "Failure showing surface " + mSurfaceControl + " in " + mWin, e);
1552        }
1553
1554        mService.reclaimSomeSurfaceMemoryLocked(this, "show", true);
1555
1556        return false;
1557    }
1558
1559    void applyEnterAnimationLocked() {
1560        final int transit;
1561        if (mEnterAnimationPending) {
1562            mEnterAnimationPending = false;
1563            transit = WindowManagerPolicy.TRANSIT_ENTER;
1564        } else {
1565            transit = WindowManagerPolicy.TRANSIT_SHOW;
1566        }
1567        applyAnimationLocked(transit, true);
1568        //TODO (multidisplay): Magnification is supported only for the default display.
1569        if (mService.mDisplayMagnifier != null
1570                && mWin.getDisplayId() == Display.DEFAULT_DISPLAY) {
1571            mService.mDisplayMagnifier.onWindowTransitionLocked(mWin, transit);
1572        }
1573    }
1574
1575    /**
1576     * Choose the correct animation and set it to the passed WindowState.
1577     * @param transit If AppTransition.TRANSIT_PREVIEW_DONE and the app window has been drawn
1578     *      then the animation will be app_starting_exit. Any other value loads the animation from
1579     *      the switch statement below.
1580     * @param isEntrance The animation type the last time this was called. Used to keep from
1581     *      loading the same animation twice.
1582     * @return true if an animation has been loaded.
1583     */
1584    boolean applyAnimationLocked(int transit, boolean isEntrance) {
1585        if (mLocalAnimating && mAnimationIsEntrance == isEntrance) {
1586            // If we are trying to apply an animation, but already running
1587            // an animation of the same type, then just leave that one alone.
1588            return true;
1589        }
1590
1591        // Only apply an animation if the display isn't frozen.  If it is
1592        // frozen, there is no reason to animate and it can cause strange
1593        // artifacts when we unfreeze the display if some different animation
1594        // is running.
1595        if (mService.okToDisplay()) {
1596            int anim = mPolicy.selectAnimationLw(mWin, transit);
1597            int attr = -1;
1598            Animation a = null;
1599            if (anim != 0) {
1600                a = anim != -1 ? AnimationUtils.loadAnimation(mContext, anim) : null;
1601            } else {
1602                switch (transit) {
1603                    case WindowManagerPolicy.TRANSIT_ENTER:
1604                        attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation;
1605                        break;
1606                    case WindowManagerPolicy.TRANSIT_EXIT:
1607                        attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation;
1608                        break;
1609                    case WindowManagerPolicy.TRANSIT_SHOW:
1610                        attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation;
1611                        break;
1612                    case WindowManagerPolicy.TRANSIT_HIDE:
1613                        attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation;
1614                        break;
1615                }
1616                if (attr >= 0) {
1617                    a = mService.mAppTransition.loadAnimation(mWin.mAttrs, attr);
1618                }
1619            }
1620            if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
1621                    "applyAnimation: win=" + this
1622                    + " anim=" + anim + " attr=0x" + Integer.toHexString(attr)
1623                    + " a=" + a
1624                    + " transit=" + transit
1625                    + " isEntrance=" + isEntrance + " Callers " + Debug.getCallers(3));
1626            if (a != null) {
1627                if (WindowManagerService.DEBUG_ANIM) {
1628                    RuntimeException e = null;
1629                    if (!WindowManagerService.HIDE_STACK_CRAWLS) {
1630                        e = new RuntimeException();
1631                        e.fillInStackTrace();
1632                    }
1633                    Slog.v(TAG, "Loaded animation " + a + " for " + this, e);
1634                }
1635                setAnimation(a);
1636                mAnimationIsEntrance = isEntrance;
1637            }
1638        } else {
1639            clearAnimation();
1640        }
1641
1642        return mAnimation != null;
1643    }
1644
1645    public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
1646        if (mAnimating || mLocalAnimating || mAnimationIsEntrance
1647                || mAnimation != null) {
1648            pw.print(prefix); pw.print("mAnimating="); pw.print(mAnimating);
1649                    pw.print(" mLocalAnimating="); pw.print(mLocalAnimating);
1650                    pw.print(" mAnimationIsEntrance="); pw.print(mAnimationIsEntrance);
1651                    pw.print(" mAnimation="); pw.println(mAnimation);
1652        }
1653        if (mHasTransformation || mHasLocalTransformation) {
1654            pw.print(prefix); pw.print("XForm: has=");
1655                    pw.print(mHasTransformation);
1656                    pw.print(" hasLocal="); pw.print(mHasLocalTransformation);
1657                    pw.print(" "); mTransformation.printShortString(pw);
1658                    pw.println();
1659        }
1660        if (mSurfaceControl != null) {
1661            if (dumpAll) {
1662                pw.print(prefix); pw.print("mSurface="); pw.println(mSurfaceControl);
1663                pw.print(prefix); pw.print("mDrawState=");
1664                pw.print(drawStateToString(mDrawState));
1665                pw.print(" mLastHidden="); pw.println(mLastHidden);
1666            }
1667            pw.print(prefix); pw.print("Surface: shown="); pw.print(mSurfaceShown);
1668                    pw.print(" layer="); pw.print(mSurfaceLayer);
1669                    pw.print(" alpha="); pw.print(mSurfaceAlpha);
1670                    pw.print(" rect=("); pw.print(mSurfaceX);
1671                    pw.print(","); pw.print(mSurfaceY);
1672                    pw.print(") "); pw.print(mSurfaceW);
1673                    pw.print(" x "); pw.println(mSurfaceH);
1674        }
1675        if (mPendingDestroySurface != null) {
1676            pw.print(prefix); pw.print("mPendingDestroySurface=");
1677                    pw.println(mPendingDestroySurface);
1678        }
1679        if (mSurfaceResized || mSurfaceDestroyDeferred) {
1680            pw.print(prefix); pw.print("mSurfaceResized="); pw.print(mSurfaceResized);
1681                    pw.print(" mSurfaceDestroyDeferred="); pw.println(mSurfaceDestroyDeferred);
1682        }
1683        if (mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND) {
1684            pw.print(prefix); pw.print("mUniverseTransform=");
1685                    mUniverseTransform.printShortString(pw);
1686                    pw.println();
1687        }
1688        if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) {
1689            pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha);
1690                    pw.print(" mAlpha="); pw.print(mAlpha);
1691                    pw.print(" mLastAlpha="); pw.println(mLastAlpha);
1692        }
1693        if (mHaveMatrix || mWin.mGlobalScale != 1) {
1694            pw.print(prefix); pw.print("mGlobalScale="); pw.print(mWin.mGlobalScale);
1695                    pw.print(" mDsDx="); pw.print(mDsDx);
1696                    pw.print(" mDtDx="); pw.print(mDtDx);
1697                    pw.print(" mDsDy="); pw.print(mDsDy);
1698                    pw.print(" mDtDy="); pw.println(mDtDy);
1699        }
1700    }
1701
1702    @Override
1703    public String toString() {
1704        StringBuffer sb = new StringBuffer("WindowStateAnimator{");
1705        sb.append(Integer.toHexString(System.identityHashCode(this)));
1706        sb.append(' ');
1707        sb.append(mWin.mAttrs.getTitle());
1708        sb.append('}');
1709        return sb.toString();
1710    }
1711}
1712