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