From 711f90a7c1e99a435fa8f5335f13772f0b41270b Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Tue, 3 Jul 2012 18:43:52 -0700 Subject: [PATCH] Swap source and destination transfer objects. It will be better to have the object that moves layout parameters to animation on the layout side, and the object that moves animation parameters back to layout on the animation side. That way we can do partial filling of these objects without calling across. We may never do partial draining of these objects. Change-Id: I88826fa97350f96e309beef386885f55a9a73305 --- .../com/android/server/wm/WindowAnimator.java | 57 +++++++--------- .../server/wm/WindowManagerService.java | 68 +++++++++++-------- .../com/android/server/wm/WindowState.java | 4 +- .../server/wm/WindowStateAnimator.java | 2 +- 4 files changed, 68 insertions(+), 63 deletions(-) diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index abe7ff3793dcf..4d32bcc5af072 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -10,17 +10,19 @@ import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPA import static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED; import static com.android.server.wm.WindowManagerService.H.SET_DIM_PARAMETERS; +import static com.android.server.wm.WindowManagerService.H.UPDATE_ANIM_PARAMETERS; import android.content.Context; import android.os.SystemClock; import android.util.Log; import android.util.Slog; -import android.view.Choreographer; import android.view.Surface; import android.view.WindowManagerPolicy; import android.view.animation.Animation; import com.android.internal.policy.impl.PhoneWindowManager; +import com.android.server.wm.WindowManagerService.AnimatorToLayoutParams; +import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams; import java.io.PrintWriter; import java.util.ArrayList; @@ -36,22 +38,10 @@ public class WindowAnimator { final Context mContext; final WindowManagerPolicy mPolicy; - final Choreographer mChoreographer = Choreographer.getInstance(); - ArrayList mWinAnimators = new ArrayList(); boolean mAnimating; - static class LayoutToAnimatorParams { - boolean mAnimationScheduled; - ArrayList mWinAnimators = new ArrayList(); - WindowState mWallpaperTarget; - } - /** Params from WindowManagerService. Do not modify or read without first locking on - * either WindowManagerService.mWindowMap or WindowManagerService.mAnimator.and then on - * mLayoutToAnim */ - final LayoutToAnimatorParams mLayoutToAnim = new LayoutToAnimatorParams(); - final Runnable mAnimationRunnable; int mAdjResult; @@ -95,6 +85,8 @@ public class WindowAnimator { WindowState mWallpaperTarget = null; + final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams(); + WindowAnimator(final WindowManagerService service, final Context context, final WindowManagerPolicy policy) { mService = service; @@ -118,9 +110,24 @@ public class WindowAnimator { mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession); } + /** Locked on mAnimToLayout */ + void updateAnimToLayoutLocked() { + final AnimatorToLayoutParams animToLayout = mAnimToLayout; + synchronized (animToLayout) { + animToLayout.mBulkUpdateParams = mBulkUpdateParams; + animToLayout.mPendingLayoutChanges = mPendingLayoutChanges; + animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper; + + if (!animToLayout.mUpdateQueued) { + animToLayout.mUpdateQueued = true; + mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS)); + } + } + } + /** Copy all WindowManagerService params into local params here. Locked on 'this'. */ private void copyLayoutToAnimParamsLocked() { - final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim; + final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim; synchronized(layoutToAnim) { layoutToAnim.mAnimationScheduled = false; @@ -129,16 +136,6 @@ public class WindowAnimator { } } - /** Note that Locked in this case is on mLayoutToAnim */ - void scheduleAnimationLocked() { - final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim; - if (!layoutToAnim.mAnimationScheduled) { - layoutToAnim.mAnimationScheduled = true; - mChoreographer.postCallback( - Choreographer.CALLBACK_ANIMATION, mAnimationRunnable, null); - } - } - void hideWallpapersLocked(final WindowState w) { if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null) || mService.mWallpaperTarget == null) { @@ -544,18 +541,12 @@ public class WindowAnimator { } if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) { - final WindowManagerService.AnimatorToLayoutParams animToLayout = mService.mAnimToLayout; - synchronized (animToLayout) { - animToLayout.mBulkUpdateParams = mBulkUpdateParams; - animToLayout.mPendingLayoutChanges = mPendingLayoutChanges; - animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper; - mService.setAnimatorParametersLocked(); - } + updateAnimToLayoutLocked(); } if (mAnimating) { - synchronized (mLayoutToAnim) { - scheduleAnimationLocked(); + synchronized (mService.mLayoutToAnim) { + mService.scheduleAnimationLocked(); } } else if (wasAnimating) { mService.requestTraversalLocked(); diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 1dd7751af5d15..6ae8df1c441fb 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -98,7 +98,7 @@ import android.util.DisplayMetrics; import android.util.EventLog; import android.util.FloatMath; import android.util.Log; -import android.util.LogPrinter; +//import android.util.LogPrinter; import android.util.Pair; import android.util.Slog; import android.util.SparseIntArray; @@ -648,7 +648,8 @@ public class WindowManagerService extends IWindowManager.Stub } final LayoutFields mInnerFields = new LayoutFields(); - /* Parameters being passed from mAnimator into this. + // TODO: Move this into WindowAnimator. For some reason it causes the H class to blow up. + /* Parameters being passed from mAnimator into this. * Do not modify unless holding (mWindowMap or mAnimator) and mAnimToLayout in that order */ static class AnimatorToLayoutParams { boolean mUpdateQueued; @@ -656,7 +657,17 @@ public class WindowManagerService extends IWindowManager.Stub int mPendingLayoutChanges; WindowState mWindowDetachedWallpaper; } - final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams(); + + static class LayoutToAnimatorParams { + boolean mAnimationScheduled; + ArrayList mWinAnimators = new ArrayList(); + WindowState mWallpaperTarget; + DimAnimator.Parameters mDimParams; + } + /** Params from WindowManagerService . Do not modify or read without first locking on + * either WindowManagerService.mWindowMap or WindowManagerService.mAnimator.and then on + * mLayoutToAnim */ + final LayoutToAnimatorParams mLayoutToAnim = new LayoutToAnimatorParams(); /** The lowest wallpaper target with a detached wallpaper animation on it. */ WindowState mWindowDetachedWallpaper = null; @@ -841,7 +852,7 @@ public class WindowManagerService extends IWindowManager.Stub public void run() { Looper.prepare(); WindowManagerPolicyThread.set(this, Looper.myLooper()); - + //Looper.myLooper().setMessageLogging(new LogPrinter( // Log.VERBOSE, "WindowManagerPolicy", Log.LOG_ID_SYSTEM)); android.os.Process.setThreadPriority( @@ -1754,7 +1765,7 @@ public class WindowManagerService extends IWindowManager.Stub mWallpaperTarget = oldW; foundW = oldW; foundI = oldI; - } + } // Now set the upper and lower wallpaper targets // correctly, and make sure that we are positioning // the wallpaper below the lower. @@ -2140,7 +2151,7 @@ public class WindowManagerService extends IWindowManager.Stub } } } - + public int addWindow(Session session, IWindow client, int seq, WindowManager.LayoutParams attrs, int viewVisibility, Rect outContentInsets, InputChannel outInputChannel) { @@ -3730,6 +3741,7 @@ public class WindowManagerService extends IWindowManager.Stub return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; } + @Override public Configuration updateOrientationFromAppTokens( Configuration currentConfig, IBinder freezeThisOneIfNeeded) { if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, @@ -5796,7 +5808,7 @@ public class WindowManagerService extends IWindowManager.Stub if (mAnimator.mScreenRotationAnimation.setRotation(rotation, mFxSession, MAX_ANIMATION_DURATION, mTransitionAnimationScale, mCurDisplayWidth, mCurDisplayHeight)) { - scheduleAnimationLocked(); + updateLayoutToAnimationLocked(); } } Surface.setOrientation(0, rotation); @@ -7213,8 +7225,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mAnimator) { // Since we're holding both mWindowMap and mAnimator we don't need to // hold mAnimator.mLayoutToAnim. - if (mAnimator.mAnimating || - mAnimator.mLayoutToAnim.mAnimationScheduled) { + if (mAnimator.mAnimating || mLayoutToAnim.mAnimationScheduled) { // If we are animating, don't do the gc now but // delay a bit so we don't interrupt the animation. mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC), @@ -7332,10 +7343,11 @@ public class WindowManagerService extends IWindowManager.Stub case UPDATE_ANIM_PARAMETERS: { // Used to send multiple changes from the animation side to the layout side. synchronized (mWindowMap) { - synchronized (mAnimToLayout) { - mAnimToLayout.mUpdateQueued = false; + final AnimatorToLayoutParams animToLayout = mAnimator.mAnimToLayout; + synchronized (animToLayout) { + animToLayout.mUpdateQueued = false; boolean doRequest = false; - final int bulkUpdateParams = mAnimToLayout.mBulkUpdateParams; + 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) { @@ -7362,12 +7374,12 @@ public class WindowManagerService extends IWindowManager.Stub mTurnOnScreen = true; } - mPendingLayoutChanges |= mAnimToLayout.mPendingLayoutChanges; + mPendingLayoutChanges |= animToLayout.mPendingLayoutChanges; if (mPendingLayoutChanges != 0) { doRequest = true; } - mWindowDetachedWallpaper = mAnimToLayout.mWindowDetachedWallpaper; + mWindowDetachedWallpaper = animToLayout.mWindowDetachedWallpaper; if (doRequest) { mH.sendEmptyMessage(CLEAR_PENDING_ACTIONS); @@ -7812,7 +7824,7 @@ public class WindowManagerService extends IWindowManager.Stub } if (layerChanged && mAnimator.isDimming(winAnimator)) { // Force an animation pass just to update the mDimAnimator layer. - scheduleAnimationLocked(); + updateLayoutToAnimationLocked(); } if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": " + winAnimator.mAnimLayer); @@ -9032,7 +9044,7 @@ public class WindowManagerService extends IWindowManager.Stub // be enabled, because the window obscured flags have changed. enableScreenIfNeededLocked(); - scheduleAnimationLocked(); + updateLayoutToAnimationLocked(); if (DEBUG_WINDOW_TRACE) { Slog.e(TAG, "performLayoutAndPlaceSurfacesLockedInner exit: mPendingLayoutChanges=" @@ -9109,8 +9121,18 @@ public class WindowManagerService extends IWindowManager.Stub } } + /** Note that Locked in this case is on mLayoutToAnim */ void scheduleAnimationLocked() { - final WindowAnimator.LayoutToAnimatorParams layoutToAnim = mAnimator.mLayoutToAnim; + final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim; + if (!layoutToAnim.mAnimationScheduled) { + layoutToAnim.mAnimationScheduled = true; + mChoreographer.postCallback( + Choreographer.CALLBACK_ANIMATION, mAnimator.mAnimationRunnable, null); + } + } + + void updateLayoutToAnimationLocked() { + final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim; synchronized (layoutToAnim) { // Copy local params to transfer params. ArrayList winAnimators = layoutToAnim.mWinAnimators; @@ -9123,7 +9145,7 @@ public class WindowManagerService extends IWindowManager.Stub } } layoutToAnim.mWallpaperTarget = mWallpaperTarget; - mAnimator.scheduleAnimationLocked(); + scheduleAnimationLocked(); } } @@ -9431,7 +9453,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_ORIENTATION) Slog.i(TAG, "**** Dismissing screen rotation animation"); if (mAnimator.mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION, mTransitionAnimationScale, mCurDisplayWidth, mCurDisplayHeight)) { - scheduleAnimationLocked(); + updateLayoutToAnimationLocked(); } else { mAnimator.mScreenRotationAnimation.kill(); mAnimator.mScreenRotationAnimation = null; @@ -10209,12 +10231,4 @@ public class WindowManagerService extends IWindowManager.Stub Integer.toHexString(pendingLayoutChanges)); } } - - /** Locked on mAnimToLayout */ - void setAnimatorParametersLocked() { - if (!mAnimToLayout.mUpdateQueued) { - mAnimToLayout.mUpdateQueued = true; - mH.sendMessage(mH.obtainMessage(H.UPDATE_ANIM_PARAMETERS)); - } - } } diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index 99f1d06395067..248da74dd24ee 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -907,7 +907,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { mWinAnimator.applyAnimationLocked(WindowManagerPolicy.TRANSIT_ENTER, true); } if (requestAnim) { - mService.scheduleAnimationLocked(); + mService.updateLayoutToAnimationLocked(); } return true; } @@ -950,7 +950,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { } } if (requestAnim) { - mService.scheduleAnimationLocked(); + mService.updateLayoutToAnimationLocked(); } return true; } diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index 606558b126651..a788ceeb0d01f 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -1334,7 +1334,7 @@ class WindowStateAnimator { if (DEBUG_SURFACE_TRACE || DEBUG_ANIM) Slog.v(TAG, "performShowLocked: mDrawState=HAS_DRAWN in " + this); mDrawState = HAS_DRAWN; - mService.scheduleAnimationLocked(); + mService.updateLayoutToAnimationLocked(); int i = mWin.mChildWindows.size(); while (i > 0) {