From a96dcb0cc78257adf2ae75eabb8a00be61408784 Mon Sep 17 00:00:00 2001 From: Luca Zuccarini Date: Tue, 23 May 2023 14:50:14 +0000 Subject: [PATCH] Remove redundant instances of depth controller. During each app launch, a new `MyDepthController` is instantiated, which registers two of its methods as listeners for cross window blur and opaqueness. This controller's usefulness spans that specific animation only, but the listeners are never unregistered. This creates conflicts when an opaqueness signal happens, which cause the background to flicker (see videos). Bug: 283335820 Test: manual, see videos in the bug Flag: not needed, bug fix Change-Id: I3dcb0b8ff0aa77bf3183a926889d0131b17bcaa4 --- .../launcher3/QuickstepTransitionManager.java | 3 +++ .../statehandlers/DepthController.java | 24 +++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 977163b8b0..b1faf88664 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -1065,6 +1065,9 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener new SurfaceControl.Transaction().remove(dimLayer).apply())); } + backgroundRadiusAnim.addListener( + AnimatorListeners.forEndCallback(depthController::dispose)); + return backgroundRadiusAnim; } diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java index d8458c9991..7c62763943 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java +++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java @@ -84,8 +84,7 @@ public class DepthController extends BaseDepthController implements StateHandler @Override public void onViewDetachedFromWindow(View view) { - CrossWindowBlurListeners.getInstance().removeListener(mCrossWindowBlurListener); - mLauncher.getScrimView().removeOpaquenessListener(mOpaquenessListener); + removeSecondaryListeners(); } }; rootView.addOnAttachStateChangeListener(mOnAttachListener); @@ -95,6 +94,27 @@ public class DepthController extends BaseDepthController implements StateHandler } } + /** + * Cleans up after this controller so it can be garbage collected without leaving traces. + */ + public void dispose() { + removeSecondaryListeners(); + + if (mLauncher.getRootView() != null && mOnAttachListener != null) { + mLauncher.getRootView().removeOnAttachStateChangeListener(mOnAttachListener); + mOnAttachListener = null; + } + } + + private void removeSecondaryListeners() { + if (mCrossWindowBlurListener != null) { + CrossWindowBlurListeners.getInstance().removeListener(mCrossWindowBlurListener); + } + if (mOpaquenessListener != null) { + mLauncher.getScrimView().removeOpaquenessListener(mOpaquenessListener); + } + } + /** * Sets if the underlying activity is started or not */