summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Craig Mautner <cmautner@google.com> 2012-12-04 14:29:11 -0800
committer Craig Mautner <cmautner@google.com> 2012-12-04 16:20:08 -0800
commit968683335e17c06504a11bc2e38a2580f613ea16 (patch)
treeb7643ed4e77a9cd507dc47b16fe876d25bcc763a
parent83323f427d3c3e9b9a76c4cb6f76a5707cc686bd (diff)
Recouple layout and animation a bit.
Share state between layout and animation and stop copying redundant data between the two. Change-Id: If07d3fc3ddfd33e3d46bf45d24d7aca58067ee66
-rw-r--r--services/java/com/android/server/wm/AppWindowAnimator.java2
-rw-r--r--services/java/com/android/server/wm/AppWindowToken.java3
-rw-r--r--services/java/com/android/server/wm/DisplayMagnificationMediator.java2
-rw-r--r--services/java/com/android/server/wm/WindowAnimator.java304
-rw-r--r--services/java/com/android/server/wm/WindowManagerService.java320
-rw-r--r--services/java/com/android/server/wm/WindowState.java8
-rw-r--r--services/java/com/android/server/wm/WindowStateAnimator.java27
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<WindowState> allAppWindows = new ArrayList<WindowState>();
+ 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<DisplayContentsAnimator> mDisplayContentsAnimators =
new SparseArray<WindowAnimator.DisplayContentsAnimator>();
- static final int WALLPAPER_ACTION_PENDING = 1;
- int mPendingActions;
-
- WindowState mWallpaperTarget = null;
- AppWindowAnimator mWpAppAnimator = null;
- WindowState mLowerWallpaperTarget = null;
- WindowState mUpperWallpaperTarget = null;
-
- ArrayList<AppWindowAnimator> mAppAnimators = new ArrayList<AppWindowAnimator>();
-
- ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
-
- /** 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<WindowToken>(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<WindowToken> wallpaperTokens) {
+ void hideWallpapersLocked(final WindowState w) {
+ final WindowState wallpaperTarget = mService.mWallpaperTarget;
+ final WindowState lowerWallpaperTarget = mService.mLowerWallpaperTarget;
+ final ArrayList<WindowToken> 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<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
+ final int NAT = appTokens.size();
for (i=0; i<NAT; i++) {
- final AppWindowAnimator appAnimator = mAppAnimators.get(i);
+ final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
final boolean wasAnimating = appAnimator.animation != null
&& appAnimator.animation != AppWindowAnimator.sDummyAnimation;
if (appAnimator.stepAnimationLocked(mCurrentTime)) {
@@ -335,15 +208,14 @@ public class WindowAnimator {
private void updateWindowsLocked(final int displayId) {
++mAnimTransactionSequence;
- final WinAnimatorList winAnimatorList =
- getDisplayContentsAnimatorLocked(displayId).mWinAnimators;
+ final WindowList windows = mService.getWindowListLocked(displayId);
ArrayList<WindowStateAnimator> 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<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
+ final int NT = appTokens.size();
for (int i=0; i<NT; i++) {
- AppWindowAnimator appAnimator = mAppAnimators.get(i);
- AppWindowToken wtoken = appAnimator.mAppToken;
+ AppWindowToken wtoken = appTokens.get(i);
+ AppWindowAnimator appAnimator = wtoken.mAppAnimator;
final boolean allDrawn = wtoken.allDrawn;
if (allDrawn != appAnimator.allDrawn) {
appAnimator.allDrawn = allDrawn;
@@ -671,10 +546,10 @@ public class WindowAnimator {
// associated with exiting/removed apps
performAnimationsLocked(displayId);
- final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators;
- final int N = winAnimatorList.size();
+ final WindowList windows = mService.getWindowListLocked(displayId);
+ final int N = windows.size();
for (int j = 0; j < N; j++) {
- winAnimatorList.get(j).prepareSurfaceLocked(true);
+ windows.get(j).mWinAnimator.prepareSurfaceLocked(true);
}
}
@@ -715,18 +590,18 @@ public class WindowAnimator {
for (int i = mPendingLayoutChanges.size() - 1; 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<displayAnimator.mWinAnimators.size(); j++) {
- WindowStateAnimator wanim = displayAnimator.mWinAnimators.get(j);
+ final WindowList windows =
+ mService.getWindowListLocked(mDisplayContentsAnimators.keyAt(i));
+ final int N = windows.size();
+ for (int j = 0; j < N; j++) {
+ WindowStateAnimator wanim = windows.get(j).mWinAnimator;
pw.print(subPrefix); pw.print("Window #"); pw.print(j);
pw.print(": "); pw.println(wanim);
}
@@ -867,34 +707,16 @@ public class WindowAnimator {
pw.print(Integer.toHexString(mBulkUpdateParams));
pw.println(bulkUpdateParamsToString(mBulkUpdateParams));
}
- if (mPendingActions != 0) {
- pw.print(prefix); pw.print("mPendingActions=0x");
- pw.println(Integer.toHexString(mPendingActions));
- }
if (mWindowDetachedWallpaper != null) {
pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
pw.println(mWindowDetachedWallpaper);
}
- pw.print(prefix); pw.print("mWallpaperTarget="); pw.println(mWallpaperTarget);
- pw.print(prefix); pw.print("mWpAppAnimator="); pw.println(mWpAppAnimator);
- if (mLowerWallpaperTarget != null || mUpperWallpaperTarget != null) {
- pw.print(prefix); pw.print("mLowerWallpaperTarget=");
- pw.println(mLowerWallpaperTarget);
- pw.print(prefix); pw.print("mUpperWallpaperTarget=");
- pw.println(mUpperWallpaperTarget);
- }
if (mUniverseBackground != null) {
pw.print(prefix); pw.print("mUniverseBackground="); pw.print(mUniverseBackground);
pw.print(" mAboveUniverseLayer="); pw.println(mAboveUniverseLayer);
}
}
- void clearPendingActions() {
- synchronized (this) {
- mPendingActions = 0;
- }
- }
-
void setPendingLayoutChanges(final int displayId, final int changes) {
mPendingLayoutChanges.put(displayId, mPendingLayoutChanges.get(displayId) | changes);
}
@@ -902,9 +724,9 @@ public class WindowAnimator {
void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) {
// Used to track which displays layout changes have been done.
SparseIntArray displays = new SparseIntArray();
- for (int i = appAnimator.mAllAppWinAnimators.size() - 1; i >= 0; i--) {
- WindowStateAnimator winAnimator = appAnimator.mAllAppWinAnimators.get(i);
- final int displayId = winAnimator.mWin.mDisplayContent.getDisplayId();
+ WindowList windows = appAnimator.mAppToken.allAppWindows;
+ for (int i = windows.size() - 1; i >= 0; i--) {
+ final int displayId = windows.get(i).getDisplayId();
if (displays.indexOfKey(displayId) < 0) {
setPendingLayoutChanges(displayId, changes);
if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
@@ -916,6 +738,27 @@ public class WindowAnimator {
}
}
+ void setDimParamsLocked(int displayId, DimAnimator.Parameters dimParams) {
+ DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.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);
+ }
+ }
+ }
+
private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
if (displayAnimator == null) {
@@ -934,7 +777,6 @@ public class WindowAnimator {
}
private class DisplayContentsAnimator {
- WinAnimatorList mWinAnimators = new WinAnimatorList();
DimAnimator mDimAnimator = null;
DimAnimator.Parameters mDimParams = null;
DimSurface mWindowAnimationBackgroundSurface = null;
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 9041a9bf09ef..359bf57533dd 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -125,7 +125,6 @@ import android.view.InputDevice;
import android.view.InputEvent;
import android.view.InputEventReceiver;
import android.view.KeyEvent;
-import android.view.MagnificationSpec;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.SurfaceSession;
@@ -522,7 +521,7 @@ public class WindowManagerService extends IWindowManager.Stub
WindowState mLowerWallpaperTarget = null;
// If non-null, we are in the middle of animating from one wallpaper target
// to another, and this is the higher one in Z-order.
- private WindowState mUpperWallpaperTarget = null;
+ WindowState mUpperWallpaperTarget = null;
int mWallpaperAnimLayerAdjustment;
float mLastWallpaperX = -1;
float mLastWallpaperY = -1;
@@ -566,6 +565,7 @@ public class WindowManagerService extends IWindowManager.Stub
static final int SET_FORCE_HIDING_CHANGED = 1 << 2;
static final int SET_ORIENTATION_CHANGE_COMPLETE = 1 << 3;
static final int SET_TURN_ON_SCREEN = 1 << 4;
+ static final int SET_WALLPAPER_ACTION_PENDING = 1 << 5;
boolean mWallpaperForceHidingChanged = false;
boolean mWallpaperMayChange = false;
@@ -579,6 +579,7 @@ public class WindowManagerService extends IWindowManager.Stub
private float mButtonBrightness = -1;
private long mUserActivityTimeout = -1;
private boolean mUpdateRotation = false;
+ boolean mWallpaperActionPending = false;
private static final int DISPLAY_CONTENT_UNKNOWN = 0;
private static final int DISPLAY_CONTENT_MIRROR = 1;
@@ -603,27 +604,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- static class LayoutToAnimatorParams {
- boolean mParamsModified;
-
- static final long WALLPAPER_TOKENS_CHANGED = 1 << 0;
- long mChanges;
-
- boolean mAnimationScheduled;
- SparseArray<WinAnimatorList> mWinAnimatorLists = new SparseArray<WinAnimatorList>();
- WindowState mWallpaperTarget;
- WindowState mLowerWallpaperTarget;
- WindowState mUpperWallpaperTarget;
- SparseArray<DimAnimator.Parameters> mDimParams = new SparseArray<DimAnimator.Parameters>();
- ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
- ArrayList<AppWindowAnimParams> mAppWindowAnimParams = new ArrayList<AppWindowAnimParams>();
- }
- /** Params from WindowManagerService to WindowAnimator. Do not modify or read without first
- * locking on either mWindowMap or mAnimator and then on mLayoutToAnim */
- final LayoutToAnimatorParams mLayoutToAnim = new LayoutToAnimatorParams();
-
- /** The lowest wallpaper target with a detached wallpaper animation on it. */
- WindowState mWindowDetachedWallpaper = null;
+ boolean mAnimationScheduled;
/** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
* is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
@@ -703,9 +684,6 @@ public class WindowManagerService extends IWindowManager.Stub
*/
boolean mInTouchMode = true;
- // Temp regions for intermediary calculations.
- private final Region mTempRegion = new Region();
-
private ViewServer mViewServer;
private ArrayList<WindowChangeListener> mWindowChangeListeners =
new ArrayList<WindowChangeListener>();
@@ -1592,7 +1570,7 @@ public class WindowManagerService extends IWindowManager.Stub
continue;
}
topCurW = null;
- if (w != mWindowDetachedWallpaper && w.mAppToken != null) {
+ if (w != mAnimator.mWindowDetachedWallpaper && w.mAppToken != null) {
// If this window's app token is hidden and not animating,
// it is of no interest to us.
if (w.mAppToken.hidden && w.mAppToken.mAppAnimator.animation == null) {
@@ -1618,7 +1596,7 @@ public class WindowManagerService extends IWindowManager.Stub
continue;
}
break;
- } else if (w == mWindowDetachedWallpaper) {
+ } else if (w == mAnimator.mWindowDetachedWallpaper) {
windowDetachedI = i;
}
}
@@ -2817,7 +2795,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
if ((attrChanges&WindowManager.LayoutParams.FORMAT_CHANGED) != 0) {
// To change the format, we need to re-build the surface.
- winAnimator.destroySurfaceLocked(false);
+ winAnimator.destroySurfaceLocked();
toBeDisplayed = true;
surfaceChanged = true;
}
@@ -2898,7 +2876,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (mInputMethodWindow == win) {
mInputMethodWindow = null;
}
- winAnimator.destroySurfaceLocked(false);
+ winAnimator.destroySurfaceLocked();
}
if (mMagnificationMediator != null) {
mMagnificationMediator.onWindowTransitionLw(win, transit);
@@ -3002,7 +2980,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (win == null) {
return;
}
- win.mWinAnimator.destroyDeferredSurfaceLocked(false);
+ win.mWinAnimator.destroyDeferredSurfaceLocked();
}
} finally {
Binder.restoreCallingIdentity(origId);
@@ -3179,7 +3157,6 @@ public class WindowManagerService extends IWindowManager.Stub
mTokenMap.put(token, wtoken);
if (type == TYPE_WALLPAPER) {
mWallpaperTokens.add(wtoken);
- updateLayoutToAnimWallpaperTokens();
}
}
}
@@ -3231,7 +3208,6 @@ public class WindowManagerService extends IWindowManager.Stub
mExitingTokens.add(wtoken);
} else if (wtoken.windowType == TYPE_WALLPAPER) {
mWallpaperTokens.remove(wtoken);
- updateLayoutToAnimWallpaperTokens();
}
}
@@ -5593,7 +5569,7 @@ public class WindowManagerService extends IWindowManager.Stub
rotation, mFxSession,
MAX_ANIMATION_DURATION, mTransitionAnimationScale,
displayInfo.logicalWidth, displayInfo.logicalHeight)) {
- updateLayoutToAnimationLocked();
+ scheduleAnimationLocked();
}
}
@@ -6641,19 +6617,17 @@ public class WindowManagerService extends IWindowManager.Stub
public static final int REPORT_HARD_KEYBOARD_STATUS_CHANGE = 22;
public static final int BOOT_TIMEOUT = 23;
public static final int WAITING_FOR_DRAWN_TIMEOUT = 24;
- public static final int UPDATE_ANIM_PARAMETERS = 25;
- public static final int SHOW_STRICT_MODE_VIOLATION = 26;
- public static final int DO_ANIMATION_CALLBACK = 27;
+ public static final int SHOW_STRICT_MODE_VIOLATION = 25;
+ public static final int DO_ANIMATION_CALLBACK = 26;
- public static final int DO_DISPLAY_ADDED = 28;
- public static final int DO_DISPLAY_REMOVED = 29;
- public static final int DO_DISPLAY_CHANGED = 30;
+ public static final int DO_DISPLAY_ADDED = 27;
+ public static final int DO_DISPLAY_REMOVED = 28;
+ public static final int DO_DISPLAY_CHANGED = 29;
- public static final int CLIENT_FREEZE_TIMEOUT = 31;
+ public static final int CLIENT_FREEZE_TIMEOUT = 30;
public static final int ANIMATOR_WHAT_OFFSET = 100000;
public static final int SET_TRANSPARENT_REGION = ANIMATOR_WHAT_OFFSET + 1;
- public static final int CLEAR_PENDING_ACTIONS = ANIMATOR_WHAT_OFFSET + 2;
public H() {
}
@@ -6933,20 +6907,18 @@ public class WindowManagerService extends IWindowManager.Stub
case FORCE_GC: {
synchronized (mWindowMap) {
- synchronized (mAnimator) {
- // Since we're holding both mWindowMap and mAnimator we don't need to
- // hold mAnimator.mLayoutToAnim.
- 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.
- sendEmptyMessageDelayed(H.FORCE_GC, 2000);
- return;
- }
- // If we are currently rotating the display, it will
- // schedule a new message when done.
- if (mDisplayFrozen) {
- return;
- }
+ // Since we're holding both mWindowMap and mAnimator we don't need to
+ // hold mAnimator.mLayoutToAnim.
+ if (mAnimator.mAnimating || mAnimationScheduled) {
+ // If we are animating, don't do the gc now but
+ // delay a bit so we don't interrupt the animation.
+ sendEmptyMessageDelayed(H.FORCE_GC, 2000);
+ return;
+ }
+ // If we are currently rotating the display, it will
+ // schedule a new message when done.
+ if (mDisplayFrozen) {
+ return;
}
}
Runtime.getRuntime().gc();
@@ -6960,16 +6932,14 @@ public class WindowManagerService extends IWindowManager.Stub
case APP_FREEZE_TIMEOUT: {
synchronized (mWindowMap) {
- synchronized (mAnimator) {
- 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);
- }
+ 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<WinAnimatorList> 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<AppWindowAnimParams> 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<WindowToken>(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<mLayoutToAnim.mWinAnimatorLists.size(); i++) {
- pw.print(" Win Animator List #");
- pw.print(mLayoutToAnim.mWinAnimatorLists.keyAt(i)); pw.println(":");
- WinAnimatorList wanim = mLayoutToAnim.mWinAnimatorLists.valueAt(i);
- for (int wi=0; wi<wanim.size(); wi++) {
- pw.print(" "); pw.println(wanim.get(wi));
- }
- }
- for (int i=0; i<mLayoutToAnim.mWallpaperTokens.size(); i++) {
- pw.print(" Wallpaper Token #"); pw.print(i); pw.print(": ");
- pw.println(mLayoutToAnim.mWallpaperTokens.get(i));
- }
- // XXX also need to print mDimParams and mAppWindowAnimParams. I am lazy.
mAppTransition.dump(pw);
}
}
@@ -10250,6 +10120,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
// Called by the heartbeat to ensure locks are not held indefnitely (for deadlock detection).
+ @Override
public void monitor() {
synchronized (mWindowMap) { }
}
@@ -10391,7 +10262,16 @@ public class WindowManagerService extends IWindowManager.Stub
* @return The list of WindowStates on the screen, or null if the there is no screen.
*/
public WindowList getWindowListLocked(final Display display) {
- final DisplayContent displayContent = getDisplayContentLocked(display.getDisplayId());
+ return getWindowListLocked(display.getDisplayId());
+ }
+
+ /**
+ * Return the list of WindowStates associated on the passed display.
+ * @param displayId The screen to return windows from.
+ * @return The list of WindowStates on the screen, or null if the there is no screen.
+ */
+ public WindowList getWindowListLocked(final int displayId) {
+ final DisplayContent displayContent = getDisplayContentLocked(displayId);
return displayContent != null ? displayContent.getWindowList() : null;
}
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index 541e8594bb8a..d352804f6bb5 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -872,8 +872,8 @@ final class WindowState implements WindowManagerPolicy.WindowState {
if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + this + " from " + mAttachedWindow);
mAttachedWindow.mChildWindows.remove(this);
}
- mWinAnimator.destroyDeferredSurfaceLocked(false);
- mWinAnimator.destroySurfaceLocked(false);
+ mWinAnimator.destroyDeferredSurfaceLocked();
+ mWinAnimator.destroySurfaceLocked();
mSession.windowRemovedLocked();
try {
mClient.asBinder().unlinkToDeath(mDeathRecipient, 0);
@@ -974,7 +974,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
mWinAnimator.applyAnimationLocked(WindowManagerPolicy.TRANSIT_ENTER, true);
}
if (requestAnim) {
- mService.updateLayoutToAnimationLocked();
+ mService.scheduleAnimationLocked();
}
return true;
}
@@ -1017,7 +1017,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
}
}
if (requestAnim) {
- mService.updateLayoutToAnimationLocked();
+ mService.scheduleAnimationLocked();
}
return true;
}
diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java
index 3c9424a7e0be..d492993f325f 100644
--- a/services/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/java/com/android/server/wm/WindowStateAnimator.java
@@ -226,7 +226,7 @@ class WindowStateAnimator {
mAnimation.cancel();
mAnimation = null;
mLocalAnimating = false;
- destroySurfaceLocked(true);
+ destroySurfaceLocked();
}
}
@@ -413,7 +413,7 @@ class WindowStateAnimator {
mService.mPendingRemove.add(mWin);
mWin.mRemoveOnExit = false;
}
- mAnimator.hideWallpapersLocked(mWin, true);
+ mAnimator.hideWallpapersLocked(mWin);
}
void hide() {
@@ -752,7 +752,7 @@ class WindowStateAnimator {
return mSurface;
}
- void destroySurfaceLocked(boolean fromAnimator) {
+ void destroySurfaceLocked() {
if (mWin.mAppToken != null && mWin == mWin.mAppToken.startingWindow) {
mWin.mAppToken.startingDisplayed = false;
}
@@ -802,7 +802,7 @@ class WindowStateAnimator {
}
mSurface.destroy();
}
- mAnimator.hideWallpapersLocked(mWin, fromAnimator);
+ mAnimator.hideWallpapersLocked(mWin);
} catch (RuntimeException e) {
Slog.w(TAG, "Exception thrown when destroying Window " + this
+ " surface " + mSurface + " session " + mSession
@@ -816,7 +816,7 @@ class WindowStateAnimator {
}
}
- void destroyDeferredSurfaceLocked(boolean fromAnimator) {
+ void destroyDeferredSurfaceLocked() {
try {
if (mPendingDestroySurface != null) {
if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) {
@@ -828,7 +828,7 @@ class WindowStateAnimator {
WindowManagerService.logSurface(mWin, "DESTROY PENDING", e);
}
mPendingDestroySurface.destroy();
- mAnimator.hideWallpapersLocked(mWin, fromAnimator);
+ mAnimator.hideWallpapersLocked(mWin);
}
} catch (RuntimeException e) {
Slog.w(TAG, "Exception thrown when destroying Window "
@@ -849,9 +849,9 @@ class WindowStateAnimator {
// Wallpapers are animated based on the "real" window they
// are currently targeting.
- if (mIsWallpaper && mAnimator.mLowerWallpaperTarget == null
- && mAnimator.mWallpaperTarget != null) {
- final WindowStateAnimator wallpaperAnimator = mAnimator.mWallpaperTarget.mWinAnimator;
+ if (mIsWallpaper && mService.mLowerWallpaperTarget == null
+ && mService.mWallpaperTarget != null) {
+ final WindowStateAnimator wallpaperAnimator = mService.mWallpaperTarget.mWinAnimator;
if (wallpaperAnimator.mHasLocalTransformation &&
wallpaperAnimator.mAnimation != null &&
!wallpaperAnimator.mAnimation.getDetachWallpaper()) {
@@ -860,7 +860,7 @@ class WindowStateAnimator {
Slog.v(TAG, "WP target attached xform: " + attachedTransformation);
}
}
- final AppWindowAnimator wpAppAnimator = mAnimator.mWpAppAnimator;
+ final AppWindowAnimator wpAppAnimator = mAnimator.getWallpaperAppAnimator();
if (wpAppAnimator != null && wpAppAnimator.hasTransformation
&& wpAppAnimator.animation != null
&& !wpAppAnimator.animation.getDetachWallpaper()) {
@@ -986,8 +986,7 @@ class WindowStateAnimator {
+ " screen=" + (screenAnimation ?
screenRotationAnimation.getEnterTransformation().getAlpha() : "null"));
return;
- } else if (mIsWallpaper &&
- (mAnimator.mPendingActions & WindowAnimator.WALLPAPER_ACTION_PENDING) != 0) {
+ } else if (mIsWallpaper && mService.mInnerFields.mWallpaperActionPending) {
return;
}
@@ -1220,7 +1219,7 @@ class WindowStateAnimator {
hide();
} else if (w.mAttachedHidden || !w.isReadyForDisplay()) {
hide();
- mAnimator.hideWallpapersLocked(w, true);
+ mAnimator.hideWallpapersLocked(w);
// If we are waiting for this window to handle an
// orientation change, well, it is hidden, so
@@ -1414,7 +1413,7 @@ class WindowStateAnimator {
if (DEBUG_SURFACE_TRACE || DEBUG_ANIM)
Slog.v(TAG, "performShowLocked: mDrawState=HAS_DRAWN in " + this);
mDrawState = HAS_DRAWN;
- mService.updateLayoutToAnimationLocked();
+ mService.scheduleAnimationLocked();
int i = mWin.mChildWindows.size();
while (i > 0) {