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