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
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index f89b72e..83b3a68 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -66,7 +66,7 @@
     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
@@ -147,6 +147,11 @@
     }
 
     @Override
+    protected void onUnbindPreferences() {
+        unregisterObserverIfNeeded();
+    }
+
+    @Override
     public void onStop() {
         super.onStop();
 
@@ -154,20 +159,23 @@
     }
 
     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;
         }
     }