1764983d16925daeeba3f29fd1f844187655d1386Craig Mautner// Copyright 2012 Google Inc. All Rights Reserved. 2764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 3764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerpackage com.android.server.wm; 4764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 5764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; 6f12100e0255c86d0d05dba2e7ba87a745870423dCraig Mautnerimport static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; 7764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 8a608b882327fbb393bde3854953cd322a6fea675Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_UPDATE_ROTATION; 9a608b882327fbb393bde3854953cd322a6fea675Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_MAY_CHANGE; 10d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED; 112639da500e3d53ea3a17d888b1c0001d043c6b98Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE; 12968683335e17c06504a11bc2e38a2580f613ea16Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_ACTION_PENDING; 13a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 14764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.content.Context; 1598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackbornimport android.os.Debug; 16764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.os.SystemClock; 17764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.util.Log; 18764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.util.Slog; 19a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautnerimport android.util.SparseArray; 2076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautnerimport android.util.SparseIntArray; 21529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackbornimport android.util.TimeUtils; 221420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautnerimport android.util.TypedValue; 236881a10557acf3b0270de54799d6f19437acf584Craig Mautnerimport android.view.Display; 24764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.view.Surface; 253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl; 26764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.view.WindowManagerPolicy; 27764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.view.animation.Animation; 28764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 29529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackbornimport com.android.server.wm.WindowManagerService.LayoutFields; 30764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 31e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautnerimport java.io.PrintWriter; 320c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackbornimport java.util.ArrayList; 33e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner 34764983d16925daeeba3f29fd1f844187655d1386Craig Mautner/** 35764983d16925daeeba3f29fd1f844187655d1386Craig Mautner * Singleton class that carries out the animations and Surface operations in a separate task 36764983d16925daeeba3f29fd1f844187655d1386Craig Mautner * on behalf of WindowManagerService. 37764983d16925daeeba3f29fd1f844187655d1386Craig Mautner */ 38764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerpublic class WindowAnimator { 39bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner private static final String TAG = "WindowAnimator"; 40764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 411420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner /** Amount of time in milliseconds to animate the dim surface from one value to another, 421420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner * when no window animation is driving it. */ 431420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner static final int DEFAULT_DIM_DURATION = 200; 441420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner 45764983d16925daeeba3f29fd1f844187655d1386Craig Mautner final WindowManagerService mService; 46764983d16925daeeba3f29fd1f844187655d1386Craig Mautner final Context mContext; 47764983d16925daeeba3f29fd1f844187655d1386Craig Mautner final WindowManagerPolicy mPolicy; 48764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 49764983d16925daeeba3f29fd1f844187655d1386Craig Mautner boolean mAnimating; 5001cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner 511caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner final Runnable mAnimationRunnable; 521caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner 53764983d16925daeeba3f29fd1f844187655d1386Craig Mautner int mAdjResult; 54764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 55764983d16925daeeba3f29fd1f844187655d1386Craig Mautner /** Time of current animation step. Reset on each iteration */ 56764983d16925daeeba3f29fd1f844187655d1386Craig Mautner long mCurrentTime; 57764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 58764983d16925daeeba3f29fd1f844187655d1386Craig Mautner /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this 59764983d16925daeeba3f29fd1f844187655d1386Craig Mautner * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */ 606fbda63e68513ece4409dac845588711ab25c39dCraig Mautner private int mAnimTransactionSequence; 61764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 62ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner /** Window currently running an animation that has requested it be detached 63ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner * from the wallpaper. This means we need to ensure the wallpaper is 64ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner * visible behind it in case it animates in a way that would allow it to be 65ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner * seen. If multiple windows satisfy this, use the lowest window. */ 66e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner WindowState mWindowDetachedWallpaper = null; 6701cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner 68a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn WindowStateAnimator mUniverseBackground = null; 69a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn int mAboveUniverseLayer = 0; 70a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 71a608b882327fbb393bde3854953cd322a6fea675Craig Mautner int mBulkUpdateParams = 0; 72a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn Object mLastWindowFreezeSource; 73a608b882327fbb393bde3854953cd322a6fea675Craig Mautner 74a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators = 75a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner new SparseArray<WindowAnimator.DisplayContentsAnimator>(); 76d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner 77b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner boolean mInitialized = false; 78b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner 79178af5948d71c841278081c712506f7a7fca34b9Craig Mautner // forceHiding states. 80178af5948d71c841278081c712506f7a7fca34b9Craig Mautner static final int KEYGUARD_NOT_SHOWN = 0; 81178af5948d71c841278081c712506f7a7fca34b9Craig Mautner static final int KEYGUARD_ANIMATING_IN = 1; 82178af5948d71c841278081c712506f7a7fca34b9Craig Mautner static final int KEYGUARD_SHOWN = 2; 83178af5948d71c841278081c712506f7a7fca34b9Craig Mautner static final int KEYGUARD_ANIMATING_OUT = 3; 84178af5948d71c841278081c712506f7a7fca34b9Craig Mautner int mForceHiding = KEYGUARD_NOT_SHOWN; 85178af5948d71c841278081c712506f7a7fca34b9Craig Mautner 86178af5948d71c841278081c712506f7a7fca34b9Craig Mautner private String forceHidingToString() { 87178af5948d71c841278081c712506f7a7fca34b9Craig Mautner switch (mForceHiding) { 88178af5948d71c841278081c712506f7a7fca34b9Craig Mautner case KEYGUARD_NOT_SHOWN: return "KEYGUARD_NOT_SHOWN"; 89178af5948d71c841278081c712506f7a7fca34b9Craig Mautner case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN"; 90178af5948d71c841278081c712506f7a7fca34b9Craig Mautner case KEYGUARD_SHOWN: return "KEYGUARD_SHOWN"; 91178af5948d71c841278081c712506f7a7fca34b9Craig Mautner case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT"; 92178af5948d71c841278081c712506f7a7fca34b9Craig Mautner default: return "KEYGUARD STATE UNKNOWN " + mForceHiding; 93178af5948d71c841278081c712506f7a7fca34b9Craig Mautner } 94178af5948d71c841278081c712506f7a7fca34b9Craig Mautner } 95178af5948d71c841278081c712506f7a7fca34b9Craig Mautner 96918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner WindowAnimator(final WindowManagerService service) { 97764983d16925daeeba3f29fd1f844187655d1386Craig Mautner mService = service; 98918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner mContext = service.mContext; 99918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner mPolicy = service.mPolicy; 1001caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner 1011caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner mAnimationRunnable = new Runnable() { 1021caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner @Override 1031caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner public void run() { 104968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner synchronized (mService.mWindowMap) { 105968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mService.mAnimationScheduled = false; 106968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner animateLocked(); 1071caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner } 1081caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner } 1091caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner }; 110b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner } 1119e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner 112a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner void addDisplayLocked(final int displayId) { 113ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner // Create the DisplayContentsAnimator object by retrieving it. 114ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner getDisplayContentsAnimatorLocked(displayId); 115a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner if (displayId == Display.DEFAULT_DISPLAY) { 116a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mInitialized = true; 117a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 118a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 119a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner 120a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner void removeDisplayLocked(final int displayId) { 121d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner final DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId); 122d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner if (displayAnimator != null) { 123d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner if (displayAnimator.mWindowAnimationBackgroundSurface != null) { 1241420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner displayAnimator.mWindowAnimationBackgroundSurface.destroySurface(); 125d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner displayAnimator.mWindowAnimationBackgroundSurface = null; 126d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner } 127d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner if (displayAnimator.mScreenRotationAnimation != null) { 128d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner displayAnimator.mScreenRotationAnimation.kill(); 129d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner displayAnimator.mScreenRotationAnimation = null; 130d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner } 131d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner if (displayAnimator.mDimAnimator != null) { 1321420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner displayAnimator.mDimAnimator.destroySurface(); 133d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner displayAnimator.mDimAnimator = null; 134d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner } 135d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner } 136d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner 137a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mDisplayContentsAnimators.delete(displayId); 1381caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner } 1391caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner 140968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner AppWindowAnimator getWallpaperAppAnimator() { 141968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner return mService.mWallpaperTarget == null 142968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner ? null : mService.mWallpaperTarget.mAppToken == null 143968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner ? null : mService.mWallpaperTarget.mAppToken.mAppAnimator; 144711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner } 145711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner 146968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner void hideWallpapersLocked(final WindowState w) { 147968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final WindowState wallpaperTarget = mService.mWallpaperTarget; 148968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final WindowState lowerWallpaperTarget = mService.mLowerWallpaperTarget; 149968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final ArrayList<WindowToken> wallpaperTokens = mService.mWallpaperTokens; 15066f78d7a979775efb148873797bac4584ddb3b83Craig Mautner 15198129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) { 15298129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn final int numTokens = wallpaperTokens.size(); 153918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner for (int i = numTokens - 1; i >= 0; i--) { 15498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn final WindowToken token = wallpaperTokens.get(i); 155918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner final int numWindows = token.windows.size(); 156918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner for (int j = numWindows - 1; j >= 0; j--) { 157918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner final WindowState wallpaper = token.windows.get(j); 158b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner final WindowStateAnimator winAnimator = wallpaper.mWinAnimator; 159b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner if (!winAnimator.mLastHidden) { 160b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner winAnimator.hide(); 161507a2ee12b6d1d683e4a5806804c472b3fe32e61Craig Mautner mService.dispatchWallpaperVisibility(wallpaper, false); 16276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner setPendingLayoutChanges(Display.DEFAULT_DISPLAY, 16376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER); 164b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner } 165b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner } 166ef03a7f441cf0cbef5a5f7fafb58a7d5aea7ef52Dianne Hackborn if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG, 1672ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn "Hiding wallpaper " + token + " from " + w 1682ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn + " target=" + wallpaperTarget + " lower=" + lowerWallpaperTarget 1692ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn + "\n" + Debug.getCallers(5, " ")); 170b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner token.hidden = true; 1710afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 1720afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 1730afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner } 1740afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner 1752ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner private void updateAppWindowsLocked() { 176764983d16925daeeba3f29fd1f844187655d1386Craig Mautner int i; 1772ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens; 1782ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner final int NAT = appTokens.size(); 1792ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner for (i=0; i<NAT; i++) { 1802ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator; 181594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final boolean wasAnimating = appAnimator.animation != null 182fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner && appAnimator.animation != AppWindowAnimator.sDummyAnimation; 1839339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner if (appAnimator.stepAnimationLocked(mCurrentTime)) { 184764983d16925daeeba3f29fd1f844187655d1386Craig Mautner mAnimating = true; 185bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner } else if (wasAnimating) { 186bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner // stopped animating, do one more pass through the layout 18776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER, 18876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner "appToken " + appAnimator.mAppToken + " done"); 18983339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 19083339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner "updateWindowsApps...: done animating " + appAnimator.mAppToken); 191bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner } 192bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner } 193a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner 1942ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner final int NEAT = mService.mExitingAppTokens.size(); 195bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner for (i=0; i<NEAT; i++) { 1962ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator; 197594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final boolean wasAnimating = appAnimator.animation != null 198fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner && appAnimator.animation != AppWindowAnimator.sDummyAnimation; 1999339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner if (appAnimator.stepAnimationLocked(mCurrentTime)) { 200bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner mAnimating = true; 201bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner } else if (wasAnimating) { 202bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner // stopped animating, do one more pass through the layout 20376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER, 20476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner "exiting appToken " + appAnimator.mAppToken + " done"); 20583339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG, 20683339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken); 207764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 208764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 209764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 210764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 211a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner private void updateWindowsLocked(final int displayId) { 2126fbda63e68513ece4409dac845588711ab25c39dCraig Mautner ++mAnimTransactionSequence; 213764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 214968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final WindowList windows = mService.getWindowListLocked(displayId); 2150c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn ArrayList<WindowStateAnimator> unForceHiding = null; 2160c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn boolean wallpaperInUnForceHiding = false; 217178af5948d71c841278081c712506f7a7fca34b9Craig Mautner mForceHiding = KEYGUARD_NOT_SHOWN; 2184bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner 219968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner for (int i = windows.size() - 1; i >= 0; i--) { 220968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner WindowState win = windows.get(i); 221968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner WindowStateAnimator winAnimator = win.mWinAnimator; 222bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner final int flags = winAnimator.mAttrFlags; 223764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 22429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (winAnimator.mSurfaceControl != null) { 225a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final boolean wasAnimating = winAnimator.mWasAnimating; 226a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime); 227764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 228764983d16925daeeba3f29fd1f844187655d1386Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER) { 229bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner Slog.v(TAG, win + ": wasAnimating=" + wasAnimating + 230764983d16925daeeba3f29fd1f844187655d1386Craig Mautner ", nowAnimating=" + nowAnimating); 231764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 232764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 233968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) { 234a608b882327fbb393bde3854953cd322a6fea675Craig Mautner mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE; 23576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner setPendingLayoutChanges(Display.DEFAULT_DISPLAY, 23676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER); 237cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner if (WindowManagerService.DEBUG_LAYOUT_REPEATS) { 238d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2", 23966f78d7a979775efb148873797bac4584ddb3b83Craig Mautner getPendingLayoutChanges(Display.DEFAULT_DISPLAY)); 240cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner } 241764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 242764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 243bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner if (mPolicy.doesForceHide(win, win.mAttrs)) { 244764983d16925daeeba3f29fd1f844187655d1386Craig Mautner if (!wasAnimating && nowAnimating) { 24583339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner if (WindowManagerService.DEBUG_ANIM || 24683339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, 24783339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner "Animation started that could impact force hide: " + win); 248d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED; 24976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner setPendingLayoutChanges(displayId, 25076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER); 251cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner if (WindowManagerService.DEBUG_LAYOUT_REPEATS) { 252d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3", 25366f78d7a979775efb148873797bac4584ddb3b83Craig Mautner getPendingLayoutChanges(displayId)); 254cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner } 255764983d16925daeeba3f29fd1f844187655d1386Craig Mautner mService.mFocusMayChange = true; 256ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn } 2574bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner if (win.isReadyForDisplay()) { 2584bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner if (nowAnimating) { 2594bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner if (winAnimator.mAnimationIsEntrance) { 260178af5948d71c841278081c712506f7a7fca34b9Craig Mautner mForceHiding = KEYGUARD_ANIMATING_IN; 2614bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner } else { 262178af5948d71c841278081c712506f7a7fca34b9Craig Mautner mForceHiding = KEYGUARD_ANIMATING_OUT; 2634bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner } 2644bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner } else { 265178af5948d71c841278081c712506f7a7fca34b9Craig Mautner mForceHiding = KEYGUARD_SHOWN; 2664bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner } 267764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 268ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, 269178af5948d71c841278081c712506f7a7fca34b9Craig Mautner "Force hide " + mForceHiding 270ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn + " hasSurface=" + win.mHasSurface 271ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn + " policyVis=" + win.mPolicyVisibility 272ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn + " destroying=" + win.mDestroying 273ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn + " attHidden=" + win.mAttachedHidden 274ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn + " vis=" + win.mViewVisibility 275ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn + " hidden=" + win.mRootToken.hidden 276ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn + " anim=" + win.mWinAnimator.mAnimation); 277bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) { 2784bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner final boolean hideWhenLocked = 2794bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0; 280d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner final boolean changed; 281178af5948d71c841278081c712506f7a7fca34b9Craig Mautner if (((mForceHiding == KEYGUARD_ANIMATING_IN) 2824bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner && (!winAnimator.isAnimating() || hideWhenLocked)) 283178af5948d71c841278081c712506f7a7fca34b9Craig Mautner || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) { 284bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner changed = win.hideLw(false, false); 285764983d16925daeeba3f29fd1f844187655d1386Craig Mautner if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG, 286bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner "Now policy hidden: " + win); 287764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } else { 288bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner changed = win.showLw(false, false); 289764983d16925daeeba3f29fd1f844187655d1386Craig Mautner if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG, 290bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner "Now policy shown: " + win); 291764983d16925daeeba3f29fd1f844187655d1386Craig Mautner if (changed) { 292d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0 293bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner && win.isVisibleNow() /*w.isReadyForDisplay()*/) { 2940c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn if (unForceHiding == null) { 2950c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn unForceHiding = new ArrayList<WindowStateAnimator>(); 2960c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn } 2970c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn unForceHiding.add(winAnimator); 29801cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner if ((flags & FLAG_SHOW_WALLPAPER) != 0) { 2990c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn wallpaperInUnForceHiding = true; 300764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 301764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 302bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) { 303764983d16925daeeba3f29fd1f844187655d1386Craig Mautner // We are showing on to of the current 304764983d16925daeeba3f29fd1f844187655d1386Craig Mautner // focus, so re-evaluate focus to make 305764983d16925daeeba3f29fd1f844187655d1386Craig Mautner // sure it is correct. 306764983d16925daeeba3f29fd1f844187655d1386Craig Mautner mService.mFocusMayChange = true; 307764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 308764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 309764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 31001cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) { 311a608b882327fbb393bde3854953cd322a6fea675Craig Mautner mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE; 31276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner setPendingLayoutChanges(Display.DEFAULT_DISPLAY, 31376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER); 314cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner if (WindowManagerService.DEBUG_LAYOUT_REPEATS) { 315d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4", 31666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner getPendingLayoutChanges(Display.DEFAULT_DISPLAY)); 317cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner } 318764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 319764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 320764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 321764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 322bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner final AppWindowToken atoken = win.mAppToken; 3236fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) { 3246fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (atoken == null || atoken.allDrawn) { 3256fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (winAnimator.performShowLocked()) { 32666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner setPendingLayoutChanges(displayId, 32776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM); 3286fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (WindowManagerService.DEBUG_LAYOUT_REPEATS) { 3296fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5", 33066f78d7a979775efb148873797bac4584ddb3b83Craig Mautner getPendingLayoutChanges(displayId)); 331764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 332cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner } 333cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner } 334764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 335322e40315609acd5a608440bc469d873e09559caCraig Mautner final AppWindowAnimator appAnimator = winAnimator.mAppAnimator; 336594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (appAnimator != null && appAnimator.thumbnail != null) { 3376fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) { 3386fbda63e68513ece4409dac845588711ab25c39dCraig Mautner appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence; 339594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner appAnimator.thumbnailLayer = 0; 3408078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn } 341594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) { 342594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner appAnimator.thumbnailLayer = winAnimator.mAnimLayer; 3438078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn } 3448078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn } 345764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } // end forall windows 3460c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn 347078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner // If we have windows that are being show due to them no longer 348078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner // being force-hidden, apply the appropriate animation to them. 349078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner if (unForceHiding != null) { 350078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner for (int i=unForceHiding.size()-1; i>=0; i--) { 351078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding); 352078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner if (a != null) { 353078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner final WindowStateAnimator winAnimator = unForceHiding.get(i); 354078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner winAnimator.setAnimation(a); 355078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner winAnimator.mAnimationIsEntrance = true; 356078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 357078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 358078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 359078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 360078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner 361a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner private void updateWallpaperLocked(int displayId) { 362a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final DisplayContentsAnimator displayAnimator = 363a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner getDisplayContentsAnimatorLocked(displayId); 364968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final WindowList windows = mService.getWindowListLocked(displayId); 365078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner WindowStateAnimator windowAnimationBackground = null; 366078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner int windowAnimationBackgroundColor = 0; 367078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner WindowState detachedWallpaper = null; 368078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner 369968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner for (int i = windows.size() - 1; i >= 0; i--) { 370968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final WindowState win = windows.get(i); 371968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner WindowStateAnimator winAnimator = win.mWinAnimator; 37229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian if (winAnimator.mSurfaceControl == null) { 373078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner continue; 374078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 375078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner 376078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner final int flags = winAnimator.mAttrFlags; 377078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner 378078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner // If this window is animating, make a note that we have 379078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner // an animating window and take care of a request to run 380078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner // a detached wallpaper animation. 381078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner if (winAnimator.mAnimating) { 382078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner if (winAnimator.mAnimation != null) { 383078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner if ((flags & FLAG_SHOW_WALLPAPER) != 0 384078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner && winAnimator.mAnimation.getDetachWallpaper()) { 385078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner detachedWallpaper = win; 386078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 387078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner final int backgroundColor = winAnimator.mAnimation.getBackgroundColor(); 388078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner if (backgroundColor != 0) { 389078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner if (windowAnimationBackground == null || (winAnimator.mAnimLayer < 390078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner windowAnimationBackground.mAnimLayer)) { 391078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner windowAnimationBackground = winAnimator; 392078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner windowAnimationBackgroundColor = backgroundColor; 393078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 394078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 395078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 396078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner mAnimating = true; 397078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 398078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner 399078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner // If this window's app token is running a detached wallpaper 400078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner // animation, make a note so we can ensure the wallpaper is 401078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner // displayed behind it. 402322e40315609acd5a608440bc469d873e09559caCraig Mautner final AppWindowAnimator appAnimator = winAnimator.mAppAnimator; 403078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner if (appAnimator != null && appAnimator.animation != null 404078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner && appAnimator.animating) { 405078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner if ((flags & FLAG_SHOW_WALLPAPER) != 0 406078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner && appAnimator.animation.getDetachWallpaper()) { 407078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner detachedWallpaper = win; 408078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 409078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner 410078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner final int backgroundColor = appAnimator.animation.getBackgroundColor(); 411078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner if (backgroundColor != 0) { 412078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner if (windowAnimationBackground == null || (winAnimator.mAnimLayer < 413078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner windowAnimationBackground.mAnimLayer)) { 414078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner windowAnimationBackground = winAnimator; 415078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner windowAnimationBackgroundColor = backgroundColor; 416078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 417078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 418078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } 419078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner } // end forall windows 420078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner 4219e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner if (mWindowDetachedWallpaper != detachedWallpaper) { 4229e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG, 4239e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner "Detached wallpaper changed from " + mWindowDetachedWallpaper 4249e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner + " to " + detachedWallpaper); 4259e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner mWindowDetachedWallpaper = detachedWallpaper; 4269e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE; 4279e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner } 4289e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner 4299e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner if (windowAnimationBackgroundColor != 0) { 4309e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner // If the window that wants black is the current wallpaper 4319e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner // target, then the black goes *below* the wallpaper so we 4329e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner // don't cause the wallpaper to suddenly disappear. 4339e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner int animLayer = windowAnimationBackground.mAnimLayer; 4349e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner WindowState win = windowAnimationBackground.mWin; 435968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner if (mService.mWallpaperTarget == win || mService.mLowerWallpaperTarget == win 436968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner || mService.mUpperWallpaperTarget == win) { 437968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final int N = windows.size(); 4389e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner for (int i = 0; i < N; i++) { 439968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner WindowStateAnimator winAnimator = windows.get(i).mWinAnimator; 440918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner if (winAnimator.mIsWallpaper) { 4419e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner animLayer = winAnimator.mAnimLayer; 4429e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner break; 4439e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner } 4449e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner } 4459e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner } 4469e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner 4471420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner displayAnimator.mWindowAnimationBackgroundSurface.show( 4481420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner animLayer - WindowManagerService.LAYER_OFFSET_DIM, 4491420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner ((windowAnimationBackgroundColor >> 24) & 0xff) / 255f, 0); 4509e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner } else { 4511420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner displayAnimator.mWindowAnimationBackgroundSurface.hide(); 4529e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner } 453764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 454764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 4559339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner /** See if any windows have been drawn, so they (and others associated with them) can now be 4569339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner * shown. */ 4572ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner private void testTokenMayBeDrawnLocked() { 458968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner // See if any windows have been drawn, so they (and others 459968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner // associated with them) can now be shown. 4602ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens; 4612ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner final int NT = appTokens.size(); 4622ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner for (int i=0; i<NT; i++) { 4632ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner AppWindowToken wtoken = appTokens.get(i); 464968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner AppWindowAnimator appAnimator = wtoken.mAppAnimator; 4656fbda63e68513ece4409dac845588711ab25c39dCraig Mautner final boolean allDrawn = wtoken.allDrawn; 466322e40315609acd5a608440bc469d873e09559caCraig Mautner if (allDrawn != appAnimator.allDrawn) { 467322e40315609acd5a608440bc469d873e09559caCraig Mautner appAnimator.allDrawn = allDrawn; 4686fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (allDrawn) { 4696fbda63e68513ece4409dac845588711ab25c39dCraig Mautner // The token has now changed state to having all 4706fbda63e68513ece4409dac845588711ab25c39dCraig Mautner // windows shown... what to do, what to do? 471322e40315609acd5a608440bc469d873e09559caCraig Mautner if (appAnimator.freezingScreen) { 472322e40315609acd5a608440bc469d873e09559caCraig Mautner appAnimator.showAllWindowsLocked(); 4736fbda63e68513ece4409dac845588711ab25c39dCraig Mautner mService.unsetAppFreezingScreenLocked(wtoken, false, true); 4746fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG, 4756fbda63e68513ece4409dac845588711ab25c39dCraig Mautner "Setting mOrientationChangeComplete=true because wtoken " 4766fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + wtoken + " numInteresting=" + wtoken.numInterestingWindows 4776fbda63e68513ece4409dac845588711ab25c39dCraig Mautner + " numDrawn=" + wtoken.numDrawnWindows); 4786fbda63e68513ece4409dac845588711ab25c39dCraig Mautner // This will set mOrientationChangeComplete and cause a pass through layout. 47976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner setAppLayoutChanges(appAnimator, 48076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER, 48176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner "testTokenMayBeDrawnLocked: freezingScreen"); 4826fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } else { 48376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner setAppLayoutChanges(appAnimator, 48476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM, 48576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner "testTokenMayBeDrawnLocked"); 48666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner 4876fbda63e68513ece4409dac845588711ab25c39dCraig Mautner // We can now show all of the drawn windows! 4886fbda63e68513ece4409dac845588711ab25c39dCraig Mautner if (!mService.mOpeningApps.contains(wtoken)) { 489322e40315609acd5a608440bc469d873e09559caCraig Mautner mAnimating |= appAnimator.showAllWindowsLocked(); 4906fbda63e68513ece4409dac845588711ab25c39dCraig Mautner } 491764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 492764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 493764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 494764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 495764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 496764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 497a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner private void performAnimationsLocked(final int displayId) { 498a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner updateWindowsLocked(displayId); 499a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner updateWallpaperLocked(displayId); 500764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 501764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 5021420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner private long getDimBehindFadeDuration(long duration) { 5031420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner TypedValue tv = new TypedValue(); 5041420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner mContext.getResources().getValue( 5051420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner com.android.internal.R.fraction.config_dimBehindFadeDuration, tv, true); 5061420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner if (tv.type == TypedValue.TYPE_FRACTION) { 5071420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner duration = (long)tv.getFraction(duration, duration); 5081420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner } else if (tv.type >= TypedValue.TYPE_FIRST_INT && tv.type <= TypedValue.TYPE_LAST_INT) { 5091420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner duration = tv.data; 5101420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner } 5111420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner return duration; 5121420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner } 5131420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner 5141420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner /** Locked on mService.mWindowMap. */ 5151caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner private void animateLocked() { 516b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner if (!mInitialized) { 517b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner return; 518b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner } 51959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 520764983d16925daeeba3f29fd1f844187655d1386Craig Mautner mCurrentTime = SystemClock.uptimeMillis(); 5212639da500e3d53ea3a17d888b1c0001d043c6b98Craig Mautner mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE; 522198e564c9a66010cfe93e0b1a75f84d696bda494Chet Haase boolean wasAnimating = mAnimating; 5237d8df3905d294127cc58100912a57c816bfb2502Craig Mautner mAnimating = false; 5247d8df3905d294127cc58100912a57c816bfb2502Craig Mautner if (WindowManagerService.DEBUG_WINDOW_TRACE) { 5257d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime); 5267d8df3905d294127cc58100912a57c816bfb2502Craig Mautner } 527764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 528ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i( 529ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner TAG, ">>> OPEN TRANSACTION animateLocked"); 5303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.openTransaction(); 5313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.setAnimationTransaction(); 532764983d16925daeeba3f29fd1f844187655d1386Craig Mautner try { 5332ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner updateAppWindowsLocked(); 5342ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner 535a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final int numDisplays = mDisplayContentsAnimators.size(); 536a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner for (int i = 0; i < numDisplays; i++) { 537a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final int displayId = mDisplayContentsAnimators.keyAt(i); 538a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i); 539a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner 540a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final ScreenRotationAnimation screenRotationAnimation = 541a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner displayAnimator.mScreenRotationAnimation; 542a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) { 543a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) { 544a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mAnimating = true; 545a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } else { 546a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mBulkUpdateParams |= SET_UPDATE_ROTATION; 547a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner screenRotationAnimation.kill(); 548a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner displayAnimator.mScreenRotationAnimation = null; 549a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 550a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 551764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 552ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner // Update animations of all applications, including those 553ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner // associated with exiting/removed apps 554a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner performAnimationsLocked(displayId); 555ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner 556968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final WindowList windows = mService.getWindowListLocked(displayId); 557968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final int N = windows.size(); 558ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner for (int j = 0; j < N; j++) { 559968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner windows.get(j).mWinAnimator.prepareSurfaceLocked(true); 560ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner } 561764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 562764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 5632ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner testTokenMayBeDrawnLocked(); 5642ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner 565a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner for (int i = 0; i < numDisplays; i++) { 566a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final int displayId = mDisplayContentsAnimators.keyAt(i); 567a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i); 568764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 569a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final ScreenRotationAnimation screenRotationAnimation = 570a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner displayAnimator.mScreenRotationAnimation; 571a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner if (screenRotationAnimation != null) { 572a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner screenRotationAnimation.updateSurfacesInTransaction(); 573a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 574a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner 5751420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner final DimLayer dimAnimator = displayAnimator.mDimAnimator; 5761420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner final WindowStateAnimator winAnimator = displayAnimator.mDimWinAnimator; 57713131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner final int dimLayer; 5781420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner final float dimAmount; 5791420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner if (winAnimator == null) { 58013131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner dimLayer = dimAnimator.getLayer(); 5811420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner dimAmount = 0; 5821420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner } else { 58313131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner dimLayer = winAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM; 5841420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner dimAmount = winAnimator.mWin.mAttrs.dimAmount; 585a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 5861420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner final float targetAlpha = dimAnimator.getTargetAlpha(); 5871420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner if (targetAlpha != dimAmount) { 5881420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner if (winAnimator == null) { 5891420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner dimAnimator.hide(DEFAULT_DIM_DURATION); 5901420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner } else { 5911420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner long duration = (winAnimator.mAnimating && winAnimator.mAnimation != null) 5921420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner ? winAnimator.mAnimation.computeDurationHint() 5931420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner : DEFAULT_DIM_DURATION; 5941420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner if (targetAlpha > dimAmount) { 5951420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner duration = getDimBehindFadeDuration(duration); 5961420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner } 59713131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner dimAnimator.show(dimLayer, dimAmount, duration); 5981420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner } 59913131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner } else if (dimAnimator.getLayer() != dimLayer) { 60013131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner dimAnimator.setLayer(dimLayer); 6011420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner } 6021420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner if (dimAnimator.isAnimating()) { 6031420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner if (!mService.okToDisplay()) { 6041420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner // Jump to the end of the animation. 6051420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner dimAnimator.show(); 6061420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner } else { 6071420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner mAnimating |= dimAnimator.stepAnimation(); 6081420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner } 609a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 6101420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner 611545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov //TODO (multidisplay): Magnification is supported only for the default display. 612545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov if (mService.mDisplayMagnifier != null && displayId == Display.DEFAULT_DISPLAY) { 613545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov mService.mDisplayMagnifier.drawMagnifiedRegionBorderIfNeededLocked(); 614545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov } 615764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 616764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 6177358fbfeb2febb60085067fcacc192f429b06545Craig Mautner if (mService.mWatermark != null) { 6187358fbfeb2febb60085067fcacc192f429b06545Craig Mautner mService.mWatermark.drawIfNeeded(); 6197358fbfeb2febb60085067fcacc192f429b06545Craig Mautner } 620764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } catch (RuntimeException e) { 621764983d16925daeeba3f29fd1f844187655d1386Craig Mautner Log.wtf(TAG, "Unhandled exception in Window Manager", e); 622764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } finally { 6233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian SurfaceControl.closeTransaction(); 624ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i( 625ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner TAG, "<<< CLOSE TRANSACTION animateLocked"); 626ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner } 627ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner 62866f78d7a979775efb148873797bac4584ddb3b83Craig Mautner boolean hasPendingLayoutChanges = false; 6295892fc5d8aaf546e605196c3dc48d8f9e193dc2aCraig Mautner final int numDisplays = mService.mDisplayContents.size(); 6305892fc5d8aaf546e605196c3dc48d8f9e193dc2aCraig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 6315892fc5d8aaf546e605196c3dc48d8f9e193dc2aCraig Mautner final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 63266f78d7a979775efb148873797bac4584ddb3b83Craig Mautner final int pendingChanges = getPendingLayoutChanges(displayContent.getDisplayId()); 63366f78d7a979775efb148873797bac4584ddb3b83Craig Mautner if ((pendingChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) { 634968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING; 635ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner } 63666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner if (pendingChanges != 0) { 63766f78d7a979775efb148873797bac4584ddb3b83Craig Mautner hasPendingLayoutChanges = true; 63866f78d7a979775efb148873797bac4584ddb3b83Craig Mautner } 639764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 640c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner 64166f78d7a979775efb148873797bac4584ddb3b83Craig Mautner boolean doRequest = false; 64266f78d7a979775efb148873797bac4584ddb3b83Craig Mautner if (mBulkUpdateParams != 0) { 64366f78d7a979775efb148873797bac4584ddb3b83Craig Mautner doRequest = mService.copyAnimToLayoutParamsLocked(); 64466f78d7a979775efb148873797bac4584ddb3b83Craig Mautner } 64566f78d7a979775efb148873797bac4584ddb3b83Craig Mautner 64666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner if (hasPendingLayoutChanges || doRequest) { 64766f78d7a979775efb148873797bac4584ddb3b83Craig Mautner mService.requestTraversalLocked(); 64801cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner } 6497d8df3905d294127cc58100912a57c816bfb2502Craig Mautner 6507d8df3905d294127cc58100912a57c816bfb2502Craig Mautner if (mAnimating) { 651968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mService.scheduleAnimationLocked(); 652198e564c9a66010cfe93e0b1a75f84d696bda494Chet Haase } else if (wasAnimating) { 653198e564c9a66010cfe93e0b1a75f84d696bda494Chet Haase mService.requestTraversalLocked(); 6547d8df3905d294127cc58100912a57c816bfb2502Craig Mautner } 6557d8df3905d294127cc58100912a57c816bfb2502Craig Mautner if (WindowManagerService.DEBUG_WINDOW_TRACE) { 6567d8df3905d294127cc58100912a57c816bfb2502Craig Mautner Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating 6577d8df3905d294127cc58100912a57c816bfb2502Craig Mautner + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams) 65876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner + " mPendingLayoutChanges(DEFAULT_DISPLAY)=" 65966f78d7a979775efb148873797bac4584ddb3b83Craig Mautner + Integer.toHexString(getPendingLayoutChanges(Display.DEFAULT_DISPLAY))); 6607d8df3905d294127cc58100912a57c816bfb2502Craig Mautner } 661764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 662764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 663764983d16925daeeba3f29fd1f844187655d1386Craig Mautner WindowState mCurrentFocus; 664d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner void setCurrentFocus(final WindowState currentFocus) { 665764983d16925daeeba3f29fd1f844187655d1386Craig Mautner mCurrentFocus = currentFocus; 666764983d16925daeeba3f29fd1f844187655d1386Craig Mautner } 667764983d16925daeeba3f29fd1f844187655d1386Craig Mautner 668a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner boolean isDimmingLocked(int displayId) { 6691420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner return getDisplayContentsAnimatorLocked(displayId).mDimAnimator.isDimming(); 670f8d4fbb9c87201350534861c4d988e63691fe24fCraig Mautner } 671f8d4fbb9c87201350534861c4d988e63691fe24fCraig Mautner 672a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner boolean isDimmingLocked(final WindowStateAnimator winAnimator) { 6731420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner final int displayId = winAnimator.mWin.getDisplayId(); 6741420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner DisplayContentsAnimator displayAnimator = 6751420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner getDisplayContentsAnimatorLocked(displayId); 6761420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner if (displayAnimator != null) { 6771420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner return displayAnimator.mDimWinAnimator == winAnimator 6781420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner && displayAnimator.mDimAnimator.isDimming(); 6791420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner } 6801420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner return false; 681acafd19c5ea05a8d465f97204f8d63468bdaa2a4Craig Mautner } 682acafd19c5ea05a8d465f97204f8d63468bdaa2a4Craig Mautner 683529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn static String bulkUpdateParamsToString(int bulkUpdateParams) { 684529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn StringBuilder builder = new StringBuilder(128); 685529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) { 686529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn builder.append(" UPDATE_ROTATION"); 687529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 688529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) { 689529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn builder.append(" WALLPAPER_MAY_CHANGE"); 690529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 691529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) { 692529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn builder.append(" FORCE_HIDING_CHANGED"); 693529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 694529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) != 0) { 695529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn builder.append(" ORIENTATION_CHANGE_COMPLETE"); 696529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 697529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) { 698529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn builder.append(" TURN_ON_SCREEN"); 699529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 700529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn return builder.toString(); 701529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 702529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn 703a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner public void dumpLocked(PrintWriter pw, String prefix, boolean dumpAll) { 704529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn final String subPrefix = " " + prefix; 705529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn final String subSubPrefix = " " + subPrefix; 706529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn 707529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn for (int i = 0; i < mDisplayContentsAnimators.size(); i++) { 708529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(prefix); pw.print("DisplayContentsAnimator #"); 709529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(mDisplayContentsAnimators.keyAt(i)); 710529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.println(":"); 711529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i); 712968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final WindowList windows = 713968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner mService.getWindowListLocked(mDisplayContentsAnimators.keyAt(i)); 714968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final int N = windows.size(); 715968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner for (int j = 0; j < N; j++) { 716968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner WindowStateAnimator wanim = windows.get(j).mWinAnimator; 717529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(subPrefix); pw.print("Window #"); pw.print(j); 718529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(": "); pw.println(wanim); 719529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 720529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn if (displayAnimator.mWindowAnimationBackgroundSurface != null) { 7211420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner if (dumpAll || displayAnimator.mWindowAnimationBackgroundSurface.isDimming()) { 722529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(subPrefix); pw.println("mWindowAnimationBackgroundSurface:"); 723529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn displayAnimator.mWindowAnimationBackgroundSurface.printTo(subSubPrefix, pw); 724529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 725529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 7261420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner if (dumpAll || displayAnimator.mDimAnimator.isDimming()) { 7271420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner pw.print(subPrefix); pw.println("mDimAnimator:"); 7281420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner displayAnimator.mDimAnimator.printTo(subSubPrefix, pw); 7291420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner pw.print(subPrefix); pw.print("mDimWinAnimator="); 7301420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner pw.println(displayAnimator.mDimWinAnimator); 731529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 732529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn if (displayAnimator.mScreenRotationAnimation != null) { 733529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(subPrefix); pw.println("mScreenRotationAnimation:"); 734529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn displayAnimator.mScreenRotationAnimation.printTo(subSubPrefix, pw); 735529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } else if (dumpAll) { 736529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(subPrefix); pw.println("no ScreenRotationAnimation "); 737529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 738529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 739529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn 740529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.println(); 741529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn 742529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn if (dumpAll) { 743529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(prefix); pw.print("mAnimTransactionSequence="); 744529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(mAnimTransactionSequence); 745529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(" mForceHiding="); pw.println(forceHidingToString()); 746529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(prefix); pw.print("mCurrentTime="); 747529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.println(TimeUtils.formatUptime(mCurrentTime)); 748529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 749529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn if (mBulkUpdateParams != 0) { 750529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(prefix); pw.print("mBulkUpdateParams=0x"); 751529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(Integer.toHexString(mBulkUpdateParams)); 752529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.println(bulkUpdateParamsToString(mBulkUpdateParams)); 753529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 754529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn if (mWindowDetachedWallpaper != null) { 755529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(prefix); pw.print("mWindowDetachedWallpaper="); 756529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.println(mWindowDetachedWallpaper); 757529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 758529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn if (mUniverseBackground != null) { 759529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(prefix); pw.print("mUniverseBackground="); pw.print(mUniverseBackground); 760529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(" mAboveUniverseLayer="); pw.println(mAboveUniverseLayer); 761529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 762e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner } 763bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner 76466f78d7a979775efb148873797bac4584ddb3b83Craig Mautner int getPendingLayoutChanges(final int displayId) { 76566f78d7a979775efb148873797bac4584ddb3b83Craig Mautner return mService.getDisplayContentLocked(displayId).pendingLayoutChanges; 76666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner } 76766f78d7a979775efb148873797bac4584ddb3b83Craig Mautner 76876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner void setPendingLayoutChanges(final int displayId, final int changes) { 76966f78d7a979775efb148873797bac4584ddb3b83Craig Mautner mService.getDisplayContentLocked(displayId).pendingLayoutChanges |= changes; 77076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner } 77176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner 77276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) { 77376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner // Used to track which displays layout changes have been done. 77476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner SparseIntArray displays = new SparseIntArray(); 775968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner WindowList windows = appAnimator.mAppToken.allAppWindows; 776968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner for (int i = windows.size() - 1; i >= 0; i--) { 777968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner final int displayId = windows.get(i).getDisplayId(); 77876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner if (displays.indexOfKey(displayId) < 0) { 77976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner setPendingLayoutChanges(displayId, changes); 78076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner if (WindowManagerService.DEBUG_LAYOUT_REPEATS) { 78166f78d7a979775efb148873797bac4584ddb3b83Craig Mautner mService.debugLayoutRepeats(s, getPendingLayoutChanges(displayId)); 78276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner } 78376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner // Keep from processing this display again. 78476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner displays.put(displayId, changes); 78576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner } 78676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner } 7874d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner } 788a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner 7891420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner void setDimWinAnimatorLocked(int displayId, WindowStateAnimator newWinAnimator) { 790968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId); 7911420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner if (newWinAnimator == null) { 7921420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner displayAnimator.mDimWinAnimator = null; 793968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner } else { 794968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner // Only set dim params on the highest dimmed layer. 7951420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner final WindowStateAnimator existingDimWinAnimator = displayAnimator.mDimWinAnimator; 7961420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner // Don't turn on for an unshown surface, or for any layer but the highest dimmed layer. 797968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner if (newWinAnimator.mSurfaceShown && (existingDimWinAnimator == null 798968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner || !existingDimWinAnimator.mSurfaceShown 799968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) { 8001420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner displayAnimator.mDimWinAnimator = newWinAnimator; 801968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner } 802968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner } 803968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner } 804968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner 805a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) { 806a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId); 807a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner if (displayAnimator == null) { 808ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner displayAnimator = new DisplayContentsAnimator(displayId); 809a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mDisplayContentsAnimators.put(displayId, displayAnimator); 810a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 811a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner return displayAnimator; 812a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 813a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner 814a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner void setScreenRotationAnimationLocked(int displayId, ScreenRotationAnimation animation) { 815a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation = animation; 816a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 817a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner 818a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner ScreenRotationAnimation getScreenRotationAnimationLocked(int displayId) { 819a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation; 820a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 821a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner 822ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner private class DisplayContentsAnimator { 8231420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner DimLayer mDimAnimator = null; 8241420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner WindowStateAnimator mDimWinAnimator = null; 8251420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner DimLayer mWindowAnimationBackgroundSurface = null; 826a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner ScreenRotationAnimation mScreenRotationAnimation = null; 827ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner 828ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner public DisplayContentsAnimator(int displayId) { 8291420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner mDimAnimator = new DimLayer(mService, displayId); 8301420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner mWindowAnimationBackgroundSurface = new DimLayer(mService, displayId); 831ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner } 832a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 833764983d16925daeeba3f29fd1f844187655d1386Craig Mautner} 834