[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 0776b3b410)
This commit is contained in:
Yurii Zubrytskyi
2022-10-11 15:47:02 -07:00
committed by Winson Chung
parent b188d33eec
commit 749de2e17a

View File

@@ -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<DarkIntensityListener> mDarkIntensityListeners;
private final Handler mHandler = Handler.getMain();
private final IWallpaperVisibilityListener mWallpaperVisibilityListener =
new IWallpaperVisibilityListener.Stub() {
static final class WallpaperVisibilityListener extends IWallpaperVisibilityListener.Stub {
private final WeakReference<NavigationBarTransitions> 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());