[sysui] More weak references for event listeners
Bug: 242005877
Test: manual, 10k theme switches to verify there's much fewer
active theme objects
Change-Id: I7b52dd1ca71879157171b508ed24b5858591b050
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java
index 59bb2278e..2a7704f 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java
@@ -45,11 +45,10 @@
import com.android.systemui.shared.system.QuickStepContract;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
import java.util.Objects;
-public class NavigationBarInflaterView extends FrameLayout
- implements NavigationModeController.ModeChangedListener {
-
+public class NavigationBarInflaterView extends FrameLayout {
private static final String TAG = "NavBarInflater";
public static final String NAV_BAR_VIEWS = "sysui_nav_bar";
@@ -83,6 +82,24 @@
private static final String ABSOLUTE_SUFFIX = "A";
private static final String ABSOLUTE_VERTICAL_CENTERED_SUFFIX = "C";
+ private static class Listener implements NavigationModeController.ModeChangedListener {
+ private final WeakReference<NavigationBarInflaterView> mSelf;
+
+ Listener(NavigationBarInflaterView self) {
+ mSelf = new WeakReference<>(self);
+ }
+
+ @Override
+ public void onNavigationModeChanged(int mode) {
+ NavigationBarInflaterView self = mSelf.get();
+ if (self != null) {
+ self.onNavigationModeChanged(mode);
+ }
+ }
+ }
+
+ private final Listener mListener;
+
protected LayoutInflater mLayoutInflater;
protected LayoutInflater mLandscapeInflater;
@@ -106,7 +123,8 @@
super(context, attrs);
createInflaters();
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
- mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this);
+ mListener = new Listener(this);
+ mNavBarMode = Dependency.get(NavigationModeController.class).addListener(mListener);
}
@VisibleForTesting
@@ -146,14 +164,13 @@
return getContext().getString(defaultResource);
}
- @Override
- public void onNavigationModeChanged(int mode) {
+ private void onNavigationModeChanged(int mode) {
mNavBarMode = mode;
}
@Override
protected void onDetachedFromWindow() {
- Dependency.get(NavigationModeController.class).removeListener(this);
+ Dependency.get(NavigationModeController.class).removeListener(mListener);
super.onDetachedFromWindow();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
index 16fddb42..6bf5443 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
@@ -33,6 +33,7 @@
import com.android.systemui.statusbar.policy.KeyguardStateController;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
import dagger.assisted.Assisted;
import dagger.assisted.AssistedFactory;
@@ -41,12 +42,54 @@
/**
* Class to control all aspects about light bar changes.
*/
-public class LightBarTransitionsController implements Dumpable, Callbacks,
- StatusBarStateController.StateListener {
+public class LightBarTransitionsController implements Dumpable {
public static final int DEFAULT_TINT_ANIMATION_DURATION = 120;
private static final String EXTRA_DARK_INTENSITY = "dark_intensity";
+ private static class Callback implements Callbacks, StatusBarStateController.StateListener {
+ private final WeakReference<LightBarTransitionsController> mSelf;
+
+ Callback(LightBarTransitionsController self) {
+ mSelf = new WeakReference<>(self);
+ }
+
+ @Override
+ public void appTransitionPending(int displayId, boolean forced) {
+ LightBarTransitionsController self = mSelf.get();
+ if (self != null) {
+ self.appTransitionPending(displayId, forced);
+ }
+ }
+
+ @Override
+ public void appTransitionCancelled(int displayId) {
+ LightBarTransitionsController self = mSelf.get();
+ if (self != null) {
+ self.appTransitionCancelled(displayId);
+ }
+ }
+
+ @Override
+ public void appTransitionStarting(int displayId, long startTime, long duration,
+ boolean forced) {
+ LightBarTransitionsController self = mSelf.get();
+ if (self != null) {
+ self.appTransitionStarting(displayId, startTime, duration, forced);
+ }
+ }
+
+ @Override
+ public void onDozeAmountChanged(float linear, float eased) {
+ LightBarTransitionsController self = mSelf.get();
+ if (self != null) {
+ self.onDozeAmountChanged(linear, eased);
+ }
+ }
+ }
+
+ private final Callback mCallback;
+
private final Handler mHandler;
private final DarkIntensityApplier mApplier;
private final KeyguardStateController mKeyguardStateController;
@@ -86,8 +129,9 @@
mKeyguardStateController = keyguardStateController;
mStatusBarStateController = statusBarStateController;
mCommandQueue = commandQueue;
- mCommandQueue.addCallback(this);
- mStatusBarStateController.addCallback(this);
+ mCallback = new Callback(this);
+ mCommandQueue.addCallback(mCallback);
+ mStatusBarStateController.addCallback(mCallback);
mDozeAmount = mStatusBarStateController.getDozeAmount();
mContext = context;
mDisplayId = mContext.getDisplayId();
@@ -95,8 +139,8 @@
/** Call to cleanup the LightBarTransitionsController when done with it. */
public void destroy() {
- mCommandQueue.removeCallback(this);
- mStatusBarStateController.removeCallback(this);
+ mCommandQueue.removeCallback(mCallback);
+ mStatusBarStateController.removeCallback(mCallback);
}
public void saveState(Bundle outState) {
@@ -110,16 +154,14 @@
mNextDarkIntensity = mDarkIntensity;
}
- @Override
- public void appTransitionPending(int displayId, boolean forced) {
+ private void appTransitionPending(int displayId, boolean forced) {
if (mDisplayId != displayId || mKeyguardStateController.isKeyguardGoingAway() && !forced) {
return;
}
mTransitionPending = true;
}
- @Override
- public void appTransitionCancelled(int displayId) {
+ private void appTransitionCancelled(int displayId) {
if (mDisplayId != displayId) {
return;
}
@@ -131,9 +173,7 @@
mTransitionPending = false;
}
- @Override
- public void appTransitionStarting(int displayId, long startTime, long duration,
- boolean forced) {
+ private void appTransitionStarting(int displayId, long startTime, long duration, boolean forced) {
if (mDisplayId != displayId || mKeyguardStateController.isKeyguardGoingAway() && !forced) {
return;
}
@@ -230,10 +270,6 @@
pw.print(" mNextDarkIntensity="); pw.println(mNextDarkIntensity);
}
- @Override
- public void onStateChanged(int newState) { }
-
- @Override
public void onDozeAmountChanged(float linear, float eased) {
mDozeAmount = eased;
dispatchDark();