From 749de2e17a16ba881b21924b847ce4b441ee34f5 Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Tue, 11 Oct 2022 15:47:02 -0700 Subject: [PATCH] [sysui] Use weak reference for the listener in NavigationBarTransitions The listener is the only thing keeping objects alive after switching dark theme, bringing the number of Resources.Theme objects to thousands. Bug: 242005877 Test: manual, 10k theme switches to verify there's fewer active theme objects Change-Id: I59ff27dacd4bcad933341886c249074cf7df6dc9 (cherry picked from commit 0776b3b410c86dd8f739097d3c53bc3ec7d5679a) --- .../NavigationBarTransitions.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java index a4de9ffbfa514..20b50325f65f2 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java @@ -36,6 +36,7 @@ import com.android.systemui.statusbar.phone.BarTransitions; import com.android.systemui.statusbar.phone.LightBarTransitionsController; import java.io.PrintWriter; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -76,15 +77,27 @@ public final class NavigationBarTransitions extends BarTransitions implements private List mDarkIntensityListeners; private final Handler mHandler = Handler.getMain(); - private final IWallpaperVisibilityListener mWallpaperVisibilityListener = - new IWallpaperVisibilityListener.Stub() { + + static final class WallpaperVisibilityListener extends IWallpaperVisibilityListener.Stub { + private final WeakReference mSelf; + + WallpaperVisibilityListener(NavigationBarTransitions self) { + mSelf = new WeakReference<>(self); + } + @Override public void onWallpaperVisibilityChanged(boolean newVisibility, - int displayId) throws RemoteException { - mWallpaperVisible = newVisibility; - mHandler.post(() -> applyLightsOut(true, false)); + int displayId) throws RemoteException { + NavigationBarTransitions self = mSelf.get(); + if (self == null) { + return; + } + self.mWallpaperVisible = newVisibility; + self.mHandler.post(() -> self.applyLightsOut(true, false)); } - }; + } + + private final IWallpaperVisibilityListener mWallpaperVisibilityListener; @Inject public NavigationBarTransitions( @@ -93,6 +106,7 @@ public final class NavigationBarTransitions extends BarTransitions implements LightBarTransitionsController.Factory lightBarTransitionsControllerFactory, DisplayTracker displayTracker) { super(view, R.drawable.nav_background); + mView = view; mWindowManagerService = windowManagerService; mLightTransitionsController = lightBarTransitionsControllerFactory.create(this); @@ -101,6 +115,7 @@ public final class NavigationBarTransitions extends BarTransitions implements .getBoolean(R.bool.config_navigation_bar_enable_auto_dim_no_visible_wallpaper); mDarkIntensityListeners = new ArrayList(); + mWallpaperVisibilityListener = new WallpaperVisibilityListener(this); try { mWallpaperVisible = mWindowManagerService.registerWallpaperVisibilityListener( mWallpaperVisibilityListener, mDisplayTracker.getDefaultDisplayId());