Clear cached CalendarObservers after Calendar wipe

* This fix may resolve the bugs referenced below; the issue fixed
  could cause pandemonium after the server commands a wipe of calendar
  data and most likely explains these issues (via Occam's Razor)

Bug: 4077499
Bug: 4064237
Change-Id: I628fb14ea2c04150d4f27341751f0eab61ee33d1
diff --git a/src/com/android/exchange/ExchangeService.java b/src/com/android/exchange/ExchangeService.java
index 0e459d7..ffdbb82 100644
--- a/src/com/android/exchange/ExchangeService.java
+++ b/src/com/android/exchange/ExchangeService.java
@@ -209,8 +209,9 @@
     private EasSyncStatusObserver mSyncStatusObserver;
     private Object mStatusChangeListener;
 
-    private HashMap<Long, CalendarObserver> mCalendarObservers =
-        new HashMap<Long, CalendarObserver>();
+    // Concurrent because CalendarSyncAdapter can modify the map during a wipe
+    private ConcurrentHashMap<Long, CalendarObserver> mCalendarObservers =
+        new ConcurrentHashMap<Long, CalendarObserver>();
 
     private ContentResolver mResolver;
 
@@ -745,11 +746,14 @@
     /**
      * Unregister all CalendarObserver's
      */
-    private void unregisterCalendarObservers() {
-        for (CalendarObserver observer: mCalendarObservers.values()) {
-            mResolver.unregisterContentObserver(observer);
+    static public void unregisterCalendarObservers() {
+        ExchangeService exchangeService = INSTANCE;
+        if (exchangeService == null) return;
+        ContentResolver resolver = exchangeService.mResolver;
+        for (CalendarObserver observer: exchangeService.mCalendarObservers.values()) {
+            resolver.unregisterContentObserver(observer);
         }
-        mCalendarObservers.clear();
+        exchangeService.mCalendarObservers.clear();
     }
 
     /**
diff --git a/src/com/android/exchange/adapter/CalendarSyncAdapter.java b/src/com/android/exchange/adapter/CalendarSyncAdapter.java
index ea857ec..682fcba 100644
--- a/src/com/android/exchange/adapter/CalendarSyncAdapter.java
+++ b/src/com/android/exchange/adapter/CalendarSyncAdapter.java
@@ -24,6 +24,7 @@
 import com.android.exchange.Eas;
 import com.android.exchange.EasOutboxService;
 import com.android.exchange.EasSyncService;
+import com.android.exchange.ExchangeService;
 import com.android.exchange.utility.CalendarUtilities;
 import com.android.exchange.utility.Duration;
 
@@ -198,6 +199,8 @@
                 "=" + DatabaseUtils.sqlEscapeString(mEmailAddress) + " AND " +
                 Calendars._SYNC_ACCOUNT_TYPE + "=" +
                 DatabaseUtils.sqlEscapeString(AccountManagerTypes.TYPE_EXCHANGE), null);
+        // Invalidate our calendar observers
+        ExchangeService.unregisterCalendarObservers();
     }
 
     @Override