Fix KeyguardSliceView leak
Tunable and slice listener was not being unregistered correctly.
Fixes: 150595377
Test: atest KeyguardSliceViewTest
Change-Id: I28afb56b732de2c3bffded031a6fc7731b72d36d
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index f48210c..95e9c20 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -29,6 +29,7 @@
import android.annotation.StyleRes;
import android.app.PendingIntent;
import android.content.Context;
+import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.text.LineBreaker;
@@ -40,6 +41,7 @@
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
+import android.view.Display;
import android.view.View;
import android.view.animation.Animation;
import android.widget.LinearLayout;
@@ -62,6 +64,7 @@
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.keyguard.KeyguardSliceProvider;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -90,6 +93,7 @@
private final ActivityStarter mActivityStarter;
private final ConfigurationController mConfigurationController;
private final LayoutTransition mLayoutTransition;
+ private final TunerService mTunerService;
private Uri mKeyguardSliceUri;
@VisibleForTesting
TextView mTitle;
@@ -114,16 +118,14 @@
@Inject
public KeyguardSliceView(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
- ActivityStarter activityStarter, ConfigurationController configurationController) {
+ ActivityStarter activityStarter, ConfigurationController configurationController,
+ TunerService tunerService, @Main Resources resources) {
super(context, attrs);
- TunerService tunerService = Dependency.get(TunerService.class);
- tunerService.addTunable(this, Settings.Secure.KEYGUARD_SLICE_URI);
-
+ mTunerService = tunerService;
mClickActions = new HashMap<>();
- mRowPadding = context.getResources().getDimensionPixelSize(R.dimen.subtitle_clock_padding);
- mRowWithHeaderPadding = context.getResources()
- .getDimensionPixelSize(R.dimen.header_subtitle_padding);
+ mRowPadding = resources.getDimensionPixelSize(R.dimen.subtitle_clock_padding);
+ mRowWithHeaderPadding = resources.getDimensionPixelSize(R.dimen.header_subtitle_padding);
mActivityStarter = activityStarter;
mConfigurationController = configurationController;
@@ -143,7 +145,8 @@
// Eventually the existing copy will be reparented instead, and we won't need this.
public KeyguardSliceView(Context context, AttributeSet attributeSet) {
this(context, attributeSet, Dependency.get(ActivityStarter.class),
- Dependency.get(ConfigurationController.class));
+ Dependency.get(ConfigurationController.class), Dependency.get(TunerService.class),
+ context.getResources());
}
@Override
@@ -166,9 +169,15 @@
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- mDisplayId = getDisplay().getDisplayId();
+ Display display = getDisplay();
+ if (display != null) {
+ mDisplayId = display.getDisplayId();
+ }
+ mTunerService.addTunable(this, Settings.Secure.KEYGUARD_SLICE_URI);
// Make sure we always have the most current slice
- mLiveData.observeForever(this);
+ if (mDisplayId == DEFAULT_DISPLAY) {
+ mLiveData.observeForever(this);
+ }
mConfigurationController.addCallback(this);
}
@@ -180,6 +189,7 @@
if (mDisplayId == DEFAULT_DISPLAY) {
mLiveData.removeObserver(this);
}
+ mTunerService.removeTunable(this);
mConfigurationController.removeCallback(this);
}