summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorCraig Mautner <cmautner@google.com>2012-09-14 16:22:08 -0700
committerCraig Mautner <cmautner@google.com>2012-09-16 10:44:06 -0700
commita91f9e2959ee905f97977a88fe45bde6ffb874b0 (patch)
tree185f751ae22ea3576684a46874115d935e794d28 /services
parentd65afc65ea5b2bf83889dd88a9c94f895da8aece (diff)
downloadframeworks_base-a91f9e2959ee905f97977a88fe45bde6ffb874b0.zip
frameworks_base-a91f9e2959ee905f97977a88fe45bde6ffb874b0.tar.gz
frameworks_base-a91f9e2959ee905f97977a88fe45bde6ffb874b0.tar.bz2
Make more items per-Display.
Moving DimSurfaces, DimBackgrounds and Rotation surfaces into per-display class. Fixes bug 7167028. Change-Id: I7408b3a27b5a7a8d0d59e9d6109c002fc627e536
Diffstat (limited to 'services')
-rw-r--r--services/java/com/android/server/wm/AppWindowAnimator.java11
-rw-r--r--services/java/com/android/server/wm/DimAnimator.java8
-rw-r--r--services/java/com/android/server/wm/DisplayContent.java49
-rw-r--r--services/java/com/android/server/wm/WindowAnimator.java236
-rwxr-xr-xservices/java/com/android/server/wm/WindowManagerService.java107
-rw-r--r--services/java/com/android/server/wm/WindowStateAnimator.java43
6 files changed, 285 insertions, 169 deletions
diff --git a/services/java/com/android/server/wm/AppWindowAnimator.java b/services/java/com/android/server/wm/AppWindowAnimator.java
index c6b7e0d..2445b98 100644
--- a/services/java/com/android/server/wm/AppWindowAnimator.java
+++ b/services/java/com/android/server/wm/AppWindowAnimator.java
@@ -4,6 +4,7 @@ package com.android.server.wm;
import android.graphics.Matrix;
import android.util.Slog;
+import android.view.Display;
import android.view.Surface;
import android.view.WindowManagerPolicy;
import android.view.animation.Animation;
@@ -134,11 +135,13 @@ public class AppWindowAnimator {
thumbnailTransformation.clear();
thumbnailAnimation.getTransformation(currentTime, thumbnailTransformation);
thumbnailTransformation.getMatrix().preTranslate(thumbnailX, thumbnailY);
- final boolean screenAnimation = mAnimator.mScreenRotationAnimation != null
- && mAnimator.mScreenRotationAnimation.isAnimating();
+
+ ScreenRotationAnimation screenRotationAnimation =
+ mAnimator.getScreenRotationAnimationLocked(Display.DEFAULT_DISPLAY);
+ final boolean screenAnimation = screenRotationAnimation != null
+ && screenRotationAnimation.isAnimating();
if (screenAnimation) {
- thumbnailTransformation.postCompose(
- mAnimator.mScreenRotationAnimation.getEnterTransformation());
+ thumbnailTransformation.postCompose(screenRotationAnimation.getEnterTransformation());
}
// cache often used attributes locally
final float tmpFloats[] = mService.mTmpFloats;
diff --git a/services/java/com/android/server/wm/DimAnimator.java b/services/java/com/android/server/wm/DimAnimator.java
index 87a2880..9bca834 100644
--- a/services/java/com/android/server/wm/DimAnimator.java
+++ b/services/java/com/android/server/wm/DimAnimator.java
@@ -219,5 +219,13 @@ class DimAnimator {
mDimHeight = o.mDimHeight;
mDimTarget = o.mDimTarget;
}
+
+ public void printTo(String prefix, PrintWriter pw) {
+ pw.print(prefix);
+ pw.print("mDimWinAnimator="); pw.print(mDimWinAnimator.mWin.mAttrs.getTitle());
+ pw.print(" "); pw.print(mDimWidth); pw.print(" x ");
+ pw.print(mDimHeight);
+ pw.print(" mDimTarget="); pw.println(mDimTarget);
+ }
}
}
diff --git a/services/java/com/android/server/wm/DisplayContent.java b/services/java/com/android/server/wm/DisplayContent.java
index d1742ff..3898ebc 100644
--- a/services/java/com/android/server/wm/DisplayContent.java
+++ b/services/java/com/android/server/wm/DisplayContent.java
@@ -101,31 +101,32 @@ class DisplayContent {
mDisplay.getDisplayInfo(mDisplayInfo);
}
- public void dump(PrintWriter pw) {
- pw.print(" Display: mDisplayId="); pw.println(mDisplayId);
- pw.print(" init="); pw.print(mInitialDisplayWidth); pw.print("x");
- pw.print(mInitialDisplayHeight); pw.print(" "); pw.print(mInitialDisplayDensity);
- pw.print("dpi");
- if (mInitialDisplayWidth != mBaseDisplayWidth
- || mInitialDisplayHeight != mBaseDisplayHeight
- || mInitialDisplayDensity != mBaseDisplayDensity) {
- pw.print(" base=");
- pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight);
- pw.print(" "); pw.print(mBaseDisplayDensity); pw.print("dpi");
- }
- pw.print(" cur=");
- pw.print(mDisplayInfo.logicalWidth);
- pw.print("x"); pw.print(mDisplayInfo.logicalHeight);
- pw.print(" app=");
- pw.print(mDisplayInfo.appWidth);
- pw.print("x"); pw.print(mDisplayInfo.appHeight);
- pw.print(" rng="); pw.print(mDisplayInfo.smallestNominalAppWidth);
- pw.print("x"); pw.print(mDisplayInfo.smallestNominalAppHeight);
- pw.print("-"); pw.print(mDisplayInfo.largestNominalAppWidth);
- pw.print("x"); pw.println(mDisplayInfo.largestNominalAppHeight);
- pw.print(" layoutNeeded="); pw.println(layoutNeeded);
+ public void dump(String prefix, PrintWriter pw) {
+ pw.print(prefix); pw.print("Display: mDisplayId="); pw.println(mDisplayId);
+ final String subPrefix = " " + prefix;
+ pw.print(subPrefix); pw.print("init="); pw.print(mInitialDisplayWidth); pw.print("x");
+ pw.print(mInitialDisplayHeight); pw.print(" "); pw.print(mInitialDisplayDensity);
+ pw.print("dpi");
+ if (mInitialDisplayWidth != mBaseDisplayWidth
+ || mInitialDisplayHeight != mBaseDisplayHeight
+ || mInitialDisplayDensity != mBaseDisplayDensity) {
+ pw.print(" base=");
+ pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight);
+ pw.print(" "); pw.print(mBaseDisplayDensity); pw.print("dpi");
+ }
+ pw.print(" cur=");
+ pw.print(mDisplayInfo.logicalWidth);
+ pw.print("x"); pw.print(mDisplayInfo.logicalHeight);
+ pw.print(" app=");
+ pw.print(mDisplayInfo.appWidth);
+ pw.print("x"); pw.print(mDisplayInfo.appHeight);
+ pw.print(" rng="); pw.print(mDisplayInfo.smallestNominalAppWidth);
+ pw.print("x"); pw.print(mDisplayInfo.smallestNominalAppHeight);
+ pw.print("-"); pw.print(mDisplayInfo.largestNominalAppWidth);
+ pw.print("x"); pw.println(mDisplayInfo.largestNominalAppHeight);
+ pw.print(subPrefix); pw.print("layoutNeeded="); pw.print(layoutNeeded);
if (mMagnificationSpec != null) {
- pw.print(" mMagnificationSpec="); pw.println(mMagnificationSpec);
+ pw.print(" mMagnificationSpec="); pw.print(mMagnificationSpec);
}
pw.println();
}
diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java
index cabe611..4494058 100644
--- a/services/java/com/android/server/wm/WindowAnimator.java
+++ b/services/java/com/android/server/wm/WindowAnimator.java
@@ -16,6 +16,7 @@ import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
import android.util.Slog;
+import android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.Display;
import android.view.Surface;
@@ -39,8 +40,6 @@ public class WindowAnimator {
final Context mContext;
final WindowManagerPolicy mPolicy;
- ArrayList<WinAnimatorList> mWinAnimatorLists = new ArrayList<WinAnimatorList>();
-
boolean mAnimating;
final Runnable mAnimationRunnable;
@@ -64,24 +63,19 @@ public class WindowAnimator {
* is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
private int mAnimTransactionSequence;
- /** The one and only screen rotation if one is happening */
- ScreenRotationAnimation mScreenRotationAnimation = null;
-
// Window currently running an animation that has requested it be detached
// from the wallpaper. This means we need to ensure the wallpaper is
// visible behind it in case it animates in a way that would allow it to be
// seen. If multiple windows satisfy this, use the lowest window.
WindowState mWindowDetachedWallpaper = null;
- DimSurface mWindowAnimationBackgroundSurface = null;
-
WindowStateAnimator mUniverseBackground = null;
int mAboveUniverseLayer = 0;
int mBulkUpdateParams = 0;
- DimAnimator mDimAnimator = null;
- DimAnimator.Parameters mDimParams = null;
+ SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators =
+ new SparseArray<WindowAnimator.DisplayContentsAnimator>();
static final int WALLPAPER_ACTION_PENDING = 1;
int mPendingActions;
@@ -127,11 +121,18 @@ public class WindowAnimator {
};
}
- void initializeLocked(final int layerStack) {
- mWindowAnimationBackgroundSurface =
- new DimSurface(mService.mFxSession, layerStack);
- mDimAnimator = new DimAnimator(mService.mFxSession, layerStack);
- mInitialized = true;
+ void addDisplayLocked(final int displayId) {
+ DisplayContentsAnimator displayAnimator = getDisplayContentsAnimatorLocked(displayId);
+ displayAnimator.mWindowAnimationBackgroundSurface =
+ new DimSurface(mService.mFxSession, displayId);
+ displayAnimator.mDimAnimator = new DimAnimator(mService.mFxSession, displayId);
+ if (displayId == Display.DEFAULT_DISPLAY) {
+ mInitialized = true;
+ }
+ }
+
+ void removeDisplayLocked(final int displayId) {
+ mDisplayContentsAnimators.delete(displayId);
}
/** Locked on mAnimToLayout */
@@ -165,8 +166,6 @@ public class WindowAnimator {
mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
}
- mWinAnimatorLists =
- new ArrayList<WinAnimatorList>(layoutToAnim.mWinAnimatorLists);
mWallpaperTarget = layoutToAnim.mWallpaperTarget;
mWpAppAnimator = mWallpaperTarget == null
? null : mWallpaperTarget.mAppToken == null
@@ -175,20 +174,34 @@ public class WindowAnimator {
mUpperWallpaperTarget = layoutToAnim.mUpperWallpaperTarget;
// Set the new DimAnimator params.
- DimAnimator.Parameters dimParams = layoutToAnim.mDimParams;
- if (dimParams == null) {
- mDimParams = null;
- } else {
- final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
-
- // Only set dim params on the highest dimmed layer.
- final WindowStateAnimator existingDimWinAnimator = mDimParams == null
- ? null : mDimParams.mDimWinAnimator;
- // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
- if (newWinAnimator.mSurfaceShown &&
- (existingDimWinAnimator == null || !existingDimWinAnimator.mSurfaceShown
- || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
- mDimParams = new DimAnimator.Parameters(dimParams);
+ 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);
+ }
}
}
@@ -225,7 +238,7 @@ public class WindowAnimator {
}
}
- private void updateWindowsAppsAndRotationAnimationsLocked() {
+ private void updateAppWindowsLocked() {
int i;
final int NAT = mAppAnimators.size();
for (i=0; i<NAT; i++) {
@@ -258,21 +271,13 @@ public class WindowAnimator {
"updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
}
}
-
- if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
- if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
- mAnimating = true;
- } else {
- mBulkUpdateParams |= SET_UPDATE_ROTATION;
- mScreenRotationAnimation.kill();
- mScreenRotationAnimation = null;
- }
- }
}
- private void updateWindowsLocked(final WinAnimatorList winAnimatorList) {
+ private void updateWindowsLocked(final int displayId) {
++mAnimTransactionSequence;
+ final WinAnimatorList winAnimatorList =
+ getDisplayContentsAnimatorLocked(displayId).mWinAnimators;
ArrayList<WindowStateAnimator> unForceHiding = null;
boolean wallpaperInUnForceHiding = false;
@@ -313,7 +318,6 @@ public class WindowAnimator {
WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
"Animation started that could impact force hide: " + win);
mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
- final int displayId = win.mDisplayContent.getDisplayId();
setPendingLayoutChanges(displayId,
WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
@@ -391,7 +395,6 @@ public class WindowAnimator {
if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
if (atoken == null || atoken.allDrawn) {
if (winAnimator.performShowLocked()) {
- final int displayId = win.mDisplayContent.getDisplayId();
mPendingLayoutChanges.put(displayId,
WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
@@ -427,10 +430,15 @@ public class WindowAnimator {
}
}
- private void updateWallpaperLocked(final WinAnimatorList winAnimatorList) {
+ private void updateWallpaperLocked(int displayId) {
+ final DisplayContentsAnimator displayAnimator =
+ getDisplayContentsAnimatorLocked(displayId);
+ final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators;
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);
@@ -510,11 +518,11 @@ public class WindowAnimator {
}
}
- mWindowAnimationBackgroundSurface.show(mDw, mDh,
+ windowAnimationBackgroundSurface.show(mDw, mDh,
animLayer - WindowManagerService.LAYER_OFFSET_DIM,
windowAnimationBackgroundColor);
} else {
- mWindowAnimationBackgroundSurface.hide();
+ windowAnimationBackgroundSurface.hide();
}
}
@@ -557,9 +565,9 @@ public class WindowAnimator {
}
}
- private void performAnimationsLocked(final WinAnimatorList winAnimatorList) {
- updateWindowsLocked(winAnimatorList);
- updateWallpaperLocked(winAnimatorList);
+ private void performAnimationsLocked(final int displayId) {
+ updateWindowsLocked(displayId);
+ updateWallpaperLocked(displayId);
}
// TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
@@ -582,15 +590,30 @@ public class WindowAnimator {
TAG, ">>> OPEN TRANSACTION animateLocked");
Surface.openTransaction();
try {
- updateWindowsAppsAndRotationAnimationsLocked();
-
- for (int i = mWinAnimatorLists.size() - 1; i >= 0; i--) {
- final WinAnimatorList winAnimatorList = mWinAnimatorLists.get(i);
+ updateAppWindowsLocked();
+
+ final int numDisplays = mDisplayContentsAnimators.size();
+ for (int i = 0; i < numDisplays; i++) {
+ final int displayId = mDisplayContentsAnimators.keyAt(i);
+ DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
+
+ final ScreenRotationAnimation screenRotationAnimation =
+ displayAnimator.mScreenRotationAnimation;
+ if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
+ if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
+ mAnimating = true;
+ } else {
+ mBulkUpdateParams |= SET_UPDATE_ROTATION;
+ screenRotationAnimation.kill();
+ displayAnimator.mScreenRotationAnimation = null;
+ }
+ }
// Update animations of all applications, including those
// associated with exiting/removed apps
- performAnimationsLocked(winAnimatorList);
+ performAnimationsLocked(displayId);
+ final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators;
final int N = winAnimatorList.size();
for (int j = 0; j < N; j++) {
winAnimatorList.get(j).prepareSurfaceLocked(true);
@@ -599,16 +622,26 @@ public class WindowAnimator {
testTokenMayBeDrawnLocked();
- if (mScreenRotationAnimation != null) {
- mScreenRotationAnimation.updateSurfacesInTransaction();
- }
+ for (int i = 0; i < numDisplays; i++) {
+ final int displayId = mDisplayContentsAnimators.keyAt(i);
+ DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
- if (mDimParams != null) {
- mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
- }
- if (mDimAnimator != null && mDimAnimator.mDimShown) {
- mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
- !mService.okToDisplay());
+ final ScreenRotationAnimation screenRotationAnimation =
+ displayAnimator.mScreenRotationAnimation;
+ if (screenRotationAnimation != null) {
+ screenRotationAnimation.updateSurfacesInTransaction();
+ }
+
+ final DimAnimator.Parameters dimParams = displayAnimator.mDimParams;
+ final DimAnimator dimAnimator = displayAnimator.mDimAnimator;
+ if (dimParams != null) {
+ dimAnimator.updateParameters(
+ mContext.getResources(), dimParams, mCurrentTime);
+ }
+ if (dimAnimator != null && dimAnimator.mDimShown) {
+ mAnimating |= dimAnimator.updateSurface(isDimmingLocked(displayId),
+ mCurrentTime, !mService.okToDisplay());
+ }
}
if (mService.mWatermark != null) {
@@ -661,15 +694,17 @@ public class WindowAnimator {
mInnerDh = appHeight;
}
- boolean isDimming() {
- return mDimParams != null;
+ boolean isDimmingLocked(int displayId) {
+ return getDisplayContentsAnimatorLocked(displayId).mDimParams != null;
}
- boolean isDimming(final WindowStateAnimator winAnimator) {
- return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
+ boolean isDimmingLocked(final WindowStateAnimator winAnimator) {
+ DimAnimator.Parameters dimParams =
+ getDisplayContentsAnimatorLocked(winAnimator.mWin.getDisplayId()).mDimParams;
+ return dimParams != null && dimParams.mDimWinAnimator == winAnimator;
}
- public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
+ public void dumpLocked(PrintWriter pw, String prefix, boolean dumpAll) {
if (dumpAll) {
if (mWindowDetachedWallpaper != null) {
pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
@@ -677,16 +712,36 @@ public class WindowAnimator {
}
pw.print(prefix); pw.print("mAnimTransactionSequence=");
pw.println(mAnimTransactionSequence);
- if (mWindowAnimationBackgroundSurface != null) {
- pw.print(prefix); pw.print("mWindowAnimationBackgroundSurface:");
- mWindowAnimationBackgroundSurface.printTo(prefix + " ", pw);
- }
- if (mDimAnimator != null) {
- pw.print(prefix); pw.print("mDimAnimator:");
- mDimAnimator.printTo(prefix + " ", pw);
- } else {
- pw.print(prefix); pw.print("no DimAnimator ");
+ for (int i = 0; i < mDisplayContentsAnimators.size(); i++) {
+ pw.print(prefix); pw.print("DisplayContentsAnimator #");
+ pw.println(mDisplayContentsAnimators.keyAt(i));
+ DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
+ final String subPrefix = " " + prefix;
+ final String subSubPrefix = " " + subPrefix;
+ if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
+ pw.println(subPrefix + "mWindowAnimationBackgroundSurface:");
+ displayAnimator.mWindowAnimationBackgroundSurface.printTo(subSubPrefix, pw);
+ }
+ if (displayAnimator.mDimAnimator != null) {
+ pw.println(subPrefix + "mDimAnimator:");
+ displayAnimator.mDimAnimator.printTo(subSubPrefix, pw);
+ } else {
+ pw.println(subPrefix + "no DimAnimator ");
+ }
+ if (displayAnimator.mDimParams != null) {
+ pw.println(subPrefix + "mDimParams:");
+ displayAnimator.mDimParams.printTo(subSubPrefix, pw);
+ } else {
+ pw.println(subPrefix + "no DimParams ");
+ }
+ if (displayAnimator.mScreenRotationAnimation != null) {
+ pw.println(subPrefix + "mScreenRotationAnimation:");
+ displayAnimator.mScreenRotationAnimation.printTo(subSubPrefix, pw);
+ } else {
+ pw.print(subPrefix + "no ScreenRotationAnimation ");
+ }
}
+ pw.println();
}
}
@@ -716,4 +771,29 @@ public class WindowAnimator {
}
}
}
+
+ private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
+ DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
+ if (displayAnimator == null) {
+ displayAnimator = new DisplayContentsAnimator();
+ mDisplayContentsAnimators.put(displayId, displayAnimator);
+ }
+ return displayAnimator;
+ }
+
+ void setScreenRotationAnimationLocked(int displayId, ScreenRotationAnimation animation) {
+ getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation = animation;
+ }
+
+ ScreenRotationAnimation getScreenRotationAnimationLocked(int displayId) {
+ return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation;
+ }
+
+ private static class DisplayContentsAnimator {
+ WinAnimatorList mWinAnimators = new WinAnimatorList();
+ DimAnimator mDimAnimator = null;
+ DimAnimator.Parameters mDimParams = null;
+ DimSurface mWindowAnimationBackgroundSurface = null;
+ ScreenRotationAnimation mScreenRotationAnimation = null;
+ }
}
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 556613e..55a7c46 100755
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -623,11 +623,11 @@ public class WindowManagerService extends IWindowManager.Stub
long mChanges;
boolean mAnimationScheduled;
- ArrayList<WinAnimatorList> mWinAnimatorLists = new ArrayList<WinAnimatorList>();
+ SparseArray<WinAnimatorList> mWinAnimatorLists = new SparseArray<WinAnimatorList>();
WindowState mWallpaperTarget;
WindowState mLowerWallpaperTarget;
WindowState mUpperWallpaperTarget;
- DimAnimator.Parameters mDimParams;
+ SparseArray<DimAnimator.Parameters> mDimParams = new SparseArray<DimAnimator.Parameters>();
ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
ArrayList<AppWindowAnimParams> mAppWindowAnimParams = new ArrayList<AppWindowAnimParams>();
}
@@ -4121,6 +4121,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
+ @Override
public void overridePendingAppTransitionScaleUp(int startX, int startY, int startWidth,
int startHeight) {
synchronized(mWindowMap) {
@@ -4138,6 +4139,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
+ @Override
public void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX,
int startY, IRemoteCallback startedCallback, boolean scaleUp) {
synchronized(mWindowMap) {
@@ -4157,6 +4159,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
+ @Override
public void executeAppTransition() {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"executeAppTransition()")) {
@@ -5943,8 +5946,9 @@ public class WindowManagerService extends IWindowManager.Stub
return false;
}
- if (mAnimator.mScreenRotationAnimation != null &&
- mAnimator.mScreenRotationAnimation.isAnimating()) {
+ ScreenRotationAnimation screenRotationAnimation =
+ mAnimator.getScreenRotationAnimationLocked(Display.DEFAULT_DISPLAY);
+ if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
// Rotation updates cannot be performed while the previous rotation change
// animation is still in progress. Skip this update. We will try updating
// again after the animation is finished and the display is unfrozen.
@@ -5996,6 +6000,9 @@ public class WindowManagerService extends IWindowManager.Stub
mWaitingForConfig = true;
getDefaultDisplayContentLocked().layoutNeeded = true;
startFreezingDisplayLocked(inTransaction, 0, 0);
+ // startFreezingDisplayLocked can reset the ScreenRotationAnimation.
+ screenRotationAnimation =
+ mAnimator.getScreenRotationAnimationLocked(Display.DEFAULT_DISPLAY);
// We need to update our screen size information to match the new
// rotation. Note that this is redundant with the later call to
@@ -6016,9 +6023,9 @@ public class WindowManagerService extends IWindowManager.Stub
try {
// NOTE: We disable the rotation in the emulator because
// it doesn't support hardware OpenGL emulation yet.
- if (CUSTOM_SCREEN_ROTATION && mAnimator.mScreenRotationAnimation != null
- && mAnimator.mScreenRotationAnimation.hasScreenshot()) {
- if (mAnimator.mScreenRotationAnimation.setRotationInTransaction(
+ if (CUSTOM_SCREEN_ROTATION && screenRotationAnimation != null
+ && screenRotationAnimation.hasScreenshot()) {
+ if (screenRotationAnimation.setRotationInTransaction(
rotation, mFxSession,
MAX_ANIMATION_DURATION, mTransitionAnimationScale,
displayInfo.logicalWidth, displayInfo.logicalHeight)) {
@@ -7158,8 +7165,6 @@ public class WindowManagerService extends IWindowManager.Stub
mIsTouchDevice = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TOUCHSCREEN);
- mAnimator.initializeLocked(display.getLayerStack());
-
final DisplayInfo displayInfo = getDefaultDisplayInfoLocked();
mAnimator.setDisplayDimensions(
displayInfo.logicalWidth, displayInfo.logicalHeight,
@@ -7181,6 +7186,7 @@ public class WindowManagerService extends IWindowManager.Stub
synchronized(mWindowMap) {
final DisplayContent displayContent = getDisplayContentLocked(displayId);
final DisplayInfo displayInfo;
+ mAnimator.addDisplayLocked(displayId);
synchronized(displayContent.mDisplaySizeLock) {
// Bootstrap the default logical display from the display manager.
displayInfo = displayContent.getDisplayInfo();
@@ -8136,7 +8142,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (winAnimator.mAnimLayer != oldLayer) {
layerChanged = true;
}
- if (layerChanged && mAnimator.isDimming(winAnimator)) {
+ if (layerChanged && mAnimator.isDimmingLocked(winAnimator)) {
// Force an animation pass just to update the mDimAnimator layer.
updateLayoutToAnimationLocked();
}
@@ -8842,7 +8848,7 @@ public class WindowManagerService extends IWindowManager.Stub
//Slog.i(TAG, "DIM BEHIND: " + w);
mInnerFields.mDimming = true;
final WindowStateAnimator winAnimator = w.mWinAnimator;
- if (!mAnimator.isDimming(winAnimator)) {
+ if (!mAnimator.isDimmingLocked(winAnimator)) {
final int width, height;
if (attrs.type == WindowManager.LayoutParams.TYPE_BOOT_PROGRESS) {
final DisplayInfo displayInfo = w.mDisplayContent.getDisplayInfo();
@@ -8852,7 +8858,8 @@ public class WindowManagerService extends IWindowManager.Stub
width = innerDw;
height = innerDh;
}
- startDimming(winAnimator, w.mExiting ? 0 : w.mAttrs.dimAmount, width, height);
+ startDimmingLocked(
+ winAnimator, w.mExiting ? 0 : w.mAttrs.dimAmount, width, height);
}
}
}
@@ -9080,7 +9087,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- winAnimator.setSurfaceBoundaries(recoveringMemory);
+ winAnimator.setSurfaceBoundariesLocked(recoveringMemory);
final AppWindowToken atoken = w.mAppToken;
if (DEBUG_STARTING_WINDOW && atoken != null && w == atoken.startingWindow) {
@@ -9138,6 +9145,10 @@ public class WindowManagerService extends IWindowManager.Stub
updateResizingWindows(w);
}
+
+ if (!mInnerFields.mDimming && mAnimator.isDimmingLocked(displayId)) {
+ stopDimmingLocked(displayId);
+ }
}
if (updateAllDrawn) {
@@ -9147,10 +9158,6 @@ public class WindowManagerService extends IWindowManager.Stub
if (focusDisplayed) {
mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS);
}
-
- if (!mInnerFields.mDimming && mAnimator.isDimming()) {
- stopDimming();
- }
} catch (RuntimeException e) {
Log.wtf(TAG, "Unhandled exception in Window Manager", e);
} finally {
@@ -9515,7 +9522,7 @@ public class WindowManagerService extends IWindowManager.Stub
final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
synchronized (layoutToAnim) {
// Copy local params to transfer params.
- ArrayList<WinAnimatorList> allWinAnimatorLists = layoutToAnim.mWinAnimatorLists;
+ SparseArray<WinAnimatorList> allWinAnimatorLists = layoutToAnim.mWinAnimatorLists;
allWinAnimatorLists.clear();
DisplayContentsIterator iterator = new DisplayContentsIterator();
while (iterator.hasNext()) {
@@ -9529,7 +9536,7 @@ public class WindowManagerService extends IWindowManager.Stub
winAnimatorList.add(winAnimator);
}
}
- allWinAnimatorLists.add(winAnimatorList);
+ allWinAnimatorLists.put(displayContent.getDisplayId(), winAnimatorList);
}
layoutToAnim.mWallpaperTarget = mWallpaperTarget;
@@ -9555,20 +9562,21 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- void setAnimDimParams(DimAnimator.Parameters params) {
+ void setAnimDimParams(int displayId, DimAnimator.Parameters params) {
synchronized (mLayoutToAnim) {
- mLayoutToAnim.mDimParams = params;
+ mLayoutToAnim.mDimParams.put(displayId, params);
scheduleAnimationLocked();
}
}
- void startDimming(final WindowStateAnimator winAnimator, final float target,
+ void startDimmingLocked(final WindowStateAnimator winAnimator, final float target,
final int width, final int height) {
- setAnimDimParams(new DimAnimator.Parameters(winAnimator, width, height, target));
+ setAnimDimParams(winAnimator.mWin.getDisplayId(),
+ new DimAnimator.Parameters(winAnimator, width, height, target));
}
- void stopDimming() {
- setAnimDimParams(null);
+ void stopDimmingLocked(int displayId) {
+ setAnimDimParams(displayId, null);
}
private boolean needsLayout() {
@@ -9900,19 +9908,22 @@ public class WindowManagerService extends IWindowManager.Stub
}
if (CUSTOM_SCREEN_ROTATION) {
- if (mAnimator.mScreenRotationAnimation != null) {
- mAnimator.mScreenRotationAnimation.kill();
- mAnimator.mScreenRotationAnimation = null;
+ final DisplayContent displayContent = getDefaultDisplayContentLocked();
+ final int displayId = displayContent.getDisplayId();
+ ScreenRotationAnimation screenRotationAnimation =
+ mAnimator.getScreenRotationAnimationLocked(displayId);
+ if (screenRotationAnimation != null) {
+ screenRotationAnimation.kill();
}
// TODO(multidisplay): rotation on main screen only.
- final DisplayContent displayContent = getDefaultDisplayContentLocked();
final Display display = displayContent.getDisplay();
final DisplayInfo displayInfo = displayContent.getDisplayInfo();
- mAnimator.mScreenRotationAnimation = new ScreenRotationAnimation(mContext,
+ screenRotationAnimation = new ScreenRotationAnimation(mContext,
display, mFxSession, inTransaction, displayInfo.logicalWidth,
displayInfo.logicalHeight, display.getRotation(),
exitAnim, enterAnim);
+ mAnimator.setScreenRotationAnimationLocked(displayId, screenRotationAnimation);
}
}
@@ -9940,24 +9951,30 @@ public class WindowManagerService extends IWindowManager.Stub
boolean updateRotation = false;
- if (CUSTOM_SCREEN_ROTATION && mAnimator.mScreenRotationAnimation != null
- && mAnimator.mScreenRotationAnimation.hasScreenshot()) {
+ final DisplayContent displayContent = getDefaultDisplayContentLocked();
+ final int displayId = displayContent.getDisplayId();
+ ScreenRotationAnimation screenRotationAnimation =
+ mAnimator.getScreenRotationAnimationLocked(displayId);
+ if (CUSTOM_SCREEN_ROTATION && screenRotationAnimation != null
+ && screenRotationAnimation.hasScreenshot()) {
if (DEBUG_ORIENTATION) Slog.i(TAG, "**** Dismissing screen rotation animation");
// TODO(multidisplay): rotation on main screen only.
- DisplayInfo displayInfo = getDefaultDisplayContentLocked().getDisplayInfo();
- if (mAnimator.mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION,
+ DisplayInfo displayInfo = displayContent.getDisplayInfo();
+ if (screenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION,
mTransitionAnimationScale, displayInfo.logicalWidth,
displayInfo.logicalHeight)) {
updateLayoutToAnimationLocked();
} else {
- mAnimator.mScreenRotationAnimation.kill();
- mAnimator.mScreenRotationAnimation = null;
+ screenRotationAnimation.kill();
+ screenRotationAnimation = null;
+ mAnimator.setScreenRotationAnimationLocked(displayId, screenRotationAnimation);
updateRotation = true;
}
} else {
- if (mAnimator.mScreenRotationAnimation != null) {
- mAnimator.mScreenRotationAnimation.kill();
- mAnimator.mScreenRotationAnimation = null;
+ if (screenRotationAnimation != null) {
+ screenRotationAnimation.kill();
+ screenRotationAnimation = null;
+ mAnimator.setScreenRotationAnimationLocked(displayId, screenRotationAnimation);
}
updateRotation = true;
}
@@ -10394,11 +10411,11 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(": "); pw.println(pair.second);
}
}
- pw.println();
+ pw.println(" DisplayContents");
if (mDisplayReady) {
DisplayContentsIterator dCIterator = new DisplayContentsIterator();
while (dCIterator.hasNext()) {
- dCIterator.next().dump(pw);
+ dCIterator.next().dump(" ", pw);
}
} else {
pw.println(" NO DISPLAY");
@@ -10463,10 +10480,6 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(" mLastWindowForcedOrientation="); pw.print(mLastWindowForcedOrientation);
pw.print(" mForcedAppOrientation="); pw.println(mForcedAppOrientation);
pw.print(" mDeferredRotationPauseCount="); pw.println(mDeferredRotationPauseCount);
- if (mAnimator.mScreenRotationAnimation != null) {
- pw.println(" mScreenRotationAnimation:");
- mAnimator.mScreenRotationAnimation.printTo(" ", pw);
- }
pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale);
pw.print(" mTransitionWindowAnimationScale="); pw.print(mTransitionAnimationScale);
pw.print(" mAnimatorDurationScale="); pw.println(mAnimatorDurationScale);
@@ -10515,7 +10528,7 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(" mStartingIconInTransition="); pw.print(mStartingIconInTransition);
pw.print(" mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation);
pw.println(" Window Animator:");
- mAnimator.dump(pw, " ", dumpAll);
+ mAnimator.dumpLocked(pw, " ", dumpAll);
}
}
@@ -10850,6 +10863,7 @@ public class WindowManagerService extends IWindowManager.Stub
private void handleDisplayAddedLocked(int displayId) {
createDisplayContentLocked(mDisplayManager.getDisplay(displayId));
+ displayReady(displayId);
}
@Override
@@ -10865,6 +10879,7 @@ public class WindowManagerService extends IWindowManager.Stub
final WindowState win = windows.get(i);
removeWindowLocked(win.mSession, win);
}
+ mAnimator.removeDisplayLocked(displayId);
}
@Override
diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java
index 8912c73..000a191 100644
--- a/services/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/java/com/android/server/wm/WindowStateAnimator.java
@@ -31,6 +31,13 @@ import java.io.PrintWriter;
import java.util.ArrayList;
class WinAnimatorList extends ArrayList<WindowStateAnimator> {
+ public WinAnimatorList() {
+ super();
+ }
+
+ public WinAnimatorList(WinAnimatorList other) {
+ super(other);
+ }
}
/**
@@ -840,8 +847,11 @@ class WindowStateAnimator {
}
}
- final boolean screenAnimation = mService.mAnimator.mScreenRotationAnimation != null
- && mService.mAnimator.mScreenRotationAnimation.isAnimating();
+ final int displayId = mWin.getDisplayId();
+ final ScreenRotationAnimation screenRotationAnimation =
+ mAnimator.getScreenRotationAnimationLocked(displayId);
+ final boolean screenAnimation =
+ screenRotationAnimation != null && screenRotationAnimation.isAnimating();
if (selfTransformation || attachedTransformation != null
|| appTransformation != null || screenAnimation) {
// cache often used attributes locally
@@ -883,8 +893,7 @@ class WindowStateAnimator {
tmpMatrix.postConcat(mAnimator.mUniverseBackground.mUniverseTransform.getMatrix());
}
if (screenAnimation) {
- tmpMatrix.postConcat(
- mService.mAnimator.mScreenRotationAnimation.getEnterTransformation().getMatrix());
+ tmpMatrix.postConcat(screenRotationAnimation.getEnterTransformation().getMatrix());
}
MagnificationSpec spec = mWin.getWindowMagnificationSpecLocked();
if (spec != null && !spec.isNop()) {
@@ -934,21 +943,21 @@ class WindowStateAnimator {
mShownAlpha *= mAnimator.mUniverseBackground.mUniverseTransform.getAlpha();
}
if (screenAnimation) {
- mShownAlpha *=
- mService.mAnimator.mScreenRotationAnimation.getEnterTransformation().getAlpha();
+ mShownAlpha *= screenRotationAnimation.getEnterTransformation().getAlpha();
}
} else {
//Slog.i(TAG, "Not applying alpha transform");
}
- if ((DEBUG_SURFACE_TRACE || WindowManagerService.localLOGV) && (mShownAlpha == 1.0 || mShownAlpha == 0.0)) Slog.v(
- TAG, "computeShownFrameLocked: Animating " + this +
- " mAlpha=" + mAlpha +
- " self=" + (selfTransformation ? mTransformation.getAlpha() : "null") +
- " attached=" + (attachedTransformation == null ? "null" : attachedTransformation.getAlpha()) +
- " app=" + (appTransformation == null ? "null" : appTransformation.getAlpha()) +
- " screen=" + (screenAnimation ? mService.mAnimator.mScreenRotationAnimation.getEnterTransformation().getAlpha()
- : "null"));
+ if ((DEBUG_SURFACE_TRACE || WindowManagerService.localLOGV)
+ && (mShownAlpha == 1.0 || mShownAlpha == 0.0)) Slog.v(
+ TAG, "computeShownFrameLocked: Animating " + this + " mAlpha=" + mAlpha
+ + " self=" + (selfTransformation ? mTransformation.getAlpha() : "null")
+ + " attached=" + (attachedTransformation == null ?
+ "null" : attachedTransformation.getAlpha())
+ + " app=" + (appTransformation == null ? "null" : appTransformation.getAlpha())
+ + " screen=" + (screenAnimation ?
+ screenRotationAnimation.getEnterTransformation().getAlpha() : "null"));
return;
} else if (mIsWallpaper &&
(mAnimator.mPendingActions & WindowAnimator.WALLPAPER_ACTION_PENDING) != 0) {
@@ -1083,7 +1092,7 @@ class WindowStateAnimator {
}
}
- void setSurfaceBoundaries(final boolean recoveringMemory) {
+ void setSurfaceBoundariesLocked(final boolean recoveringMemory) {
final WindowState w = mWin;
int width, height;
if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) {
@@ -1138,7 +1147,7 @@ class WindowStateAnimator {
WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
if ((w.mAttrs.flags & LayoutParams.FLAG_DIM_BEHIND) != 0) {
final DisplayInfo displayInfo = mWin.mDisplayContent.getDisplayInfo();
- mService.startDimming(this, w.mExiting ? 0 : w.mAttrs.dimAmount,
+ mService.startDimmingLocked(this, w.mExiting ? 0 : w.mAttrs.dimAmount,
displayInfo.appWidth, displayInfo.appHeight);
}
} catch (RuntimeException e) {
@@ -1172,7 +1181,7 @@ class WindowStateAnimator {
computeShownFrameLocked();
- setSurfaceBoundaries(recoveringMemory);
+ setSurfaceBoundariesLocked(recoveringMemory);
if (mIsWallpaper && !mWin.mWallpaperVisible) {
// Wallpaper is no longer visible and there is no wp target => hide it.