From bf477db8551539c2a650d7d6515288f3f9da9005 Mon Sep 17 00:00:00 2001 From: "andrew.gong" Date: Thu, 24 Dec 2020 15:32:49 +0800 Subject: [PATCH] Settings observer fail to unregister. Zen mode change will call displayPreference() and create a new SettingsObserver, then the old Observer object will have no opportunity to be unregistered. After too much new SettingsObserver creatd in Monkey test, memory might leak. Bug 176206489 Change-Id: I3bccec281da492299bbf755f86df7844a31223c5 --- .../zen/AbstractZenModePreferenceController.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/notification/zen/AbstractZenModePreferenceController.java b/src/com/android/settings/notification/zen/AbstractZenModePreferenceController.java index 6fa446bab8e..02e40157aa6 100644 --- a/src/com/android/settings/notification/zen/AbstractZenModePreferenceController.java +++ b/src/com/android/settings/notification/zen/AbstractZenModePreferenceController.java @@ -84,7 +84,10 @@ abstract public class AbstractZenModePreferenceController extends mScreen = screen; Preference pref = screen.findPreference(KEY); if (pref != null) { - mSettingObserver = new SettingObserver(pref); + if (mSettingObserver == null) { + mSettingObserver = new SettingObserver(); + } + mSettingObserver.setPreference(pref); } } @@ -128,10 +131,13 @@ abstract public class AbstractZenModePreferenceController extends private final Uri ZEN_MODE_DURATION_URI = Settings.Secure.getUriFor( Settings.Secure.ZEN_DURATION); - private final Preference mPreference; + private Preference mPreference; - public SettingObserver(Preference preference) { + public SettingObserver() { super(new Handler()); + } + + public void setPreference(Preference preference) { mPreference = preference; }