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:
@@ -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) {
|
if (mCurrentRootAdapter != null) {
|
||||||
getPreferenceScreen().getRootAdapter().registerDataSetObserver(mDataSetObserver);
|
mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver);
|
||||||
mIsDataSetObserverRegistered = true;
|
|
||||||
}
|
}
|
||||||
|
mCurrentRootAdapter = getPreferenceScreen().getRootAdapter();
|
||||||
|
mCurrentRootAdapter.registerDataSetObserver(mDataSetObserver);
|
||||||
|
mIsDataSetObserverRegistered = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void unregisterObserverIfNeeded() {
|
public void unregisterObserverIfNeeded() {
|
||||||
synchronized (mRegisterLock) {
|
if (mIsDataSetObserverRegistered) {
|
||||||
if (mIsDataSetObserverRegistered) {
|
if (mCurrentRootAdapter != null) {
|
||||||
getPreferenceScreen().getRootAdapter().unregisterDataSetObserver(mDataSetObserver);
|
mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver);
|
||||||
mIsDataSetObserverRegistered = false;
|
mCurrentRootAdapter = null;
|
||||||
}
|
}
|
||||||
|
mIsDataSetObserverRegistered = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user