diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java index c76b90593ab31..5365e27da9a55 100644 --- a/services/core/java/com/android/server/wm/AppWindowAnimator.java +++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java @@ -16,10 +16,10 @@ package com.android.server.wm; -import static android.view.Display.INVALID_DISPLAY; import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; import static com.android.server.wm.AppTransition.TRANSIT_UNSET; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; @@ -78,11 +78,8 @@ public class AppWindowAnimator { // requires that the duration of the two animations are the same. SurfaceControl thumbnail; int thumbnailTransactionSeq; - // TODO(b/62029108): combine both members into a private one. Create a member function to set - // the thumbnail layer to +1 to the highest layer position and replace all setter instances - // with this function. Remove all unnecessary calls to both variables in other classes. - int thumbnailLayer; - int thumbnailForceAboveLayer; + private int mThumbnailLayer; + Animation thumbnailAnimation; final Transformation thumbnailTransformation = new Transformation(); // This flag indicates that the destruction of the thumbnail surface is synchronized with @@ -256,7 +253,7 @@ public class AppWindowAnimator { private void updateLayers() { mAppToken.getDisplayContent().assignWindowLayers(false /* relayoutNeeded */); - thumbnailLayer = mAppToken.getHighestAnimLayer(); + updateThumbnailLayer(); } private void stepThumbnailAnimation(long currentTime) { @@ -280,25 +277,34 @@ public class AppWindowAnimator { thumbnail.setPosition(tmpFloats[Matrix.MTRANS_X], tmpFloats[Matrix.MTRANS_Y]); if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail, "thumbnail", "alpha=" + thumbnailTransformation.getAlpha() - + " layer=" + thumbnailLayer + + " layer=" + mThumbnailLayer + " matrix=[" + tmpFloats[Matrix.MSCALE_X] + "," + tmpFloats[Matrix.MSKEW_Y] + "][" + tmpFloats[Matrix.MSKEW_X] + "," + tmpFloats[Matrix.MSCALE_Y] + "]"); thumbnail.setAlpha(thumbnailTransformation.getAlpha()); - if (thumbnailForceAboveLayer > 0) { - thumbnail.setLayer(thumbnailForceAboveLayer + 1); - } else { - // The thumbnail is layered below the window immediately above this - // token's anim layer. - thumbnail.setLayer(thumbnailLayer + WindowManagerService.WINDOW_LAYER_MULTIPLIER - - WindowManagerService.LAYER_OFFSET_THUMBNAIL); - } + updateThumbnailLayer(); thumbnail.setMatrix(tmpFloats[Matrix.MSCALE_X], tmpFloats[Matrix.MSKEW_Y], tmpFloats[Matrix.MSKEW_X], tmpFloats[Matrix.MSCALE_Y]); thumbnail.setWindowCrop(thumbnailTransformation.getClipRect()); } + /** + * Updates the thumbnail layer z order to just above the highest animation layer if changed + */ + void updateThumbnailLayer() { + if (thumbnail != null) { + final int layer = mAppToken.getHighestAnimLayer(); + if (layer != mThumbnailLayer) { + if (DEBUG_LAYERS) Slog.v(TAG, + "Setting thumbnail layer " + mAppToken + ": layer=" + layer); + thumbnail.setLayer(layer + WindowManagerService.WINDOW_LAYER_MULTIPLIER + - WindowManagerService.LAYER_OFFSET_THUMBNAIL); + mThumbnailLayer = layer; + } + } + } + /** * Sometimes we need to synchronize the first frame of animation with some external event, e.g. * Recents hiding some of its content. To achieve this, we prolong the start of the animaiton @@ -473,7 +479,7 @@ public class AppWindowAnimator { } if (thumbnail != null) { pw.print(prefix); pw.print("thumbnail="); pw.print(thumbnail); - pw.print(" layer="); pw.println(thumbnailLayer); + pw.print(" layer="); pw.println(mThumbnailLayer); pw.print(prefix); pw.print("thumbnailAnimation="); pw.println(thumbnailAnimation); pw.print(prefix); pw.print("thumbnailTransformation="); pw.println(thumbnailTransformation.toShortString()); diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 78f81574c5bca..a1eeff842fc43 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1170,7 +1170,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree wAppAnimator.thumbnail.destroy(); } wAppAnimator.thumbnail = tAppAnimator.thumbnail; - wAppAnimator.thumbnailLayer = tAppAnimator.thumbnailLayer; wAppAnimator.thumbnailAnimation = tAppAnimator.thumbnailAnimation; tAppAnimator.thumbnail = null; } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 8fc9dda3722a1..0e68a8f64e5fc 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -392,10 +392,6 @@ class DisplayContent extends WindowContainer 0) { - if (w.mWinAnimator.mAnimLayer > w.mAppToken.mAppAnimator.thumbnailForceAboveLayer) { - w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = w.mWinAnimator.mAnimLayer; - } - // TODO(b/62029108): the entire contents of the if statement should call the refactored - // function to set the thumbnail layer for w.AppToken - int highestLayer = w.mAppToken.getHighestAnimLayer(); - if (highestLayer > 0) { - if (w.mAppToken.mAppAnimator.thumbnail != null - && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer != highestLayer) { - w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = highestLayer; - w.mAppToken.mAppAnimator.thumbnail.setLayer(highestLayer + 1); - } - } + if (w.mAppToken != null) { + w.mAppToken.mAppAnimator.updateThumbnailLayer(); } } } diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 88625d35f9b48..af1fa2fe02918 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -342,10 +342,7 @@ class WindowSurfacePlacer { mTmpLayerAndToken.token = null; handleClosingApps(transit, animLp, voiceInteraction, mTmpLayerAndToken); final AppWindowToken topClosingApp = mTmpLayerAndToken.token; - final int topClosingLayer = mTmpLayerAndToken.layer; - - final AppWindowToken topOpeningApp = handleOpeningApps(transit, - animLp, voiceInteraction, topClosingLayer); + final AppWindowToken topOpeningApp = handleOpeningApps(transit, animLp, voiceInteraction); mService.mAppTransition.setLastAppTransition(transit, topOpeningApp, topClosingApp); @@ -387,8 +384,9 @@ class WindowSurfacePlacer { } private AppWindowToken handleOpeningApps(int transit, LayoutParams animLp, - boolean voiceInteraction, int topClosingLayer) { + boolean voiceInteraction) { AppWindowToken topOpeningApp = null; + int topOpeningLayer = Integer.MIN_VALUE; final int appsCount = mService.mOpeningApps.size(); for (int i = 0; i < appsCount; i++) { AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); @@ -422,7 +420,6 @@ class WindowSurfacePlacer { } mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); - int topOpeningLayer = 0; if (animLp != null) { final int layer = wtoken.getHighestAnimLayer(); if (topOpeningApp == null || layer > topOpeningLayer) { @@ -431,7 +428,7 @@ class WindowSurfacePlacer { } } if (mService.mAppTransition.isNextAppTransitionThumbnailUp()) { - createThumbnailAppAnimator(transit, wtoken, topOpeningLayer, topClosingLayer); + createThumbnailAppAnimator(transit, wtoken); } } return topOpeningApp; @@ -473,7 +470,7 @@ class WindowSurfacePlacer { } } if (mService.mAppTransition.isNextAppTransitionThumbnailDown()) { - createThumbnailAppAnimator(transit, wtoken, 0, layerAndToken.layer); + createThumbnailAppAnimator(transit, wtoken); } } } @@ -666,8 +663,7 @@ class WindowSurfacePlacer { } } - private void createThumbnailAppAnimator(int transit, AppWindowToken appToken, - int openingLayer, int closingLayer) { + private void createThumbnailAppAnimator(int transit, AppWindowToken appToken) { AppWindowAnimator openingAppAnimator = (appToken == null) ? null : appToken.mAppAnimator; if (openingAppAnimator == null || openingAppAnimator.animation == null) { return; @@ -724,7 +720,6 @@ class WindowSurfacePlacer { anim = mService.mAppTransition.createThumbnailAspectScaleAnimationLocked(appRect, insets, thumbnailHeader, taskId, displayConfig.uiMode, displayConfig.orientation); - openingAppAnimator.thumbnailForceAboveLayer = Math.max(openingLayer, closingLayer); openingAppAnimator.deferThumbnailDestruction = !mService.mAppTransition.isNextThumbnailTransitionScaleUp(); } else { @@ -734,8 +729,8 @@ class WindowSurfacePlacer { anim.restrictDuration(MAX_ANIMATION_DURATION); anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked()); + openingAppAnimator.updateThumbnailLayer(); openingAppAnimator.thumbnail = surfaceControl; - openingAppAnimator.thumbnailLayer = openingLayer; openingAppAnimator.thumbnailAnimation = anim; mService.mAppTransition.getNextAppTransitionStartRect(taskId, mTmpStartRect); } catch (Surface.OutOfResourcesException e) {