From 968683335e17c06504a11bc2e38a2580f613ea16 Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Tue, 4 Dec 2012 14:29:11 -0800 Subject: Recouple layout and animation a bit. Share state between layout and animation and stop copying redundant data between the two. Change-Id: If07d3fc3ddfd33e3d46bf45d24d7aca58067ee66 --- .../com/android/server/wm/AppWindowAnimator.java | 2 +- .../java/com/android/server/wm/AppWindowToken.java | 3 +- .../server/wm/DisplayMagnificationMediator.java | 2 - .../java/com/android/server/wm/WindowAnimator.java | 304 +++++--------------- .../android/server/wm/WindowManagerService.java | 320 +++++++-------------- .../java/com/android/server/wm/WindowState.java | 8 +- .../com/android/server/wm/WindowStateAnimator.java | 27 +- 7 files changed, 192 insertions(+), 474 deletions(-) diff --git a/services/java/com/android/server/wm/AppWindowAnimator.java b/services/java/com/android/server/wm/AppWindowAnimator.java index 49f8c0eb03c6..34513a188410 100644 --- a/services/java/com/android/server/wm/AppWindowAnimator.java +++ b/services/java/com/android/server/wm/AppWindowAnimator.java @@ -129,7 +129,7 @@ public class AppWindowAnimator { if (w == mService.mInputMethodTarget && !mService.mInputMethodTargetWaitingAnim) { mService.setInputMethodAnimLayerAdjustment(adj); } - if (w == mAnimator.mWallpaperTarget && mAnimator.mLowerWallpaperTarget == null) { + if (w == mService.mWallpaperTarget && mService.mLowerWallpaperTarget == null) { mService.setWallpaperAnimLayerAdjustmentLocked(adj); } } diff --git a/services/java/com/android/server/wm/AppWindowToken.java b/services/java/com/android/server/wm/AppWindowToken.java index 3ec6d26e98f0..275c9bf311dc 100644 --- a/services/java/com/android/server/wm/AppWindowToken.java +++ b/services/java/com/android/server/wm/AppWindowToken.java @@ -30,7 +30,6 @@ import android.view.View; import android.view.WindowManager; import java.io.PrintWriter; -import java.util.ArrayList; /** * Version of WindowToken that is specifically for a particular application (or @@ -42,7 +41,7 @@ class AppWindowToken extends WindowToken { // All of the windows and child windows that are included in this // application token. Note this list is NOT sorted! - final ArrayList allAppWindows = new ArrayList(); + final WindowList allAppWindows = new WindowList(); final AppWindowAnimator mAppAnimator; final WindowAnimator mAnimator; diff --git a/services/java/com/android/server/wm/DisplayMagnificationMediator.java b/services/java/com/android/server/wm/DisplayMagnificationMediator.java index 8621c5cd396b..0e3a6e1d72fb 100644 --- a/services/java/com/android/server/wm/DisplayMagnificationMediator.java +++ b/services/java/com/android/server/wm/DisplayMagnificationMediator.java @@ -183,8 +183,6 @@ final class DisplayMagnificationMediator extends IDisplayMagnificationMediator.S displayState.mMagnificationSpec.initialize(spec.scale, spec.offsetX, spec.offsetY); spec.recycle(); - } - synchronized (mWindowManagerService.mLayoutToAnim) { mWindowManagerService.scheduleAnimationLocked(); } } diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index 73293b068ca2..f84c7f876bb0 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -9,8 +9,7 @@ import static com.android.server.wm.WindowManagerService.LayoutFields.SET_UPDATE import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_MAY_CHANGE; import static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED; import static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE; - -import static com.android.server.wm.WindowManagerService.H.UPDATE_ANIM_PARAMETERS; +import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_ACTION_PENDING; import android.content.Context; import android.os.Debug; @@ -25,9 +24,7 @@ import android.view.Surface; import android.view.WindowManagerPolicy; import android.view.animation.Animation; -import com.android.server.wm.WindowManagerService.AppWindowAnimParams; import com.android.server.wm.WindowManagerService.LayoutFields; -import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams; import java.io.PrintWriter; import java.util.ArrayList; @@ -73,28 +70,6 @@ public class WindowAnimator { SparseArray mDisplayContentsAnimators = new SparseArray(); - static final int WALLPAPER_ACTION_PENDING = 1; - int mPendingActions; - - WindowState mWallpaperTarget = null; - AppWindowAnimator mWpAppAnimator = null; - WindowState mLowerWallpaperTarget = null; - WindowState mUpperWallpaperTarget = null; - - ArrayList mAppAnimators = new ArrayList(); - - ArrayList mWallpaperTokens = new ArrayList(); - - /** Parameters being passed from this into mService. */ - static class AnimatorToLayoutParams { - boolean mUpdateQueued; - int mBulkUpdateParams; - SparseIntArray mPendingLayoutChanges; - WindowState mWindowDetachedWallpaper; - } - /** Do not modify unless holding mService.mWindowMap or this and mAnimToLayout in that order */ - final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams(); - boolean mInitialized = false; // forceHiding states. @@ -122,13 +97,9 @@ public class WindowAnimator { mAnimationRunnable = new Runnable() { @Override public void run() { - // TODO(cmautner): When full isolation is achieved for animation, the first lock - // goes away and only the WindowAnimator.this remains. - synchronized(mService.mWindowMap) { - synchronized(WindowAnimator.this) { - copyLayoutToAnimParamsLocked(); - animateLocked(); - } + synchronized (mService.mWindowMap) { + mService.mAnimationScheduled = false; + animateLocked(); } } }; @@ -160,119 +131,20 @@ public class WindowAnimator { } mDisplayContentsAnimators.delete(displayId); + mPendingLayoutChanges.delete(displayId); } - /** Locked on mAnimToLayout */ - void updateAnimToLayoutLocked() { - final AnimatorToLayoutParams animToLayout = mAnimToLayout; - synchronized (animToLayout) { - animToLayout.mBulkUpdateParams = mBulkUpdateParams; - animToLayout.mPendingLayoutChanges = mPendingLayoutChanges.clone(); - animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper; - - if (!animToLayout.mUpdateQueued) { - animToLayout.mUpdateQueued = true; - mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS)); - } - } + AppWindowAnimator getWallpaperAppAnimator() { + return mService.mWallpaperTarget == null + ? null : mService.mWallpaperTarget.mAppToken == null + ? null : mService.mWallpaperTarget.mAppToken.mAppAnimator; } - /** Copy all WindowManagerService params into local params here. Locked on 'this'. */ - private void copyLayoutToAnimParamsLocked() { - final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim; - synchronized(layoutToAnim) { - layoutToAnim.mAnimationScheduled = false; - - if (!layoutToAnim.mParamsModified) { - return; - } - layoutToAnim.mParamsModified = false; - - if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) { - layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED; - mWallpaperTokens = new ArrayList(layoutToAnim.mWallpaperTokens); - } - - if (WindowManagerService.DEBUG_WALLPAPER_LIGHT) { - if (mWallpaperTarget != layoutToAnim.mWallpaperTarget - || mLowerWallpaperTarget != layoutToAnim.mLowerWallpaperTarget - || mUpperWallpaperTarget != layoutToAnim.mUpperWallpaperTarget) { - Slog.d(TAG, "Pulling anim wallpaper: target=" + layoutToAnim.mWallpaperTarget - + " lower=" + layoutToAnim.mLowerWallpaperTarget + " upper=" - + layoutToAnim.mUpperWallpaperTarget); - } - } - mWallpaperTarget = layoutToAnim.mWallpaperTarget; - mWpAppAnimator = mWallpaperTarget == null - ? null : mWallpaperTarget.mAppToken == null - ? null : mWallpaperTarget.mAppToken.mAppAnimator; - mLowerWallpaperTarget = layoutToAnim.mLowerWallpaperTarget; - mUpperWallpaperTarget = layoutToAnim.mUpperWallpaperTarget; - - // Set the new DimAnimator params. - final int numDisplays = mDisplayContentsAnimators.size(); - for (int i = 0; i < numDisplays; i++) { - final int displayId = mDisplayContentsAnimators.keyAt(i); - DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i); - - displayAnimator.mWinAnimators.clear(); - final WinAnimatorList winAnimators = layoutToAnim.mWinAnimatorLists.get(displayId); - if (winAnimators != null) { - displayAnimator.mWinAnimators.addAll(winAnimators); - } - - DimAnimator.Parameters dimParams = layoutToAnim.mDimParams.get(displayId); - if (dimParams == null) { - displayAnimator.mDimParams = null; - } else { - final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator; - - // Only set dim params on the highest dimmed layer. - final WindowStateAnimator existingDimWinAnimator = - displayAnimator.mDimParams == null ? - null : displayAnimator.mDimParams.mDimWinAnimator; - // Don't turn on for an unshown surface, or for any layer but the highest - // dimmed layer. - if (newWinAnimator.mSurfaceShown && (existingDimWinAnimator == null - || !existingDimWinAnimator.mSurfaceShown - || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) { - displayAnimator.mDimParams = new DimAnimator.Parameters(dimParams); - } - } - } - - mAppAnimators.clear(); - final int N = layoutToAnim.mAppWindowAnimParams.size(); - for (int i = 0; i < N; i++) { - final AppWindowAnimParams params = layoutToAnim.mAppWindowAnimParams.get(i); - AppWindowAnimator appAnimator = params.mAppAnimator; - appAnimator.mAllAppWinAnimators.clear(); - appAnimator.mAllAppWinAnimators.addAll(params.mWinAnimators); - mAppAnimators.add(appAnimator); - } - } - } - - void hideWallpapersLocked(final WindowState w, boolean fromAnimator) { - // There is an issue where this function can be called either from - // the animation or the layout side of the window manager. The problem - // is that if it is called from the layout side, we may not yet have - // propagated the current layout wallpaper state over into the animation - // state. If that is the case, we can do bad things like hide the - // wallpaper when we had just made it shown because the animation side - // doesn't yet see that there is now a wallpaper target. As a temporary - // work-around, we tell the function here which side of the window manager - // is calling so it can use the right state. - if (fromAnimator) { - hideWallpapersLocked(w, mWallpaperTarget, mLowerWallpaperTarget, mWallpaperTokens); - } else { - hideWallpapersLocked(w, mService.mWallpaperTarget, - mService.mLowerWallpaperTarget, mService.mWallpaperTokens); - } - } - - void hideWallpapersLocked(final WindowState w, final WindowState wallpaperTarget, - final WindowState lowerWallpaperTarget, final ArrayList wallpaperTokens) { + void hideWallpapersLocked(final WindowState w) { + final WindowState wallpaperTarget = mService.mWallpaperTarget; + final WindowState lowerWallpaperTarget = mService.mLowerWallpaperTarget; + final ArrayList wallpaperTokens = mService.mWallpaperTokens; + if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) { final int numTokens = wallpaperTokens.size(); for (int i = numTokens - 1; i >= 0; i--) { @@ -299,9 +171,10 @@ public class WindowAnimator { private void updateAppWindowsLocked() { int i; - final int NAT = mAppAnimators.size(); + final ArrayList appTokens = mService.mAnimatingAppTokens; + final int NAT = appTokens.size(); for (i=0; i unForceHiding = null; boolean wallpaperInUnForceHiding = false; mForceHiding = KEYGUARD_NOT_SHOWN; - for (int i = winAnimatorList.size() - 1; i >= 0; i--) { - WindowStateAnimator winAnimator = winAnimatorList.get(i); - WindowState win = winAnimator.mWin; + for (int i = windows.size() - 1; i >= 0; i--) { + WindowState win = windows.get(i); + WindowStateAnimator winAnimator = win.mWinAnimator; final int flags = winAnimator.mAttrFlags; if (winAnimator.mSurface != null) { @@ -355,7 +227,7 @@ public class WindowAnimator { ", nowAnimating=" + nowAnimating); } - if (wasAnimating && !winAnimator.mAnimating && mWallpaperTarget == win) { + if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) { mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE; setPendingLayoutChanges(Display.DEFAULT_DISPLAY, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER); @@ -486,21 +358,21 @@ public class WindowAnimator { private void updateWallpaperLocked(int displayId) { final DisplayContentsAnimator displayAnimator = getDisplayContentsAnimatorLocked(displayId); - final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators; + final WindowList windows = mService.getWindowListLocked(displayId); WindowStateAnimator windowAnimationBackground = null; int windowAnimationBackgroundColor = 0; WindowState detachedWallpaper = null; final DimSurface windowAnimationBackgroundSurface = displayAnimator.mWindowAnimationBackgroundSurface; - for (int i = winAnimatorList.size() - 1; i >= 0; i--) { - WindowStateAnimator winAnimator = winAnimatorList.get(i); + for (int i = windows.size() - 1; i >= 0; i--) { + final WindowState win = windows.get(i); + WindowStateAnimator winAnimator = win.mWinAnimator; if (winAnimator.mSurface == null) { continue; } final int flags = winAnimator.mAttrFlags; - final WindowState win = winAnimator.mWin; // If this window is animating, make a note that we have // an animating window and take care of a request to run @@ -559,11 +431,11 @@ public class WindowAnimator { // don't cause the wallpaper to suddenly disappear. int animLayer = windowAnimationBackground.mAnimLayer; WindowState win = windowAnimationBackground.mWin; - if (mWallpaperTarget == win - || mLowerWallpaperTarget == win || mUpperWallpaperTarget == win) { - final int N = winAnimatorList.size(); + if (mService.mWallpaperTarget == win || mService.mLowerWallpaperTarget == win + || mService.mUpperWallpaperTarget == win) { + final int N = windows.size(); for (int i = 0; i < N; i++) { - WindowStateAnimator winAnimator = winAnimatorList.get(i); + WindowStateAnimator winAnimator = windows.get(i).mWinAnimator; if (winAnimator.mIsWallpaper) { animLayer = winAnimator.mAnimLayer; break; @@ -586,10 +458,13 @@ public class WindowAnimator { /** See if any windows have been drawn, so they (and others associated with them) can now be * shown. */ private void testTokenMayBeDrawnLocked() { - final int NT = mAppAnimators.size(); + // See if any windows have been drawn, so they (and others + // associated with them) can now be shown. + final ArrayList appTokens = mService.mAnimatingAppTokens; + final int NT = appTokens.size(); for (int i=0; i= 0; i--) { if ((mPendingLayoutChanges.valueAt(i) & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) { - mPendingActions |= WALLPAPER_ACTION_PENDING; + mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING; } } if (mBulkUpdateParams != 0 || mPendingLayoutChanges.size() > 0) { - updateAnimToLayoutLocked(); + if (mService.copyAnimToLayoutParamsLocked()) { + mService.requestTraversalLocked(); + } } if (mAnimating) { - synchronized (mService.mLayoutToAnim) { - mService.scheduleAnimationLocked(); - } + mService.scheduleAnimationLocked(); } else if (wasAnimating) { mService.requestTraversalLocked(); } @@ -777,51 +652,16 @@ public class WindowAnimator { final String subPrefix = " " + prefix; final String subSubPrefix = " " + subPrefix; - boolean needSep = false; - if (mAppAnimators.size() > 0) { - needSep = true; - pw.println(" App Animators:"); - for (int i=mAppAnimators.size()-1; i>=0; i--) { - AppWindowAnimator anim = mAppAnimators.get(i); - pw.print(prefix); pw.print("App Animator #"); pw.print(i); - pw.print(' '); pw.print(anim); - if (dumpAll) { - pw.println(':'); - anim.dump(pw, subPrefix, dumpAll); - } else { - pw.println(); - } - } - } - if (mWallpaperTokens.size() > 0) { - if (needSep) { - pw.println(); - } - needSep = true; - pw.print(prefix); pw.println("Wallpaper tokens:"); - for (int i=mWallpaperTokens.size()-1; i>=0; i--) { - WindowToken token = mWallpaperTokens.get(i); - pw.print(prefix); pw.print("Wallpaper #"); pw.print(i); - pw.print(' '); pw.print(token); - if (dumpAll) { - pw.println(':'); - token.dump(pw, subPrefix); - } else { - pw.println(); - } - } - } - - if (needSep) { - pw.println(); - } for (int i = 0; i < mDisplayContentsAnimators.size(); i++) { pw.print(prefix); pw.print("DisplayContentsAnimator #"); pw.print(mDisplayContentsAnimators.keyAt(i)); pw.println(":"); DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i); - for (int j=0; j 0) { - i--; - AppWindowToken tok = mAppTokens.get(i); - if (tok.mAppAnimator.freezingScreen) { - Slog.w(TAG, "Force clearing freeze: " + tok); - unsetAppFreezingScreenLocked(tok, true, true); - } + Slog.w(TAG, "App freeze timeout expired."); + int i = mAppTokens.size(); + while (i > 0) { + i--; + AppWindowToken tok = mAppTokens.get(i); + if (tok.mAppAnimator.freezingScreen) { + Slog.w(TAG, "Force clearing freeze: " + tok); + unsetAppFreezingScreenLocked(tok, true, true); } } } @@ -7060,17 +7030,6 @@ public class WindowManagerService extends IWindowManager.Stub break; } - case UPDATE_ANIM_PARAMETERS: { - // Used to send multiple changes from the animation side to the layout side. - synchronized (mWindowMap) { - if (copyAnimToLayoutParamsLocked()) { - sendEmptyMessage(CLEAR_PENDING_ACTIONS); - performLayoutAndPlaceSurfacesLocked(); - } - } - break; - } - case SHOW_STRICT_MODE_VIOLATION: { showStrictModeViolation(msg.arg1, msg.arg2); break; @@ -7085,11 +7044,6 @@ public class WindowManagerService extends IWindowManager.Stub break; } - case CLEAR_PENDING_ACTIONS: { - mAnimator.clearPendingActions(); - break; - } - case DO_ANIMATION_CALLBACK: { try { ((IRemoteCallback)msg.obj).sendResult(null); @@ -7468,7 +7422,7 @@ public class WindowManagerService extends IWindowManager.Stub pw.flush(); Slog.w(TAG, "This window was lost: " + ws); Slog.w(TAG, sw.toString()); - ws.mWinAnimator.destroySurfaceLocked(false); + ws.mWinAnimator.destroySurfaceLocked(); } } Slog.w(TAG, "Current app token list:"); @@ -7530,7 +7484,7 @@ public class WindowManagerService extends IWindowManager.Stub } if (layerChanged && mAnimator.isDimmingLocked(winAnimator)) { // Force an animation pass just to update the mDimAnimator layer. - updateLayoutToAnimationLocked(); + scheduleAnimationLocked(); } if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": " + "mBase=" + w.mBaseLayer @@ -7556,6 +7510,7 @@ public class WindowManagerService extends IWindowManager.Stub mH.removeMessages(H.DO_TRAVERSAL); loopCount--; } while (mTraversalScheduled && loopCount > 0); + mInnerFields.mWallpaperActionPending = false; } private boolean mInLayout = false; @@ -8780,7 +8735,7 @@ public class WindowManagerService extends IWindowManager.Stub if (win == mWallpaperTarget) { wallpaperDestroyed = true; } - win.mWinAnimator.destroySurfaceLocked(false); + win.mWinAnimator.destroySurfaceLocked(); } while (i > 0); mDestroySurface.clear(); } @@ -8792,7 +8747,6 @@ public class WindowManagerService extends IWindowManager.Stub mExitingTokens.remove(i); if (token.windowType == TYPE_WALLPAPER) { mWallpaperTokens.remove(token); - updateLayoutToAnimWallpaperTokens(); } } } @@ -8903,7 +8857,7 @@ public class WindowManagerService extends IWindowManager.Stub // be enabled, because the window obscured flags have changed. enableScreenIfNeededLocked(); - updateLayoutToAnimationLocked(); + scheduleAnimationLocked(); if (DEBUG_WINDOW_TRACE) { Slog.e(TAG, "performLayoutAndPlaceSurfacesLockedInner exit: animating=" @@ -9000,82 +8954,21 @@ public class WindowManagerService extends IWindowManager.Stub /** Note that Locked in this case is on mLayoutToAnim */ void scheduleAnimationLocked() { - final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim; - if (!layoutToAnim.mAnimationScheduled) { - layoutToAnim.mAnimationScheduled = true; + if (!mAnimationScheduled) { + mAnimationScheduled = true; mChoreographer.postCallback( Choreographer.CALLBACK_ANIMATION, mAnimator.mAnimationRunnable, null); } } - void updateLayoutToAnimationLocked() { - final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim; - synchronized (layoutToAnim) { - // Copy local params to transfer params. - SparseArray allWinAnimatorLists = layoutToAnim.mWinAnimatorLists; - allWinAnimatorLists.clear(); - DisplayContentsIterator iterator = new DisplayContentsIterator(); - while (iterator.hasNext()) { - final DisplayContent displayContent = iterator.next(); - WinAnimatorList winAnimatorList = new WinAnimatorList(); - final WindowList windows = displayContent.getWindowList(); - int N = windows.size(); - for (int i = 0; i < N; i++) { - final WindowStateAnimator winAnimator = windows.get(i).mWinAnimator; - if (winAnimator.mSurface != null) { - winAnimatorList.add(winAnimator); - } - } - allWinAnimatorLists.put(displayContent.getDisplayId(), winAnimatorList); - } - - if (WindowManagerService.DEBUG_WALLPAPER_LIGHT) { - if (mWallpaperTarget != layoutToAnim.mWallpaperTarget - || mLowerWallpaperTarget != layoutToAnim.mLowerWallpaperTarget - || mUpperWallpaperTarget != layoutToAnim.mUpperWallpaperTarget) { - Slog.d(TAG, "Pushing anim wallpaper: target=" + mWallpaperTarget - + " lower=" + mLowerWallpaperTarget + " upper=" - + mUpperWallpaperTarget + "\n" + Debug.getCallers(5, " ")); - } - } - layoutToAnim.mWallpaperTarget = mWallpaperTarget; - layoutToAnim.mLowerWallpaperTarget = mLowerWallpaperTarget; - layoutToAnim.mUpperWallpaperTarget = mUpperWallpaperTarget; - - final ArrayList paramList = layoutToAnim.mAppWindowAnimParams; - paramList.clear(); - int N = mAnimatingAppTokens.size(); - for (int i = 0; i < N; i++) { - paramList.add(new AppWindowAnimParams(mAnimatingAppTokens.get(i).mAppAnimator)); - } - - layoutToAnim.mParamsModified = true; - scheduleAnimationLocked(); - } - } - - void updateLayoutToAnimWallpaperTokens() { - synchronized(mLayoutToAnim) { - mLayoutToAnim.mWallpaperTokens = new ArrayList(mWallpaperTokens); - mLayoutToAnim.mChanges |= LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED; - } - } - - void setAnimDimParams(int displayId, DimAnimator.Parameters params) { - synchronized (mLayoutToAnim) { - mLayoutToAnim.mDimParams.put(displayId, params); - scheduleAnimationLocked(); - } - } - void startDimmingLocked(final WindowStateAnimator winAnimator, final float target, final int width, final int height) { - setAnimDimParams(winAnimator.mWin.getDisplayId(), + mAnimator.setDimParamsLocked(winAnimator.mWin.getDisplayId(), new DimAnimator.Parameters(winAnimator, width, height, target)); } void stopDimmingLocked(int displayId) { - setAnimDimParams(displayId, null); + mAnimator.setDimParamsLocked(displayId, null); } private boolean needsLayout() { @@ -9088,53 +8981,52 @@ public class WindowManagerService extends IWindowManager.Stub return false; } - private boolean copyAnimToLayoutParamsLocked() { + boolean copyAnimToLayoutParamsLocked() { boolean doRequest = false; - final WindowAnimator.AnimatorToLayoutParams animToLayout = mAnimator.mAnimToLayout; - synchronized (animToLayout) { - animToLayout.mUpdateQueued = false; - final int bulkUpdateParams = animToLayout.mBulkUpdateParams; - // TODO(cmautner): As the number of bits grows, use masks of bit groups to - // eliminate unnecessary tests. - if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) { - mInnerFields.mUpdateRotation = true; - doRequest = true; - } - if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) { - mInnerFields.mWallpaperMayChange = true; - doRequest = true; - } - if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) { - mInnerFields.mWallpaperForceHidingChanged = true; - doRequest = true; - } - if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) == 0) { - mInnerFields.mOrientationChangeComplete = false; - } else { - mInnerFields.mOrientationChangeComplete = true; - if (mWindowsFreezingScreen) { - doRequest = true; - } - } - if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) { - mTurnOnScreen = true; - } - SparseIntArray pendingLayouts = animToLayout.mPendingLayoutChanges; - final int count = pendingLayouts.size(); - if (count > 0) { + final int bulkUpdateParams = mAnimator.mBulkUpdateParams; + // TODO(cmautner): As the number of bits grows, use masks of bit groups to + // eliminate unnecessary tests. + if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) { + mInnerFields.mUpdateRotation = true; + doRequest = true; + } + if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) { + mInnerFields.mWallpaperMayChange = true; + doRequest = true; + } + if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) { + mInnerFields.mWallpaperForceHidingChanged = true; + doRequest = true; + } + if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) == 0) { + mInnerFields.mOrientationChangeComplete = false; + } else { + mInnerFields.mOrientationChangeComplete = true; + if (mWindowsFreezingScreen) { doRequest = true; } - for (int i = 0; i < count; ++i) { - final DisplayContent displayContent = - getDisplayContentLocked(pendingLayouts.keyAt(i)); - if (displayContent != null) { - displayContent.pendingLayoutChanges |= pendingLayouts.valueAt(i); - } - } + } + if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) { + mTurnOnScreen = true; + } + if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_ACTION_PENDING) != 0) { + mInnerFields.mWallpaperActionPending = true; + } - mWindowDetachedWallpaper = animToLayout.mWindowDetachedWallpaper; + SparseIntArray pendingLayouts = mAnimator.mPendingLayoutChanges; + final int count = pendingLayouts.size(); + if (count > 0) { + doRequest = true; } + for (int i = 0; i < count; ++i) { + final DisplayContent displayContent = + getDisplayContentLocked(pendingLayouts.keyAt(i)); + if (displayContent != null) { + displayContent.pendingLayoutChanges |= pendingLayouts.valueAt(i); + } + } + return doRequest; } @@ -9472,7 +9364,7 @@ public class WindowManagerService extends IWindowManager.Stub if (screenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION, mTransitionAnimationScale, displayInfo.logicalWidth, displayInfo.logicalHeight)) { - updateLayoutToAnimationLocked(); + scheduleAnimationLocked(); } else { screenRotationAnimation.kill(); screenRotationAnimation = null; @@ -9668,14 +9560,17 @@ public class WindowManagerService extends IWindowManager.Stub return mPolicy.hasNavigationBar(); } + @Override public void lockNow(Bundle options) { mPolicy.lockNow(options); } + @Override public boolean isSafeModeEnabled() { return mSafeMode; } + @Override public void showAssistant() { // TODO: What permission? if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER) @@ -10015,31 +9910,6 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(" mStartingIconInTransition="); pw.print(mStartingIconInTransition); pw.print(" mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation); pw.println(" mLayoutToAnim:"); - pw.print(" mParamsModified="); pw.print(mLayoutToAnim.mParamsModified); - pw.print(" mAnimationScheduled="); pw.print(mLayoutToAnim.mAnimationScheduled); - pw.print(" mChanges=0x"); - pw.println(Long.toHexString(mLayoutToAnim.mChanges)); - pw.print(" mWallpaperTarget="); pw.println(mLayoutToAnim.mWallpaperTarget); - if (mLayoutToAnim.mLowerWallpaperTarget != null - || mLayoutToAnim.mUpperWallpaperTarget != null) { - pw.print(" mLowerWallpaperTarget="); - pw.println(mLayoutToAnim.mLowerWallpaperTarget); - pw.print(" mUpperWallpaperTarget="); - pw.println(mLayoutToAnim.mUpperWallpaperTarget); - } - for (int i=0; i 0) { -- cgit v1.2.3-59-g8ed1b