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
This commit is contained in:
Fabrice Di Meglio
2014-08-13 10:45:19 -07:00
parent 841f760fd7
commit d83b3c2a39

View File

@@ -66,7 +66,7 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di
private boolean mPreferenceHighlighted = false; private boolean mPreferenceHighlighted = false;
private Drawable mHighlightDrawable; private Drawable mHighlightDrawable;
private Object mRegisterLock = new Object(); private ListAdapter mCurrentRootAdapter;
private boolean mIsDataSetObserverRegistered = false; private boolean mIsDataSetObserverRegistered = false;
private DataSetObserver mDataSetObserver = new DataSetObserver() { private DataSetObserver mDataSetObserver = new DataSetObserver() {
@Override @Override
@@ -146,6 +146,11 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di
registerObserverIfNeeded(); registerObserverIfNeeded();
} }
@Override
protected void onUnbindPreferences() {
unregisterObserverIfNeeded();
}
@Override @Override
public void onStop() { public void onStop() {
super.onStop(); super.onStop();
@@ -154,20 +159,23 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di
} }
public void registerObserverIfNeeded() { public void registerObserverIfNeeded() {
synchronized (mRegisterLock) {
if (!mIsDataSetObserverRegistered) { if (!mIsDataSetObserverRegistered) {
getPreferenceScreen().getRootAdapter().registerDataSetObserver(mDataSetObserver); if (mCurrentRootAdapter != null) {
mIsDataSetObserverRegistered = true; mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver);
} }
mCurrentRootAdapter = getPreferenceScreen().getRootAdapter();
mCurrentRootAdapter.registerDataSetObserver(mDataSetObserver);
mIsDataSetObserverRegistered = true;
} }
} }
public void unregisterObserverIfNeeded() { public void unregisterObserverIfNeeded() {
synchronized (mRegisterLock) {
if (mIsDataSetObserverRegistered) { if (mIsDataSetObserverRegistered) {
getPreferenceScreen().getRootAdapter().unregisterDataSetObserver(mDataSetObserver); if (mCurrentRootAdapter != null) {
mIsDataSetObserverRegistered = false; mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver);
mCurrentRootAdapter = null;
} }
mIsDataSetObserverRegistered = false;
} }
} }