EventInfoFragment.java revision 352e1a2f834460bd54e03ce94cadd36a46debacb
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 19cb81189e4868769ea016253eca104e46df2f033aErikimport com.android.calendar.CalendarController.EventInfo; 202bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport com.android.calendar.CalendarController.EventType; 21fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.event.EditEventHelper; 22fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.event.EventViewUtils; 232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 242bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.app.Activity; 2571d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.Dialog; 2671d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.DialogFragment; 272bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ActivityNotFoundException; 282bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.AsyncQueryHandler; 292bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentProviderOperation; 302bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentResolver; 312bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentUris; 322bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentValues; 332bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Context; 342bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Intent; 352bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.SharedPreferences; 362bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.res.Resources; 372bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.Cursor; 382bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.MatrixCursor; 392bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.PorterDuff; 402bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.Rect; 412bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.net.Uri; 422bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.os.Bundle; 432bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.pim.EventRecurrence; 442bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Attendees; 452bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Calendars; 462bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Events; 472bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Reminders; 48cb81189e4868769ea016253eca104e46df2f033aErikimport android.provider.ContactsContract; 492bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.CommonDataKinds; 50cb81189e4868769ea016253eca104e46df2f033aErikimport android.provider.ContactsContract.CommonDataKinds.Email; 512bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Contacts; 522bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Data; 532bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Intents; 542bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Presence; 552bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.QuickContact; 568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.Spannable; 578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.SpannableStringBuilder; 582bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.TextUtils; 592bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateFormat; 602bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateUtils; 612bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.Time; 628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.ForegroundColorSpan; 638ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.StrikethroughSpan; 642bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Linkify; 652bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Rfc822Token; 662bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.util.Log; 6771d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Gravity; 682bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.LayoutInflater; 692bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MotionEvent; 702bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.View; 71cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnClickListener; 72cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnTouchListener; 732bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.ViewGroup; 7471d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Window; 7571d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.WindowManager; 762bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.AdapterView; 772bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ArrayAdapter; 788ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.widget.Button; 792bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ImageButton; 802bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ImageView; 812bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.LinearLayout; 822bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.QuickContactBadge; 832bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Spinner; 842bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.TextView; 852bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Toast; 862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 872bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.ArrayList; 882bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.Arrays; 892bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.HashMap; 902bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.regex.Pattern; 912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9271d08836af4cf5fc45d340b1883044a9f8290232Michael Chanpublic class EventInfoFragment extends DialogFragment implements View.OnClickListener, 93cb81189e4868769ea016253eca104e46df2f033aErik AdapterView.OnItemSelectedListener, CalendarController.EventHandler { 94d845fbe558d5229102b58cce70a1b29fe6cb6967Erik public static final boolean DEBUG = false; 952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public static final String TAG = "EventInfoActivity"; 972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 984003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang private static final String BUNDLE_KEY_EVENT_ID = "key_event_id"; 994003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 1004003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang private static final String BUNDLE_KEY_START_MILLIS = "key_start_millis"; 1014003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 1024003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang private static final String BUNDLE_KEY_END_MILLIS = "key_end_millis"; 1034003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 10471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private static final String BUNDLE_KEY_IS_DIALOG = "key_fragment_is_dialog"; 10571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 1062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MAX_REMINDERS = 5; 1072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 1092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * These are the corresponding indices into the array of strings 1102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * "R.array.change_response_labels" in the resource file. 1112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 1122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_SINGLE = 0; 1132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_ALL = 1; 1142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Query tokens for QueryHandler 1162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_EVENT = 0; 1172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_CALENDARS = 1; 1182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_ATTENDEES = 2; 1192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_REMINDERS = 3; 1202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_DUPLICATE_CALENDARS = 4; 1212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] EVENT_PROJECTION = new String[] { 1232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._ID, // 0 do not remove; used in DeleteEventHelper 1242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.TITLE, // 1 do not remove; used in DeleteEventHelper 1252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.RRULE, // 2 do not remove; used in DeleteEventHelper 1262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ALL_DAY, // 3 do not remove; used in DeleteEventHelper 1272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.CALENDAR_ID, // 4 do not remove; used in DeleteEventHelper 1282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DTSTART, // 5 do not remove; used in DeleteEventHelper 1292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._SYNC_ID, // 6 do not remove; used in DeleteEventHelper 1302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_TIMEZONE, // 7 do not remove; used in DeleteEventHelper 1312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DESCRIPTION, // 8 1322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_LOCATION, // 9 1332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.HAS_ALARM, // 10 1342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.ACCESS_LEVEL, // 11 1352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.COLOR, // 12 1362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.HAS_ATTENDEE_DATA, // 13 1372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.GUESTS_CAN_MODIFY, // 14 1382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO Events.GUESTS_CAN_INVITE_OTHERS has not been implemented in calendar provider 1392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.GUESTS_CAN_INVITE_OTHERS, // 15 1402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ORGANIZER, // 16 1412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ORIGINAL_EVENT // 17 do not remove; used in DeleteEventHelper 1422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ID = 0; 1442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_TITLE = 1; 1452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_RRULE = 2; 1462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ALL_DAY = 3; 1472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_CALENDAR_ID = 4; 1482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_SYNC_ID = 6; 1492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_TIMEZONE = 7; 1502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_DESCRIPTION = 8; 1512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_LOCATION = 9; 1522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_HAS_ALARM = 10; 1532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ACCESS_LEVEL = 11; 1542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_COLOR = 12; 1552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_HAS_ATTENDEE_DATA = 13; 1562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_GUESTS_CAN_MODIFY = 14; 1572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_CAN_INVITE_OTHERS = 15; 1582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ORGANIZER = 16; 1592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] ATTENDEES_PROJECTION = new String[] { 1612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees._ID, // 0 1622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_NAME, // 1 1632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_EMAIL, // 2 1642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_RELATIONSHIP, // 3 1652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_STATUS, // 4 1662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_ID = 0; 1682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_NAME = 1; 1692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_EMAIL = 2; 1702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_RELATIONSHIP = 3; 1712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_STATUS = 4; 1722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?"; 1742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_SORT_ORDER = Attendees.ATTENDEE_NAME + " ASC, " 1762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang + Attendees.ATTENDEE_EMAIL + " ASC"; 1772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String[] CALENDARS_PROJECTION = new String[] { 1792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars._ID, // 0 1802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.DISPLAY_NAME, // 1 1812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.OWNER_ACCOUNT, // 2 1822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.ORGANIZER_CAN_RESPOND // 3 1832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_DISPLAY_NAME = 1; 1852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2; 1862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_CAN_RESPOND = 3; 1872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String CALENDARS_WHERE = Calendars._ID + "=?"; 1892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String CALENDARS_DUPLICATE_NAME_WHERE = Calendars.DISPLAY_NAME + "=?"; 1902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] REMINDERS_PROJECTION = new String[] { 1922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders._ID, // 0 1932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders.MINUTES, // 1 1942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int REMINDERS_INDEX_MINUTES = 1; 1962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String REMINDERS_WHERE = Reminders.EVENT_ID + "=? AND (" + 1972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders.METHOD + "=" + Reminders.METHOD_ALERT + " OR " + Reminders.METHOD + "=" + 1982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders.METHOD_DEFAULT + ")"; 1992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String REMINDERS_SORT = Reminders.MINUTES; 2002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private View mView; 2022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LinearLayout mRemindersContainer; 2032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LinearLayout mOrganizerContainer; 2042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private TextView mOrganizerView; 2052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Uri mUri; 2072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEventId; 2082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mEventCursor; 2092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mAttendeesCursor; 2102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mCalendarsCursor; 2112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mStartMillis; 2132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEndMillis; 2142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mHasAttendeeData; 2162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsOrganizer; 217d845fbe558d5229102b58cce70a1b29fe6cb6967Erik private long mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 218352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private boolean mOwnerCanRespond; 2192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private String mCalendarOwnerAccount; 2202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mCanModifyCalendar; 2212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsBusyFreeCalendar; 2222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mCanModifyEvent; 2232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mNumOfAttendees; 2242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private String mOrganizer; 2252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<Integer> mOriginalMinutes = new ArrayList<Integer>(); 2272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<LinearLayout> mReminderItems = new ArrayList<LinearLayout>(0); 2282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<Integer> mReminderValues; 2292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<String> mReminderLabels; 2302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mDefaultReminderMinutes; 2312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mOriginalHasAlarm; 2322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private EditResponseHelper mEditResponseHelper; 2342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mResponseOffset; 2362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mOriginalAttendeeResponse; 237d845fbe558d5229102b58cce70a1b29fe6cb6967Erik private int mAttendeeResponseFromIntent = EditEventHelper.ATTENDEE_NO_RESPONSE; 2382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsRepeating; 2392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsDuplicateName; 2402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Pattern mWildcardPattern = Pattern.compile("^.*$"); 2422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LayoutInflater mLayoutInflater; 2432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LinearLayout mReminderAdder; 2442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO This can be removed when the contacts content provider doesn't return duplicates 2462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mUpdateCounts; 2472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static class ViewHolder { 2482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContactBadge badge; 2492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ImageView presence; 2502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int updateCounts; 2512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 2522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private HashMap<String, ViewHolder> mViewHolders = new HashMap<String, ViewHolder>(); 2532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private PresenceQueryHandler mPresenceQueryHandler; 2542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final Uri CONTACT_DATA_WITH_PRESENCE_URI = Data.CONTENT_URI; 2562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_CONTACT_ID_INDEX = 0; 2582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_PRESENCE_INDEX = 1; 2592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_EMAIL_INDEX = 2; 2602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_PHOTO_ID_INDEX = 3; 2612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] PRESENCE_PROJECTION = new String[] { 2632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.CONTACT_ID, // 0 2642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.CONTACT_PRESENCE, // 1 2652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.DATA, // 2 2662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.PHOTO_ID, // 3 2672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 2682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mAcceptedAttendees = new ArrayList<Attendee>(); 2702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mDeclinedAttendees = new ArrayList<Attendee>(); 2712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mTentativeAttendees = new ArrayList<Attendee>(); 2722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mNoResponseAttendees = new ArrayList<Attendee>(); 2732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mColor; 2742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private QueryHandler mHandler; 2762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 277cb81189e4868769ea016253eca104e46df2f033aErik private Runnable mTZUpdater = new Runnable() { 278cb81189e4868769ea016253eca104e46df2f033aErik @Override 279cb81189e4868769ea016253eca104e46df2f033aErik public void run() { 280cb81189e4868769ea016253eca104e46df2f033aErik updateEvent(mView); 281cb81189e4868769ea016253eca104e46df2f033aErik } 282cb81189e4868769ea016253eca104e46df2f033aErik }; 283cb81189e4868769ea016253eca104e46df2f033aErik 28471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private static final int DIALOG_WIDTH = 500; // FRAG_TODO scale 285352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private static final int DIALOG_HEIGHT = 600; 28671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private boolean mIsDialog = false; 28771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mX = -1; 28871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mY = -1; 28971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 2902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private class QueryHandler extends AsyncQueryService { 2912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public QueryHandler(Context context) { 2922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super(context); 2932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 2942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 2962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 2974003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // if the activity is finishing, then close the cursor and return 2984003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang final Activity activity = getActivity(); 2994003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (activity == null || activity.isFinishing()) { 3004003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang cursor.close(); 3014003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang return; 3024003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 3034003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 3042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (token) { 3052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_EVENT: 3062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor = Utils.matrixCursorFromCursor(cursor); 3072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (initEventCursor()) { 3082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // The cursor is empty. This can happen if the event was 3092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // deleted. 3102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // FRAG_TODO we should no longer rely on Activity.finish() 3111df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity.finish(); 3122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 3132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateEvent(mView); 3152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start calendar query 3172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = Calendars.CONTENT_URI; 3182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] args = new String[] { 3192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Long.toString(mEventCursor.getLong(EVENT_INDEX_CALENDAR_ID))}; 3202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startQuery(TOKEN_QUERY_CALENDARS, null, uri, CALENDARS_PROJECTION, 3212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CALENDARS_WHERE, args, null); 3222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_CALENDARS: 3242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor = Utils.matrixCursorFromCursor(cursor); 3252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateCalendar(mView); 3264003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // FRAG_TODO fragments shouldn't set the title anymore 3272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateTitle(); 3281df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang // update the action bar since our option set might have changed 3291df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity.invalidateOptionsMenu(); 3302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 331352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (!mIsBusyFreeCalendar) { 332352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // this is used for both attendees and reminders 333352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan args = new String[] { Long.toString(mEventId) }; 334352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 335352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // start attendees query 336352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan uri = Attendees.CONTENT_URI; 337352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan startQuery(TOKEN_QUERY_ATTENDEES, null, uri, ATTENDEES_PROJECTION, 338352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan ATTENDEES_WHERE, args, ATTENDEES_SORT_ORDER); 339352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 340352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // start reminders query 341352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOriginalHasAlarm = mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) != 0; 342352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (mOriginalHasAlarm) { 343352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan uri = Reminders.CONTENT_URI; 344352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan startQuery(TOKEN_QUERY_REMINDERS, null, uri, REMINDERS_PROJECTION, 345352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan REMINDERS_WHERE, args, REMINDERS_SORT); 346352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } else { 347352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // if no reminders, hide the appropriate fields 348352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan updateRemindersVisibility(); 349352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 3502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 3512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 3522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_ATTENDEES: 3552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor = Utils.matrixCursorFromCursor(cursor); 3562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang initAttendeesCursor(mView); 3572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mView); 3582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_REMINDERS: 3602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang MatrixCursor reminderCursor = Utils.matrixCursorFromCursor(cursor); 3612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang try { 3622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // First pass: collect all the custom reminder minutes 3632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (e.g., a reminder of 8 minutes) into a global list. 3642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang while (reminderCursor.moveToNext()) { 3652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int minutes = reminderCursor.getInt(REMINDERS_INDEX_MINUTES); 3662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventViewUtils.addMinutesToList( 3671df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity, mReminderValues, mReminderLabels, minutes); 3682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Second pass: create the reminder spinners 3712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang reminderCursor.moveToPosition(-1); 3722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang while (reminderCursor.moveToNext()) { 3732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int minutes = reminderCursor.getInt(REMINDERS_INDEX_MINUTES); 3742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalMinutes.add(minutes); 3751df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang EventViewUtils.addReminder(activity, mRemindersContainer, 3762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventInfoFragment.this, mReminderItems, mReminderValues, 3772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderLabels, minutes); 3782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } finally { 3802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 3812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang reminderCursor.close(); 3822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_DUPLICATE_CALENDARS: 3852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsDuplicateName = cursor.getCount() > 1; 3862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String calendarName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 3878ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP String ownerAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 3888ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// if (mIsDuplicateName && !calendarName.equalsIgnoreCase(ownerAccount)) { 3898ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// Resources res = activity.getResources(); 3908ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// TextView ownerText = (TextView) mView.findViewById(R.id.owner); 3918ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// ownerText.setText(ownerAccount); 3928ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// ownerText.setTextColor(res.getColor(R.color.calendar_owner_text_color)); 3938ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } else { 3948ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// setVisibilityCommon(mView, R.id.owner, View.GONE); 3958ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 3962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(mView, R.id.calendar, calendarName); 3972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.close(); 4002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4044003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public EventInfoFragment() { 4054003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mUri = null; 4064003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 4074003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 4082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public EventInfoFragment(Uri uri, long startMillis, long endMillis, int attendeeResponse) { 40971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan setStyle(DialogFragment.STYLE_NO_TITLE, 0); 4102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mUri = uri; 4112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mStartMillis = startMillis; 4122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEndMillis = endMillis; 4132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeeResponseFromIntent = attendeeResponse; 4142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4164003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public EventInfoFragment(long eventId, long startMillis, long endMillis) { 4174003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang this(ContentUris.withAppendedId(Events.CONTENT_URI, eventId), 4184003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang startMillis, endMillis, EventInfoActivity.ATTENDEE_NO_RESPONSE); 4194003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = eventId; 4204003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 4214003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 42271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan @Override 42371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan public void onActivityCreated(Bundle savedInstanceState) { 42471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onActivityCreated(savedInstanceState); 42571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 42671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (savedInstanceState != null) { 42771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mIsDialog = savedInstanceState.getBoolean(BUNDLE_KEY_IS_DIALOG, false); 42871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 42971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 43071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (mIsDialog) { 43171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan applyDialogParams(); 43271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 43371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 43471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 43571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private void applyDialogParams() { 43671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Dialog dialog = getDialog(); 43771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan dialog.setCanceledOnTouchOutside(true); 43871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 43971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Window window = dialog.getWindow(); 44071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 44171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 44271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan WindowManager.LayoutParams a = window.getAttributes(); 44371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.dimAmount = .4f; 44471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 44571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.width = DIALOG_WIDTH; 446352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan a.height = DIALOG_HEIGHT; 44771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 44871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (mX != -1 || mY != -1) { 4498ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan a.x = mX - a.width - 64; // FRAG_TODO event sender should return the left edge or a rect 4508ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan a.y = mY - 64; // FRAG_TODO should set height after layout is done 45171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.gravity = Gravity.LEFT | Gravity.TOP; 45271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 45371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 45471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.setAttributes(a); 45571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 45671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 45771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan public void setDialogParams(int x, int y) { 45871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mIsDialog = true; 45971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mX = x; 46071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mY = y; 46171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 46271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 4632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is called when one of the "remove reminder" buttons is selected. 4642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onClick(View v) { 4652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang LinearLayout reminderItem = (LinearLayout) v.getParent(); 4662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang LinearLayout parent = (LinearLayout) reminderItem.getParent(); 4672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang parent.removeView(reminderItem); 4682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderItems.remove(reminderItem); 4692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 4702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { 4732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If they selected the "No response" option, then don't display the 4742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // dialog asking which events to change. 4752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (id == 0 && mResponseOffset == 0) { 4762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If this is not a repeating event, then don't display the dialog 4802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // asking which events to change. 4812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 4822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the selection is the same as the original, then don't display the 4862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // dialog asking which events to change. 4872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int index = findResponseIndexFor(mOriginalAttendeeResponse); 4882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (position == index + mResponseOffset) { 4892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event. We need to ask the user if they mean to 4932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // change just this one instance or all instances. 4942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEditResponseHelper.showDialog(mEditResponseHelper.getWhichEvents()); 4952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onNothingSelected(AdapterView<?> parent) { 4982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 5012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onAttach(Activity activity) { 5022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onAttach(activity); 5032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEditResponseHelper = new EditResponseHelper(activity); 5042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler = new QueryHandler(activity); 5052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mPresenceQueryHandler = new PresenceQueryHandler(activity, activity.getContentResolver()); 5062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 5092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public View onCreateView(LayoutInflater inflater, ViewGroup container, 5102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Bundle savedInstanceState) { 5112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mLayoutInflater = inflater; 5122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mView = inflater.inflate(R.layout.event_info_activity, null); 5132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mRemindersContainer = (LinearLayout) mView.findViewById(R.id.reminders_container); 5142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizerContainer = (LinearLayout) mView.findViewById(R.id.organizer_container); 5152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizerView = (TextView) mView.findViewById(R.id.organizer); 5162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Initialize the reminder values array. 5182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Resources r = getActivity().getResources(); 5192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] strings = r.getStringArray(R.array.reminder_minutes_values); 5202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int size = strings.length; 5212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Integer> list = new ArrayList<Integer>(size); 5222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang for (int i = 0 ; i < size ; i++) { 5232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang list.add(Integer.parseInt(strings[i])); 5242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues = list; 5262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] labels = r.getStringArray(R.array.reminder_minutes_labels); 5272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderLabels = new ArrayList<String>(Arrays.asList(labels)); 5282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5294b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa SharedPreferences prefs = GeneralPreferences.getSharedPreferences(getActivity()); 5302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String durationString = 5314b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa prefs.getString(GeneralPreferences.KEY_DEFAULT_REMINDER, "0"); 5322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDefaultReminderMinutes = Integer.parseInt(durationString); 5332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Setup the + Add Reminder Button 5352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View.OnClickListener addReminderOnClickListener = new View.OnClickListener() { 5362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onClick(View v) { 5372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang addReminder(); 5382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 5402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ImageButton reminderAddButton = (ImageButton) mView.findViewById(R.id.reminder_add); 5412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang reminderAddButton.setOnClickListener(addReminderOnClickListener); 5422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 543352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mReminderAdder = (LinearLayout) mView.findViewById(R.id.reminder_adder); 5442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5454003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (mUri == null) { 5464003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // restore event ID from bundle 5474003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = savedInstanceState.getLong(BUNDLE_KEY_EVENT_ID); 5484003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 5494003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mStartMillis = savedInstanceState.getLong(BUNDLE_KEY_START_MILLIS); 5504003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEndMillis = savedInstanceState.getLong(BUNDLE_KEY_END_MILLIS); 5514003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 5524003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 5532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start loading the data 5542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION, 5552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, null); 5562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Button b = (Button) mView.findViewById(R.id.done); 5588ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan b.setOnClickListener(new OnClickListener() { 5598ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan @Override 5608ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan public void onClick(View v) { 5618ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan EventInfoFragment.this.dismiss(); 5628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan }}); 5638ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 5642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return mView; 5652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateTitle() { 5682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Resources res = getActivity().getResources(); 5692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCanModifyCalendar && !mIsOrganizer) { 5702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title_invite)); 5712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 5722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title)); 5732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 5772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Initializes the event cursor, which is expected to point to the first 5782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * (and only) result from a query. 5792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @return true if the cursor is empty. 5802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 5812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean initEventCursor() { 5822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if ((mEventCursor == null) || (mEventCursor.getCount() == 0)) { 5832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 5842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.moveToFirst(); 5862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventId = mEventCursor.getInt(EVENT_INDEX_ID); 5872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 5882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsRepeating = (rRule != null); 5892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 5902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static class Attendee { 5932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String mName; 5942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String mEmail; 5952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendee(String name, String email) { 5972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mName = name; 5982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEmail = email; 5992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6008ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 6018ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan String getDisplayName() { 6028ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (TextUtils.isEmpty(mName)) { 6038ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan return mEmail; 6048ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } else { 6058ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan return mName; 6068ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 6078ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 6082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @SuppressWarnings("fallthrough") 6112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void initAttendeesCursor(View view) { 612d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalAttendeeResponse = EditEventHelper.ATTENDEE_NO_RESPONSE; 613d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 6142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = 0; 6152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 6162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = mAttendeesCursor.getCount(); 6172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor.moveToFirst()) { 6182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAcceptedAttendees.clear(); 6192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDeclinedAttendees.clear(); 6202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mTentativeAttendees.clear(); 6212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNoResponseAttendees.clear(); 6222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang do { 6242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 6252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String name = mAttendeesCursor.getString(ATTENDEES_INDEX_NAME); 6262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String email = mAttendeesCursor.getString(ATTENDEES_INDEX_EMAIL); 6272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor.getInt(ATTENDEES_INDEX_RELATIONSHIP) == 6292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.RELATIONSHIP_ORGANIZER) { 6302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Overwrites the one from Event table if available 6312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (name != null && name.length() > 0) { 6322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizer = name; 6332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else if (email != null && email.length() > 0) { 6342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizer = email; 6352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 638d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE && 6392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount.equalsIgnoreCase(email)) { 6402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAttendeeId = mAttendeesCursor.getInt(ATTENDEES_INDEX_ID); 6412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalAttendeeResponse = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 6422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 6432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Don't show your own status in the list because: 6442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 1) it doesn't make sense for event without other guests. 6452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 2) there's a spinner for that for events with guests. 6462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch(status) { 6472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_ACCEPTED: 6482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAcceptedAttendees.add(new Attendee(name, email)); 6492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 6502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_DECLINED: 6512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDeclinedAttendees.add(new Attendee(name, email)); 6522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 6538ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_TENTATIVE: 6542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mTentativeAttendees.add(new Attendee(name, email)); 6558ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 6568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan default: 6578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan mNoResponseAttendees.add(new Attendee(name, email)); 6582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } while (mAttendeesCursor.moveToNext()); 6612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.moveToFirst(); 6622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateAttendees(view); 6642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // only show the organizer if we're not the organizer and if 6672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // we have attendee data (might have been removed by the server 6682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // for events with a lot of attendees). 6698ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP if (!mIsOrganizer && mHasAttendeeData) { 6708ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// mOrganizerContainer.setVisibility(View.VISIBLE); 6718ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// mOrganizerView.setText(mOrganizer); 6728ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } else { 6738ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// mOrganizerContainer.setVisibility(View.GONE); 6748ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 6752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 6784003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public void onSaveInstanceState(Bundle outState) { 6794003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang super.onSaveInstanceState(outState); 6804003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_EVENT_ID, mEventId); 6814003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_START_MILLIS, mStartMillis); 6824003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_END_MILLIS, mEndMillis); 68371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 68471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan outState.putBoolean(BUNDLE_KEY_IS_DIALOG, mIsDialog); 6854003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 6864003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 6874003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 6884003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang @Override 6894003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public void onDestroyView() { 6902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Integer> reminderMinutes = EventViewUtils.reminderItemsToMinutes(mReminderItems, 6912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues); 6922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3); 6932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean changed = EditEventHelper.saveReminders(ops, mEventId, reminderMinutes, 6942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalMinutes, false /* no force save */); 6952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startBatch(mHandler.getNextToken(), null, 6962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.CONTENT_URI.getAuthority(), ops, Utils.UNDO_DELAY); 6972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Update the "hasAlarm" field for the event 6992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 7002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int len = reminderMinutes.size(); 7012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean hasAlarm = len > 0; 7022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (hasAlarm != mOriginalHasAlarm) { 7032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 7042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0); 7052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startUpdate(mHandler.getNextToken(), null, uri, values, 7062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, Utils.UNDO_DELAY); 7072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang changed |= saveResponse(); 7102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (changed) { 7112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Toast.makeText(getActivity(), R.string.saving_event, Toast.LENGTH_SHORT).show(); 7122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7134003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang super.onDestroyView(); 7142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 7172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onDestroy() { 7182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor != null) { 7192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.close(); 7202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null) { 7222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.close(); 7232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 7252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.close(); 7262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 72771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onDestroy(); 7282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean canAddReminders() { 7312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return !mIsBusyFreeCalendar && mReminderItems.size() < MAX_REMINDERS; 7322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void addReminder() { 7352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO: when adding a new reminder, make it different from the 7362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // last one in the list (if any). 7372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mDefaultReminderMinutes == 0) { 7382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventViewUtils.addReminder(getActivity(), mRemindersContainer, this, mReminderItems, 7392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues, mReminderLabels, 10 /* minutes */); 7402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 7412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventViewUtils.addReminder(getActivity(), mRemindersContainer, this, mReminderItems, 7422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues, mReminderLabels, mDefaultReminderMinutes); 7432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 7452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateRemindersVisibility() { 748352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (mIsBusyFreeCalendar) { 749352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mRemindersContainer.setVisibility(View.GONE); 750352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } else { 751352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mRemindersContainer.setVisibility(View.VISIBLE); 752352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mReminderAdder.setVisibility(canAddReminders() ? View.VISIBLE : View.GONE); 753352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 7542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 7572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Asynchronously saves the response to an invitation if the user changed 7582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * the response. Returns true if the database will be updated. 7592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 7602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @param cr the ContentResolver 7612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @return true if the database will be changed 7622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 7632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean saveResponse() { 7642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor == null || mEventCursor == null) { 7652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 7662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Spinner spinner = (Spinner) getView().findViewById(R.id.response_value); 7682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int position = spinner.getSelectedItemPosition() - mResponseOffset; 7692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (position <= 0) { 7702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 7712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 773d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int status = EditEventHelper.ATTENDEE_VALUES[position]; 7742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the status has not changed, then don't update the database 7762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (status == mOriginalAttendeeResponse) { 7772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 7782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If we never got an owner attendee id we can't set the status 781d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE) { 7822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 7832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 7862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a non-repeating event 7872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 7882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 7892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event 7922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int whichEvents = mEditResponseHelper.getWhichEvents(); 7932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (whichEvents) { 7942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case -1: 7952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 7962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_SINGLE: 7972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang createExceptionResponse(mEventId, mCalendarOwnerAttendeeId, status); 7982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 7992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_ALL: 8002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 8012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 8022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang default: 8032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "Unexpected choice for updating invitation response"); 8042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 8052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateResponse(long eventId, long attendeeId, int status) { 8102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Update the attendee status in the attendees table. the provider 8112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // takes care of updating the self attendance status. 8122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 8132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(mCalendarOwnerAccount)) { 8152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_EMAIL, mCalendarOwnerAccount); 8162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_STATUS, status); 8182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.EVENT_ID, eventId); 8192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = ContentUris.withAppendedId(Attendees.CONTENT_URI, attendeeId); 8212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startUpdate(mHandler.getNextToken(), null, uri, values, 8232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, Utils.UNDO_DELAY); 8242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void createExceptionResponse(long eventId, long attendeeId, 8272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status) { 8282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor == null || !mEventCursor.moveToFirst()) { 8292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 8302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 8332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String title = mEventCursor.getString(EVENT_INDEX_TITLE); 8352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String timezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE); 8362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int calendarId = mEventCursor.getInt(EVENT_INDEX_CALENDAR_ID); 8372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0; 8382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String syncId = mEventCursor.getString(EVENT_INDEX_SYNC_ID); 8392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.TITLE, title); 8412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.EVENT_TIMEZONE, timezone); 8422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ALL_DAY, allDay ? 1 : 0); 8432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.CALENDAR_ID, calendarId); 8442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.DTSTART, mStartMillis); 8452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.DTEND, mEndMillis); 8462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_EVENT, syncId); 8472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_INSTANCE_TIME, mStartMillis); 8482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_ALL_DAY, allDay ? 1 : 0); 8492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.STATUS, Events.STATUS_CONFIRMED); 8502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.SELF_ATTENDEE_STATUS, status); 8512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Create a recurrence exception 8532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startInsert(mHandler.getNextToken(), null, 8542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.CONTENT_URI, values, Utils.UNDO_DELAY); 8552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int findResponseIndexFor(int response) { 858d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int size = EditEventHelper.ATTENDEE_VALUES.length; 8592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang for (int index = 0; index < size; index++) { 860d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (EditEventHelper.ATTENDEE_VALUES[index] == response) { 8612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return index; 8622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return 0; 8652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void doEdit() { 8682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CalendarController.getInstance(getActivity()).sendEventRelatedEvent( 8692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang this, EventType.EDIT_EVENT, mEventId, mStartMillis, mEndMillis, 0, 0); 8702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void doDelete() { 8734003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang CalendarController.getInstance(getActivity()).sendEventRelatedEvent( 8744003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang this, EventType.DELETE_EVENT, mEventId, mStartMillis, mEndMillis, 0, 0); 8752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateEvent(View view) { 8782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor == null) { 8792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 8802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventName = mEventCursor.getString(EVENT_INDEX_TITLE); 8832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventName == null || eventName.length() == 0) { 8842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventName = getActivity().getString(R.string.no_title_label); 8852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0; 8882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String location = mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION); 8892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String description = mEventCursor.getString(EVENT_INDEX_DESCRIPTION); 8902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 8912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean hasAlarm = mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) != 0; 8922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventTimezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE); 8932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mColor = mEventCursor.getInt(EVENT_INDEX_COLOR) & 0xbbffffff; 8942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8958ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan view.findViewById(R.id.color).setBackgroundColor(mColor); 8962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView title = (TextView) view.findViewById(R.id.title); 8982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang title.setTextColor(mColor); 8992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9008ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// View divider = view.findViewById(R.id.divider); 9018ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// divider.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN); 9022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // What 9042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventName != null) { 9052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.title, eventName); 9062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // When 9092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String when; 9102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int flags; 9112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (allDay) { 9122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang flags = DateUtils.FORMAT_UTC | DateUtils.FORMAT_SHOW_WEEKDAY 9132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang | DateUtils.FORMAT_SHOW_DATE; 9142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 9152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang flags = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE; 9162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (DateFormat.is24HourFormat(getActivity())) { 9172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang flags |= DateUtils.FORMAT_24HOUR; 9182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 920cb81189e4868769ea016253eca104e46df2f033aErik when = Utils.formatDateRange(getActivity(), mStartMillis, mEndMillis, flags); 9212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.when, when); 9222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9238ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP // Show the event timezone if it is different from the local timezone 9248ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// Time time = new Time(); 9258ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// String localTimezone = time.timezone; 9268ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// if (allDay) { 9278ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// localTimezone = Time.TIMEZONE_UTC; 9288ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 9298ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// if (eventTimezone != null && !localTimezone.equals(eventTimezone) && !allDay) { 9308ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// String displayName; 9318ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// TimeZone tz = TimeZone.getTimeZone(localTimezone); 9328ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// if (tz == null || tz.getID().equals("GMT")) { 9338ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// displayName = localTimezone; 9348ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } else { 9358ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// displayName = tz.getDisplayName(); 9368ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 9378ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// 9388ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// setTextCommon(view, R.id.timezone, displayName); 9398ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// setVisibilityCommon(view, R.id.timezone_container, View.VISIBLE); 9408ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } else { 9418ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// setVisibilityCommon(view, R.id.timezone_container, View.GONE); 9428ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 9432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Repeat 9452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (rRule != null) { 9462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventRecurrence eventRecurrence = new EventRecurrence(); 9472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventRecurrence.parse(rRule); 948cb81189e4868769ea016253eca104e46df2f033aErik Time date = new Time(Utils.getTimeZone(getActivity(), mTZUpdater)); 9492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (allDay) { 9502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang date.timezone = Time.TIMEZONE_UTC; 9512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang date.set(mStartMillis); 9532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventRecurrence.setStartDate(date); 9542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String repeatString = EventRecurrenceFormatter.getRepeatString( 9552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().getResources(), eventRecurrence); 9562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.repeat, repeatString); 9579c1989989b8f633210ef1761b0e4e7ecd5b43581Mason Tang setVisibilityCommon(view, R.id.repeat_container, View.VISIBLE); 9582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 9592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.repeat_container, View.GONE); 9602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Where 9632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (location == null || location.length() == 0) { 9642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.where, View.GONE); 9652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 9662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final TextView textView = (TextView) view.findViewById(R.id.where); 9672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView != null) { 9682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setAutoLinkMask(0); 9692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setText(location); 9702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Linkify.addLinks(textView, mWildcardPattern, "geo:0,0?q="); 9712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setOnTouchListener(new OnTouchListener() { 9722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public boolean onTouch(View v, MotionEvent event) { 9732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang try { 9742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return v.onTouchEvent(event); 9752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } catch (ActivityNotFoundException e) { 9762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // ignore 9772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 9782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }); 9812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Description 985352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (description != null && description.length() != 0) { 9862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.description, description); 9872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateCalendar(View view) { 9912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = ""; 9922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null && mEventCursor != null) { 9932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.moveToFirst(); 9942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String tempAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 9952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = (tempAccount == null) ? "" : tempAccount; 996352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOwnerCanRespond = mCalendarsCursor.getInt(CALENDARS_INDEX_OWNER_CAN_RESPOND) != 0; 9972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String displayName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 9992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start duplicate calendars query 10012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startQuery(TOKEN_QUERY_DUPLICATE_CALENDARS, null, Calendars.CONTENT_URI, 10022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CALENDARS_PROJECTION, CALENDARS_DUPLICATE_NAME_WHERE, 10032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang new String[] {displayName}, null); 10042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventOrganizer = mEventCursor.getString(EVENT_INDEX_ORGANIZER); 10062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsOrganizer = mCalendarOwnerAccount.equalsIgnoreCase(eventOrganizer); 10072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHasAttendeeData = mEventCursor.getInt(EVENT_INDEX_HAS_ATTENDEE_DATA) != 0; 10082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizer = eventOrganizer; 10092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCanModifyCalendar = 10102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) >= Calendars.CONTRIBUTOR_ACCESS; 10112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsBusyFreeCalendar = 10122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) == Calendars.FREEBUSY_ACCESS; 10132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCanModifyEvent = mCanModifyCalendar 10142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang && (mIsOrganizer || (mEventCursor.getInt(EVENT_INDEX_GUESTS_CAN_MODIFY) != 0)); 1015352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 1016352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (!mIsBusyFreeCalendar) { 10178ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Button b = (Button) mView.findViewById(R.id.edit); 1018352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan b.setEnabled(true); 10198ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan b.setOnClickListener(new OnClickListener() { 10208ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan @Override 10218ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan public void onClick(View v) { 10228ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan doEdit(); 10238ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan EventInfoFragment.this.dismiss(); 1024352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 1025352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan }); 10268ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 10272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 10288ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP setVisibilityCommon(view, R.id.calendar_container, View.GONE); 10292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateAttendees(View view) { 10338ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan TextView tv = (TextView) view.findViewById(R.id.attendee_list); 10348ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan SpannableStringBuilder sb = new SpannableStringBuilder(); 10358ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan formatAttendees(mAcceptedAttendees, sb, Attendees.ATTENDEE_STATUS_ACCEPTED); 10368ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan formatAttendees(mDeclinedAttendees, sb, Attendees.ATTENDEE_STATUS_DECLINED); 10378ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan formatAttendees(mTentativeAttendees, sb, Attendees.ATTENDEE_STATUS_TENTATIVE); 10388ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan formatAttendees(mNoResponseAttendees, sb, Attendees.ATTENDEE_STATUS_NONE); 10398ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan tv.setText(sb); 10408ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 10418ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP LinearLayout attendeesLayout = (LinearLayout) view.findViewById(R.id.attendee_list); 10428ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// attendeesLayout.removeAllViewsInLayout(); 10438ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// ++mUpdateCounts; 10448ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// if(mAcceptedAttendees.size() == 0 && mDeclinedAttendees.size() == 0 && 10458ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// mTentativeAttendees.size() == mNoResponseAttendees.size()) { 10468ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// // If all guests have no response just list them as guests, 10478ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// CharSequence guestsLabel = 10488ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// getActivity().getResources().getText(R.string.attendees_label); 10498ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// addAttendeesToLayout(mNoResponseAttendees, attendeesLayout, guestsLabel); 10508ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } else { 10518ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// // If we have any responses then divide them up by response 10528ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// CharSequence[] entries; 10538ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// entries = getActivity().getResources().getTextArray(R.array.response_labels2); 10548ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// addAttendeesToLayout(mAcceptedAttendees, attendeesLayout, entries[0]); 10558ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// addAttendeesToLayout(mDeclinedAttendees, attendeesLayout, entries[2]); 10568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// addAttendeesToLayout(mTentativeAttendees, attendeesLayout, entries[1]); 10578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 10588ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 10598ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 10608ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan private void formatAttendees(ArrayList<Attendee> attendees, SpannableStringBuilder sb, int type) { 10618ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (attendees.size() <= 0) { 10628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan return; 10638ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 10648ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 10658ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan int begin = sb.length(); 10668ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan boolean firstTime = sb.length() == 0; 10678ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 10688ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (firstTime == false) { 10698ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan begin += 2; // skip over the ", " for formatting. 10708ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 10718ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 10728ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan for (Attendee attendee : attendees) { 10738ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (firstTime) { 10748ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan firstTime = false; 10758ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } else { 10768ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.append(", "); 10778ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 10788ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 10798ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan String name = attendee.getDisplayName(); 10808ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.append(name); 10818ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 10828ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 10838ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan switch (type) { 10848ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_ACCEPTED: 10858ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 10868ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_DECLINED: 10878ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.setSpan(new StrikethroughSpan(), begin, sb.length(), 10888ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 10898ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // fall through 10908ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan default: 10918ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // The last INCLUSIVE causes the foreground color to be applied 10928ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // to the rest of the span. If not, the comma at the end of the 10938ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // declined or tentative may be black. 10948ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.setSpan(new ForegroundColorSpan(0xFF888888), begin, sb.length(), 10958ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 10968ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 10972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void addAttendeesToLayout(ArrayList<Attendee> attendees, LinearLayout attendeeList, 11012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CharSequence sectionTitle) { 11022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (attendees.size() == 0) { 11032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 11042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Yes/No/Maybe Title 11072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View titleView = mLayoutInflater.inflate(R.layout.contact_item, null); 11082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang titleView.findViewById(R.id.badge).setVisibility(View.GONE); 11092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View divider = titleView.findViewById(R.id.separator); 11102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang divider.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN); 11112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView title = (TextView) titleView.findViewById(R.id.name); 11132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang title.setText(getActivity().getString(R.string.response_label, sectionTitle, 11142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang attendees.size())); 11152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang title.setTextAppearance(getActivity(), R.style.TextAppearance_EventInfo_Label); 11162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang attendeeList.addView(titleView); 11172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Attendees 11192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int numOfAttendees = attendees.size(); 11202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang StringBuilder selection = new StringBuilder(Email.DATA + " IN ("); 11212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] selectionArgs = new String[numOfAttendees]; 11222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang for (int i = 0; i < numOfAttendees; ++i) { 11242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendee attendee = attendees.get(i); 11252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selectionArgs[i] = attendee.mEmail; 11262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View v = mLayoutInflater.inflate(R.layout.contact_item, null); 11282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang v.setTag(attendee); 11292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View separator = v.findViewById(R.id.separator); 11312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang separator.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN); 11322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Text 11342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView tv = (TextView) v.findViewById(R.id.name); 11352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String name = attendee.mName; 11362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (name == null || name.length() == 0) { 11372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang name = attendee.mEmail; 11382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang tv.setText(name); 11402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ViewHolder vh = new ViewHolder(); 11422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.badge = (QuickContactBadge) v.findViewById(R.id.badge); 11432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.badge.assignContactFromEmail(attendee.mEmail, true); 11442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.presence = (ImageView) v.findViewById(R.id.presence); 11452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mViewHolders.put(attendee.mEmail, vh); 11462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (i == 0) { 11482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selection.append('?'); 11492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 11502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selection.append(", ?"); 11512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang attendeeList.addView(v); 11542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selection.append(')'); 11562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mPresenceQueryHandler.startQuery(mUpdateCounts, attendees, CONTACT_DATA_WITH_PRESENCE_URI, 11582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang PRESENCE_PROJECTION, selection.toString(), selectionArgs, null); 11592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private class PresenceQueryHandler extends AsyncQueryHandler { 11622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Context mContext; 11632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public PresenceQueryHandler(Context context, ContentResolver cr) { 11652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super(cr); 11662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mContext = context; 11672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 11702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang protected void onQueryComplete(int queryIndex, Object cookie, Cursor cursor) { 11712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (cursor == null) { 11722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (DEBUG) { 11732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "onQueryComplete: cursor == null"); 11742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 11762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang try { 11792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.moveToPosition(-1); 11802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang while (cursor.moveToNext()) { 11812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String email = cursor.getString(PRESENCE_PROJECTION_EMAIL_INDEX); 11822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int contactId = cursor.getInt(PRESENCE_PROJECTION_CONTACT_ID_INDEX); 11832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ViewHolder vh = mViewHolders.get(email); 11842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int photoId = cursor.getInt(PRESENCE_PROJECTION_PHOTO_ID_INDEX); 11852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (DEBUG) { 11862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "onQueryComplete Id: " + contactId + " PhotoId: " + photoId 11872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang + " Email: " + email); 11882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (vh == null) { 11902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang continue; 11912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ImageView presenceView = vh.presence; 11932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (presenceView != null) { 11942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status = cursor.getInt(PRESENCE_PROJECTION_PRESENCE_INDEX); 11952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang presenceView.setImageResource(Presence.getPresenceIconResourceId(status)); 11962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang presenceView.setVisibility(View.VISIBLE); 11972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (photoId > 0 && vh.updateCounts < queryIndex) { 12002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.updateCounts = queryIndex; 12012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri personUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 12022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang contactId); 12032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO, modify to batch queries together 12052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContactsAsyncHelper.updateImageViewWithContactPhotoAsync(mContext, 12062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.badge, personUri, R.drawable.ic_contact_picture); 12072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } finally { 12102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.close(); 12112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang void updateResponse(View view) { 12162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // we only let the user accept/reject/etc. a meeting if: 12172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // a) you can edit the event's containing calendar AND 12182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // b) you're not the organizer and only attendee AND 12192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // c) organizerCanRespond is enabled for the calendar 12202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (if the attendee data has been hidden, the visible number of attendees 12212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // will be 1 -- the calendar owner's). 12222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (there are more cases involved to be 100% accurate, such as 12232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // paying attention to whether or not an attendee status was 12242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // included in the feed, but we're currently omitting those corner cases 12252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // for simplicity). 1226352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 1227352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // TODO Switch to EditEventHelper.canRespond when this class uses CalendarEventModel. 1228352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 1229d785cd533f6a3c23813c15315aed74efa9a116f5Michael Chan if (!mCanModifyCalendar || (mHasAttendeeData && mIsOrganizer && mNumOfAttendees <= 1) || 1230352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan (mIsOrganizer && !mOwnerCanRespond)) { 12312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.GONE); 12322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.VISIBLE); 12362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Spinner spinner = (Spinner) view.findViewById(R.id.response_value); 12382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mResponseOffset = 0; 12402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /* If the user has previously responded to this event 12422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * we should not allow them to select no response again. 12432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Switch the entries to a set of entries without the 12442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * no response option. 12452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 12462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if ((mOriginalAttendeeResponse != Attendees.ATTENDEE_STATUS_INVITED) 1247d845fbe558d5229102b58cce70a1b29fe6cb6967Erik && (mOriginalAttendeeResponse != EditEventHelper.ATTENDEE_NO_RESPONSE) 12482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang && (mOriginalAttendeeResponse != Attendees.ATTENDEE_STATUS_NONE)) { 12492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CharSequence[] entries; 12502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang entries = getActivity().getResources().getTextArray(R.array.response_labels2); 12512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mResponseOffset = -1; 12522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayAdapter<CharSequence> adapter = 12532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang new ArrayAdapter<CharSequence>(getActivity(), 12542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang android.R.layout.simple_spinner_item, entries); 12552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 12562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang spinner.setAdapter(adapter); 12572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int index; 1260d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mAttendeeResponseFromIntent != EditEventHelper.ATTENDEE_NO_RESPONSE) { 12612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang index = findResponseIndexFor(mAttendeeResponseFromIntent); 12622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 12632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang index = findResponseIndexFor(mOriginalAttendeeResponse); 12642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang spinner.setSelection(index + mResponseOffset); 12662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang spinner.setOnItemSelectedListener(this); 12672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setTextCommon(View view, int id, CharSequence text) { 12702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView textView = (TextView) view.findViewById(id); 12712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView == null) 12722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setText(text); 12742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setVisibilityCommon(View view, int id, int visibility) { 12772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View v = view.findViewById(id); 12782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (v != null) { 12792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang v.setVisibility(visibility); 12802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 12852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Taken from com.google.android.gm.HtmlConversationActivity 12862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 12872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Send the intent that shows the Contact info corresponding to the email address. 12882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 12892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void showContactInfo(Attendee attendee, Rect rect) { 12902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // First perform lookup query to find existing contact 12912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final ContentResolver resolver = getActivity().getContentResolver(); 12922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String address = attendee.mEmail; 12932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri dataUri = Uri.withAppendedPath(CommonDataKinds.Email.CONTENT_FILTER_URI, 12942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri.encode(address)); 12952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri lookupUri = ContactsContract.Data.getContactLookupUri(resolver, dataUri); 12962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (lookupUri != null) { 12982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Found matching contact, trigger QuickContact 12992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.showQuickContact(getActivity(), rect, lookupUri, 13002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.MODE_MEDIUM, null); 13012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 13022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // No matching contact, ask user to create one 13032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri mailUri = Uri.fromParts("mailto", address, null); 13042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, mailUri); 13052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Pass along full E-mail string for possible create dialog 13072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Rfc822Token sender = new Rfc822Token(attendee.mName, attendee.mEmail, null); 13082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.EXTRA_CREATE_DESCRIPTION, sender.toString()); 13092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Only provide personal name hint if we have one 13112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String senderPersonal = attendee.mName; 13122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(senderPersonal)) { 13132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.Insert.NAME, senderPersonal); 13142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startActivity(intent); 13172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 1319cb81189e4868769ea016253eca104e46df2f033aErik 1320cb81189e4868769ea016253eca104e46df2f033aErik @Override 1321cb81189e4868769ea016253eca104e46df2f033aErik public void eventsChanged() { 1322cb81189e4868769ea016253eca104e46df2f033aErik } 1323cb81189e4868769ea016253eca104e46df2f033aErik 1324cb81189e4868769ea016253eca104e46df2f033aErik @Override 1325cb81189e4868769ea016253eca104e46df2f033aErik public boolean getAllDay() { 1326cb81189e4868769ea016253eca104e46df2f033aErik return false; 1327cb81189e4868769ea016253eca104e46df2f033aErik } 1328cb81189e4868769ea016253eca104e46df2f033aErik 1329cb81189e4868769ea016253eca104e46df2f033aErik @Override 1330cb81189e4868769ea016253eca104e46df2f033aErik public long getSelectedTime() { 1331cb81189e4868769ea016253eca104e46df2f033aErik return mStartMillis; 1332cb81189e4868769ea016253eca104e46df2f033aErik } 1333cb81189e4868769ea016253eca104e46df2f033aErik 1334cb81189e4868769ea016253eca104e46df2f033aErik @Override 1335cb81189e4868769ea016253eca104e46df2f033aErik public long getSupportedEventTypes() { 1336cb81189e4868769ea016253eca104e46df2f033aErik return EventType.EVENTS_CHANGED; 1337cb81189e4868769ea016253eca104e46df2f033aErik } 1338cb81189e4868769ea016253eca104e46df2f033aErik 1339cb81189e4868769ea016253eca104e46df2f033aErik @Override 1340cb81189e4868769ea016253eca104e46df2f033aErik public void goTo(Time time, boolean animate) { 1341cb81189e4868769ea016253eca104e46df2f033aErik } 1342cb81189e4868769ea016253eca104e46df2f033aErik 1343cb81189e4868769ea016253eca104e46df2f033aErik @Override 1344cb81189e4868769ea016253eca104e46df2f033aErik public void goToToday() { 1345cb81189e4868769ea016253eca104e46df2f033aErik 1346cb81189e4868769ea016253eca104e46df2f033aErik } 1347cb81189e4868769ea016253eca104e46df2f033aErik 1348cb81189e4868769ea016253eca104e46df2f033aErik @Override 1349cb81189e4868769ea016253eca104e46df2f033aErik public void handleEvent(EventInfo event) { 1350cb81189e4868769ea016253eca104e46df2f033aErik if (event.eventType == EventType.EVENTS_CHANGED) { 1351cb81189e4868769ea016253eca104e46df2f033aErik // reload the data 1352cb81189e4868769ea016253eca104e46df2f033aErik mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION, 1353cb81189e4868769ea016253eca104e46df2f033aErik null, null, null); 1354cb81189e4868769ea016253eca104e46df2f033aErik } 1355cb81189e4868769ea016253eca104e46df2f033aErik 1356cb81189e4868769ea016253eca104e46df2f033aErik } 13572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang} 1358