From 10c9cf6cd5e16d8e9a0efe4039e2ca860190798d Mon Sep 17 00:00:00 2001 From: Stanley Wang Date: Wed, 27 Apr 2022 17:17:21 +0800 Subject: [PATCH] Fixe the problem of invalid switch preference. The source of this problem is that onBindViewHolder is called after the user add the OnMainSwitchChangeListener. Then preference gets a new MainSwitchBar in onBindViewHolder and causes the listener to fail. Bug: 223325900 Test: Manually test and observe the UI Change-Id: I6e58c4cf035811bb8805e76bebb5fbb86c7a79da --- .../widget/SettingsMainSwitchPreference.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/widget/SettingsMainSwitchPreference.java b/src/com/android/settings/widget/SettingsMainSwitchPreference.java index 0e17d3f8e90..b7c69017404 100644 --- a/src/com/android/settings/widget/SettingsMainSwitchPreference.java +++ b/src/com/android/settings/widget/SettingsMainSwitchPreference.java @@ -199,9 +199,10 @@ public class SettingsMainSwitchPreference extends TwoStatePreference implements * Set the OnBeforeCheckedChangeListener. */ public void setOnBeforeCheckedChangeListener(OnBeforeCheckedChangeListener listener) { - if (mMainSwitchBar == null) { + if (!mBeforeCheckedChangeListeners.contains(listener)) { mBeforeCheckedChangeListeners.add(listener); - } else { + } + if (mMainSwitchBar != null) { mMainSwitchBar.setOnBeforeCheckedChangeListener(listener); } } @@ -210,9 +211,10 @@ public class SettingsMainSwitchPreference extends TwoStatePreference implements * Adds a listener for switch changes */ public void addOnSwitchChangeListener(OnMainSwitchChangeListener listener) { - if (mMainSwitchBar == null) { + if (!mSwitchChangeListeners.contains(listener)) { mSwitchChangeListeners.add(listener); - } else { + } + if (mMainSwitchBar != null) { mMainSwitchBar.addOnSwitchChangeListener(listener); } } @@ -221,9 +223,8 @@ public class SettingsMainSwitchPreference extends TwoStatePreference implements * Remove a listener for switch changes */ public void removeOnSwitchChangeListener(OnMainSwitchChangeListener listener) { - if (mMainSwitchBar == null) { - mSwitchChangeListeners.remove(listener); - } else { + mSwitchChangeListeners.remove(listener); + if (mMainSwitchBar != null) { mMainSwitchBar.removeOnSwitchChangeListener(listener); } }