Fix bug #16660405 Stability: ISE in Settings: Observer ...
com.android.settings.SettingsPreferenceFragment$1@3c1d9ecb was not registered

- use a monitor to control registering / unregistering

Change-Id: Id66dd698abf92643c97938e2091c3be38e6b78bd
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 38344fb..f89b72e 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -66,6 +66,7 @@
     private boolean mPreferenceHighlighted = false;
     private Drawable mHighlightDrawable;
 
+    private Object mRegisterLock = new Object();
     private boolean mIsDataSetObserverRegistered = false;
     private DataSetObserver mDataSetObserver = new DataSetObserver() {
         @Override
@@ -153,16 +154,20 @@
     }
 
     public void registerObserverIfNeeded() {
-        if (!mIsDataSetObserverRegistered) {
-            getPreferenceScreen().getRootAdapter().registerDataSetObserver(mDataSetObserver);
-            mIsDataSetObserverRegistered = true;
+        synchronized (mRegisterLock) {
+            if (!mIsDataSetObserverRegistered) {
+                getPreferenceScreen().getRootAdapter().registerDataSetObserver(mDataSetObserver);
+                mIsDataSetObserverRegistered = true;
+            }
         }
     }
 
     public void unregisterObserverIfNeeded() {
-        if (mIsDataSetObserverRegistered) {
-            getPreferenceScreen().getRootAdapter().unregisterDataSetObserver(mDataSetObserver);
-            mIsDataSetObserverRegistered = false;
+        synchronized (mRegisterLock) {
+            if (mIsDataSetObserverRegistered) {
+                getPreferenceScreen().getRootAdapter().unregisterDataSetObserver(mDataSetObserver);
+                mIsDataSetObserverRegistered = false;
+            }
         }
     }