EventInfoFragment.java revision 71d08836af4cf5fc45d340b1883044a9f8290232
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 192bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport com.android.calendar.CalendarController.EventType; 20fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.event.EditEventHelper; 21fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.event.EventViewUtils; 222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 232bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.app.Activity; 2471d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.Dialog; 2571d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.DialogFragment; 262bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ActivityNotFoundException; 272bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.AsyncQueryHandler; 282bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentProviderOperation; 292bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentResolver; 302bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentUris; 312bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentValues; 322bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Context; 332bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Intent; 342bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.SharedPreferences; 352bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.res.Resources; 362bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.Cursor; 372bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.MatrixCursor; 382bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.PorterDuff; 392bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.Rect; 402bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.net.Uri; 412bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.os.Bundle; 422bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.pim.EventRecurrence; 432bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Attendees; 442bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Calendars; 452bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Events; 462bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Reminders; 47d845fbe558d5229102b58cce70a1b29fe6cb6967Erikimport android.provider.ContactsContract; 482bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.CommonDataKinds; 49d845fbe558d5229102b58cce70a1b29fe6cb6967Erikimport android.provider.ContactsContract.CommonDataKinds.Email; 502bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Contacts; 512bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Data; 522bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Intents; 532bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Presence; 542bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.QuickContact; 552bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.TextUtils; 562bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateFormat; 572bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateUtils; 582bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.Time; 592bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Linkify; 602bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Rfc822Token; 612bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.util.Log; 6271d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Gravity; 632bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.LayoutInflater; 642bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.Menu; 652bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MenuInflater; 662bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MenuItem; 672bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MotionEvent; 682bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.View; 692bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.View.OnTouchListener; 702bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.ViewGroup; 7171d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Window; 7271d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.WindowManager; 732bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.AdapterView; 742bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ArrayAdapter; 752bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ImageButton; 762bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ImageView; 772bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.LinearLayout; 782bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.QuickContactBadge; 792bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Spinner; 802bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.TextView; 812bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Toast; 822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 832bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.ArrayList; 842bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.Arrays; 852bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.HashMap; 862bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.TimeZone; 872bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.regex.Pattern; 882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8971d08836af4cf5fc45d340b1883044a9f8290232Michael Chanpublic class EventInfoFragment extends DialogFragment implements View.OnClickListener, 902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang AdapterView.OnItemSelectedListener { 91d845fbe558d5229102b58cce70a1b29fe6cb6967Erik public static final boolean DEBUG = false; 922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public static final String TAG = "EventInfoActivity"; 942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 954003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang private static final String BUNDLE_KEY_EVENT_ID = "key_event_id"; 964003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 974003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang private static final String BUNDLE_KEY_START_MILLIS = "key_start_millis"; 984003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 994003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang private static final String BUNDLE_KEY_END_MILLIS = "key_end_millis"; 1004003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 10171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private static final String BUNDLE_KEY_IS_DIALOG = "key_fragment_is_dialog"; 10271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 1032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MAX_REMINDERS = 5; 1042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 1062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * These are the corresponding indices into the array of strings 1072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * "R.array.change_response_labels" in the resource file. 1082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 1092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_SINGLE = 0; 1102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_ALL = 1; 1112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Query tokens for QueryHandler 1132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_EVENT = 0; 1142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_CALENDARS = 1; 1152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_ATTENDEES = 2; 1162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_REMINDERS = 3; 1172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_DUPLICATE_CALENDARS = 4; 1182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] EVENT_PROJECTION = new String[] { 1202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._ID, // 0 do not remove; used in DeleteEventHelper 1212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.TITLE, // 1 do not remove; used in DeleteEventHelper 1222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.RRULE, // 2 do not remove; used in DeleteEventHelper 1232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ALL_DAY, // 3 do not remove; used in DeleteEventHelper 1242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.CALENDAR_ID, // 4 do not remove; used in DeleteEventHelper 1252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DTSTART, // 5 do not remove; used in DeleteEventHelper 1262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._SYNC_ID, // 6 do not remove; used in DeleteEventHelper 1272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_TIMEZONE, // 7 do not remove; used in DeleteEventHelper 1282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DESCRIPTION, // 8 1292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_LOCATION, // 9 1302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.HAS_ALARM, // 10 1312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.ACCESS_LEVEL, // 11 1322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.COLOR, // 12 1332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.HAS_ATTENDEE_DATA, // 13 1342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.GUESTS_CAN_MODIFY, // 14 1352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO Events.GUESTS_CAN_INVITE_OTHERS has not been implemented in calendar provider 1362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.GUESTS_CAN_INVITE_OTHERS, // 15 1372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ORGANIZER, // 16 1382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ORIGINAL_EVENT // 17 do not remove; used in DeleteEventHelper 1392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ID = 0; 1412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_TITLE = 1; 1422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_RRULE = 2; 1432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ALL_DAY = 3; 1442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_CALENDAR_ID = 4; 1452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_SYNC_ID = 6; 1462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_TIMEZONE = 7; 1472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_DESCRIPTION = 8; 1482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_LOCATION = 9; 1492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_HAS_ALARM = 10; 1502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ACCESS_LEVEL = 11; 1512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_COLOR = 12; 1522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_HAS_ATTENDEE_DATA = 13; 1532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_GUESTS_CAN_MODIFY = 14; 1542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_CAN_INVITE_OTHERS = 15; 1552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ORGANIZER = 16; 1562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] ATTENDEES_PROJECTION = new String[] { 1582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees._ID, // 0 1592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_NAME, // 1 1602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_EMAIL, // 2 1612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_RELATIONSHIP, // 3 1622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_STATUS, // 4 1632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_ID = 0; 1652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_NAME = 1; 1662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_EMAIL = 2; 1672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_RELATIONSHIP = 3; 1682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_STATUS = 4; 1692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?"; 1712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_SORT_ORDER = Attendees.ATTENDEE_NAME + " ASC, " 1732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang + Attendees.ATTENDEE_EMAIL + " ASC"; 1742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String[] CALENDARS_PROJECTION = new String[] { 1762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars._ID, // 0 1772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.DISPLAY_NAME, // 1 1782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.OWNER_ACCOUNT, // 2 1792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.ORGANIZER_CAN_RESPOND // 3 1802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_DISPLAY_NAME = 1; 1822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2; 1832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_CAN_RESPOND = 3; 1842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String CALENDARS_WHERE = Calendars._ID + "=?"; 1862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String CALENDARS_DUPLICATE_NAME_WHERE = Calendars.DISPLAY_NAME + "=?"; 1872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] REMINDERS_PROJECTION = new String[] { 1892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders._ID, // 0 1902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders.MINUTES, // 1 1912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int REMINDERS_INDEX_MINUTES = 1; 1932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String REMINDERS_WHERE = Reminders.EVENT_ID + "=? AND (" + 1942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders.METHOD + "=" + Reminders.METHOD_ALERT + " OR " + Reminders.METHOD + "=" + 1952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders.METHOD_DEFAULT + ")"; 1962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String REMINDERS_SORT = Reminders.MINUTES; 1972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_GROUP_REMINDER = 1; 1992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_GROUP_EDIT = 2; 2002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_GROUP_DELETE = 3; 2012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_ADD_REMINDER = 1; 2032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_EDIT = 2; 2042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_DELETE = 3; 2052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private View mView; 2072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LinearLayout mRemindersContainer; 2082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LinearLayout mOrganizerContainer; 2092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private TextView mOrganizerView; 2102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Uri mUri; 2122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEventId; 2132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mEventCursor; 2142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mAttendeesCursor; 2152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mCalendarsCursor; 2162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mStartMillis; 2182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEndMillis; 2192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mHasAttendeeData; 2212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsOrganizer; 222d845fbe558d5229102b58cce70a1b29fe6cb6967Erik private long mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 2232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mOrganizerCanRespond; 2242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private String mCalendarOwnerAccount; 2252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mCanModifyCalendar; 2262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsBusyFreeCalendar; 2272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mCanModifyEvent; 2282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mNumOfAttendees; 2292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private String mOrganizer; 2302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<Integer> mOriginalMinutes = new ArrayList<Integer>(); 2322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<LinearLayout> mReminderItems = new ArrayList<LinearLayout>(0); 2332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<Integer> mReminderValues; 2342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<String> mReminderLabels; 2352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mDefaultReminderMinutes; 2362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mOriginalHasAlarm; 2372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private EditResponseHelper mEditResponseHelper; 2392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mResponseOffset; 2412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mOriginalAttendeeResponse; 242d845fbe558d5229102b58cce70a1b29fe6cb6967Erik private int mAttendeeResponseFromIntent = EditEventHelper.ATTENDEE_NO_RESPONSE; 2432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsRepeating; 2442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsDuplicateName; 2452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Pattern mWildcardPattern = Pattern.compile("^.*$"); 2472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LayoutInflater mLayoutInflater; 2482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LinearLayout mReminderAdder; 2492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO This can be removed when the contacts content provider doesn't return duplicates 2512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mUpdateCounts; 2522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static class ViewHolder { 2532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContactBadge badge; 2542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ImageView presence; 2552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int updateCounts; 2562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 2572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private HashMap<String, ViewHolder> mViewHolders = new HashMap<String, ViewHolder>(); 2582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private PresenceQueryHandler mPresenceQueryHandler; 2592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final Uri CONTACT_DATA_WITH_PRESENCE_URI = Data.CONTENT_URI; 2612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_CONTACT_ID_INDEX = 0; 2632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_PRESENCE_INDEX = 1; 2642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_EMAIL_INDEX = 2; 2652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_PHOTO_ID_INDEX = 3; 2662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] PRESENCE_PROJECTION = new String[] { 2682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.CONTACT_ID, // 0 2692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.CONTACT_PRESENCE, // 1 2702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.DATA, // 2 2712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.PHOTO_ID, // 3 2722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 2732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mAcceptedAttendees = new ArrayList<Attendee>(); 2752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mDeclinedAttendees = new ArrayList<Attendee>(); 2762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mTentativeAttendees = new ArrayList<Attendee>(); 2772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mNoResponseAttendees = new ArrayList<Attendee>(); 2782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mColor; 2792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private QueryHandler mHandler; 2812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 28271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private static final int DIALOG_WIDTH = 500; // FRAG_TODO scale 28371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private static final int DIALOG_HEIGHT = 500; 28471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private boolean mIsDialog = false; 28571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mX = -1; 28671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mY = -1; 28771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 2882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private class QueryHandler extends AsyncQueryService { 2892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public QueryHandler(Context context) { 2902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super(context); 2912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 2922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 2942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 2954003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // if the activity is finishing, then close the cursor and return 2964003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang final Activity activity = getActivity(); 2974003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (activity == null || activity.isFinishing()) { 2984003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang cursor.close(); 2994003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang return; 3004003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 3014003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 3022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (token) { 3032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_EVENT: 3042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor = Utils.matrixCursorFromCursor(cursor); 3052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (initEventCursor()) { 3062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // The cursor is empty. This can happen if the event was 3072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // deleted. 3082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // FRAG_TODO we should no longer rely on Activity.finish() 3091df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity.finish(); 3102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 3112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateEvent(mView); 3132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start calendar query 3152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = Calendars.CONTENT_URI; 3162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] args = new String[] { 3172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Long.toString(mEventCursor.getLong(EVENT_INDEX_CALENDAR_ID))}; 3182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startQuery(TOKEN_QUERY_CALENDARS, null, uri, CALENDARS_PROJECTION, 3192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CALENDARS_WHERE, args, null); 3202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_CALENDARS: 3222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor = Utils.matrixCursorFromCursor(cursor); 3232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateCalendar(mView); 3244003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // FRAG_TODO fragments shouldn't set the title anymore 3252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateTitle(); 3261df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang // update the action bar since our option set might have changed 3271df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity.invalidateOptionsMenu(); 3282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // this is used for both attendees and reminders 3302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang args = new String[] { Long.toString(mEventId) }; 3312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start attendees query 3332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang uri = Attendees.CONTENT_URI; 3342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startQuery(TOKEN_QUERY_ATTENDEES, null, uri, ATTENDEES_PROJECTION, 3352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ATTENDEES_WHERE, args, ATTENDEES_SORT_ORDER); 3362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start reminders query 3382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalHasAlarm = mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) != 0; 3392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mOriginalHasAlarm) { 3402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang uri = Reminders.CONTENT_URI; 3412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startQuery(TOKEN_QUERY_REMINDERS, null, uri, REMINDERS_PROJECTION, 3422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang REMINDERS_WHERE, args, REMINDERS_SORT); 3432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 3442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // if no reminders, hide the appropriate fields 3452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 3462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_ATTENDEES: 3492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor = Utils.matrixCursorFromCursor(cursor); 3502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang initAttendeesCursor(mView); 3512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mView); 3522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_REMINDERS: 3542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang MatrixCursor reminderCursor = Utils.matrixCursorFromCursor(cursor); 3552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang try { 3562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // First pass: collect all the custom reminder minutes 3572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (e.g., a reminder of 8 minutes) into a global list. 3582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang while (reminderCursor.moveToNext()) { 3592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int minutes = reminderCursor.getInt(REMINDERS_INDEX_MINUTES); 3602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventViewUtils.addMinutesToList( 3611df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity, mReminderValues, mReminderLabels, minutes); 3622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Second pass: create the reminder spinners 3652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang reminderCursor.moveToPosition(-1); 3662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang while (reminderCursor.moveToNext()) { 3672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int minutes = reminderCursor.getInt(REMINDERS_INDEX_MINUTES); 3682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalMinutes.add(minutes); 3691df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang EventViewUtils.addReminder(activity, mRemindersContainer, 3702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventInfoFragment.this, mReminderItems, mReminderValues, 3712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderLabels, minutes); 3722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } finally { 3742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 3752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang reminderCursor.close(); 3762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_DUPLICATE_CALENDARS: 3792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsDuplicateName = cursor.getCount() > 1; 3802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String calendarName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 3812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String ownerAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 3822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mIsDuplicateName && !calendarName.equalsIgnoreCase(ownerAccount)) { 3831df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang Resources res = activity.getResources(); 3842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView ownerText = (TextView) mView.findViewById(R.id.owner); 3852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ownerText.setText(ownerAccount); 3862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ownerText.setTextColor(res.getColor(R.color.calendar_owner_text_color)); 3872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 3882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(mView, R.id.owner, View.GONE); 3892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(mView, R.id.calendar, calendarName); 3912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.close(); 3942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3984003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public EventInfoFragment() { 3994003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mUri = null; 4004003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 4014003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 4022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public EventInfoFragment(Uri uri, long startMillis, long endMillis, int attendeeResponse) { 40371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan setStyle(DialogFragment.STYLE_NO_TITLE, 0); 4042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mUri = uri; 4052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mStartMillis = startMillis; 4062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEndMillis = endMillis; 4072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeeResponseFromIntent = attendeeResponse; 4082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4104003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public EventInfoFragment(long eventId, long startMillis, long endMillis) { 4114003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang this(ContentUris.withAppendedId(Events.CONTENT_URI, eventId), 4124003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang startMillis, endMillis, EventInfoActivity.ATTENDEE_NO_RESPONSE); 4134003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = eventId; 4144003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 4154003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 41671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan @Override 41771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan public void onActivityCreated(Bundle savedInstanceState) { 41871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onActivityCreated(savedInstanceState); 41971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 42071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (savedInstanceState != null) { 42171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mIsDialog = savedInstanceState.getBoolean(BUNDLE_KEY_IS_DIALOG, false); 42271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 42371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 42471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (mIsDialog) { 42571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan applyDialogParams(); 42671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 42771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 42871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 42971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private void applyDialogParams() { 43071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Dialog dialog = getDialog(); 43171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan dialog.setCanceledOnTouchOutside(true); 43271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 43371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Window window = dialog.getWindow(); 43471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 43571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 43671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan WindowManager.LayoutParams a = window.getAttributes(); 43771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.dimAmount = .4f; 43871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 43971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.width = DIALOG_WIDTH; 44071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.height = DIALOG_HEIGHT; 44171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 44271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (mX != -1 || mY != -1) { 44371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.x = mX - a.width / 2; 44471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.y = mY - a.height / 2; 44571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.gravity = Gravity.LEFT | Gravity.TOP; 44671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 44771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 44871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.setAttributes(a); 44971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 45071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 45171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan public void setDialogParams(int x, int y) { 45271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mIsDialog = true; 45371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mX = x; 45471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mY = y; 45571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 45671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 4572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is called when one of the "remove reminder" buttons is selected. 4582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onClick(View v) { 4592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang LinearLayout reminderItem = (LinearLayout) v.getParent(); 4602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang LinearLayout parent = (LinearLayout) reminderItem.getParent(); 4612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang parent.removeView(reminderItem); 4622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderItems.remove(reminderItem); 4632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 4642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { 4672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If they selected the "No response" option, then don't display the 4682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // dialog asking which events to change. 4692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (id == 0 && mResponseOffset == 0) { 4702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If this is not a repeating event, then don't display the dialog 4742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // asking which events to change. 4752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 4762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the selection is the same as the original, then don't display the 4802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // dialog asking which events to change. 4812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int index = findResponseIndexFor(mOriginalAttendeeResponse); 4822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (position == index + mResponseOffset) { 4832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event. We need to ask the user if they mean to 4872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // change just this one instance or all instances. 4882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEditResponseHelper.showDialog(mEditResponseHelper.getWhichEvents()); 4892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onNothingSelected(AdapterView<?> parent) { 4922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 4952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onAttach(Activity activity) { 4962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onAttach(activity); 4972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEditResponseHelper = new EditResponseHelper(activity); 4982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setHasOptionsMenu(true); 4992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler = new QueryHandler(activity); 5002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mPresenceQueryHandler = new PresenceQueryHandler(activity, activity.getContentResolver()); 5012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 5042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public View onCreateView(LayoutInflater inflater, ViewGroup container, 5052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Bundle savedInstanceState) { 5062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mLayoutInflater = inflater; 5072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mView = inflater.inflate(R.layout.event_info_activity, null); 5082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mRemindersContainer = (LinearLayout) mView.findViewById(R.id.reminders_container); 5092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizerContainer = (LinearLayout) mView.findViewById(R.id.organizer_container); 5102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizerView = (TextView) mView.findViewById(R.id.organizer); 5112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Initialize the reminder values array. 5132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Resources r = getActivity().getResources(); 5142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] strings = r.getStringArray(R.array.reminder_minutes_values); 5152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int size = strings.length; 5162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Integer> list = new ArrayList<Integer>(size); 5172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang for (int i = 0 ; i < size ; i++) { 5182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang list.add(Integer.parseInt(strings[i])); 5192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues = list; 5212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] labels = r.getStringArray(R.array.reminder_minutes_labels); 5222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderLabels = new ArrayList<String>(Arrays.asList(labels)); 5232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(getActivity()); 5252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String durationString = 5262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang prefs.getString(CalendarPreferenceActivity.KEY_DEFAULT_REMINDER, "0"); 5272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDefaultReminderMinutes = Integer.parseInt(durationString); 5282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Setup the + Add Reminder Button 5302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View.OnClickListener addReminderOnClickListener = new View.OnClickListener() { 5312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onClick(View v) { 5322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang addReminder(); 5332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 5352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ImageButton reminderAddButton = (ImageButton) mView.findViewById(R.id.reminder_add); 5362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang reminderAddButton.setOnClickListener(addReminderOnClickListener); 5372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderAdder = (LinearLayout) mView.findViewById(R.id.reminder_adder); 5392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5404003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (mUri == null) { 5414003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // restore event ID from bundle 5424003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = savedInstanceState.getLong(BUNDLE_KEY_EVENT_ID); 5434003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 5444003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mStartMillis = savedInstanceState.getLong(BUNDLE_KEY_START_MILLIS); 5454003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEndMillis = savedInstanceState.getLong(BUNDLE_KEY_END_MILLIS); 5464003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 5474003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 5482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start loading the data 5492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION, 5502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, null); 5512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return mView; 5532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateTitle() { 5562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Resources res = getActivity().getResources(); 5572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCanModifyCalendar && !mIsOrganizer) { 5582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title_invite)); 5592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 5602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title)); 5612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 5652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Initializes the event cursor, which is expected to point to the first 5662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * (and only) result from a query. 5672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @return true if the cursor is empty. 5682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 5692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean initEventCursor() { 5702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if ((mEventCursor == null) || (mEventCursor.getCount() == 0)) { 5712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 5722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.moveToFirst(); 5742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventId = mEventCursor.getInt(EVENT_INDEX_ID); 5752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 5762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsRepeating = (rRule != null); 5772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 5782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static class Attendee { 5812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String mName; 5822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String mEmail; 5832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendee(String name, String email) { 5852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mName = name; 5862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEmail = email; 5872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @SuppressWarnings("fallthrough") 5912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void initAttendeesCursor(View view) { 592d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalAttendeeResponse = EditEventHelper.ATTENDEE_NO_RESPONSE; 593d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 5942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = 0; 5952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 5962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = mAttendeesCursor.getCount(); 5972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor.moveToFirst()) { 5982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAcceptedAttendees.clear(); 5992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDeclinedAttendees.clear(); 6002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mTentativeAttendees.clear(); 6012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNoResponseAttendees.clear(); 6022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang do { 6042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 6052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String name = mAttendeesCursor.getString(ATTENDEES_INDEX_NAME); 6062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String email = mAttendeesCursor.getString(ATTENDEES_INDEX_EMAIL); 6072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor.getInt(ATTENDEES_INDEX_RELATIONSHIP) == 6092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.RELATIONSHIP_ORGANIZER) { 6102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Overwrites the one from Event table if available 6112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (name != null && name.length() > 0) { 6122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizer = name; 6132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else if (email != null && email.length() > 0) { 6142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizer = email; 6152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 618d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE && 6192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount.equalsIgnoreCase(email)) { 6202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAttendeeId = mAttendeesCursor.getInt(ATTENDEES_INDEX_ID); 6212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalAttendeeResponse = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 6222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 6232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Don't show your own status in the list because: 6242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 1) it doesn't make sense for event without other guests. 6252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 2) there's a spinner for that for events with guests. 6262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch(status) { 6272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_ACCEPTED: 6282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAcceptedAttendees.add(new Attendee(name, email)); 6292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 6302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_DECLINED: 6312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDeclinedAttendees.add(new Attendee(name, email)); 6322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 6332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_NONE: 6342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNoResponseAttendees.add(new Attendee(name, email)); 6352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Fallthrough so that no response is a subset of tentative 6362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang default: 6372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mTentativeAttendees.add(new Attendee(name, email)); 6382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } while (mAttendeesCursor.moveToNext()); 6412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.moveToFirst(); 6422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateAttendees(view); 6442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // only show the organizer if we're not the organizer and if 6472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // we have attendee data (might have been removed by the server 6482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // for events with a lot of attendees). 6492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsOrganizer && mHasAttendeeData) { 6502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizerContainer.setVisibility(View.VISIBLE); 6512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizerView.setText(mOrganizer); 6522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 6532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizerContainer.setVisibility(View.GONE); 6542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 6584003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public void onSaveInstanceState(Bundle outState) { 6594003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang super.onSaveInstanceState(outState); 6604003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_EVENT_ID, mEventId); 6614003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_START_MILLIS, mStartMillis); 6624003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_END_MILLIS, mEndMillis); 66371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 66471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan outState.putBoolean(BUNDLE_KEY_IS_DIALOG, mIsDialog); 6654003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 6664003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 6674003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 6684003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang @Override 6694003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public void onDestroyView() { 6702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Integer> reminderMinutes = EventViewUtils.reminderItemsToMinutes(mReminderItems, 6712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues); 6722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3); 6732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean changed = EditEventHelper.saveReminders(ops, mEventId, reminderMinutes, 6742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalMinutes, false /* no force save */); 6752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startBatch(mHandler.getNextToken(), null, 6762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.CONTENT_URI.getAuthority(), ops, Utils.UNDO_DELAY); 6772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Update the "hasAlarm" field for the event 6792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 6802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int len = reminderMinutes.size(); 6812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean hasAlarm = len > 0; 6822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (hasAlarm != mOriginalHasAlarm) { 6832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 6842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0); 6852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startUpdate(mHandler.getNextToken(), null, uri, values, 6862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, Utils.UNDO_DELAY); 6872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang changed |= saveResponse(); 6902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (changed) { 6912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Toast.makeText(getActivity(), R.string.saving_event, Toast.LENGTH_SHORT).show(); 6922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6934003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang super.onDestroyView(); 6942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 6972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onDestroy() { 6982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor != null) { 6992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.close(); 7002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null) { 7022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.close(); 7032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 7052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.close(); 7062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 70771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onDestroy(); 7082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean canAddReminders() { 7112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return !mIsBusyFreeCalendar && mReminderItems.size() < MAX_REMINDERS; 7122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void addReminder() { 7152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO: when adding a new reminder, make it different from the 7162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // last one in the list (if any). 7172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mDefaultReminderMinutes == 0) { 7182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventViewUtils.addReminder(getActivity(), mRemindersContainer, this, mReminderItems, 7192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues, mReminderLabels, 10 /* minutes */); 7202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 7212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventViewUtils.addReminder(getActivity(), mRemindersContainer, this, mReminderItems, 7222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues, mReminderLabels, mDefaultReminderMinutes); 7232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 7252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 7282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 7292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang MenuItem item; 7302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item = menu.add(MENU_GROUP_REMINDER, MENU_ADD_REMINDER, 0, 7312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang R.string.add_new_reminder); 7322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item.setIcon(R.drawable.ic_menu_reminder); 7332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item.setAlphabeticShortcut('r'); 7341df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 7352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item = menu.add(MENU_GROUP_EDIT, MENU_EDIT, 0, R.string.edit_event_label); 7372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item.setIcon(android.R.drawable.ic_menu_edit); 7382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item.setAlphabeticShortcut('e'); 7391df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 7402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item = menu.add(MENU_GROUP_DELETE, MENU_DELETE, 0, R.string.delete_event_label); 7422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item.setIcon(android.R.drawable.ic_menu_delete); 7431df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 7442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onCreateOptionsMenu(menu, inflater); 7462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 7492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onPrepareOptionsMenu(Menu menu) { 7502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean canAddReminders = canAddReminders(); 7512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupVisible(MENU_GROUP_REMINDER, canAddReminders); 7522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupEnabled(MENU_GROUP_REMINDER, canAddReminders); 7532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupVisible(MENU_GROUP_EDIT, mCanModifyEvent); 7552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupEnabled(MENU_GROUP_EDIT, mCanModifyEvent); 7562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupVisible(MENU_GROUP_DELETE, mCanModifyCalendar); 7572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupEnabled(MENU_GROUP_DELETE, mCanModifyCalendar); 7582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onPrepareOptionsMenu(menu); 7602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 7632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public boolean onOptionsItemSelected(MenuItem item) { 7642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onOptionsItemSelected(item); 7652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (item.getItemId()) { 7662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case MENU_ADD_REMINDER: 7672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang addReminder(); 7682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 7692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case MENU_EDIT: 7702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang doEdit(); 7712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 7722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case MENU_DELETE: 7732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang doDelete(); 7742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 7752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 7772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// @Override 7802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// public boolean onKeyDown(int keyCode, KeyEvent event) { 7812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// if (keyCode == KeyEvent.KEYCODE_DEL) { 7822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// doDelete(); 7832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// return true; 7842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// } 7852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// return super.onKeyDown(keyCode, event); 7862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// } 7872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateRemindersVisibility() { 7892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mIsBusyFreeCalendar) { 7902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mRemindersContainer.setVisibility(View.GONE); 7912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 7922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mRemindersContainer.setVisibility(View.VISIBLE); 7932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderAdder.setVisibility(canAddReminders() ? View.VISIBLE : View.GONE); 7942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 7982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Asynchronously saves the response to an invitation if the user changed 7992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * the response. Returns true if the database will be updated. 8002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 8012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @param cr the ContentResolver 8022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @return true if the database will be changed 8032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 8042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean saveResponse() { 8052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor == null || mEventCursor == null) { 8062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Spinner spinner = (Spinner) getView().findViewById(R.id.response_value); 8092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int position = spinner.getSelectedItemPosition() - mResponseOffset; 8102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (position <= 0) { 8112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 814d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int status = EditEventHelper.ATTENDEE_VALUES[position]; 8152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the status has not changed, then don't update the database 8172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (status == mOriginalAttendeeResponse) { 8182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If we never got an owner attendee id we can't set the status 822d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE) { 8232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 8272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a non-repeating event 8282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 8292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 8302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event 8332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int whichEvents = mEditResponseHelper.getWhichEvents(); 8342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (whichEvents) { 8352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case -1: 8362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_SINGLE: 8382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang createExceptionResponse(mEventId, mCalendarOwnerAttendeeId, status); 8392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 8402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_ALL: 8412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 8422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 8432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang default: 8442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "Unexpected choice for updating invitation response"); 8452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 8462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateResponse(long eventId, long attendeeId, int status) { 8512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Update the attendee status in the attendees table. the provider 8522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // takes care of updating the self attendance status. 8532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 8542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(mCalendarOwnerAccount)) { 8562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_EMAIL, mCalendarOwnerAccount); 8572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_STATUS, status); 8592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.EVENT_ID, eventId); 8602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = ContentUris.withAppendedId(Attendees.CONTENT_URI, attendeeId); 8622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startUpdate(mHandler.getNextToken(), null, uri, values, 8642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, Utils.UNDO_DELAY); 8652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void createExceptionResponse(long eventId, long attendeeId, 8682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status) { 8692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor == null || !mEventCursor.moveToFirst()) { 8702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 8712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 8742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String title = mEventCursor.getString(EVENT_INDEX_TITLE); 8762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String timezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE); 8772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int calendarId = mEventCursor.getInt(EVENT_INDEX_CALENDAR_ID); 8782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0; 8792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String syncId = mEventCursor.getString(EVENT_INDEX_SYNC_ID); 8802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.TITLE, title); 8822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.EVENT_TIMEZONE, timezone); 8832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ALL_DAY, allDay ? 1 : 0); 8842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.CALENDAR_ID, calendarId); 8852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.DTSTART, mStartMillis); 8862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.DTEND, mEndMillis); 8872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_EVENT, syncId); 8882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_INSTANCE_TIME, mStartMillis); 8892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_ALL_DAY, allDay ? 1 : 0); 8902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.STATUS, Events.STATUS_CONFIRMED); 8912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.SELF_ATTENDEE_STATUS, status); 8922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Create a recurrence exception 8942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startInsert(mHandler.getNextToken(), null, 8952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.CONTENT_URI, values, Utils.UNDO_DELAY); 8962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int findResponseIndexFor(int response) { 899d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int size = EditEventHelper.ATTENDEE_VALUES.length; 9002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang for (int index = 0; index < size; index++) { 901d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (EditEventHelper.ATTENDEE_VALUES[index] == response) { 9022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return index; 9032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return 0; 9062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void doEdit() { 9092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CalendarController.getInstance(getActivity()).sendEventRelatedEvent( 9102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang this, EventType.EDIT_EVENT, mEventId, mStartMillis, mEndMillis, 0, 0); 9112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void doDelete() { 9144003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang CalendarController.getInstance(getActivity()).sendEventRelatedEvent( 9154003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang this, EventType.DELETE_EVENT, mEventId, mStartMillis, mEndMillis, 0, 0); 9162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateEvent(View view) { 9192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor == null) { 9202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 9212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventName = mEventCursor.getString(EVENT_INDEX_TITLE); 9242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventName == null || eventName.length() == 0) { 9252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventName = getActivity().getString(R.string.no_title_label); 9262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0; 9292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String location = mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION); 9302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String description = mEventCursor.getString(EVENT_INDEX_DESCRIPTION); 9312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 9322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean hasAlarm = mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) != 0; 9332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventTimezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE); 9342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mColor = mEventCursor.getInt(EVENT_INDEX_COLOR) & 0xbbffffff; 9352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View calBackground = view.findViewById(R.id.cal_background); 9372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang calBackground.setBackgroundColor(mColor); 9382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView title = (TextView) view.findViewById(R.id.title); 9402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang title.setTextColor(mColor); 9412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View divider = view.findViewById(R.id.divider); 9432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang divider.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN); 9442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // What 9462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventName != null) { 9472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.title, eventName); 9482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // When 9512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String when; 9522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int flags; 9532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (allDay) { 9542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang flags = DateUtils.FORMAT_UTC | DateUtils.FORMAT_SHOW_WEEKDAY 9552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang | DateUtils.FORMAT_SHOW_DATE; 9562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 9572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang flags = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE; 9582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (DateFormat.is24HourFormat(getActivity())) { 9592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang flags |= DateUtils.FORMAT_24HOUR; 9602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang when = DateUtils.formatDateRange(getActivity(), mStartMillis, mEndMillis, flags); 9632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.when, when); 9642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Show the event timezone if it is different from the local timezone 9662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Time time = new Time(); 9672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String localTimezone = time.timezone; 9682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (allDay) { 9692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang localTimezone = Time.TIMEZONE_UTC; 9702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventTimezone != null && !localTimezone.equals(eventTimezone) && !allDay) { 9722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String displayName; 9732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TimeZone tz = TimeZone.getTimeZone(localTimezone); 9742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (tz == null || tz.getID().equals("GMT")) { 9752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang displayName = localTimezone; 9762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 9772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang displayName = tz.getDisplayName(); 9782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.timezone, displayName); 9819c1989989b8f633210ef1761b0e4e7ecd5b43581Mason Tang setVisibilityCommon(view, R.id.timezone_container, View.VISIBLE); 9822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 9832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.timezone_container, View.GONE); 9842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Repeat 9872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (rRule != null) { 9882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventRecurrence eventRecurrence = new EventRecurrence(); 9892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventRecurrence.parse(rRule); 9902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Time date = new Time(); 9912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (allDay) { 9922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang date.timezone = Time.TIMEZONE_UTC; 9932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang date.set(mStartMillis); 9952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventRecurrence.setStartDate(date); 9962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String repeatString = EventRecurrenceFormatter.getRepeatString( 9972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().getResources(), eventRecurrence); 9982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.repeat, repeatString); 9999c1989989b8f633210ef1761b0e4e7ecd5b43581Mason Tang setVisibilityCommon(view, R.id.repeat_container, View.VISIBLE); 10002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 10012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.repeat_container, View.GONE); 10022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Where 10052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (location == null || location.length() == 0) { 10062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.where, View.GONE); 10072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 10082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final TextView textView = (TextView) view.findViewById(R.id.where); 10092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView != null) { 10102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setAutoLinkMask(0); 10112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setText(location); 10122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Linkify.addLinks(textView, mWildcardPattern, "geo:0,0?q="); 10132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setOnTouchListener(new OnTouchListener() { 10142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public boolean onTouch(View v, MotionEvent event) { 10152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang try { 10162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return v.onTouchEvent(event); 10172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } catch (ActivityNotFoundException e) { 10182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // ignore 10192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 10202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }); 10232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Description 10272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (description == null || description.length() == 0) { 10282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.description, View.GONE); 10292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 10302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.description, description); 10312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateCalendar(View view) { 10352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = ""; 10362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null && mEventCursor != null) { 10372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.moveToFirst(); 10382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String tempAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 10392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = (tempAccount == null) ? "" : tempAccount; 10402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizerCanRespond = mCalendarsCursor.getInt(CALENDARS_INDEX_OWNER_CAN_RESPOND) != 0; 10412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String displayName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 10432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start duplicate calendars query 10452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startQuery(TOKEN_QUERY_DUPLICATE_CALENDARS, null, Calendars.CONTENT_URI, 10462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CALENDARS_PROJECTION, CALENDARS_DUPLICATE_NAME_WHERE, 10472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang new String[] {displayName}, null); 10482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventOrganizer = mEventCursor.getString(EVENT_INDEX_ORGANIZER); 10502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsOrganizer = mCalendarOwnerAccount.equalsIgnoreCase(eventOrganizer); 10512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHasAttendeeData = mEventCursor.getInt(EVENT_INDEX_HAS_ATTENDEE_DATA) != 0; 10522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizer = eventOrganizer; 10532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCanModifyCalendar = 10542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) >= Calendars.CONTRIBUTOR_ACCESS; 10552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsBusyFreeCalendar = 10562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) == Calendars.FREEBUSY_ACCESS; 10572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCanModifyEvent = mCanModifyCalendar 10582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang && (mIsOrganizer || (mEventCursor.getInt(EVENT_INDEX_GUESTS_CAN_MODIFY) != 0)); 10592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 10602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.calendar_container, View.GONE); 10612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateAttendees(View view) { 10652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang LinearLayout attendeesLayout = (LinearLayout) view.findViewById(R.id.attendee_list); 10662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang attendeesLayout.removeAllViewsInLayout(); 10672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ++mUpdateCounts; 10682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if(mAcceptedAttendees.size() == 0 && mDeclinedAttendees.size() == 0 && 10692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mTentativeAttendees.size() == mNoResponseAttendees.size()) { 10702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If all guests have no response just list them as guests, 10712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CharSequence guestsLabel = 10722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().getResources().getText(R.string.attendees_label); 10732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang addAttendeesToLayout(mNoResponseAttendees, attendeesLayout, guestsLabel); 10742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 10752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If we have any responses then divide them up by response 10762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CharSequence[] entries; 10772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang entries = getActivity().getResources().getTextArray(R.array.response_labels2); 10782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang addAttendeesToLayout(mAcceptedAttendees, attendeesLayout, entries[0]); 10792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang addAttendeesToLayout(mDeclinedAttendees, attendeesLayout, entries[2]); 10802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang addAttendeesToLayout(mTentativeAttendees, attendeesLayout, entries[1]); 10812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void addAttendeesToLayout(ArrayList<Attendee> attendees, LinearLayout attendeeList, 10852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CharSequence sectionTitle) { 10862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (attendees.size() == 0) { 10872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 10882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Yes/No/Maybe Title 10912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View titleView = mLayoutInflater.inflate(R.layout.contact_item, null); 10922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang titleView.findViewById(R.id.badge).setVisibility(View.GONE); 10932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View divider = titleView.findViewById(R.id.separator); 10942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang divider.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN); 10952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView title = (TextView) titleView.findViewById(R.id.name); 10972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang title.setText(getActivity().getString(R.string.response_label, sectionTitle, 10982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang attendees.size())); 10992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang title.setTextAppearance(getActivity(), R.style.TextAppearance_EventInfo_Label); 11002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang attendeeList.addView(titleView); 11012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Attendees 11032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int numOfAttendees = attendees.size(); 11042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang StringBuilder selection = new StringBuilder(Email.DATA + " IN ("); 11052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] selectionArgs = new String[numOfAttendees]; 11062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang for (int i = 0; i < numOfAttendees; ++i) { 11082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendee attendee = attendees.get(i); 11092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selectionArgs[i] = attendee.mEmail; 11102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View v = mLayoutInflater.inflate(R.layout.contact_item, null); 11122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang v.setTag(attendee); 11132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View separator = v.findViewById(R.id.separator); 11152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang separator.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN); 11162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Text 11182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView tv = (TextView) v.findViewById(R.id.name); 11192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String name = attendee.mName; 11202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (name == null || name.length() == 0) { 11212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang name = attendee.mEmail; 11222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang tv.setText(name); 11242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ViewHolder vh = new ViewHolder(); 11262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.badge = (QuickContactBadge) v.findViewById(R.id.badge); 11272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.badge.assignContactFromEmail(attendee.mEmail, true); 11282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.presence = (ImageView) v.findViewById(R.id.presence); 11292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mViewHolders.put(attendee.mEmail, vh); 11302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (i == 0) { 11322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selection.append('?'); 11332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 11342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selection.append(", ?"); 11352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang attendeeList.addView(v); 11382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selection.append(')'); 11402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mPresenceQueryHandler.startQuery(mUpdateCounts, attendees, CONTACT_DATA_WITH_PRESENCE_URI, 11422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang PRESENCE_PROJECTION, selection.toString(), selectionArgs, null); 11432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private class PresenceQueryHandler extends AsyncQueryHandler { 11462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Context mContext; 11472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public PresenceQueryHandler(Context context, ContentResolver cr) { 11492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super(cr); 11502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mContext = context; 11512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 11542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang protected void onQueryComplete(int queryIndex, Object cookie, Cursor cursor) { 11552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (cursor == null) { 11562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (DEBUG) { 11572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "onQueryComplete: cursor == null"); 11582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 11602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang try { 11632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.moveToPosition(-1); 11642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang while (cursor.moveToNext()) { 11652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String email = cursor.getString(PRESENCE_PROJECTION_EMAIL_INDEX); 11662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int contactId = cursor.getInt(PRESENCE_PROJECTION_CONTACT_ID_INDEX); 11672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ViewHolder vh = mViewHolders.get(email); 11682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int photoId = cursor.getInt(PRESENCE_PROJECTION_PHOTO_ID_INDEX); 11692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (DEBUG) { 11702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "onQueryComplete Id: " + contactId + " PhotoId: " + photoId 11712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang + " Email: " + email); 11722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (vh == null) { 11742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang continue; 11752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ImageView presenceView = vh.presence; 11772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (presenceView != null) { 11782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status = cursor.getInt(PRESENCE_PROJECTION_PRESENCE_INDEX); 11792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang presenceView.setImageResource(Presence.getPresenceIconResourceId(status)); 11802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang presenceView.setVisibility(View.VISIBLE); 11812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (photoId > 0 && vh.updateCounts < queryIndex) { 11842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.updateCounts = queryIndex; 11852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri personUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 11862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang contactId); 11872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO, modify to batch queries together 11892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContactsAsyncHelper.updateImageViewWithContactPhotoAsync(mContext, 11902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.badge, personUri, R.drawable.ic_contact_picture); 11912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } finally { 11942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.close(); 11952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang void updateResponse(View view) { 12002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // we only let the user accept/reject/etc. a meeting if: 12012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // a) you can edit the event's containing calendar AND 12022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // b) you're not the organizer and only attendee AND 12032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // c) organizerCanRespond is enabled for the calendar 12042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (if the attendee data has been hidden, the visible number of attendees 12052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // will be 1 -- the calendar owner's). 12062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (there are more cases involved to be 100% accurate, such as 12072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // paying attention to whether or not an attendee status was 12082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // included in the feed, but we're currently omitting those corner cases 12092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // for simplicity). 12102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mCanModifyCalendar || (mHasAttendeeData && mIsOrganizer && mNumOfAttendees <= 1) || 12112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang (mIsOrganizer && !mOrganizerCanRespond)) { 12122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.GONE); 12132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.VISIBLE); 12172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Spinner spinner = (Spinner) view.findViewById(R.id.response_value); 12192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mResponseOffset = 0; 12212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /* If the user has previously responded to this event 12232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * we should not allow them to select no response again. 12242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Switch the entries to a set of entries without the 12252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * no response option. 12262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 12272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if ((mOriginalAttendeeResponse != Attendees.ATTENDEE_STATUS_INVITED) 1228d845fbe558d5229102b58cce70a1b29fe6cb6967Erik && (mOriginalAttendeeResponse != EditEventHelper.ATTENDEE_NO_RESPONSE) 12292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang && (mOriginalAttendeeResponse != Attendees.ATTENDEE_STATUS_NONE)) { 12302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CharSequence[] entries; 12312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang entries = getActivity().getResources().getTextArray(R.array.response_labels2); 12322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mResponseOffset = -1; 12332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayAdapter<CharSequence> adapter = 12342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang new ArrayAdapter<CharSequence>(getActivity(), 12352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang android.R.layout.simple_spinner_item, entries); 12362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 12372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang spinner.setAdapter(adapter); 12382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int index; 1241d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mAttendeeResponseFromIntent != EditEventHelper.ATTENDEE_NO_RESPONSE) { 12422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang index = findResponseIndexFor(mAttendeeResponseFromIntent); 12432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 12442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang index = findResponseIndexFor(mOriginalAttendeeResponse); 12452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang spinner.setSelection(index + mResponseOffset); 12472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang spinner.setOnItemSelectedListener(this); 12482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setTextCommon(View view, int id, CharSequence text) { 12512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView textView = (TextView) view.findViewById(id); 12522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView == null) 12532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setText(text); 12552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setVisibilityCommon(View view, int id, int visibility) { 12582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View v = view.findViewById(id); 12592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (v != null) { 12602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang v.setVisibility(visibility); 12612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 12662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Taken from com.google.android.gm.HtmlConversationActivity 12672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 12682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Send the intent that shows the Contact info corresponding to the email address. 12692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 12702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void showContactInfo(Attendee attendee, Rect rect) { 12712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // First perform lookup query to find existing contact 12722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final ContentResolver resolver = getActivity().getContentResolver(); 12732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String address = attendee.mEmail; 12742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri dataUri = Uri.withAppendedPath(CommonDataKinds.Email.CONTENT_FILTER_URI, 12752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri.encode(address)); 12762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri lookupUri = ContactsContract.Data.getContactLookupUri(resolver, dataUri); 12772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (lookupUri != null) { 12792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Found matching contact, trigger QuickContact 12802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.showQuickContact(getActivity(), rect, lookupUri, 12812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.MODE_MEDIUM, null); 12822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 12832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // No matching contact, ask user to create one 12842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri mailUri = Uri.fromParts("mailto", address, null); 12852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, mailUri); 12862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Pass along full E-mail string for possible create dialog 12882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Rfc822Token sender = new Rfc822Token(attendee.mName, attendee.mEmail, null); 12892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.EXTRA_CREATE_DESCRIPTION, sender.toString()); 12902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Only provide personal name hint if we have one 12922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String senderPersonal = attendee.mName; 12932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(senderPersonal)) { 12942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.Insert.NAME, senderPersonal); 12952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startActivity(intent); 12982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang} 1301