12bebde787f9490408ceaf14166de4b016a10daf1Mason Tang/* 22bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Copyright (C) 2010 The Android Open Source Project 32bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 42bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Licensed under the Apache License, Version 2.0 (the "License"); 52bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * you may not use this file except in compliance with the License. 62bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * You may obtain a copy of the License at 72bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 82bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * http://www.apache.org/licenses/LICENSE-2.0 92bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Unless required by applicable law or agreed to in writing, software 112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * distributed under the License is distributed on an "AS IS" BASIS, 122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * See the License for the specific language governing permissions and 142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * limitations under the License. 152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 172bebde787f9490408ceaf14166de4b016a10daf1Mason Tangpackage com.android.calendar; 182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 192c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport static android.provider.CalendarContract.EXTRA_EVENT_ALL_DAY; 202c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport static android.provider.CalendarContract.EXTRA_EVENT_BEGIN_TIME; 212c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport static android.provider.CalendarContract.EXTRA_EVENT_END_TIME; 222c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport static com.android.calendar.CalendarController.EVENT_EDIT_ON_LAUNCH; 232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 248f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelsonimport android.animation.Animator; 258f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelsonimport android.animation.AnimatorListenerAdapter; 268f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelsonimport android.animation.ObjectAnimator; 272bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.app.Activity; 2871d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.Dialog; 2971d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.DialogFragment; 3095e9538c2e504ea5528b07e3abdf54bb3d91c88aJames Kungimport android.app.FragmentManager; 31ef31a98202852807f460af49ae3313d1ccf5e288Andy McFaddenimport android.app.Service; 322bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ActivityNotFoundException; 33364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erikimport android.content.ContentProviderOperation; 342bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentResolver; 352bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentUris; 362bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentValues; 372bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Context; 38b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelsonimport android.content.DialogInterface; 392bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Intent; 401ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport android.content.SharedPreferences; 412c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport android.content.pm.ApplicationInfo; 422c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport android.content.pm.PackageManager; 432c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport android.content.pm.PackageManager.NameNotFoundException; 442bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.res.Resources; 452bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.Cursor; 464afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport android.graphics.Color; 472bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.Rect; 482c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport android.graphics.drawable.Drawable; 492bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.net.Uri; 502bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.os.Bundle; 51a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract; 52a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Attendees; 53a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Calendars; 544afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport android.provider.CalendarContract.Colors; 55a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Events; 561ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport android.provider.CalendarContract.Reminders; 57cb81189e4868769ea016253eca104e46df2f033aErikimport android.provider.ContactsContract; 582bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.CommonDataKinds; 592bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Intents; 602bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.QuickContact; 618ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.Spannable; 628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.SpannableStringBuilder; 632bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.TextUtils; 642bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.Time; 6573b07655afcea1ba2ce8ed580a50992bf0baf857Andy McFaddenimport android.text.method.LinkMovementMethod; 6673b07655afcea1ba2ce8ed580a50992bf0baf857Andy McFaddenimport android.text.method.MovementMethod; 678ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.ForegroundColorSpan; 682bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Rfc822Token; 692bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.util.Log; 704afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport android.util.SparseIntArray; 7171d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Gravity; 722bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.LayoutInflater; 7360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.Menu; 7460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.MenuInflater; 7560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.MenuItem; 762bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MotionEvent; 772bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.View; 78cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnClickListener; 79cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnTouchListener; 802bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.ViewGroup; 8171d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Window; 8271d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.WindowManager; 83259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.view.accessibility.AccessibilityEvent; 84259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.view.accessibility.AccessibilityManager; 852bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.AdapterView; 868b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErikimport android.widget.AdapterView.OnItemSelectedListener; 878ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.widget.Button; 881ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport android.widget.LinearLayout; 89259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.widget.RadioButton; 90f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanimport android.widget.RadioGroup; 91f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanimport android.widget.RadioGroup.OnCheckedChangeListener; 928b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErikimport android.widget.ScrollView; 932bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.TextView; 942bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Toast; 952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 962c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.CalendarController.EventInfo; 972c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.CalendarController.EventType; 982c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.CalendarEventModel.Attendee; 992c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.CalendarEventModel.ReminderEntry; 1007da27670d2a62e213e230989b250f047012a3bbdSara Tingimport com.android.calendar.alerts.QuickResponseActivity; 1012c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.event.AttendeesView; 1022c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.event.EditEventActivity; 1032c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.event.EditEventHelper; 1044afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport com.android.calendar.event.EventColorPickerDialog; 1052c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.event.EventViewUtils; 106da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Tingimport com.android.calendarcommon2.DateException; 107da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Tingimport com.android.calendarcommon2.Duration; 1088a528adbba5d46fe0d566f474bc3be190511198eMichael Chanimport com.android.calendarcommon2.EventRecurrence; 109a8b8c0d17adf3e8f9b34a5da89592aa7069c0bddJames Kungimport com.android.colorpicker.ColorPickerSwatch.OnColorSelectedListener; 110a8b8c0d17adf3e8f9b34a5da89592aa7069c0bddJames Kungimport com.android.colorpicker.HsvColorComparator; 1112c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 1122bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.ArrayList; 1131ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport java.util.Arrays; 1141ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport java.util.Collections; 115259b8f9a21fffd3858218581e9daaf689b6b888fErikimport java.util.List; 116f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson 117f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanpublic class EventInfoFragment extends DialogFragment implements OnCheckedChangeListener, 118b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung CalendarController.EventHandler, OnClickListener, DeleteEventHelper.DeleteNotifyListener, 119b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung OnColorSelectedListener { 12083efa2d50deca53c9937b19a379045c31b541cb7Michael Chan 121e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung public static final boolean DEBUG = false; 1222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1232c7c851a4e40afa83a741ec39d44425b705a712eMichael Chan public static final String TAG = "EventInfoFragment"; 1242fca024254c9de09f8d87933cc8c9a2046e37c52James Kung public static final String COLOR_PICKER_DIALOG_TAG = "EventColorPickerDialog"; 1252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 126b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung private static final int REQUEST_CODE_COLOR_PICKER = 0; 127b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung 12860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_EVENT_ID = "key_event_id"; 12960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_START_MILLIS = "key_start_millis"; 13060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_END_MILLIS = "key_end_millis"; 13160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_IS_DIALOG = "key_fragment_is_dialog"; 132b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson protected static final String BUNDLE_KEY_DELETE_DIALOG_VISIBLE = "key_delete_dialog_visible"; 1337ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson protected static final String BUNDLE_KEY_WINDOW_STYLE = "key_window_style"; 1344afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung protected static final String BUNDLE_KEY_CALENDAR_COLOR = "key_calendar_color"; 135f56b14972130233fd7e7c64160084793a7a0a55bJames Kung protected static final String BUNDLE_KEY_CALENDAR_COLOR_INIT = "key_calendar_color_init"; 1364afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung protected static final String BUNDLE_KEY_CURRENT_COLOR = "key_current_color"; 137497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung protected static final String BUNDLE_KEY_CURRENT_COLOR_KEY = "key_current_color_key"; 138f56b14972130233fd7e7c64160084793a7a0a55bJames Kung protected static final String BUNDLE_KEY_CURRENT_COLOR_INIT = "key_current_color_init"; 1394afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung protected static final String BUNDLE_KEY_ORIGINAL_COLOR = "key_original_color"; 140f56b14972130233fd7e7c64160084793a7a0a55bJames Kung protected static final String BUNDLE_KEY_ORIGINAL_COLOR_INIT = "key_original_color_init"; 14194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein protected static final String BUNDLE_KEY_ATTENDEE_RESPONSE = "key_attendee_response"; 14294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein protected static final String BUNDLE_KEY_USER_SET_ATTENDEE_RESPONSE = 14394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein "key_user_set_attendee_response"; 14494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein protected static final String BUNDLE_KEY_TENTATIVE_USER_RESPONSE = 14594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein "key_tentative_user_response"; 14694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein protected static final String BUNDLE_KEY_RESPONSE_WHICH_EVENTS = "key_response_which_events"; 14794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein protected static final String BUNDLE_KEY_REMINDER_MINUTES = "key_reminder_minutes"; 14894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein protected static final String BUNDLE_KEY_REMINDER_METHODS = "key_reminder_methods"; 14994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein 1504afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 151259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final String PERIOD_SPACE = ". "; 152259b8f9a21fffd3858218581e9daaf689b6b888fErik 1534afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private static final String NO_EVENT_COLOR = ""; 1544afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 1552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 1562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * These are the corresponding indices into the array of strings 1572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * "R.array.change_response_labels" in the resource file. 1582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 1592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_SINGLE = 0; 1602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_ALL = 1; 1612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1627ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson // Style of view 1637ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson public static final int FULL_WINDOW_STYLE = 0; 1647ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson public static final int DIALOG_WINDOW_STYLE = 1; 1657ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson 1667ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson private int mWindowStyle = DIALOG_WINDOW_STYLE; 1677ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson 1682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Query tokens for QueryHandler 169259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_EVENT = 1 << 0; 170259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_CALENDARS = 1 << 1; 171259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_ATTENDEES = 1 << 2; 172259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_DUPLICATE_CALENDARS = 1 << 3; 1731ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final int TOKEN_QUERY_REMINDERS = 1 << 4; 1746aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting private static final int TOKEN_QUERY_VISIBLE_CALENDARS = 1 << 5; 1754afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private static final int TOKEN_QUERY_COLORS = 1 << 6; 1764afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 177259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_ALL = TOKEN_QUERY_DUPLICATE_CALENDARS 1781ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson | TOKEN_QUERY_ATTENDEES | TOKEN_QUERY_CALENDARS | TOKEN_QUERY_EVENT 1794afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung | TOKEN_QUERY_REMINDERS | TOKEN_QUERY_VISIBLE_CALENDARS | TOKEN_QUERY_COLORS; 1806aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting 181259b8f9a21fffd3858218581e9daaf689b6b888fErik private int mCurrentQuery = 0; 1822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] EVENT_PROJECTION = new String[] { 1842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._ID, // 0 do not remove; used in DeleteEventHelper 1852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.TITLE, // 1 do not remove; used in DeleteEventHelper 1862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.RRULE, // 2 do not remove; used in DeleteEventHelper 1872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ALL_DAY, // 3 do not remove; used in DeleteEventHelper 1882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.CALENDAR_ID, // 4 do not remove; used in DeleteEventHelper 1892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DTSTART, // 5 do not remove; used in DeleteEventHelper 1902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._SYNC_ID, // 6 do not remove; used in DeleteEventHelper 1912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_TIMEZONE, // 7 do not remove; used in DeleteEventHelper 1922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DESCRIPTION, // 8 1932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_LOCATION, // 9 194693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan Calendars.CALENDAR_ACCESS_LEVEL, // 10 1954afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Events.CALENDAR_COLOR, // 11 1964afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Events.EVENT_COLOR, // 12 1974afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Events.HAS_ATTENDEE_DATA, // 13 1984afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Events.ORGANIZER, // 14 1994afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Events.HAS_ALARM, // 15 2004afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Calendars.MAX_REMINDERS, // 16 2014afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Calendars.ALLOWED_REMINDERS, // 17 2024afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Events.CUSTOM_APP_PACKAGE, // 18 2034afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Events.CUSTOM_APP_URI, // 19 204da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting Events.DTEND, // 20 205da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting Events.DURATION, // 21 2064afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Events.ORIGINAL_SYNC_ID // 22 do not remove; used in DeleteEventHelper 2072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 2082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ID = 0; 2092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_TITLE = 1; 2102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_RRULE = 2; 2112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ALL_DAY = 3; 2122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_CALENDAR_ID = 4; 213da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting private static final int EVENT_INDEX_DTSTART = 5; 2142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_SYNC_ID = 6; 2152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_TIMEZONE = 7; 2162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_DESCRIPTION = 8; 2172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_LOCATION = 9; 21871b221ae5d0f514352584a955630f5494f686c51Michael Chan private static final int EVENT_INDEX_ACCESS_LEVEL = 10; 2194afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private static final int EVENT_INDEX_CALENDAR_COLOR = 11; 2204afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private static final int EVENT_INDEX_EVENT_COLOR = 12; 2214afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private static final int EVENT_INDEX_HAS_ATTENDEE_DATA = 13; 2224afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private static final int EVENT_INDEX_ORGANIZER = 14; 2234afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private static final int EVENT_INDEX_HAS_ALARM = 15; 2244afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private static final int EVENT_INDEX_MAX_REMINDERS = 16; 2254afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private static final int EVENT_INDEX_ALLOWED_REMINDERS = 17; 2264afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private static final int EVENT_INDEX_CUSTOM_APP_PACKAGE = 18; 2274afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private static final int EVENT_INDEX_CUSTOM_APP_URI = 19; 228da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting private static final int EVENT_INDEX_DTEND = 20; 229da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting private static final int EVENT_INDEX_DURATION = 21; 2301ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] ATTENDEES_PROJECTION = new String[] { 2322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees._ID, // 0 2332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_NAME, // 1 2342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_EMAIL, // 2 2352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_RELATIONSHIP, // 3 2362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_STATUS, // 4 237ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting Attendees.ATTENDEE_IDENTITY, // 5 238ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting Attendees.ATTENDEE_ID_NAMESPACE // 6 2392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 2402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_ID = 0; 2412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_NAME = 1; 2422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_EMAIL = 2; 2432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_RELATIONSHIP = 3; 2442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_STATUS = 4; 245ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting private static final int ATTENDEES_INDEX_IDENTITY = 5; 246ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting private static final int ATTENDEES_INDEX_ID_NAMESPACE = 6; 2472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 248693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan static { 249fac2d1594f7ecae8e50dc7790ce67de0c9b70d22Sara Ting if (!Utils.isJellybeanOrLater()) { 250693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan EVENT_PROJECTION[EVENT_INDEX_CUSTOM_APP_PACKAGE] = Events._ID; // dummy value 251693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan EVENT_PROJECTION[EVENT_INDEX_CUSTOM_APP_URI] = Events._ID; // dummy value 252693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan 253693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan ATTENDEES_PROJECTION[ATTENDEES_INDEX_IDENTITY] = Attendees._ID; // dummy value 254693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan ATTENDEES_PROJECTION[ATTENDEES_INDEX_ID_NAMESPACE] = Attendees._ID; // dummy value 255693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan } 256693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan } 257693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan 2582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?"; 2592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_SORT_ORDER = Attendees.ATTENDEE_NAME + " ASC, " 2612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang + Attendees.ATTENDEE_EMAIL + " ASC"; 2622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2631ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final String[] REMINDERS_PROJECTION = new String[] { 2641ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Reminders._ID, // 0 2651ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Reminders.MINUTES, // 1 2661ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Reminders.METHOD // 2 2671ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson }; 2681ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final int REMINDERS_INDEX_ID = 0; 2691ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final int REMINDERS_MINUTES_ID = 1; 2701ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final int REMINDERS_METHOD_ID = 2; 2711ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2721ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final String REMINDERS_WHERE = Reminders.EVENT_ID + "=?"; 2731ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String[] CALENDARS_PROJECTION = new String[] { 2752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars._ID, // 0 276ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik Calendars.CALENDAR_DISPLAY_NAME, // 1 2772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.OWNER_ACCOUNT, // 2 27842896f76d81dbae873614340a3a78b29e7d463d2Sara Ting Calendars.CAN_ORGANIZER_RESPOND, // 3 2794afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Calendars.ACCOUNT_NAME, // 4 2804afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Calendars.ACCOUNT_TYPE // 5 2812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 2822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_DISPLAY_NAME = 1; 2832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2; 2842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_CAN_RESPOND = 3; 28542896f76d81dbae873614340a3a78b29e7d463d2Sara Ting static final int CALENDARS_INDEX_ACCOUNT_NAME = 4; 2864afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung static final int CALENDARS_INDEX_ACCOUNT_TYPE = 5; 2872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String CALENDARS_WHERE = Calendars._ID + "=?"; 289ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik static final String CALENDARS_DUPLICATE_NAME_WHERE = Calendars.CALENDAR_DISPLAY_NAME + "=?"; 2906aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting static final String CALENDARS_VISIBLE_WHERE = Calendars.VISIBLE + "=?"; 2912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2924afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung static final String[] COLORS_PROJECTION = new String[] { 2934afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Colors._ID, // 0 2944afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Colors.COLOR, // 1 2954afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Colors.COLOR_KEY // 2 2964afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung }; 2974afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 2984afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung static final String COLORS_WHERE = Colors.ACCOUNT_NAME + "=? AND " + Colors.ACCOUNT_TYPE + 2994afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung "=? AND " + Colors.COLOR_TYPE + "=" + Colors.TYPE_EVENT; 3004afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 3014afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung public static final int COLORS_INDEX_COLOR = 1; 3024afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung public static final int COLORS_INDEX_COLOR_KEY = 2; 303fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden 3042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private View mView; 3052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Uri mUri; 3072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEventId; 3082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mEventCursor; 3092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mAttendeesCursor; 3102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mCalendarsCursor; 3111ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private Cursor mRemindersCursor; 3121ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 3130a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan private static float mScale = 0; // Used for supporting different screen densities 3142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3152c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan private static int mCustomAppIconSize = 32; 3162c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 3172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mStartMillis; 3182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEndMillis; 3198b1119b1b58381c7fc550974f53cf93bd95dffa8Michael Chan private boolean mAllDay; 3202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mHasAttendeeData; 32283efa2d50deca53c9937b19a379045c31b541cb7Michael Chan private String mEventOrganizerEmail; 32383efa2d50deca53c9937b19a379045c31b541cb7Michael Chan private String mEventOrganizerDisplayName = ""; 3242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsOrganizer; 325d845fbe558d5229102b58cce70a1b29fe6cb6967Erik private long mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 326352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private boolean mOwnerCanRespond; 32742896f76d81dbae873614340a3a78b29e7d463d2Sara Ting private String mSyncAccountName; 3282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private String mCalendarOwnerAccount; 3292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mCanModifyCalendar; 33065eeb79e62034d706503ce29d88c0e05ebd726feRoboErik private boolean mCanModifyEvent; 3312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsBusyFreeCalendar; 3322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mNumOfAttendees; 3332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private EditResponseHelper mEditResponseHelper; 334b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson private boolean mDeleteDialogVisible = false; 335b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson private DeleteEventHelper mDeleteHelper; 3362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mOriginalAttendeeResponse; 3386bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson private int mAttendeeResponseFromIntent = Attendees.ATTENDEE_STATUS_NONE; 3396bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson private int mUserSetResponse = Attendees.ATTENDEE_STATUS_NONE; 3403b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein private int mWhichEvents = -1; 3413b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // Used as the temporary response until the dialog is confirmed. It is also 3423b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // able to be used as a state marker for configuration changes. 3433b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein private int mTentativeUserSetResponse = Attendees.ATTENDEE_STATUS_NONE; 3442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsRepeating; 3451ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private boolean mHasAlarm; 3461ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private int mMaxReminders; 3471ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private String mCalendarAllowedReminders; 348b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson // Used to prevent saving changes in event if it is being deleted. 349b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson private boolean mEventDeletionStarted = false; 3502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 351259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mTitle; 35275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private TextView mWhenDateTime; 353259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mWhere; 35499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan private ExpandableTextView mDesc; 355c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private AttendeesView mLongAttendees; 3567ffa24cba2977925b737e6bd39be59ba39609611Sara Ting private Button emailAttendeesButton; 357d8353fb85ef59a88580125207be9c914a8586758RoboErik private Menu mMenu = null; 358fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson private View mHeadlines; 3591ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private ScrollView mScrollView; 3608f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson private View mLoadingMsgView; 3611aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski private View mErrorMsgView; 3628f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson private ObjectAnimator mAnimateAlpha; 363263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson private long mLoadingMsgStartTime; 3644afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 3652fca024254c9de09f8d87933cc8c9a2046e37c52James Kung private EventColorPickerDialog mColorPickerDialog; 366e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung private SparseIntArray mDisplayColorKeyMap = new SparseIntArray(); 3674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private int[] mColors; 3684afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private int mOriginalColor = -1; 369f56b14972130233fd7e7c64160084793a7a0a55bJames Kung private boolean mOriginalColorInitialized = false; 3704afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private int mCalendarColor = -1; 371f56b14972130233fd7e7c64160084793a7a0a55bJames Kung private boolean mCalendarColorInitialized = false; 3724afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private int mCurrentColor = -1; 373f56b14972130233fd7e7c64160084793a7a0a55bJames Kung private boolean mCurrentColorInitialized = false; 374497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung private int mCurrentColorKey = -1; 3754afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 3768f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson private static final int FADE_IN_TIME = 300; // in milliseconds 377263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson private static final int LOADING_MSG_DELAY = 600; // in milliseconds 378263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson private static final int LOADING_MSG_MIN_DISPLAY_TIME = 600; 37980d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson private boolean mNoCrossFade = false; // Used to prevent repeated cross-fade 3803b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein private RadioGroup mResponseRadioGroup; 3818f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson 3822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mAcceptedAttendees = new ArrayList<Attendee>(); 3832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mDeclinedAttendees = new ArrayList<Attendee>(); 3842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mTentativeAttendees = new ArrayList<Attendee>(); 3852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mNoResponseAttendees = new ArrayList<Attendee>(); 386cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting ArrayList<String> mToEmails = new ArrayList<String>(); 387cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting ArrayList<String> mCcEmails = new ArrayList<String>(); 3881ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 3891ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private int mDefaultReminderMinutes; 390ac4350b25b794d1b2935266cf8c480e4fbf97b8fIsaac Katzenelson private final ArrayList<LinearLayout> mReminderViews = new ArrayList<LinearLayout>(0); 3911ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson public ArrayList<ReminderEntry> mReminders; 3927f078b716fa7f1d374af9af3dad05d2e249e18c8RoboErik public ArrayList<ReminderEntry> mOriginalReminders = new ArrayList<ReminderEntry>(); 3937f078b716fa7f1d374af9af3dad05d2e249e18c8RoboErik public ArrayList<ReminderEntry> mUnsupportedReminders = new ArrayList<ReminderEntry>(); 3948b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik private boolean mUserModifiedReminders = false; 3951ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 3961ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson /** 3971ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * Contents of the "minutes" spinner. This has default values from the XML file, augmented 3981ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * with any additional values that were already associated with the event. 3991ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson */ 4001ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private ArrayList<Integer> mReminderMinuteValues; 4011ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private ArrayList<String> mReminderMinuteLabels; 4021ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 4031ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson /** 4041ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * Contents of the "methods" spinner. The "values" list specifies the method constant 4051ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * (e.g. {@link Reminders#METHOD_ALERT}) associated with the labels. Any methods that 4061ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * aren't allowed by the Calendar will be removed. 4071ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson */ 4081ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private ArrayList<Integer> mReminderMethodValues; 4091ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private ArrayList<String> mReminderMethodLabels; 4101ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 4112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private QueryHandler mHandler; 4122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 413b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson 414ac4350b25b794d1b2935266cf8c480e4fbf97b8fIsaac Katzenelson private final Runnable mTZUpdater = new Runnable() { 415cb81189e4868769ea016253eca104e46df2f033aErik @Override 416cb81189e4868769ea016253eca104e46df2f033aErik public void run() { 417cb81189e4868769ea016253eca104e46df2f033aErik updateEvent(mView); 418cb81189e4868769ea016253eca104e46df2f033aErik } 419cb81189e4868769ea016253eca104e46df2f033aErik }; 420cb81189e4868769ea016253eca104e46df2f033aErik 421ac4350b25b794d1b2935266cf8c480e4fbf97b8fIsaac Katzenelson private final Runnable mLoadingMsgAlphaUpdater = new Runnable() { 422263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson @Override 423263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson public void run() { 424263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson // Since this is run after a delay, make sure to only show the message 425263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson // if the event's data is not shown yet. 426263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson if (!mAnimateAlpha.isRunning() && mScrollView.getAlpha() == 0) { 427263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson mLoadingMsgStartTime = System.currentTimeMillis(); 428263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson mLoadingMsgView.setAlpha(1); 429263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson } 430263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson } 431263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson }; 432263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson 4338b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik private OnItemSelectedListener mReminderChangeListener; 4348b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik 4357ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson private static int mDialogWidth = 500; 4367ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson private static int mDialogHeight = 600; 4370aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson private static int DIALOG_TOP_MARGIN = 8; 43871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private boolean mIsDialog = false; 4397c6236d5553dc9f3d004ebbed794249713a11d19RoboErik private boolean mIsPaused = true; 4407c6236d5553dc9f3d004ebbed794249713a11d19RoboErik private boolean mDismissOnResume = false; 44171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mX = -1; 44271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mY = -1; 4430aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson private int mMinTop; // Dialog cannot be above this location 44410b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson private boolean mIsTabletConfig; 44510b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson private Activity mActivity; 446be2a432034e96c9f2fbf333cd7fe6489312bbeaaMichael Chan private Context mContext; 44771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 4484afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private CalendarController mController; 4494afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 4502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private class QueryHandler extends AsyncQueryService { 4512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public QueryHandler(Context context) { 4522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super(context); 4532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 4562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 4574003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // if the activity is finishing, then close the cursor and return 4584003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang final Activity activity = getActivity(); 4594003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (activity == null || activity.isFinishing()) { 46047f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson if (cursor != null) { 46147f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson cursor.close(); 46247f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson } 4634003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang return; 4644003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 4654003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 4662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (token) { 4672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_EVENT: 4682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor = Utils.matrixCursorFromCursor(cursor); 4691aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski if (!initEventCursor()) { 4701aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski displayEventNotFound(); 4712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 473f56b14972130233fd7e7c64160084793a7a0a55bJames Kung if (!mCalendarColorInitialized) { 4744afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mCalendarColor = Utils.getDisplayColorFromColor( 4754afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mEventCursor.getInt(EVENT_INDEX_CALENDAR_COLOR)); 476f56b14972130233fd7e7c64160084793a7a0a55bJames Kung mCalendarColorInitialized = true; 4774afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 4784afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 479f56b14972130233fd7e7c64160084793a7a0a55bJames Kung if (!mOriginalColorInitialized) { 4804afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mOriginalColor = mEventCursor.isNull(EVENT_INDEX_EVENT_COLOR) 4814afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung ? mCalendarColor : Utils.getDisplayColorFromColor( 4824afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mEventCursor.getInt(EVENT_INDEX_EVENT_COLOR)); 483f56b14972130233fd7e7c64160084793a7a0a55bJames Kung mOriginalColorInitialized = true; 4844afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 4854afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 486f56b14972130233fd7e7c64160084793a7a0a55bJames Kung if (!mCurrentColorInitialized) { 4874afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mCurrentColor = mOriginalColor; 488f56b14972130233fd7e7c64160084793a7a0a55bJames Kung mCurrentColorInitialized = true; 4894afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 4904afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 4912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateEvent(mView); 492e35a032c939f357ce435711b2fd8de1887a05011RoboErik prepareReminders(); 4932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start calendar query 4952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = Calendars.CONTENT_URI; 4962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] args = new String[] { 4972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Long.toString(mEventCursor.getLong(EVENT_INDEX_CALENDAR_ID))}; 4982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startQuery(TOKEN_QUERY_CALENDARS, null, uri, CALENDARS_PROJECTION, 4992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CALENDARS_WHERE, args, null); 5002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 5012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_CALENDARS: 5022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor = Utils.matrixCursorFromCursor(cursor); 5032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateCalendar(mView); 5044003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // FRAG_TODO fragments shouldn't set the title anymore 5052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateTitle(); 5062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5074afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung args = new String[] { 5084afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mCalendarsCursor.getString(CALENDARS_INDEX_ACCOUNT_NAME), 5094afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mCalendarsCursor.getString(CALENDARS_INDEX_ACCOUNT_TYPE) }; 5104afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung uri = Colors.CONTENT_URI; 5114afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung startQuery(TOKEN_QUERY_COLORS, null, uri, COLORS_PROJECTION, COLORS_WHERE, args, 5124afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung null); 5134afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 514352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (!mIsBusyFreeCalendar) { 515352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan args = new String[] { Long.toString(mEventId) }; 516352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 517352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // start attendees query 518352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan uri = Attendees.CONTENT_URI; 519352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan startQuery(TOKEN_QUERY_ATTENDEES, null, uri, ATTENDEES_PROJECTION, 520352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan ATTENDEES_WHERE, args, ATTENDEES_SORT_ORDER); 521259b8f9a21fffd3858218581e9daaf689b6b888fErik } else { 522259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEventIfQueryDone(TOKEN_QUERY_ATTENDEES); 5232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5241ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (mHasAlarm) { 5251ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // start reminders query 5261ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson args = new String[] { Long.toString(mEventId) }; 5271ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson uri = Reminders.CONTENT_URI; 5281ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson startQuery(TOKEN_QUERY_REMINDERS, null, uri, 5291ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson REMINDERS_PROJECTION, REMINDERS_WHERE, args, null); 5301ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } else { 5311ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson sendAccessibilityEventIfQueryDone(TOKEN_QUERY_REMINDERS); 5321ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 5332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 5344afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung case TOKEN_QUERY_COLORS: 5354afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung ArrayList<Integer> colors = new ArrayList<Integer>(); 5364afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung if (cursor.moveToFirst()) { 5374afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung do 5384afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung { 5394afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung int colorKey = cursor.getInt(COLORS_INDEX_COLOR_KEY); 5404afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung int rawColor = cursor.getInt(COLORS_INDEX_COLOR); 5414afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung int displayColor = Utils.getDisplayColorFromColor(rawColor); 542e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung mDisplayColorKeyMap.put(displayColor, colorKey); 5434afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung colors.add(displayColor); 5444afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } while (cursor.moveToNext()); 5454afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 5464afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung cursor.close(); 5474afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Integer[] sortedColors = new Integer[colors.size()]; 548e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung Arrays.sort(colors.toArray(sortedColors), new HsvColorComparator()); 5494afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mColors = new int[sortedColors.length]; 5504afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung for (int i = 0; i < sortedColors.length; i++) { 5514afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mColors[i] = sortedColors[i].intValue(); 5524afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 5534afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung float[] hsv = new float[3]; 5544afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Color.colorToHSV(mColors[i], hsv); 555e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung if (DEBUG) { 556e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung Log.d("Color", "H:" + hsv[0] + ",S:" + hsv[1] + ",V:" + hsv[2]); 557e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung } 5584afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 5596090ba2c18b94b78953495ee5ace9c6116a40009James Kung if (mCanModifyCalendar) { 5606090ba2c18b94b78953495ee5ace9c6116a40009James Kung View button = mView.findViewById(R.id.change_color); 5616090ba2c18b94b78953495ee5ace9c6116a40009James Kung if (button != null && mColors.length > 0) { 5626090ba2c18b94b78953495ee5ace9c6116a40009James Kung button.setEnabled(true); 5636090ba2c18b94b78953495ee5ace9c6116a40009James Kung button.setVisibility(View.VISIBLE); 5646090ba2c18b94b78953495ee5ace9c6116a40009James Kung } 5654afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 5664afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung updateMenu(); 5674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung break; 5682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_ATTENDEES: 5692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor = Utils.matrixCursorFromCursor(cursor); 5702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang initAttendeesCursor(mView); 5712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mView); 5722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 5731ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson case TOKEN_QUERY_REMINDERS: 5741ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mRemindersCursor = Utils.matrixCursorFromCursor(cursor); 5751ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson initReminders(mView, mRemindersCursor); 5761ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson break; 5776aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting case TOKEN_QUERY_VISIBLE_CALENDARS: 5786aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting if (cursor.getCount() > 1) { 5796aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting // Start duplicate calendars query to detect whether to add the calendar 5806aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting // email to the calendar owner display. 5816aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting String displayName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 5826aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting mHandler.startQuery(TOKEN_QUERY_DUPLICATE_CALENDARS, null, 5836aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting Calendars.CONTENT_URI, CALENDARS_PROJECTION, 5846aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting CALENDARS_DUPLICATE_NAME_WHERE, new String[] {displayName}, null); 5856aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting } else { 5866aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting // Don't need to display the calendar owner when there is only a single 5876aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting // calendar. Skip the duplicate calendars query. 5886aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting setVisibilityCommon(mView, R.id.calendar_container, View.GONE); 5896aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting mCurrentQuery |= TOKEN_QUERY_DUPLICATE_CALENDARS; 5906aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting } 5916aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting break; 5922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_DUPLICATE_CALENDARS: 59371b221ae5d0f514352584a955630f5494f686c51Michael Chan SpannableStringBuilder sb = new SpannableStringBuilder(); 59471b221ae5d0f514352584a955630f5494f686c51Michael Chan 59571b221ae5d0f514352584a955630f5494f686c51Michael Chan // Calendar display name 5962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String calendarName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 59771b221ae5d0f514352584a955630f5494f686c51Michael Chan sb.append(calendarName); 59871b221ae5d0f514352584a955630f5494f686c51Michael Chan 59971b221ae5d0f514352584a955630f5494f686c51Michael Chan // Show email account if display name is not unique and 60071b221ae5d0f514352584a955630f5494f686c51Michael Chan // display name != email 60171b221ae5d0f514352584a955630f5494f686c51Michael Chan String email = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 6026aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting if (cursor.getCount() > 1 && !calendarName.equalsIgnoreCase(email) && 6036aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting Utils.isValidEmail(email)) { 60471b221ae5d0f514352584a955630f5494f686c51Michael Chan sb.append(" (").append(email).append(")"); 60571b221ae5d0f514352584a955630f5494f686c51Michael Chan } 60671b221ae5d0f514352584a955630f5494f686c51Michael Chan 6076aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting setVisibilityCommon(mView, R.id.calendar_container, View.VISIBLE); 6086aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting setTextCommon(mView, R.id.calendar_name, sb); 6092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 6102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.close(); 612259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEventIfQueryDone(token); 6136aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting 6146aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting // All queries are done, show the view. 615263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson if (mCurrentQuery == TOKEN_QUERY_ALL) { 616263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson if (mLoadingMsgView.getAlpha() == 1) { 617263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson // Loading message is showing, let it stay a bit more (to prevent 618263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson // flashing) by adding a start delay to the event animation 619263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson long timeDiff = LOADING_MSG_MIN_DISPLAY_TIME - (System.currentTimeMillis() - 620263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson mLoadingMsgStartTime); 621263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson if (timeDiff > 0) { 622263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson mAnimateAlpha.setStartDelay(timeDiff); 623263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson } 624263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson } 62580d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson if (!mAnimateAlpha.isRunning() &&!mAnimateAlpha.isStarted() && !mNoCrossFade) { 62680d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson mAnimateAlpha.start(); 62780d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson } else { 62880d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson mScrollView.setAlpha(1); 62980d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson mLoadingMsgView.setVisibility(View.GONE); 63080d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson } 631263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson } 6322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 635259b8f9a21fffd3858218581e9daaf689b6b888fErik private void sendAccessibilityEventIfQueryDone(int token) { 636259b8f9a21fffd3858218581e9daaf689b6b888fErik mCurrentQuery |= token; 637259b8f9a21fffd3858218581e9daaf689b6b888fErik if (mCurrentQuery == TOKEN_QUERY_ALL) { 638259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEvent(); 639259b8f9a21fffd3858218581e9daaf689b6b888fErik } 640259b8f9a21fffd3858218581e9daaf689b6b888fErik } 641259b8f9a21fffd3858218581e9daaf689b6b888fErik 6420a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan public EventInfoFragment(Context context, Uri uri, long startMillis, long endMillis, 64394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein int attendeeResponse, boolean isDialog, int windowStyle, 64494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein ArrayList<ReminderEntry> reminders) { 6457ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson 6462c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan Resources r = context.getResources(); 6472c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan if (mScale == 0) { 6482c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan mScale = context.getResources().getDisplayMetrics().density; 6492c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan if (mScale != 1) { 6502c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan mCustomAppIconSize *= mScale; 6512c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan if (isDialog) { 6527ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson DIALOG_TOP_MARGIN *= mScale; 6537ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson } 6540a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan } 6550a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan } 656363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan if (isDialog) { 657363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan setDialogSize(r); 658363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan } 65960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mIsDialog = isDialog; 660c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson 6612fc6b79dfb06812baf2e6c547f3ffee83b5c3e9aMichael Chan setStyle(DialogFragment.STYLE_NO_TITLE, 0); 6622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mUri = uri; 6632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mStartMillis = startMillis; 6642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEndMillis = endMillis; 6652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeeResponseFromIntent = attendeeResponse; 6667ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson mWindowStyle = windowStyle; 66794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein 66894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein // Pass in null if no reminders are being specified. 66994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein // This may be used to explicitly show certain reminders already known 67094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein // about, such as during configuration changes. 67194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein mReminders = reminders; 6722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 674ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden // This is currently required by the fragment manager. 67560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson public EventInfoFragment() { 67660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 67760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 6780a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan public EventInfoFragment(Context context, long eventId, long startMillis, long endMillis, 67994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein int attendeeResponse, boolean isDialog, int windowStyle, 68094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein ArrayList<ReminderEntry> reminders) { 6810a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan this(context, ContentUris.withAppendedId(Events.CONTENT_URI, eventId), startMillis, 68294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein endMillis, attendeeResponse, isDialog, windowStyle, reminders); 6834003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = eventId; 6844003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 6854003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 68671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan @Override 68771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan public void onActivityCreated(Bundle savedInstanceState) { 68871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onActivityCreated(savedInstanceState); 68971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 6908b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik mReminderChangeListener = new OnItemSelectedListener() { 6918b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik @Override 6928b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 6938b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik Integer prevValue = (Integer) parent.getTag(); 6948b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik if (prevValue == null || prevValue != position) { 6958b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik parent.setTag(position); 6968b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik mUserModifiedReminders = true; 6978b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik } 6988b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik } 6998b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik 7008b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik @Override 7018b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik public void onNothingSelected(AdapterView<?> parent) { 7028b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik // do nothing 7038b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik } 7048b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik 7058b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik }; 7068b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik 70771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (savedInstanceState != null) { 70871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mIsDialog = savedInstanceState.getBoolean(BUNDLE_KEY_IS_DIALOG, false); 7097ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson mWindowStyle = savedInstanceState.getInt(BUNDLE_KEY_WINDOW_STYLE, 7107ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson DIALOG_WINDOW_STYLE); 71171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 71271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 71371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (mIsDialog) { 71471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan applyDialogParams(); 71571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 7162fca024254c9de09f8d87933cc8c9a2046e37c52James Kung 7172fca024254c9de09f8d87933cc8c9a2046e37c52James Kung final Activity activity = getActivity(); 7182fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mContext = activity; 7192fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mColorPickerDialog = (EventColorPickerDialog) activity.getFragmentManager() 7202fca024254c9de09f8d87933cc8c9a2046e37c52James Kung .findFragmentByTag(COLOR_PICKER_DIALOG_TAG); 7212fca024254c9de09f8d87933cc8c9a2046e37c52James Kung if (mColorPickerDialog != null) { 7222fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mColorPickerDialog.setOnColorSelectedListener(this); 7232fca024254c9de09f8d87933cc8c9a2046e37c52James Kung } 72471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 72571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 72671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private void applyDialogParams() { 72771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Dialog dialog = getDialog(); 72871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan dialog.setCanceledOnTouchOutside(true); 72971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 73071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Window window = dialog.getWindow(); 73171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 73271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 73371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan WindowManager.LayoutParams a = window.getAttributes(); 73471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.dimAmount = .4f; 73571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 7367ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson a.width = mDialogWidth; 7377ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson a.height = mDialogHeight; 73871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 7390b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson 7400b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson // On tablets , do smart positioning of dialog 7410b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson // On phones , use the whole screen 7420b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson 74360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (mX != -1 || mY != -1) { 7447ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson a.x = mX - mDialogWidth / 2; 7457ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson a.y = mY - mDialogHeight / 2; 7460aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson if (a.y < mMinTop) { 7470aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson a.y = mMinTop + DIALOG_TOP_MARGIN; 7480a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan } 74960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson a.gravity = Gravity.LEFT | Gravity.TOP; 75071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 75171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.setAttributes(a); 75271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 75371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 7540aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson public void setDialogParams(int x, int y, int minTop) { 75571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mX = x; 75671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mY = y; 7570aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson mMinTop = minTop; 75871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 75971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 760f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan // Implements OnCheckedChangeListener 761f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan @Override 762f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan public void onCheckedChanged(RadioGroup group, int checkedId) { 7633b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // If we haven't finished the return from the dialog yet, don't display. 7643b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) { 7653b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein return; 7663b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } 7673b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein 7682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If this is not a repeating event, then don't display the dialog 7692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // asking which events to change. 7703b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein int response = getResponseFromButtonId(checkedId); 7712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 7723b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mUserSetResponse = response; 7732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 7742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the selection is the same as the original, then don't display the 7772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // dialog asking which events to change. 778f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan if (checkedId == findButtonIdForResponse(mOriginalAttendeeResponse)) { 7793b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mUserSetResponse = response; 7802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 7812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event. We need to ask the user if they mean to 7842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // change just this one instance or all instances. 7853b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mTentativeUserSetResponse = response; 7863b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mEditResponseHelper.showDialog(mWhichEvents); 7872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onNothingSelected(AdapterView<?> parent) { 7902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 7934afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung public void onDetach() { 7944afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung super.onDetach(); 7954afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mController.deregisterEventHandler(R.layout.event_info); 7964afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 7974afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 7984afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung @Override 7992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onAttach(Activity activity) { 8002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onAttach(activity); 80110b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson mActivity = activity; 8021dadfa267acd2f6e190c945db3ae59cd7b06a1c8James Kung // Ensure that mIsTabletConfig is set before creating the menu. 80300544123439268a9f391396712560bd6cb8ee586James Kung mIsTabletConfig = Utils.getConfigBool(mActivity, R.bool.tablet_config); 8044afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mController = CalendarController.getInstance(mActivity); 8054afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mController.registerEventHandler(R.layout.event_info, this); 8062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEditResponseHelper = new EditResponseHelper(activity); 8073b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mEditResponseHelper.setDismissListener( 8083b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein new DialogInterface.OnDismissListener() { 8093b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein @Override 8103b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein public void onDismiss(DialogInterface dialog) { 8113b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // If the user dismisses the dialog (without hitting OK), 8123b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // then we want to revert the selection that opened the dialog. 8133b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein if (mEditResponseHelper.getWhichEvents() != -1) { 8143b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mUserSetResponse = mTentativeUserSetResponse; 8153b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mWhichEvents = mEditResponseHelper.getWhichEvents(); 8163b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } else { 8173b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // Revert the attending response radio selection to whatever 8183b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // was selected prior to this selection (possibly nothing). 8193b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein int oldResponse; 8203b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein if (mUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) { 8213b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein oldResponse = mUserSetResponse; 8223b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } else { 8233b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein oldResponse = mOriginalAttendeeResponse; 8243b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } 8253b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein int buttonToCheck = findButtonIdForResponse(oldResponse); 8263b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein 8273b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein if (mResponseRadioGroup != null) { 8283b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mResponseRadioGroup.check(buttonToCheck); 8293b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } 8303b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein 8313b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // If the radio group is being cleared, also clear the 8323b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // dialog's selection of which events should be included 8333b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // in this response. 8343b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein if (buttonToCheck == -1) { 8353b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mEditResponseHelper.setWhichEvents(-1); 8363b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } 8373b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } 8383b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein 8393b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // Since OnPause will force the dialog to dismiss, do 8403b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // not change the dialog status 8413b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein if (!mIsPaused) { 8423b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mTentativeUserSetResponse = Attendees.ATTENDEE_STATUS_NONE; 8433b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } 8443b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } 8453b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein }); 84686550ce5323f7e3971977702fca259986c048bf6RoboErik 84786550ce5323f7e3971977702fca259986c048bf6RoboErik if (mAttendeeResponseFromIntent != Attendees.ATTENDEE_STATUS_NONE) { 84886550ce5323f7e3971977702fca259986c048bf6RoboErik mEditResponseHelper.setWhichEvents(UPDATE_ALL); 84996267164b5f536ae0d341ed46a55098423bf33ebJames Kung mWhichEvents = mEditResponseHelper.getWhichEvents(); 85086550ce5323f7e3971977702fca259986c048bf6RoboErik } 8512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler = new QueryHandler(activity); 85260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (!mIsDialog) { 85360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson setHasOptionsMenu(true); 85460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 8552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 8582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public View onCreateView(LayoutInflater inflater, ViewGroup container, 8592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Bundle savedInstanceState) { 860320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson 861320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson if (savedInstanceState != null) { 862320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson mIsDialog = savedInstanceState.getBoolean(BUNDLE_KEY_IS_DIALOG, false); 863320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson mWindowStyle = savedInstanceState.getInt(BUNDLE_KEY_WINDOW_STYLE, 864320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson DIALOG_WINDOW_STYLE); 865320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson mDeleteDialogVisible = 866320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson savedInstanceState.getBoolean(BUNDLE_KEY_DELETE_DIALOG_VISIBLE,false); 8674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mCalendarColor = savedInstanceState.getInt(BUNDLE_KEY_CALENDAR_COLOR); 868f56b14972130233fd7e7c64160084793a7a0a55bJames Kung mCalendarColorInitialized = 869f56b14972130233fd7e7c64160084793a7a0a55bJames Kung savedInstanceState.getBoolean(BUNDLE_KEY_CALENDAR_COLOR_INIT); 8704afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mOriginalColor = savedInstanceState.getInt(BUNDLE_KEY_ORIGINAL_COLOR); 871f56b14972130233fd7e7c64160084793a7a0a55bJames Kung mOriginalColorInitialized = savedInstanceState.getBoolean( 872f56b14972130233fd7e7c64160084793a7a0a55bJames Kung BUNDLE_KEY_ORIGINAL_COLOR_INIT); 8734afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mCurrentColor = savedInstanceState.getInt(BUNDLE_KEY_CURRENT_COLOR); 874f56b14972130233fd7e7c64160084793a7a0a55bJames Kung mCurrentColorInitialized = savedInstanceState.getBoolean( 875f56b14972130233fd7e7c64160084793a7a0a55bJames Kung BUNDLE_KEY_CURRENT_COLOR_INIT); 876497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung mCurrentColorKey = savedInstanceState.getInt(BUNDLE_KEY_CURRENT_COLOR_KEY); 87794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein 8783b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mTentativeUserSetResponse = savedInstanceState.getInt( 8793b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein BUNDLE_KEY_TENTATIVE_USER_RESPONSE, 8803b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein Attendees.ATTENDEE_STATUS_NONE); 8813b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE && 8823b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mEditResponseHelper != null) { 8833b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // If the edit response helper dialog is open, we'll need to 8843b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // know if either of the choices were selected. 8853b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mEditResponseHelper.setWhichEvents(savedInstanceState.getInt( 8863b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein BUNDLE_KEY_RESPONSE_WHICH_EVENTS, -1)); 8873b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } 88894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein mUserSetResponse = savedInstanceState.getInt( 88994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein BUNDLE_KEY_USER_SET_ATTENDEE_RESPONSE, 89094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein Attendees.ATTENDEE_STATUS_NONE); 89194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein if (mUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) { 89294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein // If the response was set by the user before a configuration 89394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein // change, we'll need to know which choice was selected. 89494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein mWhichEvents = savedInstanceState.getInt( 89594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein BUNDLE_KEY_RESPONSE_WHICH_EVENTS, -1); 89694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein } 89794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein 89894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein mReminders = Utils.readRemindersFromBundle(savedInstanceState); 899320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson } 900320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson 9017ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson if (mWindowStyle == DIALOG_WINDOW_STYLE) { 902cba7f1fd22e1d7ee9d8d0828f37bc08512bf6b75Michael Chan mView = inflater.inflate(R.layout.event_info_dialog, container, false); 9037ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson } else { 9047ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson mView = inflater.inflate(R.layout.event_info, container, false); 9057ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson } 9061ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mScrollView = (ScrollView) mView.findViewById(R.id.event_info_scroll_view); 9078f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson mLoadingMsgView = mView.findViewById(R.id.event_info_loading_msg); 9081aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski mErrorMsgView = mView.findViewById(R.id.event_info_error_msg); 909259b8f9a21fffd3858218581e9daaf689b6b888fErik mTitle = (TextView) mView.findViewById(R.id.title); 91075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting mWhenDateTime = (TextView) mView.findViewById(R.id.when_datetime); 911259b8f9a21fffd3858218581e9daaf689b6b888fErik mWhere = (TextView) mView.findViewById(R.id.where); 91299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mDesc = (ExpandableTextView) mView.findViewById(R.id.description); 913fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mHeadlines = mView.findViewById(R.id.event_info_headline); 9144afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mLongAttendees = (AttendeesView) mView.findViewById(R.id.long_attendee_list); 9154afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 9163b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mResponseRadioGroup = (RadioGroup) mView.findViewById(R.id.response_value); 9172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9184003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (mUri == null) { 9194003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // restore event ID from bundle 9204003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = savedInstanceState.getLong(BUNDLE_KEY_EVENT_ID); 9214003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 9224003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mStartMillis = savedInstanceState.getLong(BUNDLE_KEY_START_MILLIS); 9234003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEndMillis = savedInstanceState.getLong(BUNDLE_KEY_END_MILLIS); 9244003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 9254003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 9268f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson mAnimateAlpha = ObjectAnimator.ofFloat(mScrollView, "Alpha", 0, 1); 9278f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson mAnimateAlpha.setDuration(FADE_IN_TIME); 9288f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson mAnimateAlpha.addListener(new AnimatorListenerAdapter() { 9298f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson int defLayerType; 9308f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson 9318f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson @Override 9328f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson public void onAnimationStart(Animator animation) { 9338f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson // Use hardware layer for better performance during animation 9348f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson defLayerType = mScrollView.getLayerType(); 9358f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson mScrollView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 9368f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson // Ensure that the loading message is gone before showing the 9378f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson // event info 938263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson mLoadingMsgView.removeCallbacks(mLoadingMsgAlphaUpdater); 9398f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson mLoadingMsgView.setVisibility(View.GONE); 9408f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson } 9418f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson 9428f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson @Override 9438f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson public void onAnimationCancel(Animator animation) { 9448f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson mScrollView.setLayerType(defLayerType, null); 9458f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson } 9468f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson 9478f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson @Override 9488f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson public void onAnimationEnd(Animator animation) { 9498f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson mScrollView.setLayerType(defLayerType, null); 95080d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson // Do not cross fade after the first time 95180d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson mNoCrossFade = true; 9528f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson } 9538f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson }); 9548f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson 9558f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson mLoadingMsgView.setAlpha(0); 9568f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson mScrollView.setAlpha(0); 9571aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski mErrorMsgView.setVisibility(View.INVISIBLE); 958263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson mLoadingMsgView.postDelayed(mLoadingMsgAlphaUpdater, LOADING_MSG_DELAY); 9598f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson 9602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start loading the data 9618f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson 9622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION, 9632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, null); 9642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 965d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson View b = mView.findViewById(R.id.delete); 9668ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan b.setOnClickListener(new OnClickListener() { 9678ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan @Override 9688ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan public void onClick(View v) { 96969be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik if (!mCanModifyCalendar) { 97069be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik return; 97169be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik } 972d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson mDeleteHelper = 973d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson new DeleteEventHelper(mContext, mActivity, !mIsDialog && !mIsTabletConfig /* exitWhenDone */); 974b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson mDeleteHelper.setDeleteNotificationListener(EventInfoFragment.this); 975b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson mDeleteHelper.setOnDismissListener(createDeleteOnDismissListener()); 976b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson mDeleteDialogVisible = true; 977b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson mDeleteHelper.delete(mStartMillis, mEndMillis, mEventId, -1, onDeleteRunnable); 978d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson } 979d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson }); 9808ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 9814afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung b = mView.findViewById(R.id.change_color); 9824afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung b.setOnClickListener(new OnClickListener() { 9834afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung @Override 9844afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung public void onClick(View v) { 9854afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung if (!mCanModifyCalendar) { 9864afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung return; 9874afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 9884afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung showEventColorPickerDialog(); 9894afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 9904afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung }); 9914afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 99210b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson // Hide Edit/Delete buttons if in full screen mode on a phone 9937ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson if (!mIsDialog && !mIsTabletConfig || mWindowStyle == EventInfoFragment.FULL_WINDOW_STYLE) { 99460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mView.findViewById(R.id.event_info_buttons_container).setVisibility(View.GONE); 99560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 99660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 997cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting // Create a listener for the email guests button 9987ffa24cba2977925b737e6bd39be59ba39609611Sara Ting emailAttendeesButton = (Button) mView.findViewById(R.id.email_attendees_button); 999cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting if (emailAttendeesButton != null) { 1000cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting emailAttendeesButton.setOnClickListener(new View.OnClickListener() { 1001cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting @Override 1002cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting public void onClick(View v) { 1003cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting emailAttendees(); 1004cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting } 1005cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting }); 1006cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting } 10071ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 1008cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting // Create a listener for the add reminder button 1009b20942b3087dbef5483669b76e00e9b8b4d5a7b1Michael Chan View reminderAddButton = mView.findViewById(R.id.reminder_add); 10101ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson View.OnClickListener addReminderOnClickListener = new View.OnClickListener() { 10111ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson @Override 10121ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson public void onClick(View v) { 10131ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson addReminder(); 10148b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik mUserModifiedReminders = true; 10151ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 10161ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson }; 10171ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson reminderAddButton.setOnClickListener(addReminderOnClickListener); 10181ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 10191ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Set reminders variables 10201ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 10211ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson SharedPreferences prefs = GeneralPreferences.getSharedPreferences(mActivity); 10221ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson String defaultReminderString = prefs.getString( 10231ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson GeneralPreferences.KEY_DEFAULT_REMINDER, GeneralPreferences.NO_REMINDER_STRING); 10241ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mDefaultReminderMinutes = Integer.parseInt(defaultReminderString); 10251ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson prepareReminders(); 10261ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 10272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return mView; 10282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1030ac4350b25b794d1b2935266cf8c480e4fbf97b8fIsaac Katzenelson private final Runnable onDeleteRunnable = new Runnable() { 103189ad0822f104015625f4ca88bfdf5c1d522b6e74Erik @Override 103289ad0822f104015625f4ca88bfdf5c1d522b6e74Erik public void run() { 10337c6236d5553dc9f3d004ebbed794249713a11d19RoboErik if (EventInfoFragment.this.mIsPaused) { 10347c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mDismissOnResume = true; 10357c6236d5553dc9f3d004ebbed794249713a11d19RoboErik return; 10367c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 103789ad0822f104015625f4ca88bfdf5c1d522b6e74Erik if (EventInfoFragment.this.isVisible()) { 103889ad0822f104015625f4ca88bfdf5c1d522b6e74Erik EventInfoFragment.this.dismiss(); 103989ad0822f104015625f4ca88bfdf5c1d522b6e74Erik } 104089ad0822f104015625f4ca88bfdf5c1d522b6e74Erik } 104189ad0822f104015625f4ca88bfdf5c1d522b6e74Erik }; 104289ad0822f104015625f4ca88bfdf5c1d522b6e74Erik 10432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateTitle() { 10442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Resources res = getActivity().getResources(); 10452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCanModifyCalendar && !mIsOrganizer) { 10462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title_invite)); 10472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 10482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title)); 10492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 10532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Initializes the event cursor, which is expected to point to the first 10542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * (and only) result from a query. 10551aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski * @return false if the cursor is empty, true otherwise 10562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 10572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean initEventCursor() { 10582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if ((mEventCursor == null) || (mEventCursor.getCount() == 0)) { 10591aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski return false; 10602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.moveToFirst(); 10622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventId = mEventCursor.getInt(EVENT_INDEX_ID); 10632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 106466b2067e0a389180f909eb0a528bea5f6becca23Michael Chan mIsRepeating = !TextUtils.isEmpty(rRule); 106594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein // mHasAlarm will be true if it was saved in the event already, or if 106694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein // we've explicitly been provided reminders (e.g. during rotation). 106794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein mHasAlarm = (mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) == 1)? true : 106894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein (mReminders != null && mReminders.size() > 0); 10691ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mMaxReminders = mEventCursor.getInt(EVENT_INDEX_MAX_REMINDERS); 10701ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mCalendarAllowedReminders = mEventCursor.getString(EVENT_INDEX_ALLOWED_REMINDERS); 10711aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski return true; 10722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @SuppressWarnings("fallthrough") 10752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void initAttendeesCursor(View view) { 10766bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson mOriginalAttendeeResponse = Attendees.ATTENDEE_STATUS_NONE; 1077d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 10782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = 0; 10792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 10802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = mAttendeesCursor.getCount(); 10812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor.moveToFirst()) { 10822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAcceptedAttendees.clear(); 10832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDeclinedAttendees.clear(); 10842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mTentativeAttendees.clear(); 10852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNoResponseAttendees.clear(); 10862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang do { 10882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 10892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String name = mAttendeesCursor.getString(ATTENDEES_INDEX_NAME); 10902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String email = mAttendeesCursor.getString(ATTENDEES_INDEX_EMAIL); 10912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 109283efa2d50deca53c9937b19a379045c31b541cb7Michael Chan if (mAttendeesCursor.getInt(ATTENDEES_INDEX_RELATIONSHIP) == 109383efa2d50deca53c9937b19a379045c31b541cb7Michael Chan Attendees.RELATIONSHIP_ORGANIZER) { 109483efa2d50deca53c9937b19a379045c31b541cb7Michael Chan 109583efa2d50deca53c9937b19a379045c31b541cb7Michael Chan // Overwrites the one from Event table if available 109683efa2d50deca53c9937b19a379045c31b541cb7Michael Chan if (!TextUtils.isEmpty(name)) { 109783efa2d50deca53c9937b19a379045c31b541cb7Michael Chan mEventOrganizerDisplayName = name; 109883efa2d50deca53c9937b19a379045c31b541cb7Michael Chan if (!mIsOrganizer) { 109983efa2d50deca53c9937b19a379045c31b541cb7Michael Chan setVisibilityCommon(view, R.id.organizer_container, View.VISIBLE); 110083efa2d50deca53c9937b19a379045c31b541cb7Michael Chan setTextCommon(view, R.id.organizer, mEventOrganizerDisplayName); 110183efa2d50deca53c9937b19a379045c31b541cb7Michael Chan } 110283efa2d50deca53c9937b19a379045c31b541cb7Michael Chan } 110383efa2d50deca53c9937b19a379045c31b541cb7Michael Chan } 110483efa2d50deca53c9937b19a379045c31b541cb7Michael Chan 1105d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE && 11062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount.equalsIgnoreCase(email)) { 11072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAttendeeId = mAttendeesCursor.getInt(ATTENDEES_INDEX_ID); 11082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalAttendeeResponse = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 11092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 1110693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan String identity = null; 1111693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan String idNamespace = null; 1112693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan 1113fac2d1594f7ecae8e50dc7790ce67de0c9b70d22Sara Ting if (Utils.isJellybeanOrLater()) { 1114693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan identity = mAttendeesCursor.getString(ATTENDEES_INDEX_IDENTITY); 1115693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan idNamespace = mAttendeesCursor.getString(ATTENDEES_INDEX_ID_NAMESPACE); 1116693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan } 1117ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting 11182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Don't show your own status in the list because: 11192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 1) it doesn't make sense for event without other guests. 11202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 2) there's a spinner for that for events with guests. 11212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch(status) { 11222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_ACCEPTED: 1123fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mAcceptedAttendees.add(new Attendee(name, email, 1124ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting Attendees.ATTENDEE_STATUS_ACCEPTED, identity, 1125ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting idNamespace)); 11262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 11272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_DECLINED: 1128fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mDeclinedAttendees.add(new Attendee(name, email, 1129ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting Attendees.ATTENDEE_STATUS_DECLINED, identity, 1130ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting idNamespace)); 11312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 11328ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_TENTATIVE: 1133fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mTentativeAttendees.add(new Attendee(name, email, 1134ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting Attendees.ATTENDEE_STATUS_TENTATIVE, identity, 1135ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting idNamespace)); 11368ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 11378ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan default: 1138fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mNoResponseAttendees.add(new Attendee(name, email, 1139ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting Attendees.ATTENDEE_STATUS_NONE, identity, 1140ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting idNamespace)); 11412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } while (mAttendeesCursor.moveToNext()); 11442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.moveToFirst(); 11452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateAttendees(view); 11472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 11524003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public void onSaveInstanceState(Bundle outState) { 11534003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang super.onSaveInstanceState(outState); 11544003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_EVENT_ID, mEventId); 11554003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_START_MILLIS, mStartMillis); 11564003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_END_MILLIS, mEndMillis); 115771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan outState.putBoolean(BUNDLE_KEY_IS_DIALOG, mIsDialog); 11587ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson outState.putInt(BUNDLE_KEY_WINDOW_STYLE, mWindowStyle); 1159b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson outState.putBoolean(BUNDLE_KEY_DELETE_DIALOG_VISIBLE, mDeleteDialogVisible); 11604afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung outState.putInt(BUNDLE_KEY_CALENDAR_COLOR, mCalendarColor); 1161f56b14972130233fd7e7c64160084793a7a0a55bJames Kung outState.putBoolean(BUNDLE_KEY_CALENDAR_COLOR_INIT, mCalendarColorInitialized); 11624afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung outState.putInt(BUNDLE_KEY_ORIGINAL_COLOR, mOriginalColor); 1163f56b14972130233fd7e7c64160084793a7a0a55bJames Kung outState.putBoolean(BUNDLE_KEY_ORIGINAL_COLOR_INIT, mOriginalColorInitialized); 11644afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung outState.putInt(BUNDLE_KEY_CURRENT_COLOR, mCurrentColor); 1165f56b14972130233fd7e7c64160084793a7a0a55bJames Kung outState.putBoolean(BUNDLE_KEY_CURRENT_COLOR_INIT, mCurrentColorInitialized); 1166497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung outState.putInt(BUNDLE_KEY_CURRENT_COLOR_KEY, mCurrentColorKey); 1167f56b14972130233fd7e7c64160084793a7a0a55bJames Kung 11683b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // We'll need the temporary response for configuration changes. 11693b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein outState.putInt(BUNDLE_KEY_TENTATIVE_USER_RESPONSE, mTentativeUserSetResponse); 11703b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE && 11713b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mEditResponseHelper != null) { 11723b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein outState.putInt(BUNDLE_KEY_RESPONSE_WHICH_EVENTS, 11733b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mEditResponseHelper.getWhichEvents()); 11743b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } 117594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein 117694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein // Save the current response. 117794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein int response; 117894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein if (mAttendeeResponseFromIntent != Attendees.ATTENDEE_STATUS_NONE) { 117994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein response = mAttendeeResponseFromIntent; 118094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein } else { 118194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein response = mOriginalAttendeeResponse; 118294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein } 118394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein outState.putInt(BUNDLE_KEY_ATTENDEE_RESPONSE, response); 118494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein if (mUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) { 118594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein response = mUserSetResponse; 118694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein outState.putInt(BUNDLE_KEY_USER_SET_ATTENDEE_RESPONSE, response); 118794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein outState.putInt(BUNDLE_KEY_RESPONSE_WHICH_EVENTS, mWhichEvents); 118894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein } 118994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein 119094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein // Save the reminders. 119194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein mReminders = EventViewUtils.reminderItemsToReminders(mReminderViews, 119294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein mReminderMinuteValues, mReminderMethodValues); 119394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein int numReminders = mReminders.size(); 119494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein ArrayList<Integer> reminderMinutes = 119594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein new ArrayList<Integer>(numReminders); 119694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein ArrayList<Integer> reminderMethods = 119794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein new ArrayList<Integer>(numReminders); 119894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein for (ReminderEntry reminder : mReminders) { 119994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein reminderMinutes.add(reminder.getMinutes()); 120094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein reminderMethods.add(reminder.getMethod()); 120194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein } 120294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein outState.putIntegerArrayList( 120394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein BUNDLE_KEY_REMINDER_MINUTES, reminderMinutes); 120494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein outState.putIntegerArrayList( 120594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein BUNDLE_KEY_REMINDER_METHODS, reminderMethods); 120660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 120760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 120860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson @Override 120960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 121060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson super.onCreateOptionsMenu(menu, inflater); 12111dadfa267acd2f6e190c945db3ae59cd7b06a1c8James Kung // Show color/edit/delete buttons only in non-dialog configuration 12127ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson if (!mIsDialog && !mIsTabletConfig || mWindowStyle == EventInfoFragment.FULL_WINDOW_STYLE) { 121360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson inflater.inflate(R.menu.event_info_title_bar, menu); 1214d8353fb85ef59a88580125207be9c914a8586758RoboErik mMenu = menu; 1215d8353fb85ef59a88580125207be9c914a8586758RoboErik updateMenu(); 121660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 12174003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 12184003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 1219d8353fb85ef59a88580125207be9c914a8586758RoboErik @Override 1220d8353fb85ef59a88580125207be9c914a8586758RoboErik public boolean onOptionsItemSelected(MenuItem item) { 1221d8353fb85ef59a88580125207be9c914a8586758RoboErik 12227ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson // If we're a dialog we don't want to handle menu buttons 12237ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson if (mIsDialog) { 1224d8353fb85ef59a88580125207be9c914a8586758RoboErik return false; 1225d8353fb85ef59a88580125207be9c914a8586758RoboErik } 1226d8353fb85ef59a88580125207be9c914a8586758RoboErik // Handles option menu selections: 1227d8353fb85ef59a88580125207be9c914a8586758RoboErik // Home button - close event info activity and start the main calendar 1228d8353fb85ef59a88580125207be9c914a8586758RoboErik // one 1229d8353fb85ef59a88580125207be9c914a8586758RoboErik // Edit button - start the event edit activity and close the info 1230d8353fb85ef59a88580125207be9c914a8586758RoboErik // activity 1231d8353fb85ef59a88580125207be9c914a8586758RoboErik // Delete button - start a delete query that calls a runnable that close 1232d8353fb85ef59a88580125207be9c914a8586758RoboErik // the info activity 1233d8353fb85ef59a88580125207be9c914a8586758RoboErik 1234bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan final int itemId = item.getItemId(); 1235bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan if (itemId == android.R.id.home) { 1236bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan Utils.returnToCalendarHome(mContext); 1237bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan mActivity.finish(); 1238bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan return true; 1239bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan } else if (itemId == R.id.info_action_edit) { 12401d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung doEdit(); 1241bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan mActivity.finish(); 1242bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan } else if (itemId == R.id.info_action_delete) { 1243bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan mDeleteHelper = 1244bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan new DeleteEventHelper(mActivity, mActivity, true /* exitWhenDone */); 1245bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan mDeleteHelper.setDeleteNotificationListener(EventInfoFragment.this); 1246bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan mDeleteHelper.setOnDismissListener(createDeleteOnDismissListener()); 1247bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan mDeleteDialogVisible = true; 1248bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan mDeleteHelper.delete(mStartMillis, mEndMillis, mEventId, -1, onDeleteRunnable); 12494afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } else if (itemId == R.id.info_action_change_color) { 12504afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung showEventColorPickerDialog(); 1251d8353fb85ef59a88580125207be9c914a8586758RoboErik } 1252d8353fb85ef59a88580125207be9c914a8586758RoboErik return super.onOptionsItemSelected(item); 1253d8353fb85ef59a88580125207be9c914a8586758RoboErik } 12544003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 12554afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private void showEventColorPickerDialog() { 12562fca024254c9de09f8d87933cc8c9a2046e37c52James Kung if (mColorPickerDialog == null) { 12572fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mColorPickerDialog = EventColorPickerDialog.newInstance(mColors, mCurrentColor, 12582fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mCalendarColor, mIsTabletConfig); 12592fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mColorPickerDialog.setOnColorSelectedListener(this); 12604afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 126195e9538c2e504ea5528b07e3abdf54bb3d91c88aJames Kung final FragmentManager fragmentManager = getFragmentManager(); 126295e9538c2e504ea5528b07e3abdf54bb3d91c88aJames Kung fragmentManager.executePendingTransactions(); 12632fca024254c9de09f8d87933cc8c9a2046e37c52James Kung if (!mColorPickerDialog.isAdded()) { 12642fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mColorPickerDialog.show(fragmentManager, COLOR_PICKER_DIALOG_TAG); 12654afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 12664afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 12674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 12684afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung private boolean saveEventColor() { 12694afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung if (mCurrentColor == mOriginalColor) { 12704afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung return false; 12714afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 12724afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 12734afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung ContentValues values = new ContentValues(); 12744afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung if (mCurrentColor != mCalendarColor) { 1275497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung values.put(Events.EVENT_COLOR_KEY, mCurrentColorKey); 12764afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } else { 12774afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung values.put(Events.EVENT_COLOR_KEY, NO_EVENT_COLOR); 12784afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 12794afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 12804afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mHandler.startUpdate(mHandler.getNextToken(), null, uri, values, 12814afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung null, null, Utils.UNDO_DELAY); 12824afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung return true; 12834afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 12844afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 12854003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang @Override 12869d4a952f846a5758965897b88715e49106638120Sam Blitzstein public void onStop() { 12879d4a952f846a5758965897b88715e49106638120Sam Blitzstein Activity act = getActivity(); 12889d4a952f846a5758965897b88715e49106638120Sam Blitzstein if (!mEventDeletionStarted && act != null && !act.isChangingConfigurations()) { 1289497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung 1290ac4350b25b794d1b2935266cf8c480e4fbf97b8fIsaac Katzenelson boolean responseSaved = saveResponse(); 12914afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung boolean eventColorSaved = saveEventColor(); 12924afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung if (saveReminders() || responseSaved || eventColorSaved) { 1293b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson Toast.makeText(getActivity(), R.string.saving_event, Toast.LENGTH_SHORT).show(); 1294b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson } 12952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12969d4a952f846a5758965897b88715e49106638120Sam Blitzstein super.onStop(); 12972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 13002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onDestroy() { 13012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor != null) { 13022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.close(); 13032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null) { 13052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.close(); 13062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 13082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.close(); 13092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 131071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onDestroy(); 13112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 13142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Asynchronously saves the response to an invitation if the user changed 13152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * the response. Returns true if the database will be updated. 13162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 13172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @return true if the database will be changed 13182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 13192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean saveResponse() { 13202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor == null || mEventCursor == null) { 13212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 13222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 1323f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 13243b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein int status = getResponseFromButtonId( 13253b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mResponseRadioGroup.getCheckedRadioButtonId()); 1326f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan if (status == Attendees.ATTENDEE_STATUS_NONE) { 13272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 13282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the status has not changed, then don't update the database 13312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (status == mOriginalAttendeeResponse) { 13322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 13332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If we never got an owner attendee id we can't set the status 1336d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE) { 13372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 13382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 13412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a non-repeating event 13422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 13439d4a952f846a5758965897b88715e49106638120Sam Blitzstein mOriginalAttendeeResponse = status; 13442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 13452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 134796267164b5f536ae0d341ed46a55098423bf33ebJames Kung if (DEBUG) { 134896267164b5f536ae0d341ed46a55098423bf33ebJames Kung Log.d(TAG, "Repeating event: mWhichEvents=" + mWhichEvents); 134996267164b5f536ae0d341ed46a55098423bf33ebJames Kung } 13502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event 13513b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein switch (mWhichEvents) { 13522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case -1: 13532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 13542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_SINGLE: 1355c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden createExceptionResponse(mEventId, status); 13569d4a952f846a5758965897b88715e49106638120Sam Blitzstein mOriginalAttendeeResponse = status; 13572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 13582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_ALL: 13592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 13609d4a952f846a5758965897b88715e49106638120Sam Blitzstein mOriginalAttendeeResponse = status; 13612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 13622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang default: 13632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "Unexpected choice for updating invitation response"); 13642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 13652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 13672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateResponse(long eventId, long attendeeId, int status) { 13702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Update the attendee status in the attendees table. the provider 13712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // takes care of updating the self attendance status. 13722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 13732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(mCalendarOwnerAccount)) { 13752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_EMAIL, mCalendarOwnerAccount); 13762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_STATUS, status); 13782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.EVENT_ID, eventId); 13792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = ContentUris.withAppendedId(Attendees.CONTENT_URI, attendeeId); 13812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startUpdate(mHandler.getNextToken(), null, uri, values, 13832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, Utils.UNDO_DELAY); 13842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1386c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden /** 1387c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * Creates an exception to a recurring event. The only change we're making is to the 1388c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * "self attendee status" value. The provider will take care of updating the corresponding 1389c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * Attendees.attendeeStatus entry. 1390c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * 1391c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * @param eventId The recurring event. 1392c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * @param status The new value for selfAttendeeStatus. 1393c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden */ 1394c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden private void createExceptionResponse(long eventId, int status) { 13952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 13962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_INSTANCE_TIME, mStartMillis); 13972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.SELF_ATTENDEE_STATUS, status); 1398c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden values.put(Events.STATUS, Events.STATUS_CONFIRMED); 13992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1400364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 140179b2c8c946c29ea9107957fe72a9fa9f560da345Andy McFadden Uri exceptionUri = Uri.withAppendedPath(Events.CONTENT_EXCEPTION_URI, 1402c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden String.valueOf(eventId)); 1403c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden ops.add(ContentProviderOperation.newInsert(exceptionUri).withValues(values).build()); 1404364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik 1405c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden mHandler.startBatch(mHandler.getNextToken(), null, CalendarContract.AUTHORITY, ops, 1406c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden Utils.UNDO_DELAY); 1407c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden } 14082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1409f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan public static int getResponseFromButtonId(int buttonId) { 1410f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int response; 1411bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan if (buttonId == R.id.response_yes) { 1412bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan response = Attendees.ATTENDEE_STATUS_ACCEPTED; 1413bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan } else if (buttonId == R.id.response_maybe) { 1414bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan response = Attendees.ATTENDEE_STATUS_TENTATIVE; 1415bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan } else if (buttonId == R.id.response_no) { 1416bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan response = Attendees.ATTENDEE_STATUS_DECLINED; 1417bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan } else { 1418bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan response = Attendees.ATTENDEE_STATUS_NONE; 14192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 1420f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan return response; 1421f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan } 1422f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 1423f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan public static int findButtonIdForResponse(int response) { 1424f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int buttonId; 1425f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan switch (response) { 1426f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case Attendees.ATTENDEE_STATUS_ACCEPTED: 1427f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = R.id.response_yes; 1428f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 1429f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case Attendees.ATTENDEE_STATUS_TENTATIVE: 1430f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = R.id.response_maybe; 1431f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 1432f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case Attendees.ATTENDEE_STATUS_DECLINED: 1433f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = R.id.response_no; 1434f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 1435f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan default: 1436f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = -1; 1437f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan } 1438f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan return buttonId; 14392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 14402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 14412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void doEdit() { 1442c41b99be504e395b8c7264a0d626906ccbff1c57Erik Context c = getActivity(); 1443c41b99be504e395b8c7264a0d626906ccbff1c57Erik // This ensures that we aren't in the process of closing and have been 1444c41b99be504e395b8c7264a0d626906ccbff1c57Erik // unattached already 1445c41b99be504e395b8c7264a0d626906ccbff1c57Erik if (c != null) { 14461d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 14471d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung Intent intent = new Intent(Intent.ACTION_EDIT, uri); 14481d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung intent.setClass(mActivity, EditEventActivity.class); 14491d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung intent.putExtra(EXTRA_EVENT_BEGIN_TIME, mStartMillis); 14501d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung intent.putExtra(EXTRA_EVENT_END_TIME, mEndMillis); 14511d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung intent.putExtra(EXTRA_EVENT_ALL_DAY, mAllDay); 14521d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung intent.putExtra(EditEventActivity.EXTRA_EVENT_COLOR, mCurrentColor); 14531d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung intent.putExtra(EditEventActivity.EXTRA_EVENT_REMINDERS, EventViewUtils 14541d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung .reminderItemsToReminders(mReminderViews, mReminderMinuteValues, 14551d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung mReminderMethodValues)); 14561d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung intent.putExtra(EVENT_EDIT_ON_LAUNCH, true); 14571d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung startActivity(intent); 1458c41b99be504e395b8c7264a0d626906ccbff1c57Erik } 14592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 14602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 14611aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski private void displayEventNotFound() { 14621aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski mErrorMsgView.setVisibility(View.VISIBLE); 14631aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski mScrollView.setVisibility(View.GONE); 14641aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski mLoadingMsgView.setVisibility(View.GONE); 14651aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski } 14661aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski 14672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateEvent(View view) { 1468b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson if (mEventCursor == null || view == null) { 14692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 14702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 14712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 14725f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan Context context = view.getContext(); 14735f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan if (context == null) { 14745f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan return; 14755f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan } 14765f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan 14772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventName = mEventCursor.getString(EVENT_INDEX_TITLE); 14782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventName == null || eventName.length() == 0) { 14792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventName = getActivity().getString(R.string.no_title_label); 14802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 14812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1482da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting // 3rd parties might not have specified the start/end time when firing the 1483da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting // Events.CONTENT_URI intent. Update these with values read from the db. 1484da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting if (mStartMillis == 0 && mEndMillis == 0) { 1485da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting mStartMillis = mEventCursor.getLong(EVENT_INDEX_DTSTART); 1486da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting mEndMillis = mEventCursor.getLong(EVENT_INDEX_DTEND); 1487da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting if (mEndMillis == 0) { 1488da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting String duration = mEventCursor.getString(EVENT_INDEX_DURATION); 1489da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting if (!TextUtils.isEmpty(duration)) { 1490da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting try { 1491da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting Duration d = new Duration(); 1492da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting d.parse(duration); 1493da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting long endMillis = mStartMillis + d.getMillis(); 1494da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting if (endMillis >= mStartMillis) { 1495da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting mEndMillis = endMillis; 1496da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting } else { 1497da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting Log.d(TAG, "Invalid duration string: " + duration); 1498da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting } 1499da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting } catch (DateException e) { 1500da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting Log.d(TAG, "Error parsing duration string " + duration, e); 1501da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting } 1502da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting } 1503da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting if (mEndMillis == 0) { 1504da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting mEndMillis = mStartMillis; 1505da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting } 1506da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting } 1507da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting } 1508da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting 15098b1119b1b58381c7fc550974f53cf93bd95dffa8Michael Chan mAllDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0; 15102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String location = mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION); 15112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String description = mEventCursor.getString(EVENT_INDEX_DESCRIPTION); 15122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 1513f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson String eventTimezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE); 15142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1515497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung mHeadlines.setBackgroundColor(mCurrentColor); 15162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 15174e92627c5eb10de50c49c57e116b080d48360c70Sara Ting // What 15184e92627c5eb10de50c49c57e116b080d48360c70Sara Ting if (eventName != null) { 15194e92627c5eb10de50c49c57e116b080d48360c70Sara Ting setTextCommon(view, R.id.title, eventName); 15204e92627c5eb10de50c49c57e116b080d48360c70Sara Ting } 15214e92627c5eb10de50c49c57e116b080d48360c70Sara Ting 15222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // When 1523fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson // Set the date and repeats (if any) 152475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String localTimezone = Utils.getTimeZone(mActivity, mTZUpdater); 15255f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan 152623acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting Resources resources = context.getResources(); 152723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting String displayedDatetime = Utils.getDisplayedDatetime(mStartMillis, mEndMillis, 152823acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting System.currentTimeMillis(), localTimezone, mAllDay, context); 1529e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan 1530e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan String displayedTimezone = null; 1531e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan if (!mAllDay) { 1532e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan displayedTimezone = Utils.getDisplayedTimezone(mStartMillis, localTimezone, 1533e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan eventTimezone); 153423acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting } 153523acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting // Display the datetime. Make the timezone (if any) transparent. 153623acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting if (displayedTimezone == null) { 153723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting setTextCommon(view, R.id.when_datetime, displayedDatetime); 153823acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting } else { 1539e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan int timezoneIndex = displayedDatetime.length(); 1540e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan displayedDatetime += " " + displayedTimezone; 154123acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting SpannableStringBuilder sb = new SpannableStringBuilder(displayedDatetime); 154223acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting ForegroundColorSpan transparentColorSpan = new ForegroundColorSpan( 154323acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting resources.getColor(R.color.event_info_headline_transparent_color)); 154423acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting sb.setSpan(transparentColorSpan, timezoneIndex, displayedDatetime.length(), 154523acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting Spannable.SPAN_INCLUSIVE_INCLUSIVE); 154623acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting setTextCommon(view, R.id.when_datetime, sb); 154723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting } 1548fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson 154975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting // Display the repeat string (if any) 1550fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson String repeatString = null; 1551fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson if (!TextUtils.isEmpty(rRule)) { 1552fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson EventRecurrence eventRecurrence = new EventRecurrence(); 1553fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson eventRecurrence.parse(rRule); 155475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting Time date = new Time(localTimezone); 155575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting date.set(mStartMillis); 15568b1119b1b58381c7fc550974f53cf93bd95dffa8Michael Chan if (mAllDay) { 1557fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson date.timezone = Time.TIMEZONE_UTC; 1558fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson } 1559fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson eventRecurrence.setStartDate(date); 1560b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan repeatString = EventRecurrenceFormatter.getRepeatString(mContext, resources, 1561b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan eventRecurrence, true); 1562fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson } 156375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting if (repeatString == null) { 156475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting view.findViewById(R.id.when_repeat).setVisibility(View.GONE); 15652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 156675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting setTextCommon(view, R.id.when_repeat, repeatString); 1567f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson } 1568f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson 15692e46cff640b123ba5f7a67c934ae98e6b02a905fIsaac Katzenelson // Organizer view is setup in the updateCalendar method 15702e46cff640b123ba5f7a67c934ae98e6b02a905fIsaac Katzenelson 15712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 15722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Where 1573ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan if (location == null || location.trim().length() == 0) { 15742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.where, View.GONE); 15752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 1576259b8f9a21fffd3858218581e9daaf689b6b888fErik final TextView textView = mWhere; 15772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView != null) { 1578ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan textView.setAutoLinkMask(0); 1579ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan textView.setText(location.trim()); 1580af577fd49d334060f34d3e40e48c762ff5f0de4fAndy McFadden try { 158129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein textView.setText(Utils.extendedLinkify(textView.getText().toString(), true)); 158229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 158329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // Linkify.addLinks() sets the TextView movement method if it finds any links. 1584da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting // We must do the same here, in case linkify by itself did not find any. 158529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // (This is cloned from Linkify.addLinkMovementMethod().) 158629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein MovementMethod mm = textView.getMovementMethod(); 158729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein if ((mm == null) || !(mm instanceof LinkMovementMethod)) { 158829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein if (textView.getLinksClickable()) { 158929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein textView.setMovementMethod(LinkMovementMethod.getInstance()); 159029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein } 159129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein } 1592af577fd49d334060f34d3e40e48c762ff5f0de4fAndy McFadden } catch (Exception ex) { 1593af577fd49d334060f34d3e40e48c762ff5f0de4fAndy McFadden // unexpected 1594af577fd49d334060f34d3e40e48c762ff5f0de4fAndy McFadden Log.e(TAG, "Linkification failed", ex); 1595af577fd49d334060f34d3e40e48c762ff5f0de4fAndy McFadden } 159673b07655afcea1ba2ce8ed580a50992bf0baf857Andy McFadden 1597ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan textView.setOnTouchListener(new OnTouchListener() { 1598c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden @Override 1599ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan public boolean onTouch(View v, MotionEvent event) { 1600ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan try { 1601ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan return v.onTouchEvent(event); 1602ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan } catch (ActivityNotFoundException e) { 1603ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan // ignore 1604ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan return true; 16052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 1606ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan } 1607ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan }); 16082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 16092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 16102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 16112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Description 1612352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (description != null && description.length() != 0) { 161399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mDesc.setText(description); 16142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 16152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 16162c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan // Launch Custom App 1617fac2d1594f7ecae8e50dc7790ce67de0c9b70d22Sara Ting if (Utils.isJellybeanOrLater()) { 1618693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan updateCustomAppButton(); 1619693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan } 16202c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan } 16212c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16222c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan private void updateCustomAppButton() { 16232c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan buttonSetup: { 16242c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan final Button launchButton = (Button) mView.findViewById(R.id.launch_custom_app_button); 16252c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan if (launchButton == null) 16262c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan break buttonSetup; 16272c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16282c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan final String customAppPackage = mEventCursor.getString(EVENT_INDEX_CUSTOM_APP_PACKAGE); 16292c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan final String customAppUri = mEventCursor.getString(EVENT_INDEX_CUSTOM_APP_URI); 16302c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16312c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan if (TextUtils.isEmpty(customAppPackage) || TextUtils.isEmpty(customAppUri)) 16322c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan break buttonSetup; 16332c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16342c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan PackageManager pm = mContext.getPackageManager(); 16352c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan if (pm == null) 16362c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan break buttonSetup; 16372c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16382c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan ApplicationInfo info; 16392c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan try { 16402c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan info = pm.getApplicationInfo(customAppPackage, 0); 16412c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan if (info == null) 16422c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan break buttonSetup; 16432c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan } catch (NameNotFoundException e) { 16442c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan break buttonSetup; 16452c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan } 16462c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16472c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 16482c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan final Intent intent = new Intent(CalendarContract.ACTION_HANDLE_CUSTOM_EVENT, uri); 16492c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan intent.setPackage(customAppPackage); 16502c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan intent.putExtra(CalendarContract.EXTRA_CUSTOM_APP_URI, customAppUri); 16512c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan intent.putExtra(EXTRA_EVENT_BEGIN_TIME, mStartMillis); 16522c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16532c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan // See if we have a taker for our intent 16542c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan if (pm.resolveActivity(intent, 0) == null) 16552c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan break buttonSetup; 16562c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16572c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan Drawable icon = pm.getApplicationIcon(info); 16582c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan if (icon != null) { 16592c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16602c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan Drawable[] d = launchButton.getCompoundDrawables(); 16612c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan icon.setBounds(0, 0, mCustomAppIconSize, mCustomAppIconSize); 16622c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan launchButton.setCompoundDrawables(icon, d[1], d[2], d[3]); 16632c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan } 16642c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16652c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan CharSequence label = pm.getApplicationLabel(info); 16662c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan if (label != null && label.length() != 0) { 16672c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan launchButton.setText(label); 16682c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan } else if (icon == null) { 16692c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan // No icon && no label. Hide button? 16702c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan break buttonSetup; 16712c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan } 16722c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16732c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan // Launch custom app 16742c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan launchButton.setOnClickListener(new View.OnClickListener() { 16752c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan @Override 16762c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan public void onClick(View v) { 16772c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan try { 16782c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan startActivityForResult(intent, 0); 16792c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan } catch (ActivityNotFoundException e) { 16802c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan // Shouldn't happen as we checked it already 16812c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan setVisibilityCommon(mView, R.id.launch_custom_app_container, View.GONE); 16822c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan } 16832c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan } 16842c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan }); 16852c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16862c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan setVisibilityCommon(mView, R.id.launch_custom_app_container, View.VISIBLE); 16872c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan return; 16882c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16892c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan } 16902c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan 16912c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan setVisibilityCommon(mView, R.id.launch_custom_app_container, View.GONE); 16922c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan return; 16938f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson } 169475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 1695259b8f9a21fffd3858218581e9daaf689b6b888fErik private void sendAccessibilityEvent() { 1696ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden AccessibilityManager am = 1697ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden (AccessibilityManager) getActivity().getSystemService(Service.ACCESSIBILITY_SERVICE); 1698259b8f9a21fffd3858218581e9daaf689b6b888fErik if (!am.isEnabled()) { 1699259b8f9a21fffd3858218581e9daaf689b6b888fErik return; 1700259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1701259b8f9a21fffd3858218581e9daaf689b6b888fErik 1702259b8f9a21fffd3858218581e9daaf689b6b888fErik AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_FOCUSED); 17031aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski event.setClassName(EventInfoFragment.class.getName()); 1704259b8f9a21fffd3858218581e9daaf689b6b888fErik event.setPackageName(getActivity().getPackageName()); 1705259b8f9a21fffd3858218581e9daaf689b6b888fErik List<CharSequence> text = event.getText(); 1706259b8f9a21fffd3858218581e9daaf689b6b888fErik 170799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan addFieldToAccessibilityEvent(text, mTitle, null); 170875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting addFieldToAccessibilityEvent(text, mWhenDateTime, null); 170999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan addFieldToAccessibilityEvent(text, mWhere, null); 171099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan addFieldToAccessibilityEvent(text, null, mDesc); 1711259b8f9a21fffd3858218581e9daaf689b6b888fErik 17123b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein if (mResponseRadioGroup.getVisibility() == View.VISIBLE) { 17133b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein int id = mResponseRadioGroup.getCheckedRadioButtonId(); 1714259b8f9a21fffd3858218581e9daaf689b6b888fErik if (id != View.NO_ID) { 1715259b8f9a21fffd3858218581e9daaf689b6b888fErik text.add(((TextView) getView().findViewById(R.id.response_label)).getText()); 17163b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein text.add((((RadioButton) (mResponseRadioGroup.findViewById(id))) 17173b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein .getText() + PERIOD_SPACE)); 1718259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1719259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1720259b8f9a21fffd3858218581e9daaf689b6b888fErik 1721259b8f9a21fffd3858218581e9daaf689b6b888fErik am.sendAccessibilityEvent(event); 1722259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1723259b8f9a21fffd3858218581e9daaf689b6b888fErik 172499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan private void addFieldToAccessibilityEvent(List<CharSequence> text, TextView tv, 172599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan ExpandableTextView etv) { 17263389397186b93936747d4009a35f5bae605c246eMichael Chan CharSequence cs; 172799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan if (tv != null) { 17283389397186b93936747d4009a35f5bae605c246eMichael Chan cs = tv.getText(); 172999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } else if (etv != null) { 17303389397186b93936747d4009a35f5bae605c246eMichael Chan cs = etv.getText(); 173199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } else { 17329ceed1f3df98c5fc85441da0c6e7e5d45cf17a1eIsaac Katzenelson return; 17339ceed1f3df98c5fc85441da0c6e7e5d45cf17a1eIsaac Katzenelson } 173499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 17353389397186b93936747d4009a35f5bae605c246eMichael Chan if (!TextUtils.isEmpty(cs)) { 17363389397186b93936747d4009a35f5bae605c246eMichael Chan cs = cs.toString().trim(); 17373389397186b93936747d4009a35f5bae605c246eMichael Chan if (cs.length() > 0) { 17383389397186b93936747d4009a35f5bae605c246eMichael Chan text.add(cs); 17393389397186b93936747d4009a35f5bae605c246eMichael Chan text.add(PERIOD_SPACE); 17403389397186b93936747d4009a35f5bae605c246eMichael Chan } 1741259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1742259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1743259b8f9a21fffd3858218581e9daaf689b6b888fErik 17442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateCalendar(View view) { 17454afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung 17462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = ""; 17472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null && mEventCursor != null) { 17482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.moveToFirst(); 17492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String tempAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 17502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = (tempAccount == null) ? "" : tempAccount; 1751352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOwnerCanRespond = mCalendarsCursor.getInt(CALENDARS_INDEX_OWNER_CAN_RESPOND) != 0; 175242896f76d81dbae873614340a3a78b29e7d463d2Sara Ting mSyncAccountName = mCalendarsCursor.getString(CALENDARS_INDEX_ACCOUNT_NAME); 17532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 17546aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting // start visible calendars query 17556aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting mHandler.startQuery(TOKEN_QUERY_VISIBLE_CALENDARS, null, Calendars.CONTENT_URI, 17566aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting CALENDARS_PROJECTION, CALENDARS_VISIBLE_WHERE, new String[] {"1"}, null); 17572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 175883efa2d50deca53c9937b19a379045c31b541cb7Michael Chan mEventOrganizerEmail = mEventCursor.getString(EVENT_INDEX_ORGANIZER); 175983efa2d50deca53c9937b19a379045c31b541cb7Michael Chan mIsOrganizer = mCalendarOwnerAccount.equalsIgnoreCase(mEventOrganizerEmail); 176083efa2d50deca53c9937b19a379045c31b541cb7Michael Chan 17610c0da940484dc8966576634475daa126b4a6ede2Sara Ting if (!TextUtils.isEmpty(mEventOrganizerEmail) && 17620c0da940484dc8966576634475daa126b4a6ede2Sara Ting !mEventOrganizerEmail.endsWith(Utils.MACHINE_GENERATED_ADDRESS)) { 176383efa2d50deca53c9937b19a379045c31b541cb7Michael Chan mEventOrganizerDisplayName = mEventOrganizerEmail; 176483efa2d50deca53c9937b19a379045c31b541cb7Michael Chan } 176583efa2d50deca53c9937b19a379045c31b541cb7Michael Chan 176683efa2d50deca53c9937b19a379045c31b541cb7Michael Chan if (!mIsOrganizer && !TextUtils.isEmpty(mEventOrganizerDisplayName)) { 176783efa2d50deca53c9937b19a379045c31b541cb7Michael Chan setTextCommon(view, R.id.organizer, mEventOrganizerDisplayName); 1768b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson setVisibilityCommon(view, R.id.organizer_container, View.VISIBLE); 1769b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson } else { 1770b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson setVisibilityCommon(view, R.id.organizer_container, View.GONE); 1771b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson } 17722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHasAttendeeData = mEventCursor.getInt(EVENT_INDEX_HAS_ATTENDEE_DATA) != 0; 177365eeb79e62034d706503ce29d88c0e05ebd726feRoboErik mCanModifyCalendar = mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) 177465eeb79e62034d706503ce29d88c0e05ebd726feRoboErik >= Calendars.CAL_ACCESS_CONTRIBUTOR; 177565eeb79e62034d706503ce29d88c0e05ebd726feRoboErik // TODO add "|| guestCanModify" after b/1299071 is fixed 177665eeb79e62034d706503ce29d88c0e05ebd726feRoboErik mCanModifyEvent = mCanModifyCalendar && mIsOrganizer; 17772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsBusyFreeCalendar = 1778ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) == Calendars.CAL_ACCESS_FREEBUSY; 1779352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 1780352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (!mIsBusyFreeCalendar) { 1781d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson 1782d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson View b = mView.findViewById(R.id.edit); 1783352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan b.setEnabled(true); 17848ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan b.setOnClickListener(new OnClickListener() { 17858ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan @Override 17868ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan public void onClick(View v) { 17878ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan doEdit(); 178810b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson // For dialogs, just close the fragment 178910b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson // For full screen, close activity on phone, leave it for tablet 179060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (mIsDialog) { 179160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson EventInfoFragment.this.dismiss(); 179260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 179310b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson else if (!mIsTabletConfig){ 179460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson getActivity().finish(); 179560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 1796352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 1797352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan }); 17988ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 1799dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira View button; 180042896f76d81dbae873614340a3a78b29e7d463d2Sara Ting if (mCanModifyCalendar) { 1801dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira button = mView.findViewById(R.id.delete); 1802dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira if (button != null) { 180342896f76d81dbae873614340a3a78b29e7d463d2Sara Ting button.setEnabled(true); 180442896f76d81dbae873614340a3a78b29e7d463d2Sara Ting button.setVisibility(View.VISIBLE); 180565eeb79e62034d706503ce29d88c0e05ebd726feRoboErik } 1806dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira } 180742896f76d81dbae873614340a3a78b29e7d463d2Sara Ting if (mCanModifyEvent) { 1808dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira button = mView.findViewById(R.id.edit); 1809dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira if (button != null) { 181042896f76d81dbae873614340a3a78b29e7d463d2Sara Ting button.setEnabled(true); 181142896f76d81dbae873614340a3a78b29e7d463d2Sara Ting button.setVisibility(View.VISIBLE); 181260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 1813d8353fb85ef59a88580125207be9c914a8586758RoboErik } 18147ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson if ((!mIsDialog && !mIsTabletConfig || 18157ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson mWindowStyle == EventInfoFragment.FULL_WINDOW_STYLE) && mMenu != null) { 1816d8353fb85ef59a88580125207be9c914a8586758RoboErik mActivity.invalidateOptionsMenu(); 181769be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik } 18182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 181971b221ae5d0f514352584a955630f5494f686c51Michael Chan setVisibilityCommon(view, R.id.calendar, View.GONE); 1820259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEventIfQueryDone(TOKEN_QUERY_DUPLICATE_CALENDARS); 18212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 18222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 18232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1824d8353fb85ef59a88580125207be9c914a8586758RoboErik /** 1825d8353fb85ef59a88580125207be9c914a8586758RoboErik * 1826d8353fb85ef59a88580125207be9c914a8586758RoboErik */ 1827d8353fb85ef59a88580125207be9c914a8586758RoboErik private void updateMenu() { 1828d8353fb85ef59a88580125207be9c914a8586758RoboErik if (mMenu == null) { 1829d8353fb85ef59a88580125207be9c914a8586758RoboErik return; 1830d8353fb85ef59a88580125207be9c914a8586758RoboErik } 1831d8353fb85ef59a88580125207be9c914a8586758RoboErik MenuItem delete = mMenu.findItem(R.id.info_action_delete); 1832d8353fb85ef59a88580125207be9c914a8586758RoboErik MenuItem edit = mMenu.findItem(R.id.info_action_edit); 18334afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung MenuItem changeColor = mMenu.findItem(R.id.info_action_change_color); 1834d8353fb85ef59a88580125207be9c914a8586758RoboErik if (delete != null) { 1835d8353fb85ef59a88580125207be9c914a8586758RoboErik delete.setVisible(mCanModifyCalendar); 1836d8353fb85ef59a88580125207be9c914a8586758RoboErik delete.setEnabled(mCanModifyCalendar); 1837d8353fb85ef59a88580125207be9c914a8586758RoboErik } 1838d8353fb85ef59a88580125207be9c914a8586758RoboErik if (edit != null) { 183965eeb79e62034d706503ce29d88c0e05ebd726feRoboErik edit.setVisible(mCanModifyEvent); 184065eeb79e62034d706503ce29d88c0e05ebd726feRoboErik edit.setEnabled(mCanModifyEvent); 1841d8353fb85ef59a88580125207be9c914a8586758RoboErik } 18424afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung if (changeColor != null && mColors != null && mColors.length > 0) { 18434afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung changeColor.setVisible(mCanModifyCalendar); 18444afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung changeColor.setEnabled(mCanModifyCalendar); 18454afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 1846d8353fb85ef59a88580125207be9c914a8586758RoboErik } 1847d8353fb85ef59a88580125207be9c914a8586758RoboErik 18482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateAttendees(View view) { 1849fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson if (mAcceptedAttendees.size() + mDeclinedAttendees.size() + 1850fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mTentativeAttendees.size() + mNoResponseAttendees.size() > 0) { 1851c7f3c3896f1bc4cad43aa7f0bca1dee603704613RoboErik mLongAttendees.clearAttendees(); 18524acb2fd087308dea146b8b10f5278c59df387680RoboErik (mLongAttendees).addAttendees(mAcceptedAttendees); 18534acb2fd087308dea146b8b10f5278c59df387680RoboErik (mLongAttendees).addAttendees(mDeclinedAttendees); 18544acb2fd087308dea146b8b10f5278c59df387680RoboErik (mLongAttendees).addAttendees(mTentativeAttendees); 18554acb2fd087308dea146b8b10f5278c59df387680RoboErik (mLongAttendees).addAttendees(mNoResponseAttendees); 1856fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mLongAttendees.setEnabled(false); 1857fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mLongAttendees.setVisibility(View.VISIBLE); 185860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } else { 1859fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mLongAttendees.setVisibility(View.GONE); 186071b221ae5d0f514352584a955630f5494f686c51Michael Chan } 1861cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting 18627ffa24cba2977925b737e6bd39be59ba39609611Sara Ting if (hasEmailableAttendees()) { 18637da27670d2a62e213e230989b250f047012a3bbdSara Ting setVisibilityCommon(mView, R.id.email_attendees_container, View.VISIBLE); 18647ffa24cba2977925b737e6bd39be59ba39609611Sara Ting if (emailAttendeesButton != null) { 18657ffa24cba2977925b737e6bd39be59ba39609611Sara Ting emailAttendeesButton.setText(R.string.email_guests_label); 18667ffa24cba2977925b737e6bd39be59ba39609611Sara Ting } 18677ffa24cba2977925b737e6bd39be59ba39609611Sara Ting } else if (hasEmailableOrganizer()) { 18687ffa24cba2977925b737e6bd39be59ba39609611Sara Ting setVisibilityCommon(mView, R.id.email_attendees_container, View.VISIBLE); 18697ffa24cba2977925b737e6bd39be59ba39609611Sara Ting if (emailAttendeesButton != null) { 18707ffa24cba2977925b737e6bd39be59ba39609611Sara Ting emailAttendeesButton.setText(R.string.email_organizer_label); 18717ffa24cba2977925b737e6bd39be59ba39609611Sara Ting } 18727da27670d2a62e213e230989b250f047012a3bbdSara Ting } else { 18737da27670d2a62e213e230989b250f047012a3bbdSara Ting setVisibilityCommon(mView, R.id.email_attendees_container, View.GONE); 18747da27670d2a62e213e230989b250f047012a3bbdSara Ting } 1875cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting } 1876cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting 1877cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting /** 18787da27670d2a62e213e230989b250f047012a3bbdSara Ting * Returns true if there is at least 1 attendee that is not the viewer. 1879cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting */ 18807ffa24cba2977925b737e6bd39be59ba39609611Sara Ting private boolean hasEmailableAttendees() { 1881cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting for (Attendee attendee : mAcceptedAttendees) { 18827da27670d2a62e213e230989b250f047012a3bbdSara Ting if (Utils.isEmailableFrom(attendee.mEmail, mSyncAccountName)) { 18837da27670d2a62e213e230989b250f047012a3bbdSara Ting return true; 18847da27670d2a62e213e230989b250f047012a3bbdSara Ting } 1885cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting } 1886cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting for (Attendee attendee : mTentativeAttendees) { 18877da27670d2a62e213e230989b250f047012a3bbdSara Ting if (Utils.isEmailableFrom(attendee.mEmail, mSyncAccountName)) { 18887da27670d2a62e213e230989b250f047012a3bbdSara Ting return true; 18897da27670d2a62e213e230989b250f047012a3bbdSara Ting } 1890cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting } 1891cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting for (Attendee attendee : mNoResponseAttendees) { 18927da27670d2a62e213e230989b250f047012a3bbdSara Ting if (Utils.isEmailableFrom(attendee.mEmail, mSyncAccountName)) { 18937da27670d2a62e213e230989b250f047012a3bbdSara Ting return true; 18947da27670d2a62e213e230989b250f047012a3bbdSara Ting } 1895cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting } 18967da27670d2a62e213e230989b250f047012a3bbdSara Ting for (Attendee attendee : mDeclinedAttendees) { 18977da27670d2a62e213e230989b250f047012a3bbdSara Ting if (Utils.isEmailableFrom(attendee.mEmail, mSyncAccountName)) { 18987da27670d2a62e213e230989b250f047012a3bbdSara Ting return true; 18997da27670d2a62e213e230989b250f047012a3bbdSara Ting } 1900cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting } 19017ffa24cba2977925b737e6bd39be59ba39609611Sara Ting return false; 19027ffa24cba2977925b737e6bd39be59ba39609611Sara Ting } 19037ffa24cba2977925b737e6bd39be59ba39609611Sara Ting 19047ffa24cba2977925b737e6bd39be59ba39609611Sara Ting private boolean hasEmailableOrganizer() { 19057da27670d2a62e213e230989b250f047012a3bbdSara Ting return mEventOrganizerEmail != null && 19067da27670d2a62e213e230989b250f047012a3bbdSara Ting Utils.isEmailableFrom(mEventOrganizerEmail, mSyncAccountName); 19078ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 19088ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 19091ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson public void initReminders(View view, Cursor cursor) { 19101ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 19111ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Add reminders 1912c7f3c3896f1bc4cad43aa7f0bca1dee603704613RoboErik mOriginalReminders.clear(); 1913c08957b48e755d34f1496d3937a24d60bdd24904RoboErik mUnsupportedReminders.clear(); 19141ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson while (cursor.moveToNext()) { 19151ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson int minutes = cursor.getInt(EditEventHelper.REMINDERS_INDEX_MINUTES); 19161ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson int method = cursor.getInt(EditEventHelper.REMINDERS_INDEX_METHOD); 1917e35a032c939f357ce435711b2fd8de1887a05011RoboErik 1918c08957b48e755d34f1496d3937a24d60bdd24904RoboErik if (method != Reminders.METHOD_DEFAULT && !mReminderMethodValues.contains(method)) { 1919e35a032c939f357ce435711b2fd8de1887a05011RoboErik // Stash unsupported reminder types separately so we don't alter 1920e35a032c939f357ce435711b2fd8de1887a05011RoboErik // them in the UI 1921e35a032c939f357ce435711b2fd8de1887a05011RoboErik mUnsupportedReminders.add(ReminderEntry.valueOf(minutes, method)); 1922e35a032c939f357ce435711b2fd8de1887a05011RoboErik } else { 1923e35a032c939f357ce435711b2fd8de1887a05011RoboErik mOriginalReminders.add(ReminderEntry.valueOf(minutes, method)); 1924e35a032c939f357ce435711b2fd8de1887a05011RoboErik } 19251ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 19261ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Sort appropriately for display (by time, then type) 19271ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Collections.sort(mOriginalReminders); 19281ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 19298b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik if (mUserModifiedReminders) { 19308b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik // If the user has changed the list of reminders don't change what's 19318b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik // shown. 19328b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik return; 19338b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik } 19348b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik 19355d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik LinearLayout parent = (LinearLayout) mScrollView 19365d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik .findViewById(R.id.reminder_items_container); 19375d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik if (parent != null) { 19385d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik parent.removeAllViews(); 19395d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik } 1940c08957b48e755d34f1496d3937a24d60bdd24904RoboErik if (mReminderViews != null) { 1941c08957b48e755d34f1496d3937a24d60bdd24904RoboErik mReminderViews.clear(); 1942c08957b48e755d34f1496d3937a24d60bdd24904RoboErik } 19435d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik 19441ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (mHasAlarm) { 194594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein ArrayList<ReminderEntry> reminders; 194694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein // If applicable, use reminders saved in the bundle. 194794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein if (mReminders != null) { 194894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein reminders = mReminders; 194994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein } else { 195094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein reminders = mOriginalReminders; 195194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein } 19521ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Insert any minute values that aren't represented in the minutes list. 19531ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson for (ReminderEntry re : reminders) { 19541ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson EventViewUtils.addMinutesToList( 19551ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mActivity, mReminderMinuteValues, mReminderMinuteLabels, re.getMinutes()); 19561ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 19571ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Create a UI element for each reminder. We display all of the reminders we get 19581ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // from the provider, even if the count exceeds the calendar maximum. (Also, for 19591ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // a new event, we won't have a maxReminders value available.) 19601ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson for (ReminderEntry re : reminders) { 1961e35a032c939f357ce435711b2fd8de1887a05011RoboErik EventViewUtils.addReminder(mActivity, mScrollView, this, mReminderViews, 1962e35a032c939f357ce435711b2fd8de1887a05011RoboErik mReminderMinuteValues, mReminderMinuteLabels, mReminderMethodValues, 19638b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik mReminderMethodLabels, re, Integer.MAX_VALUE, mReminderChangeListener); 19641ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 196506f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting EventViewUtils.updateAddReminderButton(mView, mReminderViews, mMaxReminders); 1966e35a032c939f357ce435711b2fd8de1887a05011RoboErik // TODO show unsupported reminder types in some fashion. 19671ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 19681ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 19691ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 19702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang void updateResponse(View view) { 19712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // we only let the user accept/reject/etc. a meeting if: 19722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // a) you can edit the event's containing calendar AND 19732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // b) you're not the organizer and only attendee AND 19742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // c) organizerCanRespond is enabled for the calendar 19752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (if the attendee data has been hidden, the visible number of attendees 19762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // will be 1 -- the calendar owner's). 19772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (there are more cases involved to be 100% accurate, such as 19782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // paying attention to whether or not an attendee status was 19792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // included in the feed, but we're currently omitting those corner cases 19802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // for simplicity). 1981352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 1982352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // TODO Switch to EditEventHelper.canRespond when this class uses CalendarEventModel. 1983d785cd533f6a3c23813c15315aed74efa9a116f5Michael Chan if (!mCanModifyCalendar || (mHasAttendeeData && mIsOrganizer && mNumOfAttendees <= 1) || 1984352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan (mIsOrganizer && !mOwnerCanRespond)) { 19852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.GONE); 19862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 19872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 19882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 19892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.VISIBLE); 19902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1991f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 1992f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int response; 19933b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) { 19943b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein response = mTentativeUserSetResponse; 19953b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } else if (mUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) { 19965afc08352fb7e2679ed00d41e6e5763ad333a7ecRoboErik response = mUserSetResponse; 19976bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson } else if (mAttendeeResponseFromIntent != Attendees.ATTENDEE_STATUS_NONE) { 1998f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = mAttendeeResponseFromIntent; 19992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 2000f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = mOriginalAttendeeResponse; 20012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 2002f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 2003f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int buttonToCheck = findButtonIdForResponse(response); 20043b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mResponseRadioGroup.check(buttonToCheck); // -1 clear all radio buttons 20053b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mResponseRadioGroup.setOnCheckedChangeListener(this); 20062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 20072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 20082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setTextCommon(View view, int id, CharSequence text) { 20092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView textView = (TextView) view.findViewById(id); 20102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView == null) 20112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 20122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setText(text); 20132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 20142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 20152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setVisibilityCommon(View view, int id, int visibility) { 20162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View v = view.findViewById(id); 20172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (v != null) { 20182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang v.setVisibility(visibility); 20192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 20202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 20212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 20222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 20232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 20242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Taken from com.google.android.gm.HtmlConversationActivity 20252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 20262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Send the intent that shows the Contact info corresponding to the email address. 20272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 20282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void showContactInfo(Attendee attendee, Rect rect) { 20292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // First perform lookup query to find existing contact 20302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final ContentResolver resolver = getActivity().getContentResolver(); 20312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String address = attendee.mEmail; 20322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri dataUri = Uri.withAppendedPath(CommonDataKinds.Email.CONTENT_FILTER_URI, 20332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri.encode(address)); 20342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri lookupUri = ContactsContract.Data.getContactLookupUri(resolver, dataUri); 20352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 20362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (lookupUri != null) { 20372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Found matching contact, trigger QuickContact 20382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.showQuickContact(getActivity(), rect, lookupUri, 20392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.MODE_MEDIUM, null); 20402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 20412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // No matching contact, ask user to create one 20422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri mailUri = Uri.fromParts("mailto", address, null); 20432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, mailUri); 20442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 20452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Pass along full E-mail string for possible create dialog 20462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Rfc822Token sender = new Rfc822Token(attendee.mName, attendee.mEmail, null); 20472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.EXTRA_CREATE_DESCRIPTION, sender.toString()); 20482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 20492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Only provide personal name hint if we have one 20502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String senderPersonal = attendee.mName; 20512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(senderPersonal)) { 20522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.Insert.NAME, senderPersonal); 20532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 20542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 20552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startActivity(intent); 20562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 20572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 2058cb81189e4868769ea016253eca104e46df2f033aErik 2059cb81189e4868769ea016253eca104e46df2f033aErik @Override 20607c6236d5553dc9f3d004ebbed794249713a11d19RoboErik public void onPause() { 20617c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mIsPaused = true; 20627c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mHandler.removeCallbacks(onDeleteRunnable); 20637c6236d5553dc9f3d004ebbed794249713a11d19RoboErik super.onPause(); 2064b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson // Remove event deletion alert box since it is being rebuild in the OnResume 2065b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson // This is done to get the same behavior on OnResume since the AlertDialog is gone on 2066b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson // rotation but not if you press the HOME key 2067b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson if (mDeleteDialogVisible && mDeleteHelper != null) { 2068b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson mDeleteHelper.dismissAlertDialog(); 2069b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson mDeleteHelper = null; 2070b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson } 20713b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE 20723b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein && mEditResponseHelper != null) { 20733b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mEditResponseHelper.dismissAlertDialog(); 20743b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } 20757c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 20767c6236d5553dc9f3d004ebbed794249713a11d19RoboErik 20777c6236d5553dc9f3d004ebbed794249713a11d19RoboErik @Override 20787c6236d5553dc9f3d004ebbed794249713a11d19RoboErik public void onResume() { 20797c6236d5553dc9f3d004ebbed794249713a11d19RoboErik super.onResume(); 2080363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan if (mIsDialog) { 2081363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan setDialogSize(getActivity().getResources()); 2082363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan applyDialogParams(); 2083363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan } 20847c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mIsPaused = false; 20857c6236d5553dc9f3d004ebbed794249713a11d19RoboErik if (mDismissOnResume) { 20867c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mHandler.post(onDeleteRunnable); 20877c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 20883b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein // Display the "delete confirmation" or "edit response helper" dialog if needed 2089b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson if (mDeleteDialogVisible) { 2090b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson mDeleteHelper = new DeleteEventHelper( 2091b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson mContext, mActivity, 2092b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson !mIsDialog && !mIsTabletConfig /* exitWhenDone */); 2093b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson mDeleteHelper.setOnDismissListener(createDeleteOnDismissListener()); 2094b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson mDeleteHelper.delete(mStartMillis, mEndMillis, mEventId, -1, onDeleteRunnable); 20953b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein } else if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) { 20963b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein int buttonId = findButtonIdForResponse(mTentativeUserSetResponse); 20973b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mResponseRadioGroup.check(buttonId); 20983b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein mEditResponseHelper.showDialog(mEditResponseHelper.getWhichEvents()); 2099b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson } 21007c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 21017c6236d5553dc9f3d004ebbed794249713a11d19RoboErik 21027c6236d5553dc9f3d004ebbed794249713a11d19RoboErik @Override 2103cb81189e4868769ea016253eca104e46df2f033aErik public void eventsChanged() { 2104cb81189e4868769ea016253eca104e46df2f033aErik } 2105cb81189e4868769ea016253eca104e46df2f033aErik 2106cb81189e4868769ea016253eca104e46df2f033aErik @Override 2107cb81189e4868769ea016253eca104e46df2f033aErik public long getSupportedEventTypes() { 2108cb81189e4868769ea016253eca104e46df2f033aErik return EventType.EVENTS_CHANGED; 2109cb81189e4868769ea016253eca104e46df2f033aErik } 2110cb81189e4868769ea016253eca104e46df2f033aErik 2111cb81189e4868769ea016253eca104e46df2f033aErik @Override 2112cb81189e4868769ea016253eca104e46df2f033aErik public void handleEvent(EventInfo event) { 21134afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung reloadEvents(); 2114cb81189e4868769ea016253eca104e46df2f033aErik } 21151ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 211680d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson public void reloadEvents() { 21174afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung if (mHandler != null) { 21184afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION, 21194afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung null, null, null); 21204afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung } 212180d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson } 21221ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 21231ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson @Override 21241ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson public void onClick(View view) { 21251ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 21261ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // This must be a click on one of the "remove reminder" buttons 21271ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson LinearLayout reminderItem = (LinearLayout) view.getParent(); 21281ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson LinearLayout parent = (LinearLayout) reminderItem.getParent(); 21291ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson parent.removeView(reminderItem); 21301ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderViews.remove(reminderItem); 21318b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik mUserModifiedReminders = true; 213206f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting EventViewUtils.updateAddReminderButton(mView, mReminderViews, mMaxReminders); 21331ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 21341ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 21351ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 21361ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson /** 21371ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * Add a new reminder when the user hits the "add reminder" button. We use the default 21381ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * reminder time and method. 21391ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson */ 21401ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private void addReminder() { 21411ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // TODO: when adding a new reminder, make it different from the 21421ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // last one in the list (if any). 21431ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (mDefaultReminderMinutes == GeneralPreferences.NO_REMINDER) { 21441ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson EventViewUtils.addReminder(mActivity, mScrollView, this, mReminderViews, 21458b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik mReminderMinuteValues, mReminderMinuteLabels, mReminderMethodValues, 21468b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik mReminderMethodLabels, 21478b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik ReminderEntry.valueOf(GeneralPreferences.REMINDER_DEFAULT_TIME), mMaxReminders, 21488b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik mReminderChangeListener); 21491ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } else { 21501ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson EventViewUtils.addReminder(mActivity, mScrollView, this, mReminderViews, 21518b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik mReminderMinuteValues, mReminderMinuteLabels, mReminderMethodValues, 21528b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik mReminderMethodLabels, ReminderEntry.valueOf(mDefaultReminderMinutes), 21538b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik mMaxReminders, mReminderChangeListener); 21541ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 21551ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 215606f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting EventViewUtils.updateAddReminderButton(mView, mReminderViews, mMaxReminders); 215706f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting } 21581ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2159e35a032c939f357ce435711b2fd8de1887a05011RoboErik synchronized private void prepareReminders() { 2160e35a032c939f357ce435711b2fd8de1887a05011RoboErik // Nothing to do if we've already built these lists _and_ we aren't 2161e35a032c939f357ce435711b2fd8de1887a05011RoboErik // removing not allowed methods 2162e35a032c939f357ce435711b2fd8de1887a05011RoboErik if (mReminderMinuteValues != null && mReminderMinuteLabels != null 2163e35a032c939f357ce435711b2fd8de1887a05011RoboErik && mReminderMethodValues != null && mReminderMethodLabels != null 2164e35a032c939f357ce435711b2fd8de1887a05011RoboErik && mCalendarAllowedReminders == null) { 2165e35a032c939f357ce435711b2fd8de1887a05011RoboErik return; 2166e35a032c939f357ce435711b2fd8de1887a05011RoboErik } 2167e35a032c939f357ce435711b2fd8de1887a05011RoboErik // Load the labels and corresponding numeric values for the minutes and methods lists 2168e35a032c939f357ce435711b2fd8de1887a05011RoboErik // from the assets. If we're switching calendars, we need to clear and re-populate the 2169e35a032c939f357ce435711b2fd8de1887a05011RoboErik // lists (which may have elements added and removed based on calendar properties). This 2170e35a032c939f357ce435711b2fd8de1887a05011RoboErik // is mostly relevant for "methods", since we shouldn't have any "minutes" values in a 2171e35a032c939f357ce435711b2fd8de1887a05011RoboErik // new event that aren't in the default set. 21721ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Resources r = mActivity.getResources(); 21731ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMinuteValues = loadIntegerArray(r, R.array.reminder_minutes_values); 21741ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMinuteLabels = loadStringArray(r, R.array.reminder_minutes_labels); 21751ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMethodValues = loadIntegerArray(r, R.array.reminder_methods_values); 21761ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMethodLabels = loadStringArray(r, R.array.reminder_methods_labels); 2177e35a032c939f357ce435711b2fd8de1887a05011RoboErik 2178e35a032c939f357ce435711b2fd8de1887a05011RoboErik // Remove any reminder methods that aren't allowed for this calendar. If this is 2179e35a032c939f357ce435711b2fd8de1887a05011RoboErik // a new event, mCalendarAllowedReminders may not be set the first time we're called. 2180e35a032c939f357ce435711b2fd8de1887a05011RoboErik if (mCalendarAllowedReminders != null) { 2181e35a032c939f357ce435711b2fd8de1887a05011RoboErik EventViewUtils.reduceMethodList(mReminderMethodValues, mReminderMethodLabels, 2182e35a032c939f357ce435711b2fd8de1887a05011RoboErik mCalendarAllowedReminders); 2183e35a032c939f357ce435711b2fd8de1887a05011RoboErik } 2184e35a032c939f357ce435711b2fd8de1887a05011RoboErik if (mView != null) { 2185e35a032c939f357ce435711b2fd8de1887a05011RoboErik mView.invalidate(); 2186e35a032c939f357ce435711b2fd8de1887a05011RoboErik } 21871ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 21881ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 21891ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 21901ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private boolean saveReminders() { 21911ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3); 21921ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 21931ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Read reminders from UI 21941ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminders = EventViewUtils.reminderItemsToReminders(mReminderViews, 21951ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMinuteValues, mReminderMethodValues); 2196e35a032c939f357ce435711b2fd8de1887a05011RoboErik mOriginalReminders.addAll(mUnsupportedReminders); 2197e35a032c939f357ce435711b2fd8de1887a05011RoboErik Collections.sort(mOriginalReminders); 2198e35a032c939f357ce435711b2fd8de1887a05011RoboErik mReminders.addAll(mUnsupportedReminders); 2199e35a032c939f357ce435711b2fd8de1887a05011RoboErik Collections.sort(mReminders); 22001ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 22011ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Check if there are any changes in the reminder 22021ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson boolean changed = EditEventHelper.saveReminders(ops, mEventId, mReminders, 22031ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mOriginalReminders, false /* no force save */); 22041ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 22051ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (!changed) { 22061ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson return false; 22071ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 22081ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 22091ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // save new reminders 22101ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson AsyncQueryService service = new AsyncQueryService(getActivity()); 22111ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson service.startBatch(0, null, Calendars.CONTENT_URI.getAuthority(), ops, 0); 22129d4a952f846a5758965897b88715e49106638120Sam Blitzstein mOriginalReminders = mReminders; 22131ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Update the "hasAlarm" field for the event 22141ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 22151ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson int len = mReminders.size(); 22161ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson boolean hasAlarm = len > 0; 22171ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (hasAlarm != mHasAlarm) { 22181ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ContentValues values = new ContentValues(); 22191ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0); 22201ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson service.startUpdate(0, null, uri, values, null, null, 0); 22211ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 22221ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson return true; 22231ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 22241ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 22251ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson /** 222642896f76d81dbae873614340a3a78b29e7d463d2Sara Ting * Email all the attendees of the event, except for the viewer (so as to not email 222742896f76d81dbae873614340a3a78b29e7d463d2Sara Ting * himself) and resources like conference rooms. 222842896f76d81dbae873614340a3a78b29e7d463d2Sara Ting */ 222942896f76d81dbae873614340a3a78b29e7d463d2Sara Ting private void emailAttendees() { 22307da27670d2a62e213e230989b250f047012a3bbdSara Ting Intent i = new Intent(getActivity(), QuickResponseActivity.class); 22317da27670d2a62e213e230989b250f047012a3bbdSara Ting i.putExtra(QuickResponseActivity.EXTRA_EVENT_ID, mEventId); 22327da27670d2a62e213e230989b250f047012a3bbdSara Ting i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 22337da27670d2a62e213e230989b250f047012a3bbdSara Ting startActivity(i); 223442896f76d81dbae873614340a3a78b29e7d463d2Sara Ting } 223542896f76d81dbae873614340a3a78b29e7d463d2Sara Ting 223642896f76d81dbae873614340a3a78b29e7d463d2Sara Ting /** 22371ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * Loads an integer array asset into a list. 22381ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson */ 22391ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static ArrayList<Integer> loadIntegerArray(Resources r, int resNum) { 22401ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson int[] vals = r.getIntArray(resNum); 22411ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson int size = vals.length; 22421ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ArrayList<Integer> list = new ArrayList<Integer>(size); 22431ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 22441ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson for (int i = 0; i < size; i++) { 22451ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson list.add(vals[i]); 22461ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 22471ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 22481ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson return list; 22491ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 22501ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson /** 22511ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * Loads a String array asset into a list. 22521ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson */ 22531ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static ArrayList<String> loadStringArray(Resources r, int resNum) { 22541ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson String[] labels = r.getStringArray(resNum); 22551ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ArrayList<String> list = new ArrayList<String>(Arrays.asList(labels)); 22561ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson return list; 22571ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 22581ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 225948bcc4cb015dbf802341698a3a04e28d2cfb2ddcMichael Chan @Override 2260b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson public void onDeleteStarted() { 2261b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson mEventDeletionStarted = true; 2262b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson } 2263b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson 2264b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson private Dialog.OnDismissListener createDeleteOnDismissListener() { 2265b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson return new Dialog.OnDismissListener() { 2266b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson @Override 2267b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson public void onDismiss(DialogInterface dialog) { 2268b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson // Since OnPause will force the dialog to dismiss , do 2269b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson // not change the dialog status 2270b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson if (!mIsPaused) { 2271b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson mDeleteDialogVisible = false; 2272b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson } 2273b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson } 2274b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson }; 2275b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson } 2276b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson 227780d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson public long getEventId() { 227880d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson return mEventId; 227980d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson } 228080d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson 228180d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson public long getStartMillis() { 228280d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson return mStartMillis; 228380d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson } 228480d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson public long getEndMillis() { 228580d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson return mEndMillis; 228680d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson } 2287363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan private void setDialogSize(Resources r) { 2288363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan mDialogWidth = (int)r.getDimension(R.dimen.event_info_dialog_width); 2289363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan mDialogHeight = (int)r.getDimension(R.dimen.event_info_dialog_height); 2290363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan } 2291b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung 2292b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung @Override 2293b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung public void onColorSelected(int color) { 2294497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung mCurrentColor = color; 2295497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung mCurrentColorKey = mDisplayColorKeyMap.get(color); 2296497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung mHeadlines.setBackgroundColor(color); 2297b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung } 22982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang} 2299