Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d83b3c2a authored by Fabrice Di Meglio's avatar Fabrice Di Meglio
Browse files

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
parent 841f760f
Loading
Loading
Loading
Loading
+17 −9
Original line number Diff line number Diff line
@@ -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 (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 (mCurrentRootAdapter != null) {
                mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver);
                mCurrentRootAdapter = null;
            }
            mIsDataSetObserverRegistered = false;
        }
    }