diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java index c42647ed0aee9..e3941b9a2b184 100644 --- a/services/core/java/com/android/server/wm/AppWindowAnimator.java +++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java @@ -248,8 +248,9 @@ public class AppWindowAnimator { } } - void updateLayers() { - thumbnailLayer = mAppToken.adjustAnimLayer(animLayerAdjustment); + private void updateLayers() { + mAppToken.getDisplayContent().assignWindowLayers(false /* relayoutNeeded */); + thumbnailLayer = mAppToken.getHighestAnimLayer(); } private void stepThumbnailAnimation(long currentTime) { diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 22630428ad01e..d790ad94b28f8 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1408,6 +1408,11 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree return candidate; } + @Override + int getAnimLayerAdjustment() { + return mAppAnimator.animLayerAdjustment; + } + @Override void dump(PrintWriter pw, String prefix) { super.dump(pw, prefix); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 2f9868e059d3b..461c3faf1d9e1 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -341,9 +341,6 @@ class DisplayContent extends WindowContainer mSetInputMethodAnimLayerAdjustment = - w -> w.adjustAnimLayer(mInputMethodAnimLayerAdjustment); - private final Consumer mScheduleToastTimeout = w -> { final int lostFocusUid = mTmpWindow.mOwnerUid; final Handler handler = mService.mH; @@ -1281,8 +1278,7 @@ class DisplayContent extends WindowContainer= 0; curTokenNdx--) { final WallpaperWindowToken token = mWallpaperTokens.get(curTokenNdx); token.updateWallpaperWindows(visible, mWallpaperAnimLayerAdjustment); + token.getDisplayContent().assignWindowLayers(false); } } @@ -568,7 +569,7 @@ class WallpaperController { // Only do this if we are not transferring between two wallpaper targets. mWallpaperAnimLayerAdjustment = (mPrevWallpaperTarget == null && mWallpaperTarget.mAppToken != null) - ? mWallpaperTarget.mAppToken.mAppAnimator.animLayerAdjustment : 0; + ? mWallpaperTarget.mAppToken.getAnimLayerAdjustment() : 0; if (mWallpaperTarget.mWallpaperX >= 0) { mLastWallpaperX = mWallpaperTarget.mWallpaperX; diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java index 28aebbbb281ca..a12c0e5003c84 100644 --- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java +++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java @@ -142,7 +142,6 @@ class WallpaperWindowToken extends WindowToken { // First, make sure the client has the current visibility state. wallpaper.dispatchWallpaperVisibility(visible); - wallpaper.adjustAnimLayer(animLayerAdj); if (DEBUG_LAYERS || DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "adjustWallpaper win " + wallpaper + " anim layer: " + wallpaper.mWinAnimator.mAnimLayer); diff --git a/services/core/java/com/android/server/wm/WindowLayersController.java b/services/core/java/com/android/server/wm/WindowLayersController.java index 1cd2b53de9bac..172ec4871b481 100644 --- a/services/core/java/com/android/server/wm/WindowLayersController.java +++ b/services/core/java/com/android/server/wm/WindowLayersController.java @@ -129,7 +129,7 @@ class WindowLayersController { final WindowStateAnimator winAnimator = w.mWinAnimator; Slog.v(TAG_WM, "Assign layer " + w + ": " + "mBase=" + w.mBaseLayer + " mLayer=" + w.mLayer + (w.mAppToken == null - ? "" : " mAppLayer=" + w.mAppToken.mAppAnimator.animLayerAdjustment) + ? "" : " mAppLayer=" + w.mAppToken.getAnimLayerAdjustment()) + " =mAnimLayer=" + winAnimator.mAnimLayer); }, false /* traverseTopToBottom */); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 945a349a28fd0..14f14c5116716 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1923,16 +1923,11 @@ class WindowState extends WindowContainer implements WindowManagerP if (mIsImWindow && mService.mInputMethodTarget != null) { final AppWindowToken appToken = mService.mInputMethodTarget.mAppToken; if (appToken != null) { - return appToken.mAppAnimator.animLayerAdjustment; + return appToken.getAnimLayerAdjustment(); } } - if (mAppToken != null) { - return mAppToken.mAppAnimator.animLayerAdjustment; - } - - // Nothing is animating, so there is no animation adjustment. - return 0; + return mToken.getAnimLayerAdjustment(); } int getSpecialWindowAnimLayerAdjustment() { @@ -3860,20 +3855,6 @@ class WindowState extends WindowContainer implements WindowManagerP return highest; } - int adjustAnimLayer(int adj) { - int highestAnimLayer = mWinAnimator.mAnimLayer = mLayer + adj; - if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG_WM, - "adjustAnimLayer win=" + this + " anim layer: " + mWinAnimator.mAnimLayer); - for (int i = mChildren.size() - 1; i >= 0; i--) { - final WindowState childWindow = mChildren.get(i); - childWindow.adjustAnimLayer(adj); - if (childWindow.mWinAnimator.mAnimLayer > highestAnimLayer) { - highestAnimLayer = childWindow.mWinAnimator.mAnimLayer; - } - } - return highestAnimLayer; - } - @Override boolean forAllWindows(ToBooleanFunction callback, boolean traverseTopToBottom) { if (mChildren.isEmpty()) { diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index 8beb87d3354b9..fab59d6c8f08c 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -151,21 +151,6 @@ class WindowToken extends WindowContainer { } } - int adjustAnimLayer(int adj) { - int highestAnimLayer = -1; - for (int j = mChildren.size() - 1; j >= 0; j--) { - final WindowState w = mChildren.get(j); - final int winHighestAnimLayer = w.adjustAnimLayer(adj); - if (winHighestAnimLayer > highestAnimLayer) { - highestAnimLayer = winHighestAnimLayer; - } - if (w == mService.mInputMethodTarget && !mService.mInputMethodTargetWaitingAnim) { - mDisplayContent.setInputMethodAnimLayerAdjustment(adj); - } - } - return highestAnimLayer; - } - /** * Returns true if the new window is considered greater than the existing window in terms of * z-order. @@ -197,6 +182,11 @@ class WindowToken extends WindowContainer { return mChildren.isEmpty(); } + // Used by AppWindowToken. + int getAnimLayerAdjustment() { + return 0; + } + WindowState getReplacingWindow() { for (int i = mChildren.size() - 1; i >= 0; i--) { final WindowState win = mChildren.get(i); diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java index b9c2eedfa2158..83926654884be 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java @@ -280,6 +280,7 @@ class WindowTestsBase { /* Used so we can gain access to some protected members of the {@link WindowToken} class */ static class TestWindowToken extends WindowToken { + int adj = 0; TestWindowToken(int type, DisplayContent dc) { this(type, dc, false /* persistOnEmpty */); @@ -297,6 +298,11 @@ class WindowTestsBase { boolean hasWindow(WindowState w) { return mChildren.contains(w); } + + @Override + int getAnimLayerAdjustment() { + return adj; + } } /** Used so we can gain access to some protected members of the {@link AppWindowToken} class. */ diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java index 0c053b90b757e..babb6d9db31fd 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java @@ -102,14 +102,28 @@ public class WindowTokenTests extends WindowTestsBase { final WindowState window2 = createWindow(null, TYPE_APPLICATION, token, "window2"); final WindowState window3 = createWindow(null, TYPE_APPLICATION, token, "window3"); - final int adj = 50; - final int window2StartLayer = window2.mLayer = 100; - final int window3StartLayer = window3.mLayer = 200; - final int highestLayer = token.adjustAnimLayer(adj); + window2.mLayer = 100; + window3.mLayer = 200; - assertEquals(adj, window1.mWinAnimator.mAnimLayer); - assertEquals(adj, window11.mWinAnimator.mAnimLayer); - assertEquals(adj, window12.mWinAnimator.mAnimLayer); + // We assign layers once, to get the base values computed by + // the controller. + sLayersController.assignWindowLayers(sDisplayContent); + + final int window1StartLayer = window1.mWinAnimator.mAnimLayer; + final int window11StartLayer = window11.mWinAnimator.mAnimLayer; + final int window12StartLayer = window12.mWinAnimator.mAnimLayer; + final int window2StartLayer = window2.mWinAnimator.mAnimLayer; + final int window3StartLayer = window3.mWinAnimator.mAnimLayer; + + // Then we set an adjustment, and assign them again, they should + // be offset. + int adj = token.adj = 50; + sLayersController.assignWindowLayers(sDisplayContent); + final int highestLayer = token.getHighestAnimLayer(); + + assertEquals(window1StartLayer + adj, window1.mWinAnimator.mAnimLayer); + assertEquals(window11StartLayer + adj, window11.mWinAnimator.mAnimLayer); + assertEquals(window12StartLayer + adj, window12.mWinAnimator.mAnimLayer); assertEquals(window2StartLayer + adj, window2.mWinAnimator.mAnimLayer); assertEquals(window3StartLayer + adj, window3.mWinAnimator.mAnimLayer); assertEquals(window3StartLayer + adj, highestLayer);