From dee1b3f80c363fa6d3c9e87acd729161bce56c23 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 27 Feb 2017 11:33:33 -0800 Subject: [PATCH] Only adjust window layers from WindowLayerController Various animation adjustment logic will directly set mAnimLayer outside of WindowLayerController. If we end up setting this layer very high, we can end up moving it above the special windows collected in WindowLayersController. Bug: 33702491 Bug: 35396882 Test: bit FrameworksServicesTests:com.android.server.wm.WindowTokenTests Change-Id: I9850529ecd6f0067bc24421515b39b645885a3ec --- .../android/server/wm/AppWindowAnimator.java | 5 ++-- .../com/android/server/wm/AppWindowToken.java | 5 ++++ .../com/android/server/wm/DisplayContent.java | 8 ++---- .../server/wm/WallpaperController.java | 3 +- .../server/wm/WallpaperWindowToken.java | 1 - .../server/wm/WindowLayersController.java | 2 +- .../com/android/server/wm/WindowState.java | 23 ++------------- .../com/android/server/wm/WindowToken.java | 20 ++++--------- .../android/server/wm/WindowTestsBase.java | 6 ++++ .../android/server/wm/WindowTokenTests.java | 28 ++++++++++++++----- 10 files changed, 47 insertions(+), 54 deletions(-) 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);