From 84f6e0182e8768329c744d63345d4201892933a2 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Fri, 29 May 2020 12:00:56 -0700 Subject: [PATCH] Fix depth jumping around during transitions. This is caused because we use mDepth for depth comparisons, but there are cases where we set mDepth but we do not pass that value to WallpaperManager (ie. surface is null or not valid) and that leads us into inconsistent states. Bug: 155780358 Change-Id: I3faf14416d5783ad472892425eb0bd37dd469a46 --- .../statehandlers/DepthController.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java index 8292a92af6..fcffaedfd8 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java +++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java @@ -102,11 +102,30 @@ public class DepthController implements StateHandler { */ private float mDepth; + private View.OnAttachStateChangeListener mOnAttachListener; + public DepthController(Launcher l) { mLauncher = l; } private void ensureDependencies() { + if (mLauncher.getRootView() != null && mOnAttachListener == null) { + mOnAttachListener = new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View view) { + // To handle the case where window token is invalid during last setDepth call. + IBinder windowToken = mLauncher.getRootView().getWindowToken(); + if (windowToken != null) { + mWallpaperManager.setWallpaperZoomOut(windowToken, mDepth); + } + } + + @Override + public void onViewDetachedFromWindow(View view) { + } + }; + mLauncher.getRootView().addOnAttachStateChangeListener(mOnAttachListener); + } if (mWallpaperManager != null) { return; } @@ -184,10 +203,10 @@ public class DepthController implements StateHandler { return; } - mDepth = depthF; if (mSurface == null || !mSurface.isValid()) { return; } + mDepth = depthF; ensureDependencies(); IBinder windowToken = mLauncher.getRootView().getWindowToken(); if (windowToken != null) {