From d83b3c2a39e4716b4a4276b8b8ce0db2b9a62b9e Mon Sep 17 00:00:00 2001 From: Fabrice Di Meglio Date: Wed, 13 Aug 2014 10:45:19 -0700 Subject: [PATCH] Fix bug #16957601 Stability: ISE in Settings: Observer com.android.settings. SettingsPreferenceFragment$1@273c8fdb was not registered - add override for onUnbindPreferences() that will unregister the observer if needed - keep track of the root adapter so that we can unregister / register with the correct one (by having a new PreferenceScreen the root adapter would not be the same and thus unregistering the Observer on the new one would not work and create the current bug) Change-Id: I2cef0398c2ae0ab4f5ffd67ca20e8874be997bf6 --- .../settings/SettingsPreferenceFragment.java | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index f89b72eb29a..83b3a687695 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -66,7 +66,7 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di private boolean mPreferenceHighlighted = false; private Drawable mHighlightDrawable; - private Object mRegisterLock = new Object(); + private ListAdapter mCurrentRootAdapter; private boolean mIsDataSetObserverRegistered = false; private DataSetObserver mDataSetObserver = new DataSetObserver() { @Override @@ -146,6 +146,11 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di registerObserverIfNeeded(); } + @Override + protected void onUnbindPreferences() { + unregisterObserverIfNeeded(); + } + @Override public void onStop() { super.onStop(); @@ -154,20 +159,23 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di } public void registerObserverIfNeeded() { - synchronized (mRegisterLock) { - if (!mIsDataSetObserverRegistered) { - getPreferenceScreen().getRootAdapter().registerDataSetObserver(mDataSetObserver); - mIsDataSetObserverRegistered = true; + if (!mIsDataSetObserverRegistered) { + if (mCurrentRootAdapter != null) { + mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver); } + mCurrentRootAdapter = getPreferenceScreen().getRootAdapter(); + mCurrentRootAdapter.registerDataSetObserver(mDataSetObserver); + mIsDataSetObserverRegistered = true; } } public void unregisterObserverIfNeeded() { - synchronized (mRegisterLock) { - if (mIsDataSetObserverRegistered) { - getPreferenceScreen().getRootAdapter().unregisterDataSetObserver(mDataSetObserver); - mIsDataSetObserverRegistered = false; + if (mIsDataSetObserverRegistered) { + if (mCurrentRootAdapter != null) { + mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver); + mCurrentRootAdapter = null; } + mIsDataSetObserverRegistered = false; } }