EventInfoFragment.java revision d785cd533f6a3c23813c15315aed74efa9a116f5
12bebde787f9490408ceaf14166de4b016a10daf1Mason Tang/* 22bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Copyright (C) 2010 The Android Open Source Project 32bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 42bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Licensed under the Apache License, Version 2.0 (the "License"); 52bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * you may not use this file except in compliance with the License. 62bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * You may obtain a copy of the License at 72bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 82bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * http://www.apache.org/licenses/LICENSE-2.0 92bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Unless required by applicable law or agreed to in writing, software 112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * distributed under the License is distributed on an "AS IS" BASIS, 122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * See the License for the specific language governing permissions and 142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * limitations under the License. 152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 172bebde787f9490408ceaf14166de4b016a10daf1Mason Tangpackage com.android.calendar; 182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 192bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport com.android.calendar.CalendarController.EventType; 20fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.event.EditEventHelper; 21fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.event.EventViewUtils; 222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 232bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.app.Activity; 2471d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.Dialog; 2571d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.DialogFragment; 262bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ActivityNotFoundException; 272bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.AsyncQueryHandler; 282bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentProviderOperation; 292bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentResolver; 302bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentUris; 312bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentValues; 322bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Context; 332bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Intent; 342bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.SharedPreferences; 352bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.res.Resources; 362bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.Cursor; 372bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.MatrixCursor; 382bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.PorterDuff; 392bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.Rect; 402bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.net.Uri; 412bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.os.Bundle; 422bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.pim.EventRecurrence; 438ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.provider.ContactsContract; 442bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Attendees; 452bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Calendars; 462bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Events; 472bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Reminders; 482bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.CommonDataKinds; 492bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Contacts; 502bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Data; 512bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Intents; 522bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Presence; 532bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.QuickContact; 548ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.provider.ContactsContract.CommonDataKinds.Email; 558ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.Spannable; 568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.SpannableStringBuilder; 572bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.TextUtils; 582bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateFormat; 592bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateUtils; 602bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.Time; 618ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.ForegroundColorSpan; 628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.StrikethroughSpan; 632bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Linkify; 642bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Rfc822Token; 652bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.util.Log; 6671d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Gravity; 672bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.LayoutInflater; 682bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.Menu; 692bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MenuInflater; 702bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MenuItem; 712bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MotionEvent; 722bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.View; 732bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.ViewGroup; 7471d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Window; 7571d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.WindowManager; 768ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.view.View.OnClickListener; 778ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.view.View.OnTouchListener; 782bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.AdapterView; 792bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ArrayAdapter; 808ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.widget.Button; 812bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ImageButton; 822bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ImageView; 832bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.LinearLayout; 842bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.QuickContactBadge; 852bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Spinner; 862bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.TextView; 872bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Toast; 882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 892bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.ArrayList; 902bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.Arrays; 912bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.HashMap; 922bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.regex.Pattern; 932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9471d08836af4cf5fc45d340b1883044a9f8290232Michael Chanpublic class EventInfoFragment extends DialogFragment implements View.OnClickListener, 952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang AdapterView.OnItemSelectedListener { 96d845fbe558d5229102b58cce70a1b29fe6cb6967Erik public static final boolean DEBUG = false; 972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public static final String TAG = "EventInfoActivity"; 992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1004003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang private static final String BUNDLE_KEY_EVENT_ID = "key_event_id"; 1014003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 1024003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang private static final String BUNDLE_KEY_START_MILLIS = "key_start_millis"; 1034003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 1044003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang private static final String BUNDLE_KEY_END_MILLIS = "key_end_millis"; 1054003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 10671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private static final String BUNDLE_KEY_IS_DIALOG = "key_fragment_is_dialog"; 10771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 1082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MAX_REMINDERS = 5; 1092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 1112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * These are the corresponding indices into the array of strings 1122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * "R.array.change_response_labels" in the resource file. 1132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 1142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_SINGLE = 0; 1152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_ALL = 1; 1162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Query tokens for QueryHandler 1182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_EVENT = 0; 1192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_CALENDARS = 1; 1202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_ATTENDEES = 2; 1212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_REMINDERS = 3; 1222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int TOKEN_QUERY_DUPLICATE_CALENDARS = 4; 1232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] EVENT_PROJECTION = new String[] { 1252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._ID, // 0 do not remove; used in DeleteEventHelper 1262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.TITLE, // 1 do not remove; used in DeleteEventHelper 1272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.RRULE, // 2 do not remove; used in DeleteEventHelper 1282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ALL_DAY, // 3 do not remove; used in DeleteEventHelper 1292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.CALENDAR_ID, // 4 do not remove; used in DeleteEventHelper 1302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DTSTART, // 5 do not remove; used in DeleteEventHelper 1312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._SYNC_ID, // 6 do not remove; used in DeleteEventHelper 1322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_TIMEZONE, // 7 do not remove; used in DeleteEventHelper 1332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DESCRIPTION, // 8 1342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_LOCATION, // 9 1352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.HAS_ALARM, // 10 1362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.ACCESS_LEVEL, // 11 1372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.COLOR, // 12 1382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.HAS_ATTENDEE_DATA, // 13 1392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.GUESTS_CAN_MODIFY, // 14 1402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO Events.GUESTS_CAN_INVITE_OTHERS has not been implemented in calendar provider 1412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.GUESTS_CAN_INVITE_OTHERS, // 15 1422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ORGANIZER, // 16 1432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ORIGINAL_EVENT // 17 do not remove; used in DeleteEventHelper 1442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ID = 0; 1462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_TITLE = 1; 1472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_RRULE = 2; 1482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ALL_DAY = 3; 1492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_CALENDAR_ID = 4; 1502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_SYNC_ID = 6; 1512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_TIMEZONE = 7; 1522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_DESCRIPTION = 8; 1532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_LOCATION = 9; 1542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_HAS_ALARM = 10; 1552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ACCESS_LEVEL = 11; 1562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_COLOR = 12; 1572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_HAS_ATTENDEE_DATA = 13; 1582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_GUESTS_CAN_MODIFY = 14; 1592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_CAN_INVITE_OTHERS = 15; 1602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ORGANIZER = 16; 1612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] ATTENDEES_PROJECTION = new String[] { 1632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees._ID, // 0 1642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_NAME, // 1 1652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_EMAIL, // 2 1662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_RELATIONSHIP, // 3 1672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_STATUS, // 4 1682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_ID = 0; 1702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_NAME = 1; 1712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_EMAIL = 2; 1722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_RELATIONSHIP = 3; 1732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_STATUS = 4; 1742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?"; 1762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_SORT_ORDER = Attendees.ATTENDEE_NAME + " ASC, " 1782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang + Attendees.ATTENDEE_EMAIL + " ASC"; 1792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String[] CALENDARS_PROJECTION = new String[] { 1812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars._ID, // 0 1822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.DISPLAY_NAME, // 1 1832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.OWNER_ACCOUNT, // 2 1842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.ORGANIZER_CAN_RESPOND // 3 1852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_DISPLAY_NAME = 1; 1872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2; 1882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_CAN_RESPOND = 3; 1892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String CALENDARS_WHERE = Calendars._ID + "=?"; 1912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String CALENDARS_DUPLICATE_NAME_WHERE = Calendars.DISPLAY_NAME + "=?"; 1922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] REMINDERS_PROJECTION = new String[] { 1942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders._ID, // 0 1952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders.MINUTES, // 1 1962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int REMINDERS_INDEX_MINUTES = 1; 1982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String REMINDERS_WHERE = Reminders.EVENT_ID + "=? AND (" + 1992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders.METHOD + "=" + Reminders.METHOD_ALERT + " OR " + Reminders.METHOD + "=" + 2002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Reminders.METHOD_DEFAULT + ")"; 2012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String REMINDERS_SORT = Reminders.MINUTES; 2022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_GROUP_REMINDER = 1; 2042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_GROUP_EDIT = 2; 2052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_GROUP_DELETE = 3; 2062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_ADD_REMINDER = 1; 2082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_EDIT = 2; 2092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int MENU_DELETE = 3; 2102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private View mView; 2122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LinearLayout mRemindersContainer; 2132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LinearLayout mOrganizerContainer; 2142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private TextView mOrganizerView; 2152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Uri mUri; 2172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEventId; 2182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mEventCursor; 2192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mAttendeesCursor; 2202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mCalendarsCursor; 2212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mStartMillis; 2232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEndMillis; 2242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mHasAttendeeData; 2262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsOrganizer; 227d845fbe558d5229102b58cce70a1b29fe6cb6967Erik private long mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 2282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mOrganizerCanRespond; 2292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private String mCalendarOwnerAccount; 2302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mCanModifyCalendar; 2312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsBusyFreeCalendar; 2322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mCanModifyEvent; 2332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mNumOfAttendees; 2342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private String mOrganizer; 2352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<Integer> mOriginalMinutes = new ArrayList<Integer>(); 2372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<LinearLayout> mReminderItems = new ArrayList<LinearLayout>(0); 2382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<Integer> mReminderValues; 2392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private ArrayList<String> mReminderLabels; 2402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mDefaultReminderMinutes; 2412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mOriginalHasAlarm; 2422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private EditResponseHelper mEditResponseHelper; 2442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mResponseOffset; 2462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mOriginalAttendeeResponse; 247d845fbe558d5229102b58cce70a1b29fe6cb6967Erik private int mAttendeeResponseFromIntent = EditEventHelper.ATTENDEE_NO_RESPONSE; 2482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsRepeating; 2492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsDuplicateName; 2502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Pattern mWildcardPattern = Pattern.compile("^.*$"); 2522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LayoutInflater mLayoutInflater; 2532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private LinearLayout mReminderAdder; 2542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO This can be removed when the contacts content provider doesn't return duplicates 2562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mUpdateCounts; 2572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static class ViewHolder { 2582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContactBadge badge; 2592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ImageView presence; 2602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int updateCounts; 2612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 2622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private HashMap<String, ViewHolder> mViewHolders = new HashMap<String, ViewHolder>(); 2632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private PresenceQueryHandler mPresenceQueryHandler; 2642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final Uri CONTACT_DATA_WITH_PRESENCE_URI = Data.CONTENT_URI; 2662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_CONTACT_ID_INDEX = 0; 2682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_PRESENCE_INDEX = 1; 2692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_EMAIL_INDEX = 2; 2702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int PRESENCE_PROJECTION_PHOTO_ID_INDEX = 3; 2712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] PRESENCE_PROJECTION = new String[] { 2732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.CONTACT_ID, // 0 2742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.CONTACT_PRESENCE, // 1 2752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.DATA, // 2 2762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Email.PHOTO_ID, // 3 2772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 2782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mAcceptedAttendees = new ArrayList<Attendee>(); 2802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mDeclinedAttendees = new ArrayList<Attendee>(); 2812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mTentativeAttendees = new ArrayList<Attendee>(); 2822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mNoResponseAttendees = new ArrayList<Attendee>(); 2832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mColor; 2842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private QueryHandler mHandler; 2862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 28771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private static final int DIALOG_WIDTH = 500; // FRAG_TODO scale 28871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private static final int DIALOG_HEIGHT = 500; 28971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private boolean mIsDialog = false; 29071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mX = -1; 29171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mY = -1; 29271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 2932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private class QueryHandler extends AsyncQueryService { 2942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public QueryHandler(Context context) { 2952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super(context); 2962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 2972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 2992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 3004003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // if the activity is finishing, then close the cursor and return 3014003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang final Activity activity = getActivity(); 3024003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (activity == null || activity.isFinishing()) { 3034003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang cursor.close(); 3044003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang return; 3054003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 3064003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 3072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (token) { 3082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_EVENT: 3092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor = Utils.matrixCursorFromCursor(cursor); 3102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (initEventCursor()) { 3112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // The cursor is empty. This can happen if the event was 3122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // deleted. 3132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // FRAG_TODO we should no longer rely on Activity.finish() 3141df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity.finish(); 3152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 3162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateEvent(mView); 3182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start calendar query 3202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = Calendars.CONTENT_URI; 3212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] args = new String[] { 3222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Long.toString(mEventCursor.getLong(EVENT_INDEX_CALENDAR_ID))}; 3232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startQuery(TOKEN_QUERY_CALENDARS, null, uri, CALENDARS_PROJECTION, 3242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CALENDARS_WHERE, args, null); 3252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_CALENDARS: 3272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor = Utils.matrixCursorFromCursor(cursor); 3282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateCalendar(mView); 3294003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // FRAG_TODO fragments shouldn't set the title anymore 3302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateTitle(); 3311df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang // update the action bar since our option set might have changed 3321df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity.invalidateOptionsMenu(); 3332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // this is used for both attendees and reminders 3352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang args = new String[] { Long.toString(mEventId) }; 3362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start attendees query 3382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang uri = Attendees.CONTENT_URI; 3392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startQuery(TOKEN_QUERY_ATTENDEES, null, uri, ATTENDEES_PROJECTION, 3402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ATTENDEES_WHERE, args, ATTENDEES_SORT_ORDER); 3412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start reminders query 3432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalHasAlarm = mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) != 0; 3442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mOriginalHasAlarm) { 3452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang uri = Reminders.CONTENT_URI; 3462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startQuery(TOKEN_QUERY_REMINDERS, null, uri, REMINDERS_PROJECTION, 3472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang REMINDERS_WHERE, args, REMINDERS_SORT); 3482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 3492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // if no reminders, hide the appropriate fields 3502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 3512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_ATTENDEES: 3542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor = Utils.matrixCursorFromCursor(cursor); 3552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang initAttendeesCursor(mView); 3562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mView); 3572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_REMINDERS: 3592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang MatrixCursor reminderCursor = Utils.matrixCursorFromCursor(cursor); 3602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang try { 3612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // First pass: collect all the custom reminder minutes 3622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (e.g., a reminder of 8 minutes) into a global list. 3632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang while (reminderCursor.moveToNext()) { 3642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int minutes = reminderCursor.getInt(REMINDERS_INDEX_MINUTES); 3652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventViewUtils.addMinutesToList( 3661df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity, mReminderValues, mReminderLabels, minutes); 3672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Second pass: create the reminder spinners 3702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang reminderCursor.moveToPosition(-1); 3712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang while (reminderCursor.moveToNext()) { 3722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int minutes = reminderCursor.getInt(REMINDERS_INDEX_MINUTES); 3732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalMinutes.add(minutes); 3741df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang EventViewUtils.addReminder(activity, mRemindersContainer, 3752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventInfoFragment.this, mReminderItems, mReminderValues, 3762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderLabels, minutes); 3772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } finally { 3792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 3802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang reminderCursor.close(); 3812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_DUPLICATE_CALENDARS: 3842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsDuplicateName = cursor.getCount() > 1; 3852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String calendarName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 3868ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP String ownerAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 3878ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// if (mIsDuplicateName && !calendarName.equalsIgnoreCase(ownerAccount)) { 3888ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// Resources res = activity.getResources(); 3898ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// TextView ownerText = (TextView) mView.findViewById(R.id.owner); 3908ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// ownerText.setText(ownerAccount); 3918ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// ownerText.setTextColor(res.getColor(R.color.calendar_owner_text_color)); 3928ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } else { 3938ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// setVisibilityCommon(mView, R.id.owner, View.GONE); 3948ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 3952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(mView, R.id.calendar, calendarName); 3962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.close(); 3992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4034003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public EventInfoFragment() { 4044003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mUri = null; 4054003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 4064003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 4072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public EventInfoFragment(Uri uri, long startMillis, long endMillis, int attendeeResponse) { 40871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan setStyle(DialogFragment.STYLE_NO_TITLE, 0); 4092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mUri = uri; 4102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mStartMillis = startMillis; 4112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEndMillis = endMillis; 4122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeeResponseFromIntent = attendeeResponse; 4132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4154003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public EventInfoFragment(long eventId, long startMillis, long endMillis) { 4164003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang this(ContentUris.withAppendedId(Events.CONTENT_URI, eventId), 4174003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang startMillis, endMillis, EventInfoActivity.ATTENDEE_NO_RESPONSE); 4184003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = eventId; 4194003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 4204003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 42171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan @Override 42271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan public void onActivityCreated(Bundle savedInstanceState) { 42371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onActivityCreated(savedInstanceState); 42471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 42571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (savedInstanceState != null) { 42671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mIsDialog = savedInstanceState.getBoolean(BUNDLE_KEY_IS_DIALOG, false); 42771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 42871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 42971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (mIsDialog) { 43071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan applyDialogParams(); 43171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 43271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 43371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 43471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private void applyDialogParams() { 43571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Dialog dialog = getDialog(); 43671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan dialog.setCanceledOnTouchOutside(true); 43771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 43871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Window window = dialog.getWindow(); 43971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 44071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 44171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan WindowManager.LayoutParams a = window.getAttributes(); 44271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.dimAmount = .4f; 44371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 44471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.width = DIALOG_WIDTH; 44571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 44671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (mX != -1 || mY != -1) { 4478ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan a.x = mX - a.width - 64; // FRAG_TODO event sender should return the left edge or a rect 4488ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan a.y = mY - 64; // FRAG_TODO should set height after layout is done 44971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.gravity = Gravity.LEFT | Gravity.TOP; 45071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 45171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 45271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.setAttributes(a); 45371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 45471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 45571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan public void setDialogParams(int x, int y) { 45671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mIsDialog = true; 45771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mX = x; 45871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mY = y; 45971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 46071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 4612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is called when one of the "remove reminder" buttons is selected. 4622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onClick(View v) { 4632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang LinearLayout reminderItem = (LinearLayout) v.getParent(); 4642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang LinearLayout parent = (LinearLayout) reminderItem.getParent(); 4652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang parent.removeView(reminderItem); 4662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderItems.remove(reminderItem); 4672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 4682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { 4712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If they selected the "No response" option, then don't display the 4722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // dialog asking which events to change. 4732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (id == 0 && mResponseOffset == 0) { 4742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If this is not a repeating event, then don't display the dialog 4782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // asking which events to change. 4792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 4802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the selection is the same as the original, then don't display the 4842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // dialog asking which events to change. 4852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int index = findResponseIndexFor(mOriginalAttendeeResponse); 4862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (position == index + mResponseOffset) { 4872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event. We need to ask the user if they mean to 4912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // change just this one instance or all instances. 4922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEditResponseHelper.showDialog(mEditResponseHelper.getWhichEvents()); 4932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onNothingSelected(AdapterView<?> parent) { 4962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 4992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onAttach(Activity activity) { 5002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onAttach(activity); 5012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEditResponseHelper = new EditResponseHelper(activity); 5022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setHasOptionsMenu(true); 5032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler = new QueryHandler(activity); 5042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mPresenceQueryHandler = new PresenceQueryHandler(activity, activity.getContentResolver()); 5052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 5082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public View onCreateView(LayoutInflater inflater, ViewGroup container, 5092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Bundle savedInstanceState) { 5102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mLayoutInflater = inflater; 5112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mView = inflater.inflate(R.layout.event_info_activity, null); 5122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mRemindersContainer = (LinearLayout) mView.findViewById(R.id.reminders_container); 5132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizerContainer = (LinearLayout) mView.findViewById(R.id.organizer_container); 5142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizerView = (TextView) mView.findViewById(R.id.organizer); 5152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Initialize the reminder values array. 5172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Resources r = getActivity().getResources(); 5182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] strings = r.getStringArray(R.array.reminder_minutes_values); 5192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int size = strings.length; 5202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Integer> list = new ArrayList<Integer>(size); 5212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang for (int i = 0 ; i < size ; i++) { 5222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang list.add(Integer.parseInt(strings[i])); 5232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues = list; 5252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] labels = r.getStringArray(R.array.reminder_minutes_labels); 5262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderLabels = new ArrayList<String>(Arrays.asList(labels)); 5272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(getActivity()); 5292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String durationString = 5302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang prefs.getString(CalendarPreferenceActivity.KEY_DEFAULT_REMINDER, "0"); 5312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDefaultReminderMinutes = Integer.parseInt(durationString); 5322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Setup the + Add Reminder Button 5342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View.OnClickListener addReminderOnClickListener = new View.OnClickListener() { 5352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onClick(View v) { 5362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang addReminder(); 5372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 5392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ImageButton reminderAddButton = (ImageButton) mView.findViewById(R.id.reminder_add); 5402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang reminderAddButton.setOnClickListener(addReminderOnClickListener); 5412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5428ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP mReminderAdder = (LinearLayout) mView.findViewById(R.id.reminder_adder); 5432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5444003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (mUri == null) { 5454003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // restore event ID from bundle 5464003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = savedInstanceState.getLong(BUNDLE_KEY_EVENT_ID); 5474003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 5484003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mStartMillis = savedInstanceState.getLong(BUNDLE_KEY_START_MILLIS); 5494003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEndMillis = savedInstanceState.getLong(BUNDLE_KEY_END_MILLIS); 5504003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 5514003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 5522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start loading the data 5532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION, 5542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, null); 5552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Button b = (Button) mView.findViewById(R.id.done); 5578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan b.setOnClickListener(new OnClickListener() { 5588ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan @Override 5598ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan public void onClick(View v) { 5608ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan EventInfoFragment.this.dismiss(); 5618ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan }}); 5628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 5632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return mView; 5642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateTitle() { 5672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Resources res = getActivity().getResources(); 5682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCanModifyCalendar && !mIsOrganizer) { 5692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title_invite)); 5702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 5712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title)); 5722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 5762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Initializes the event cursor, which is expected to point to the first 5772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * (and only) result from a query. 5782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @return true if the cursor is empty. 5792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 5802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean initEventCursor() { 5812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if ((mEventCursor == null) || (mEventCursor.getCount() == 0)) { 5822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 5832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.moveToFirst(); 5852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventId = mEventCursor.getInt(EVENT_INDEX_ID); 5862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 5872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsRepeating = (rRule != null); 5882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 5892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static class Attendee { 5922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String mName; 5932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String mEmail; 5942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendee(String name, String email) { 5962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mName = name; 5972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEmail = email; 5982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5998ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 6008ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan String getDisplayName() { 6018ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (TextUtils.isEmpty(mName)) { 6028ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan return mEmail; 6038ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } else { 6048ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan return mName; 6058ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 6068ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 6072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @SuppressWarnings("fallthrough") 6102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void initAttendeesCursor(View view) { 611d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalAttendeeResponse = EditEventHelper.ATTENDEE_NO_RESPONSE; 612d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 6132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = 0; 6142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 6152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = mAttendeesCursor.getCount(); 6162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor.moveToFirst()) { 6172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAcceptedAttendees.clear(); 6182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDeclinedAttendees.clear(); 6192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mTentativeAttendees.clear(); 6202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNoResponseAttendees.clear(); 6212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang do { 6232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 6242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String name = mAttendeesCursor.getString(ATTENDEES_INDEX_NAME); 6252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String email = mAttendeesCursor.getString(ATTENDEES_INDEX_EMAIL); 6262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor.getInt(ATTENDEES_INDEX_RELATIONSHIP) == 6282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.RELATIONSHIP_ORGANIZER) { 6292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Overwrites the one from Event table if available 6302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (name != null && name.length() > 0) { 6312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizer = name; 6322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else if (email != null && email.length() > 0) { 6332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizer = email; 6342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 637d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE && 6382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount.equalsIgnoreCase(email)) { 6392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAttendeeId = mAttendeesCursor.getInt(ATTENDEES_INDEX_ID); 6402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalAttendeeResponse = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 6412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 6422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Don't show your own status in the list because: 6432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 1) it doesn't make sense for event without other guests. 6442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 2) there's a spinner for that for events with guests. 6452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch(status) { 6462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_ACCEPTED: 6472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAcceptedAttendees.add(new Attendee(name, email)); 6482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 6492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_DECLINED: 6502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDeclinedAttendees.add(new Attendee(name, email)); 6512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 6528ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_TENTATIVE: 6532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mTentativeAttendees.add(new Attendee(name, email)); 6548ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 6558ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan default: 6568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan mNoResponseAttendees.add(new Attendee(name, email)); 6572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } while (mAttendeesCursor.moveToNext()); 6602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.moveToFirst(); 6612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateAttendees(view); 6632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // only show the organizer if we're not the organizer and if 6662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // we have attendee data (might have been removed by the server 6672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // for events with a lot of attendees). 6688ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP if (!mIsOrganizer && mHasAttendeeData) { 6698ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// mOrganizerContainer.setVisibility(View.VISIBLE); 6708ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// mOrganizerView.setText(mOrganizer); 6718ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } else { 6728ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// mOrganizerContainer.setVisibility(View.GONE); 6738ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 6742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 6774003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public void onSaveInstanceState(Bundle outState) { 6784003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang super.onSaveInstanceState(outState); 6794003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_EVENT_ID, mEventId); 6804003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_START_MILLIS, mStartMillis); 6814003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_END_MILLIS, mEndMillis); 68271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 68371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan outState.putBoolean(BUNDLE_KEY_IS_DIALOG, mIsDialog); 6844003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 6854003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 6864003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 6874003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang @Override 6884003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public void onDestroyView() { 6892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Integer> reminderMinutes = EventViewUtils.reminderItemsToMinutes(mReminderItems, 6902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues); 6912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3); 6922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean changed = EditEventHelper.saveReminders(ops, mEventId, reminderMinutes, 6932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalMinutes, false /* no force save */); 6942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startBatch(mHandler.getNextToken(), null, 6952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.CONTENT_URI.getAuthority(), ops, Utils.UNDO_DELAY); 6962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Update the "hasAlarm" field for the event 6982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 6992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int len = reminderMinutes.size(); 7002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean hasAlarm = len > 0; 7012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (hasAlarm != mOriginalHasAlarm) { 7022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 7032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0); 7042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startUpdate(mHandler.getNextToken(), null, uri, values, 7052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, Utils.UNDO_DELAY); 7062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang changed |= saveResponse(); 7092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (changed) { 7102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Toast.makeText(getActivity(), R.string.saving_event, Toast.LENGTH_SHORT).show(); 7112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7124003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang super.onDestroyView(); 7132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 7162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onDestroy() { 7172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor != null) { 7182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.close(); 7192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null) { 7212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.close(); 7222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 7242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.close(); 7252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 72671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onDestroy(); 7272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean canAddReminders() { 7302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return !mIsBusyFreeCalendar && mReminderItems.size() < MAX_REMINDERS; 7312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void addReminder() { 7342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO: when adding a new reminder, make it different from the 7352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // last one in the list (if any). 7362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mDefaultReminderMinutes == 0) { 7372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventViewUtils.addReminder(getActivity(), mRemindersContainer, this, mReminderItems, 7382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues, mReminderLabels, 10 /* minutes */); 7392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 7402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventViewUtils.addReminder(getActivity(), mRemindersContainer, this, mReminderItems, 7412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mReminderValues, mReminderLabels, mDefaultReminderMinutes); 7422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateRemindersVisibility(); 7442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 7472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 7482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang MenuItem item; 7492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item = menu.add(MENU_GROUP_REMINDER, MENU_ADD_REMINDER, 0, 7502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang R.string.add_new_reminder); 7512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item.setIcon(R.drawable.ic_menu_reminder); 7522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item.setAlphabeticShortcut('r'); 7531df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 7542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item = menu.add(MENU_GROUP_EDIT, MENU_EDIT, 0, R.string.edit_event_label); 7562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item.setIcon(android.R.drawable.ic_menu_edit); 7572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item.setAlphabeticShortcut('e'); 7581df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 7592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item = menu.add(MENU_GROUP_DELETE, MENU_DELETE, 0, R.string.delete_event_label); 7612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang item.setIcon(android.R.drawable.ic_menu_delete); 7621df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 7632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onCreateOptionsMenu(menu, inflater); 7652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 7682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onPrepareOptionsMenu(Menu menu) { 7692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean canAddReminders = canAddReminders(); 7702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupVisible(MENU_GROUP_REMINDER, canAddReminders); 7712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupEnabled(MENU_GROUP_REMINDER, canAddReminders); 7722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupVisible(MENU_GROUP_EDIT, mCanModifyEvent); 7742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupEnabled(MENU_GROUP_EDIT, mCanModifyEvent); 7752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupVisible(MENU_GROUP_DELETE, mCanModifyCalendar); 7762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang menu.setGroupEnabled(MENU_GROUP_DELETE, mCanModifyCalendar); 7772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onPrepareOptionsMenu(menu); 7792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 7822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public boolean onOptionsItemSelected(MenuItem item) { 7832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onOptionsItemSelected(item); 7842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (item.getItemId()) { 7852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case MENU_ADD_REMINDER: 7862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang addReminder(); 7872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 7882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case MENU_EDIT: 7892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang doEdit(); 7902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 7912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case MENU_DELETE: 7922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang doDelete(); 7932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 7942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 7962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7988ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP @Override 7992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// public boolean onKeyDown(int keyCode, KeyEvent event) { 8002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// if (keyCode == KeyEvent.KEYCODE_DEL) { 8012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// doDelete(); 8022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// return true; 8032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// } 8042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// return super.onKeyDown(keyCode, event); 8052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang// } 8062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateRemindersVisibility() { 8088ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP if (mIsBusyFreeCalendar) { 8098ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// mRemindersContainer.setVisibility(View.GONE); 8108ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } else { 8118ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// mRemindersContainer.setVisibility(View.VISIBLE); 8128ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// mReminderAdder.setVisibility(canAddReminders() ? View.VISIBLE : View.GONE); 8138ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 8142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 8172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Asynchronously saves the response to an invitation if the user changed 8182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * the response. Returns true if the database will be updated. 8192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 8202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @param cr the ContentResolver 8212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @return true if the database will be changed 8222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 8232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean saveResponse() { 8242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor == null || mEventCursor == null) { 8252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Spinner spinner = (Spinner) getView().findViewById(R.id.response_value); 8282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int position = spinner.getSelectedItemPosition() - mResponseOffset; 8292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (position <= 0) { 8302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 833d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int status = EditEventHelper.ATTENDEE_VALUES[position]; 8342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the status has not changed, then don't update the database 8362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (status == mOriginalAttendeeResponse) { 8372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If we never got an owner attendee id we can't set the status 841d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE) { 8422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 8462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a non-repeating event 8472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 8482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 8492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event 8522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int whichEvents = mEditResponseHelper.getWhichEvents(); 8532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (whichEvents) { 8542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case -1: 8552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_SINGLE: 8572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang createExceptionResponse(mEventId, mCalendarOwnerAttendeeId, status); 8582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 8592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_ALL: 8602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 8612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 8622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang default: 8632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "Unexpected choice for updating invitation response"); 8642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 8652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateResponse(long eventId, long attendeeId, int status) { 8702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Update the attendee status in the attendees table. the provider 8712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // takes care of updating the self attendance status. 8722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 8732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(mCalendarOwnerAccount)) { 8752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_EMAIL, mCalendarOwnerAccount); 8762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_STATUS, status); 8782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.EVENT_ID, eventId); 8792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = ContentUris.withAppendedId(Attendees.CONTENT_URI, attendeeId); 8812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startUpdate(mHandler.getNextToken(), null, uri, values, 8832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, Utils.UNDO_DELAY); 8842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void createExceptionResponse(long eventId, long attendeeId, 8872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status) { 8882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor == null || !mEventCursor.moveToFirst()) { 8892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 8902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 8932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String title = mEventCursor.getString(EVENT_INDEX_TITLE); 8952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String timezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE); 8962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int calendarId = mEventCursor.getInt(EVENT_INDEX_CALENDAR_ID); 8972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0; 8982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String syncId = mEventCursor.getString(EVENT_INDEX_SYNC_ID); 8992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.TITLE, title); 9012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.EVENT_TIMEZONE, timezone); 9022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ALL_DAY, allDay ? 1 : 0); 9032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.CALENDAR_ID, calendarId); 9042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.DTSTART, mStartMillis); 9052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.DTEND, mEndMillis); 9062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_EVENT, syncId); 9072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_INSTANCE_TIME, mStartMillis); 9082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_ALL_DAY, allDay ? 1 : 0); 9092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.STATUS, Events.STATUS_CONFIRMED); 9102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.SELF_ATTENDEE_STATUS, status); 9112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Create a recurrence exception 9132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startInsert(mHandler.getNextToken(), null, 9142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.CONTENT_URI, values, Utils.UNDO_DELAY); 9152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int findResponseIndexFor(int response) { 918d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int size = EditEventHelper.ATTENDEE_VALUES.length; 9192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang for (int index = 0; index < size; index++) { 920d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (EditEventHelper.ATTENDEE_VALUES[index] == response) { 9212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return index; 9222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return 0; 9252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void doEdit() { 9282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CalendarController.getInstance(getActivity()).sendEventRelatedEvent( 9292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang this, EventType.EDIT_EVENT, mEventId, mStartMillis, mEndMillis, 0, 0); 9302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void doDelete() { 9334003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang CalendarController.getInstance(getActivity()).sendEventRelatedEvent( 9344003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang this, EventType.DELETE_EVENT, mEventId, mStartMillis, mEndMillis, 0, 0); 9352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateEvent(View view) { 9382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor == null) { 9392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 9402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventName = mEventCursor.getString(EVENT_INDEX_TITLE); 9432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventName == null || eventName.length() == 0) { 9442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventName = getActivity().getString(R.string.no_title_label); 9452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0; 9482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String location = mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION); 9492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String description = mEventCursor.getString(EVENT_INDEX_DESCRIPTION); 9502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 9512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean hasAlarm = mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) != 0; 9522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventTimezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE); 9532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mColor = mEventCursor.getInt(EVENT_INDEX_COLOR) & 0xbbffffff; 9542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9558ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan view.findViewById(R.id.color).setBackgroundColor(mColor); 9562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView title = (TextView) view.findViewById(R.id.title); 9582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang title.setTextColor(mColor); 9592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9608ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// View divider = view.findViewById(R.id.divider); 9618ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// divider.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN); 9622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // What 9642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventName != null) { 9652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.title, eventName); 9662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // When 9692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String when; 9702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int flags; 9712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (allDay) { 9722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang flags = DateUtils.FORMAT_UTC | DateUtils.FORMAT_SHOW_WEEKDAY 9732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang | DateUtils.FORMAT_SHOW_DATE; 9742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 9752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang flags = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE; 9762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (DateFormat.is24HourFormat(getActivity())) { 9772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang flags |= DateUtils.FORMAT_24HOUR; 9782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang when = DateUtils.formatDateRange(getActivity(), mStartMillis, mEndMillis, flags); 9812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.when, when); 9822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9838ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP // Show the event timezone if it is different from the local timezone 9848ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// Time time = new Time(); 9858ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// String localTimezone = time.timezone; 9868ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// if (allDay) { 9878ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// localTimezone = Time.TIMEZONE_UTC; 9888ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 9898ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// if (eventTimezone != null && !localTimezone.equals(eventTimezone) && !allDay) { 9908ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// String displayName; 9918ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// TimeZone tz = TimeZone.getTimeZone(localTimezone); 9928ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// if (tz == null || tz.getID().equals("GMT")) { 9938ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// displayName = localTimezone; 9948ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } else { 9958ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// displayName = tz.getDisplayName(); 9968ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 9978ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// 9988ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// setTextCommon(view, R.id.timezone, displayName); 9998ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// setVisibilityCommon(view, R.id.timezone_container, View.VISIBLE); 10008ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } else { 10018ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// setVisibilityCommon(view, R.id.timezone_container, View.GONE); 10028ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 10032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Repeat 10052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (rRule != null) { 10062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventRecurrence eventRecurrence = new EventRecurrence(); 10072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventRecurrence.parse(rRule); 10082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Time date = new Time(); 10092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (allDay) { 10102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang date.timezone = Time.TIMEZONE_UTC; 10112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang date.set(mStartMillis); 10132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventRecurrence.setStartDate(date); 10142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String repeatString = EventRecurrenceFormatter.getRepeatString( 10152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().getResources(), eventRecurrence); 10162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.repeat, repeatString); 10179c1989989b8f633210ef1761b0e4e7ecd5b43581Mason Tang setVisibilityCommon(view, R.id.repeat_container, View.VISIBLE); 10182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 10192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.repeat_container, View.GONE); 10202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Where 10232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (location == null || location.length() == 0) { 10242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.where, View.GONE); 10252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 10262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final TextView textView = (TextView) view.findViewById(R.id.where); 10272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView != null) { 10282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setAutoLinkMask(0); 10292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setText(location); 10302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Linkify.addLinks(textView, mWildcardPattern, "geo:0,0?q="); 10312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setOnTouchListener(new OnTouchListener() { 10322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public boolean onTouch(View v, MotionEvent event) { 10332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang try { 10342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return v.onTouchEvent(event); 10352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } catch (ActivityNotFoundException e) { 10362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // ignore 10372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 10382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }); 10412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Description 10452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (description == null || description.length() == 0) { 10462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.description, View.GONE); 10472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 10482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.description, description); 10492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateCalendar(View view) { 10532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = ""; 10542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null && mEventCursor != null) { 10552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.moveToFirst(); 10562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String tempAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 10572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = (tempAccount == null) ? "" : tempAccount; 10582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizerCanRespond = mCalendarsCursor.getInt(CALENDARS_INDEX_OWNER_CAN_RESPOND) != 0; 10592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String displayName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 10612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start duplicate calendars query 10632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startQuery(TOKEN_QUERY_DUPLICATE_CALENDARS, null, Calendars.CONTENT_URI, 10642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CALENDARS_PROJECTION, CALENDARS_DUPLICATE_NAME_WHERE, 10652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang new String[] {displayName}, null); 10662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventOrganizer = mEventCursor.getString(EVENT_INDEX_ORGANIZER); 10682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsOrganizer = mCalendarOwnerAccount.equalsIgnoreCase(eventOrganizer); 10692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHasAttendeeData = mEventCursor.getInt(EVENT_INDEX_HAS_ATTENDEE_DATA) != 0; 10702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOrganizer = eventOrganizer; 10712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCanModifyCalendar = 10722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) >= Calendars.CONTRIBUTOR_ACCESS; 10732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsBusyFreeCalendar = 10742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) == Calendars.FREEBUSY_ACCESS; 10752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCanModifyEvent = mCanModifyCalendar 10762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang && (mIsOrganizer || (mEventCursor.getInt(EVENT_INDEX_GUESTS_CAN_MODIFY) != 0)); 10778ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (mCanModifyEvent) { 10788ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Button b = (Button) mView.findViewById(R.id.edit); 10798ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan b.setOnClickListener(new OnClickListener() { 10808ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan @Override 10818ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan public void onClick(View v) { 10828ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan doEdit(); 10838ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan EventInfoFragment.this.dismiss(); 10848ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan }}); 10858ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan b.setVisibility(View.VISIBLE); 10868ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 10872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 10888ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP setVisibilityCommon(view, R.id.calendar_container, View.GONE); 10892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateAttendees(View view) { 10938ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan TextView tv = (TextView) view.findViewById(R.id.attendee_list); 10948ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan SpannableStringBuilder sb = new SpannableStringBuilder(); 10958ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan formatAttendees(mAcceptedAttendees, sb, Attendees.ATTENDEE_STATUS_ACCEPTED); 10968ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan formatAttendees(mDeclinedAttendees, sb, Attendees.ATTENDEE_STATUS_DECLINED); 10978ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan formatAttendees(mTentativeAttendees, sb, Attendees.ATTENDEE_STATUS_TENTATIVE); 10988ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan formatAttendees(mNoResponseAttendees, sb, Attendees.ATTENDEE_STATUS_NONE); 10998ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan tv.setText(sb); 11008ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11018ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP LinearLayout attendeesLayout = (LinearLayout) view.findViewById(R.id.attendee_list); 11028ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// attendeesLayout.removeAllViewsInLayout(); 11038ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// ++mUpdateCounts; 11048ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// if(mAcceptedAttendees.size() == 0 && mDeclinedAttendees.size() == 0 && 11058ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// mTentativeAttendees.size() == mNoResponseAttendees.size()) { 11068ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// // If all guests have no response just list them as guests, 11078ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// CharSequence guestsLabel = 11088ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// getActivity().getResources().getText(R.string.attendees_label); 11098ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// addAttendeesToLayout(mNoResponseAttendees, attendeesLayout, guestsLabel); 11108ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } else { 11118ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// // If we have any responses then divide them up by response 11128ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// CharSequence[] entries; 11138ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// entries = getActivity().getResources().getTextArray(R.array.response_labels2); 11148ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// addAttendeesToLayout(mAcceptedAttendees, attendeesLayout, entries[0]); 11158ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// addAttendeesToLayout(mDeclinedAttendees, attendeesLayout, entries[2]); 11168ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// addAttendeesToLayout(mTentativeAttendees, attendeesLayout, entries[1]); 11178ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan// } 11188ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 11198ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11208ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan private void formatAttendees(ArrayList<Attendee> attendees, SpannableStringBuilder sb, int type) { 11218ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (attendees.size() <= 0) { 11228ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan return; 11238ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 11248ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11258ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan int begin = sb.length(); 11268ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan boolean firstTime = sb.length() == 0; 11278ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11288ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (firstTime == false) { 11298ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan begin += 2; // skip over the ", " for formatting. 11308ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 11318ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11328ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan for (Attendee attendee : attendees) { 11338ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (firstTime) { 11348ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan firstTime = false; 11358ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } else { 11368ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.append(", "); 11378ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 11388ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11398ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan String name = attendee.getDisplayName(); 11408ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.append(name); 11418ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 11428ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11438ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan switch (type) { 11448ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_ACCEPTED: 11458ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 11468ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_DECLINED: 11478ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.setSpan(new StrikethroughSpan(), begin, sb.length(), 11488ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 11498ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // fall through 11508ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan default: 11518ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // The last INCLUSIVE causes the foreground color to be applied 11528ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // to the rest of the span. If not, the comma at the end of the 11538ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // declined or tentative may be black. 11548ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.setSpan(new ForegroundColorSpan(0xFF888888), begin, sb.length(), 11558ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 11568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 11572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void addAttendeesToLayout(ArrayList<Attendee> attendees, LinearLayout attendeeList, 11612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CharSequence sectionTitle) { 11622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (attendees.size() == 0) { 11632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 11642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Yes/No/Maybe Title 11672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View titleView = mLayoutInflater.inflate(R.layout.contact_item, null); 11682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang titleView.findViewById(R.id.badge).setVisibility(View.GONE); 11692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View divider = titleView.findViewById(R.id.separator); 11702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang divider.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN); 11712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView title = (TextView) titleView.findViewById(R.id.name); 11732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang title.setText(getActivity().getString(R.string.response_label, sectionTitle, 11742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang attendees.size())); 11752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang title.setTextAppearance(getActivity(), R.style.TextAppearance_EventInfo_Label); 11762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang attendeeList.addView(titleView); 11772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Attendees 11792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int numOfAttendees = attendees.size(); 11802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang StringBuilder selection = new StringBuilder(Email.DATA + " IN ("); 11812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] selectionArgs = new String[numOfAttendees]; 11822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang for (int i = 0; i < numOfAttendees; ++i) { 11842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendee attendee = attendees.get(i); 11852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selectionArgs[i] = attendee.mEmail; 11862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View v = mLayoutInflater.inflate(R.layout.contact_item, null); 11882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang v.setTag(attendee); 11892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View separator = v.findViewById(R.id.separator); 11912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang separator.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN); 11922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Text 11942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView tv = (TextView) v.findViewById(R.id.name); 11952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String name = attendee.mName; 11962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (name == null || name.length() == 0) { 11972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang name = attendee.mEmail; 11982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang tv.setText(name); 12002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ViewHolder vh = new ViewHolder(); 12022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.badge = (QuickContactBadge) v.findViewById(R.id.badge); 12032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.badge.assignContactFromEmail(attendee.mEmail, true); 12042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.presence = (ImageView) v.findViewById(R.id.presence); 12052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mViewHolders.put(attendee.mEmail, vh); 12062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (i == 0) { 12082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selection.append('?'); 12092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 12102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selection.append(", ?"); 12112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang attendeeList.addView(v); 12142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang selection.append(')'); 12162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mPresenceQueryHandler.startQuery(mUpdateCounts, attendees, CONTACT_DATA_WITH_PRESENCE_URI, 12182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang PRESENCE_PROJECTION, selection.toString(), selectionArgs, null); 12192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private class PresenceQueryHandler extends AsyncQueryHandler { 12222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Context mContext; 12232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public PresenceQueryHandler(Context context, ContentResolver cr) { 12252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super(cr); 12262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mContext = context; 12272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 12302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang protected void onQueryComplete(int queryIndex, Object cookie, Cursor cursor) { 12312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (cursor == null) { 12322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (DEBUG) { 12332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "onQueryComplete: cursor == null"); 12342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang try { 12392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.moveToPosition(-1); 12402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang while (cursor.moveToNext()) { 12412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String email = cursor.getString(PRESENCE_PROJECTION_EMAIL_INDEX); 12422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int contactId = cursor.getInt(PRESENCE_PROJECTION_CONTACT_ID_INDEX); 12432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ViewHolder vh = mViewHolders.get(email); 12442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int photoId = cursor.getInt(PRESENCE_PROJECTION_PHOTO_ID_INDEX); 12452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (DEBUG) { 12462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "onQueryComplete Id: " + contactId + " PhotoId: " + photoId 12472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang + " Email: " + email); 12482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (vh == null) { 12502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang continue; 12512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ImageView presenceView = vh.presence; 12532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (presenceView != null) { 12542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status = cursor.getInt(PRESENCE_PROJECTION_PRESENCE_INDEX); 12552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang presenceView.setImageResource(Presence.getPresenceIconResourceId(status)); 12562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang presenceView.setVisibility(View.VISIBLE); 12572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (photoId > 0 && vh.updateCounts < queryIndex) { 12602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.updateCounts = queryIndex; 12612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri personUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 12622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang contactId); 12632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // TODO, modify to batch queries together 12652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContactsAsyncHelper.updateImageViewWithContactPhotoAsync(mContext, 12662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang vh.badge, personUri, R.drawable.ic_contact_picture); 12672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } finally { 12702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.close(); 12712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang void updateResponse(View view) { 12762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // we only let the user accept/reject/etc. a meeting if: 12772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // a) you can edit the event's containing calendar AND 12782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // b) you're not the organizer and only attendee AND 12792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // c) organizerCanRespond is enabled for the calendar 12802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (if the attendee data has been hidden, the visible number of attendees 12812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // will be 1 -- the calendar owner's). 12822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (there are more cases involved to be 100% accurate, such as 12832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // paying attention to whether or not an attendee status was 12842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // included in the feed, but we're currently omitting those corner cases 12852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // for simplicity). 12868ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP 1287d785cd533f6a3c23813c15315aed74efa9a116f5Michael Chan if (!mCanModifyCalendar || (mHasAttendeeData && mIsOrganizer && mNumOfAttendees <= 1) || 12882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang (mIsOrganizer && !mOrganizerCanRespond)) { 12892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.GONE); 12902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.VISIBLE); 12942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Spinner spinner = (Spinner) view.findViewById(R.id.response_value); 12962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mResponseOffset = 0; 12982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /* If the user has previously responded to this event 13002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * we should not allow them to select no response again. 13012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Switch the entries to a set of entries without the 13022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * no response option. 13032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 13042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if ((mOriginalAttendeeResponse != Attendees.ATTENDEE_STATUS_INVITED) 1305d845fbe558d5229102b58cce70a1b29fe6cb6967Erik && (mOriginalAttendeeResponse != EditEventHelper.ATTENDEE_NO_RESPONSE) 13062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang && (mOriginalAttendeeResponse != Attendees.ATTENDEE_STATUS_NONE)) { 13072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CharSequence[] entries; 13082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang entries = getActivity().getResources().getTextArray(R.array.response_labels2); 13092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mResponseOffset = -1; 13102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayAdapter<CharSequence> adapter = 13112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang new ArrayAdapter<CharSequence>(getActivity(), 13122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang android.R.layout.simple_spinner_item, entries); 13132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 13142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang spinner.setAdapter(adapter); 13152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int index; 1318d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mAttendeeResponseFromIntent != EditEventHelper.ATTENDEE_NO_RESPONSE) { 13192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang index = findResponseIndexFor(mAttendeeResponseFromIntent); 13202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 13212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang index = findResponseIndexFor(mOriginalAttendeeResponse); 13222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang spinner.setSelection(index + mResponseOffset); 13242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang spinner.setOnItemSelectedListener(this); 13252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setTextCommon(View view, int id, CharSequence text) { 13282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView textView = (TextView) view.findViewById(id); 13292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView == null) 13302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 13312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setText(text); 13322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setVisibilityCommon(View view, int id, int visibility) { 13352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View v = view.findViewById(id); 13362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (v != null) { 13372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang v.setVisibility(visibility); 13382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 13402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 13432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Taken from com.google.android.gm.HtmlConversationActivity 13442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 13452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Send the intent that shows the Contact info corresponding to the email address. 13462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 13472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void showContactInfo(Attendee attendee, Rect rect) { 13482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // First perform lookup query to find existing contact 13492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final ContentResolver resolver = getActivity().getContentResolver(); 13502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String address = attendee.mEmail; 13512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri dataUri = Uri.withAppendedPath(CommonDataKinds.Email.CONTENT_FILTER_URI, 13522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri.encode(address)); 13532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri lookupUri = ContactsContract.Data.getContactLookupUri(resolver, dataUri); 13542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (lookupUri != null) { 13562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Found matching contact, trigger QuickContact 13572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.showQuickContact(getActivity(), rect, lookupUri, 13582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.MODE_MEDIUM, null); 13592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 13602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // No matching contact, ask user to create one 13612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri mailUri = Uri.fromParts("mailto", address, null); 13622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, mailUri); 13632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Pass along full E-mail string for possible create dialog 13652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Rfc822Token sender = new Rfc822Token(attendee.mName, attendee.mEmail, null); 13662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.EXTRA_CREATE_DESCRIPTION, sender.toString()); 13672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Only provide personal name hint if we have one 13692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String senderPersonal = attendee.mName; 13702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(senderPersonal)) { 13712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.Insert.NAME, senderPersonal); 13722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startActivity(intent); 13752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang} 1378