From 1998a2ee1e27b514bfdaab51e73746805ec8bedf Mon Sep 17 00:00:00 2001 From: James Kung Date: Wed, 20 Mar 2013 12:36:48 -0700 Subject: am 95e9538c: Fix for "Fragment already added" exception * commit '95e9538c2e504ea5528b07e3abdf54bb3d91c88a': Fix for "Fragment already added" exception --- src/com/android/calendar/EventInfoFragment.java | 5 ++++- src/com/android/calendar/event/EditEventFragment.java | 5 ++++- .../calendar/selectcalendars/SelectCalendarsSimpleAdapter.java | 1 + .../android/calendar/selectcalendars/SelectCalendarsSyncAdapter.java | 1 + .../selectcalendars/SelectSyncedCalendarsMultiAccountAdapter.java | 1 + 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/com/android/calendar/EventInfoFragment.java b/src/com/android/calendar/EventInfoFragment.java index 198a9117..e0bc1c24 100644 --- a/src/com/android/calendar/EventInfoFragment.java +++ b/src/com/android/calendar/EventInfoFragment.java @@ -27,6 +27,7 @@ import android.animation.ObjectAnimator; import android.app.Activity; import android.app.Dialog; import android.app.DialogFragment; +import android.app.FragmentManager; import android.app.Service; import android.content.ActivityNotFoundException; import android.content.ContentProviderOperation; @@ -1222,8 +1223,10 @@ public class EventInfoFragment extends DialogFragment implements OnCheckedChange mIsTabletConfig); mDialog.setTargetFragment(this, REQUEST_CODE_COLOR_PICKER); } + final FragmentManager fragmentManager = getFragmentManager(); + fragmentManager.executePendingTransactions(); if (!mDialog.isAdded()) { - mDialog.show(getFragmentManager(), TAG); + mDialog.show(fragmentManager, TAG); } } diff --git a/src/com/android/calendar/event/EditEventFragment.java b/src/com/android/calendar/event/EditEventFragment.java index 220e17cc..b0af28db 100644 --- a/src/com/android/calendar/event/EditEventFragment.java +++ b/src/com/android/calendar/event/EditEventFragment.java @@ -19,6 +19,7 @@ package com.android.calendar.event; import android.app.Activity; import android.app.AlertDialog; import android.app.Fragment; +import android.app.FragmentManager; import android.content.AsyncQueryHandler; import android.content.ContentProviderOperation; import android.content.ContentResolver; @@ -375,8 +376,10 @@ public class EditEventFragment extends Fragment implements EventHandler, OnColor mDialog.setCalendarColor(mModel.mCalendarColor); mDialog.setColors(colors, mModel.mEventColor); } + final FragmentManager fragmentManager = getFragmentManager(); + fragmentManager.executePendingTransactions(); if (!mDialog.isAdded()) { - mDialog.show(getFragmentManager(), TAG); + mDialog.show(fragmentManager, TAG); } } }; diff --git a/src/com/android/calendar/selectcalendars/SelectCalendarsSimpleAdapter.java b/src/com/android/calendar/selectcalendars/SelectCalendarsSimpleAdapter.java index 4a9420b1..c3be8ac4 100644 --- a/src/com/android/calendar/selectcalendars/SelectCalendarsSimpleAdapter.java +++ b/src/com/android/calendar/selectcalendars/SelectCalendarsSimpleAdapter.java @@ -240,6 +240,7 @@ public class SelectCalendarsSimpleAdapter extends BaseAdapter implements ListAda } else { mDialog.setCalendarId(mData[position].id); } + mFragmentManager.executePendingTransactions(); if (!mDialog.isAdded()) { mDialog.show(mFragmentManager, "Fragment"); } diff --git a/src/com/android/calendar/selectcalendars/SelectCalendarsSyncAdapter.java b/src/com/android/calendar/selectcalendars/SelectCalendarsSyncAdapter.java index 67e078b6..4035932f 100644 --- a/src/com/android/calendar/selectcalendars/SelectCalendarsSyncAdapter.java +++ b/src/com/android/calendar/selectcalendars/SelectCalendarsSyncAdapter.java @@ -182,6 +182,7 @@ public class SelectCalendarsSyncAdapter extends BaseAdapter } else { mDialog.setCalendarId(mData[position].id); } + mFragmentManager.executePendingTransactions(); if (!mDialog.isAdded()) { mDialog.show(mFragmentManager, TAG); } diff --git a/src/com/android/calendar/selectcalendars/SelectSyncedCalendarsMultiAccountAdapter.java b/src/com/android/calendar/selectcalendars/SelectSyncedCalendarsMultiAccountAdapter.java index 41e1b2e1..e4692319 100644 --- a/src/com/android/calendar/selectcalendars/SelectSyncedCalendarsMultiAccountAdapter.java +++ b/src/com/android/calendar/selectcalendars/SelectSyncedCalendarsMultiAccountAdapter.java @@ -334,6 +334,7 @@ public class SelectSyncedCalendarsMultiAccountAdapter extends CursorTreeAdapter } else { mDialog.setCalendarId(id); } + mFragmentManager.executePendingTransactions(); if (!mDialog.isAdded()) { mDialog.show(mFragmentManager, TAG); } -- cgit v1.2.3 From d2f728b1243e10f96f71b62bb9919f43ae182fda Mon Sep 17 00:00:00 2001 From: Chris Wren Date: Mon, 6 May 2013 09:23:04 -0700 Subject: am 5f44e994: serialize the GCM calls. * commit '5f44e994a6f1dabf5a208f0035d476e71460626b': serialize the GCM calls. --- src/com/android/calendar/alerts/AlertActivity.java | 10 +- .../calendar/alerts/GlobalDismissManager.java | 231 ++++++++++----------- 2 files changed, 117 insertions(+), 124 deletions(-) diff --git a/src/com/android/calendar/alerts/AlertActivity.java b/src/com/android/calendar/alerts/AlertActivity.java index 5f8173a2..6e9af6de 100644 --- a/src/com/android/calendar/alerts/AlertActivity.java +++ b/src/com/android/calendar/alerts/AlertActivity.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; +import android.os.AsyncTask; import android.os.Bundle; import android.provider.CalendarContract; import android.provider.CalendarContract.CalendarAlerts; @@ -133,8 +134,15 @@ public class AlertActivity extends Activity implements OnClickListener { initiateGlobalDismiss(alarmIds); } + @SuppressWarnings("unchecked") private void initiateGlobalDismiss(List alarmIds) { - GlobalDismissManager.dismissGlobally(getApplicationContext(), alarmIds); + new AsyncTask, Void, Void>() { + @Override + protected Void doInBackground(List... params) { + GlobalDismissManager.dismissGlobally(getApplicationContext(), params[0]); + return null; + } + }.execute(alarmIds); } private class QueryHandler extends AsyncQueryService { diff --git a/src/com/android/calendar/alerts/GlobalDismissManager.java b/src/com/android/calendar/alerts/GlobalDismissManager.java index fb36a3ea..7bd32222 100644 --- a/src/com/android/calendar/alerts/GlobalDismissManager.java +++ b/src/com/android/calendar/alerts/GlobalDismissManager.java @@ -16,7 +16,6 @@ package com.android.calendar.alerts; -import android.app.Activity; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.ContentValues; @@ -25,7 +24,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; -import android.os.AsyncTask; import android.os.Bundle; import android.provider.CalendarContract.CalendarAlerts; import android.provider.CalendarContract.Calendars; @@ -98,68 +96,61 @@ public class GlobalDismissManager extends BroadcastReceiver { Log.i(TAG, "no sender configured"); return; } - new AsyncTask() { - - @Override - protected Void doInBackground(Void... params) { - - Map eventsToCalendars = lookupEventToCalendarMap(context, eventIds); - Set calendars = new LinkedHashSet(); - calendars.addAll(eventsToCalendars.values()); - if (calendars.isEmpty()) { - Log.d(TAG, "foudn no calendars for events"); - return null; - } + Map eventsToCalendars = lookupEventToCalendarMap(context, eventIds); + Set calendars = new LinkedHashSet(); + calendars.addAll(eventsToCalendars.values()); + if (calendars.isEmpty()) { + Log.d(TAG, "found no calendars for events"); + return; + } - Map> calendarsToAccounts = - lookupCalendarToAccountMap(context, calendars); + Map> calendarsToAccounts = + lookupCalendarToAccountMap(context, calendars); - if (calendarsToAccounts.isEmpty()) { - Log.d(TAG, "found no accounts for calendars"); - return null; - } + if (calendarsToAccounts.isEmpty()) { + Log.d(TAG, "found no accounts for calendars"); + return; + } - // filter out non-google accounts (necessary?) - Set accounts = new LinkedHashSet(); - for (Pair accountPair : calendarsToAccounts.values()) { - if (GOOGLE_ACCOUNT_TYPE.equals(accountPair.first)) { - accounts.add(accountPair.second); - } - } + // filter out non-google accounts (necessary?) + Set accounts = new LinkedHashSet(); + for (Pair accountPair : calendarsToAccounts.values()) { + if (GOOGLE_ACCOUNT_TYPE.equals(accountPair.first)) { + accounts.add(accountPair.second); + } + } - // filter out accounts we already know about - SharedPreferences prefs = - context.getSharedPreferences(GLOBAL_DISMISS_MANAGER_PREFS, - Context.MODE_PRIVATE); - Set existingAccounts = prefs.getStringSet(ACCOUNT_KEY, - new HashSet()); - accounts.removeAll(existingAccounts); + // filter out accounts we already know about + SharedPreferences prefs = + context.getSharedPreferences(GLOBAL_DISMISS_MANAGER_PREFS, + Context.MODE_PRIVATE); + Set existingAccounts = prefs.getStringSet(ACCOUNT_KEY, + new HashSet()); + accounts.removeAll(existingAccounts); - if (accounts.isEmpty()) { - return null; - } + if (accounts.isEmpty()) { + // nothing to do, we've already registered all the accounts. + return; + } - // subscribe to remaining accounts - CloudNotificationBackplane cnb = - ExtensionsFactory.getCloudNotificationBackplane(); - if (cnb.open(context)) { - for (String account : accounts) { - try { - if (cnb.subscribeToGroup(senderId, account, account)) { - existingAccounts.add(account); - } - } catch (IOException e) { - // Try again, next time the account triggers and alert. - } + // subscribe to remaining accounts + CloudNotificationBackplane cnb = + ExtensionsFactory.getCloudNotificationBackplane(); + if (cnb.open(context)) { + for (String account : accounts) { + try { + if (cnb.subscribeToGroup(senderId, account, account)) { + existingAccounts.add(account); } - cnb.close(); - prefs.edit() - .putStringSet(ACCOUNT_KEY, existingAccounts) - .commit(); + } catch (IOException e) { + // Try again, next time the account triggers and alert. } - return null; } - }.execute(); + cnb.close(); + prefs.edit() + .putStringSet(ACCOUNT_KEY, existingAccounts) + .commit(); + } } /** @@ -175,86 +166,80 @@ public class GlobalDismissManager extends BroadcastReceiver { Log.i(TAG, "no sender configured"); return; } - new AsyncTask() { - @Override - protected Void doInBackground(Void... params) { - Set eventIds = new HashSet(alarmIds.size()); - for (AlarmId alarmId: alarmIds) { - eventIds.add(alarmId.mEventId); - } - // find the mapping between calendars and events - Map eventsToCalendars = lookupEventToCalendarMap(context, eventIds); + Set eventIds = new HashSet(alarmIds.size()); + for (AlarmId alarmId: alarmIds) { + eventIds.add(alarmId.mEventId); + } + // find the mapping between calendars and events + Map eventsToCalendars = lookupEventToCalendarMap(context, eventIds); - if (eventsToCalendars.isEmpty()) { - Log.d(TAG, "found no calendars for events"); - return null; - } + if (eventsToCalendars.isEmpty()) { + Log.d(TAG, "found no calendars for events"); + return; + } - Set calendars = new LinkedHashSet(); - calendars.addAll(eventsToCalendars.values()); + Set calendars = new LinkedHashSet(); + calendars.addAll(eventsToCalendars.values()); - // find the accounts associated with those calendars - Map> calendarsToAccounts = - lookupCalendarToAccountMap(context, calendars); + // find the accounts associated with those calendars + Map> calendarsToAccounts = + lookupCalendarToAccountMap(context, calendars); - if (calendarsToAccounts.isEmpty()) { - Log.d(TAG, "found no accounts for calendars"); - return null; - } + if (calendarsToAccounts.isEmpty()) { + Log.d(TAG, "found no accounts for calendars"); + return; + } - // TODO group by account to reduce queries - Map syncIdToAccount = new HashMap(); - Map eventIdToSyncId = new HashMap(); - ContentResolver resolver = context.getContentResolver(); - for (Long eventId : eventsToCalendars.keySet()) { - Long calendar = eventsToCalendars.get(eventId); - Pair account = calendarsToAccounts.get(calendar); - if (GOOGLE_ACCOUNT_TYPE.equals(account.first)) { - Uri uri = asSync(Events.CONTENT_URI, account.first, account.second); - Cursor cursor = resolver.query(uri, EVENT_SYNC_PROJECTION, - Events._ID + " = " + eventId, null, null); - try { - cursor.moveToPosition(-1); - int sync_id_idx = cursor.getColumnIndex(Events._SYNC_ID); - if (sync_id_idx != -1) { - while (cursor.moveToNext()) { - String syncId = cursor.getString(sync_id_idx); - syncIdToAccount.put(syncId, account.second); - eventIdToSyncId.put(eventId, syncId); - } - } - } finally { - cursor.close(); + // TODO group by account to reduce queries + Map syncIdToAccount = new HashMap(); + Map eventIdToSyncId = new HashMap(); + ContentResolver resolver = context.getContentResolver(); + for (Long eventId : eventsToCalendars.keySet()) { + Long calendar = eventsToCalendars.get(eventId); + Pair account = calendarsToAccounts.get(calendar); + if (GOOGLE_ACCOUNT_TYPE.equals(account.first)) { + Uri uri = asSync(Events.CONTENT_URI, account.first, account.second); + Cursor cursor = resolver.query(uri, EVENT_SYNC_PROJECTION, + Events._ID + " = " + eventId, null, null); + try { + cursor.moveToPosition(-1); + int sync_id_idx = cursor.getColumnIndex(Events._SYNC_ID); + if (sync_id_idx != -1) { + while (cursor.moveToNext()) { + String syncId = cursor.getString(sync_id_idx); + syncIdToAccount.put(syncId, account.second); + eventIdToSyncId.put(eventId, syncId); } } + } finally { + cursor.close(); } + } + } - if (syncIdToAccount.isEmpty()) { - Log.d(TAG, "found no syncIds for events"); - return null; - } + if (syncIdToAccount.isEmpty()) { + Log.d(TAG, "found no syncIds for events"); + return; + } - // TODO group by account to reduce packets - CloudNotificationBackplane cnb = ExtensionsFactory.getCloudNotificationBackplane(); - if (cnb.open(context)) { - for (AlarmId alarmId: alarmIds) { - String syncId = eventIdToSyncId.get(alarmId.mEventId); - String account = syncIdToAccount.get(syncId); - Bundle data = new Bundle(); - data.putString(SYNC_ID, syncId); - data.putString(START_TIME, Long.toString(alarmId.mStart)); - data.putString(ACCOUNT_NAME, account); - try { - cnb.send(account, syncId + ":" + alarmId.mStart, data); - } catch (IOException e) { - // TODO save a note to try again later - } - } - cnb.close(); + // TODO group by account to reduce packets + CloudNotificationBackplane cnb = ExtensionsFactory.getCloudNotificationBackplane(); + if (cnb.open(context)) { + for (AlarmId alarmId: alarmIds) { + String syncId = eventIdToSyncId.get(alarmId.mEventId); + String account = syncIdToAccount.get(syncId); + Bundle data = new Bundle(); + data.putString(SYNC_ID, syncId); + data.putString(START_TIME, Long.toString(alarmId.mStart)); + data.putString(ACCOUNT_NAME, account); + try { + cnb.send(account, syncId + ":" + alarmId.mStart, data); + } catch (IOException e) { + // TODO save a note to try again later } - return null; } - }.execute(); + cnb.close(); + } } private static Uri asSync(Uri uri, String accountType, String account) { -- cgit v1.2.3 From e4650063865793a28ab502e9ac2bcdf2822ec845 Mon Sep 17 00:00:00 2001 From: Chris Wren Date: Mon, 6 May 2013 09:19:59 -0700 Subject: am d6360ea9: don\'t return a result from this non-ordered broadcast. * commit 'd6360ea9b9ebed2a7b571c0270ed1a00e123ca23': don't return a result from this non-ordered broadcast. --- src/com/android/calendar/alerts/GlobalDismissManager.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/com/android/calendar/alerts/GlobalDismissManager.java b/src/com/android/calendar/alerts/GlobalDismissManager.java index 7bd32222..a57a9945 100644 --- a/src/com/android/calendar/alerts/GlobalDismissManager.java +++ b/src/com/android/calendar/alerts/GlobalDismissManager.java @@ -370,7 +370,5 @@ public class GlobalDismissManager extends BroadcastReceiver { Log.d(TAG, "updating alarm state"); AlertService.updateAlertNotification(context); } - - setResultCode(Activity.RESULT_OK); } } -- cgit v1.2.3