EventInfoFragment.java revision 2e46cff640b123ba5f7a67c934ae98e6b02a905f
12bebde787f9490408ceaf14166de4b016a10daf1Mason Tang/* 22bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Copyright (C) 2010 The Android Open Source Project 32bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 42bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Licensed under the Apache License, Version 2.0 (the "License"); 52bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * you may not use this file except in compliance with the License. 62bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * You may obtain a copy of the License at 72bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 82bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * http://www.apache.org/licenses/LICENSE-2.0 92bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Unless required by applicable law or agreed to in writing, software 112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * distributed under the License is distributed on an "AS IS" BASIS, 122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * See the License for the specific language governing permissions and 142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * limitations under the License. 152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 172bebde787f9490408ceaf14166de4b016a10daf1Mason Tangpackage com.android.calendar; 182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 19cb81189e4868769ea016253eca104e46df2f033aErikimport com.android.calendar.CalendarController.EventInfo; 202bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport com.android.calendar.CalendarController.EventType; 21667af28a8e9729e14831f3db456ff3edb2c4c29aIsaac Katzenelsonimport com.android.calendar.CalendarEventModel.Attendee; 22c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelsonimport com.android.calendar.event.AttendeesView; 23fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.event.EditEventHelper; 242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 252bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.app.Activity; 2671d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.Dialog; 2771d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.DialogFragment; 28ef31a98202852807f460af49ae3313d1ccf5e288Andy McFaddenimport android.app.Service; 292bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ActivityNotFoundException; 30364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erikimport android.content.ContentProviderOperation; 312bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentResolver; 322bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentUris; 332bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentValues; 342bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Context; 352bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Intent; 362bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.res.Resources; 372bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.Cursor; 382bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.Rect; 3971b221ae5d0f514352584a955630f5494f686c51Michael Chanimport android.graphics.Typeface; 402bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.net.Uri; 412bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.os.Bundle; 422bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.pim.EventRecurrence; 43364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erikimport android.provider.Calendar; 442bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Attendees; 452bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Calendars; 462bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Events; 47cb81189e4868769ea016253eca104e46df2f033aErikimport android.provider.ContactsContract; 482bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.CommonDataKinds; 492bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Intents; 502bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.QuickContact; 518ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.Spannable; 528ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.SpannableStringBuilder; 532bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.TextUtils; 542bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateFormat; 552bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateUtils; 562bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.Time; 578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.ForegroundColorSpan; 588ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.StrikethroughSpan; 5971b221ae5d0f514352584a955630f5494f686c51Michael Chanimport android.text.style.StyleSpan; 602bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Linkify; 612bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Rfc822Token; 622bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.util.Log; 6371d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Gravity; 642bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.LayoutInflater; 6560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.Menu; 6660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.MenuInflater; 6760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.MenuItem; 682bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MotionEvent; 692bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.View; 70cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnClickListener; 71cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnTouchListener; 722bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.ViewGroup; 7371d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Window; 7471d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.WindowManager; 75259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.view.accessibility.AccessibilityEvent; 76259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.view.accessibility.AccessibilityManager; 772bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.AdapterView; 788ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.widget.Button; 79259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.widget.RadioButton; 80f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanimport android.widget.RadioGroup; 81f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanimport android.widget.RadioGroup.OnCheckedChangeListener; 822bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.TextView; 832bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Toast; 842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 852bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.ArrayList; 8674c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelsonimport java.util.Formatter; 87259b8f9a21fffd3858218581e9daaf689b6b888fErikimport java.util.List; 8874c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelsonimport java.util.Locale; 892bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.regex.Pattern; 90f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelsonimport java.util.TimeZone; 91f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson 922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 93f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanpublic class EventInfoFragment extends DialogFragment implements OnCheckedChangeListener, 94f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan CalendarController.EventHandler { 95d845fbe558d5229102b58cce70a1b29fe6cb6967Erik public static final boolean DEBUG = false; 962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 972c7c851a4e40afa83a741ec39d44425b705a712eMichael Chan public static final String TAG = "EventInfoFragment"; 982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_EVENT_ID = "key_event_id"; 10060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_START_MILLIS = "key_start_millis"; 10160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_END_MILLIS = "key_end_millis"; 10260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_IS_DIALOG = "key_fragment_is_dialog"; 10360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_ATTENDEE_RESPONSE = "key_attendee_response"; 10471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 105259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final String PERIOD_SPACE = ". "; 106259b8f9a21fffd3858218581e9daaf689b6b888fErik 1072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 1082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * These are the corresponding indices into the array of strings 1092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * "R.array.change_response_labels" in the resource file. 1102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 1112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_SINGLE = 0; 1122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_ALL = 1; 1132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Query tokens for QueryHandler 115259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_EVENT = 1 << 0; 116259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_CALENDARS = 1 << 1; 117259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_ATTENDEES = 1 << 2; 118259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_DUPLICATE_CALENDARS = 1 << 3; 119259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_ALL = TOKEN_QUERY_DUPLICATE_CALENDARS 120259b8f9a21fffd3858218581e9daaf689b6b888fErik | TOKEN_QUERY_ATTENDEES | TOKEN_QUERY_CALENDARS | TOKEN_QUERY_EVENT; 121259b8f9a21fffd3858218581e9daaf689b6b888fErik private int mCurrentQuery = 0; 1222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] EVENT_PROJECTION = new String[] { 1242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._ID, // 0 do not remove; used in DeleteEventHelper 1252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.TITLE, // 1 do not remove; used in DeleteEventHelper 1262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.RRULE, // 2 do not remove; used in DeleteEventHelper 1272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ALL_DAY, // 3 do not remove; used in DeleteEventHelper 1282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.CALENDAR_ID, // 4 do not remove; used in DeleteEventHelper 1292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DTSTART, // 5 do not remove; used in DeleteEventHelper 1302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._SYNC_ID, // 6 do not remove; used in DeleteEventHelper 1312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_TIMEZONE, // 7 do not remove; used in DeleteEventHelper 1322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DESCRIPTION, // 8 1332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_LOCATION, // 9 13471b221ae5d0f514352584a955630f5494f686c51Michael Chan Calendars.ACCESS_LEVEL, // 10 1350e1e62408b96e1532eb6f6a609ae4c817751aaf3RoboErik Calendars.CALENDAR_COLOR, // 11 13671b221ae5d0f514352584a955630f5494f686c51Michael Chan Events.HAS_ATTENDEE_DATA, // 12 13771b221ae5d0f514352584a955630f5494f686c51Michael Chan Events.ORGANIZER, // 13 1380e1e62408b96e1532eb6f6a609ae4c817751aaf3RoboErik Events.ORIGINAL_SYNC_ID // 14 do not remove; used in DeleteEventHelper 1392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ID = 0; 1412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_TITLE = 1; 1422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_RRULE = 2; 1432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ALL_DAY = 3; 1442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_CALENDAR_ID = 4; 1452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_SYNC_ID = 6; 1462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_TIMEZONE = 7; 1472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_DESCRIPTION = 8; 1482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_LOCATION = 9; 14971b221ae5d0f514352584a955630f5494f686c51Michael Chan private static final int EVENT_INDEX_ACCESS_LEVEL = 10; 15071b221ae5d0f514352584a955630f5494f686c51Michael Chan private static final int EVENT_INDEX_COLOR = 11; 15171b221ae5d0f514352584a955630f5494f686c51Michael Chan private static final int EVENT_INDEX_HAS_ATTENDEE_DATA = 12; 15271b221ae5d0f514352584a955630f5494f686c51Michael Chan private static final int EVENT_INDEX_ORGANIZER = 13; 1532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] ATTENDEES_PROJECTION = new String[] { 1552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees._ID, // 0 1562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_NAME, // 1 1572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_EMAIL, // 2 1582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_RELATIONSHIP, // 3 1592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_STATUS, // 4 1602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_ID = 0; 1622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_NAME = 1; 1632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_EMAIL = 2; 1642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_RELATIONSHIP = 3; 1652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_STATUS = 4; 1662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?"; 1682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_SORT_ORDER = Attendees.ATTENDEE_NAME + " ASC, " 1702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang + Attendees.ATTENDEE_EMAIL + " ASC"; 1712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String[] CALENDARS_PROJECTION = new String[] { 1732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars._ID, // 0 1742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.DISPLAY_NAME, // 1 1752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.OWNER_ACCOUNT, // 2 176950e8a615f3dcca0b61b2eb8f8de72ecf6825d4bAndy McFadden Calendars.CAN_ORGANIZER_RESPOND // 3 1772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_DISPLAY_NAME = 1; 1792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2; 1802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_CAN_RESPOND = 3; 1812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String CALENDARS_WHERE = Calendars._ID + "=?"; 1832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String CALENDARS_DUPLICATE_NAME_WHERE = Calendars.DISPLAY_NAME + "=?"; 1842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private View mView; 1862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Uri mUri; 1882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEventId; 1892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mEventCursor; 1902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mAttendeesCursor; 1912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mCalendarsCursor; 1920a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan private static float mScale = 0; // Used for supporting different screen densities 1932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mStartMillis; 1952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEndMillis; 1962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mHasAttendeeData; 1982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsOrganizer; 199d845fbe558d5229102b58cce70a1b29fe6cb6967Erik private long mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 200352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private boolean mOwnerCanRespond; 2012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private String mCalendarOwnerAccount; 2022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mCanModifyCalendar; 2032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsBusyFreeCalendar; 2042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mNumOfAttendees; 2052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private EditResponseHelper mEditResponseHelper; 2072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mOriginalAttendeeResponse; 209deced8999da73effe4133e2317c262fea7910090Michael Chan private int mAttendeeResponseFromIntent = CalendarController.ATTENDEE_NO_RESPONSE; 2102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsRepeating; 2112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 212259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mTitle; 213259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mWhen; 214259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mWhere; 215259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mWhat; 216259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mAttendees; 217c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private AttendeesView mLongAttendees; 218259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mCalendar; 21960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson private Menu mMenu; 220259b8f9a21fffd3858218581e9daaf689b6b888fErik 2212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Pattern mWildcardPattern = Pattern.compile("^.*$"); 2222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mAcceptedAttendees = new ArrayList<Attendee>(); 2242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mDeclinedAttendees = new ArrayList<Attendee>(); 2252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mTentativeAttendees = new ArrayList<Attendee>(); 2262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mNoResponseAttendees = new ArrayList<Attendee>(); 2272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mColor; 2282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private QueryHandler mHandler; 2302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 231cb81189e4868769ea016253eca104e46df2f033aErik private Runnable mTZUpdater = new Runnable() { 232cb81189e4868769ea016253eca104e46df2f033aErik @Override 233cb81189e4868769ea016253eca104e46df2f033aErik public void run() { 234cb81189e4868769ea016253eca104e46df2f033aErik updateEvent(mView); 235cb81189e4868769ea016253eca104e46df2f033aErik } 236cb81189e4868769ea016253eca104e46df2f033aErik }; 237cb81189e4868769ea016253eca104e46df2f033aErik 2382fc6b79dfb06812baf2e6c547f3ffee83b5c3e9aMichael Chan private static int DIALOG_WIDTH = 500; 2392fc6b79dfb06812baf2e6c547f3ffee83b5c3e9aMichael Chan private static int DIALOG_HEIGHT = 600; 24071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private boolean mIsDialog = false; 2417c6236d5553dc9f3d004ebbed794249713a11d19RoboErik private boolean mIsPaused = true; 2427c6236d5553dc9f3d004ebbed794249713a11d19RoboErik private boolean mDismissOnResume = false; 24371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mX = -1; 24471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mY = -1; 2450b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson private static boolean mIsFullScreen = true; 246c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private Button mDescButton; // Button to expand/collapse the description 247c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private String mMoreLabel; // Labels for the button 248c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private String mLessLabel; 249c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private boolean mShowMaxDescription; // Current status of button 250c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private int mDescLineNum; // The default number of lines in the description 25171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 2522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private class QueryHandler extends AsyncQueryService { 2532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public QueryHandler(Context context) { 2542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super(context); 2552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 2562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 2582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 2594003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // if the activity is finishing, then close the cursor and return 2604003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang final Activity activity = getActivity(); 2614003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (activity == null || activity.isFinishing()) { 2624003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang cursor.close(); 2634003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang return; 2644003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 2654003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 2662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (token) { 2672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_EVENT: 2682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor = Utils.matrixCursorFromCursor(cursor); 2692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (initEventCursor()) { 2702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // The cursor is empty. This can happen if the event was 2712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // deleted. 2722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // FRAG_TODO we should no longer rely on Activity.finish() 2731df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity.finish(); 2742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 2752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 2762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateEvent(mView); 2772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start calendar query 2792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = Calendars.CONTENT_URI; 2802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] args = new String[] { 2812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Long.toString(mEventCursor.getLong(EVENT_INDEX_CALENDAR_ID))}; 2822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startQuery(TOKEN_QUERY_CALENDARS, null, uri, CALENDARS_PROJECTION, 2832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CALENDARS_WHERE, args, null); 2842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 2852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_CALENDARS: 2862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor = Utils.matrixCursorFromCursor(cursor); 2872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateCalendar(mView); 2884003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // FRAG_TODO fragments shouldn't set the title anymore 2892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateTitle(); 2901df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang // update the action bar since our option set might have changed 2911df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity.invalidateOptionsMenu(); 2922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 293352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (!mIsBusyFreeCalendar) { 294352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan args = new String[] { Long.toString(mEventId) }; 295352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 296352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // start attendees query 297352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan uri = Attendees.CONTENT_URI; 298352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan startQuery(TOKEN_QUERY_ATTENDEES, null, uri, ATTENDEES_PROJECTION, 299352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan ATTENDEES_WHERE, args, ATTENDEES_SORT_ORDER); 300259b8f9a21fffd3858218581e9daaf689b6b888fErik } else { 301259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEventIfQueryDone(TOKEN_QUERY_ATTENDEES); 3022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_ATTENDEES: 3052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor = Utils.matrixCursorFromCursor(cursor); 3062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang initAttendeesCursor(mView); 3072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mView); 3082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_DUPLICATE_CALENDARS: 31071b221ae5d0f514352584a955630f5494f686c51Michael Chan Resources res = activity.getResources(); 31171b221ae5d0f514352584a955630f5494f686c51Michael Chan SpannableStringBuilder sb = new SpannableStringBuilder(); 31271b221ae5d0f514352584a955630f5494f686c51Michael Chan 31371b221ae5d0f514352584a955630f5494f686c51Michael Chan // Label 31471b221ae5d0f514352584a955630f5494f686c51Michael Chan String label = res.getString(R.string.view_event_calendar_label); 31571b221ae5d0f514352584a955630f5494f686c51Michael Chan sb.append(label).append(" "); 31671b221ae5d0f514352584a955630f5494f686c51Michael Chan sb.setSpan(new StyleSpan(Typeface.BOLD), 0, label.length(), 31771b221ae5d0f514352584a955630f5494f686c51Michael Chan Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 31871b221ae5d0f514352584a955630f5494f686c51Michael Chan 31971b221ae5d0f514352584a955630f5494f686c51Michael Chan // Calendar display name 3202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String calendarName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 32171b221ae5d0f514352584a955630f5494f686c51Michael Chan sb.append(calendarName); 32271b221ae5d0f514352584a955630f5494f686c51Michael Chan 32371b221ae5d0f514352584a955630f5494f686c51Michael Chan // Show email account if display name is not unique and 32471b221ae5d0f514352584a955630f5494f686c51Michael Chan // display name != email 32571b221ae5d0f514352584a955630f5494f686c51Michael Chan String email = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 32671b221ae5d0f514352584a955630f5494f686c51Michael Chan if (cursor.getCount() > 1 && !calendarName.equalsIgnoreCase(email)) { 32771b221ae5d0f514352584a955630f5494f686c51Michael Chan sb.append(" (").append(email).append(")"); 32871b221ae5d0f514352584a955630f5494f686c51Michael Chan } 32971b221ae5d0f514352584a955630f5494f686c51Michael Chan 330259b8f9a21fffd3858218581e9daaf689b6b888fErik mCalendar.setText(sb); 3312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.close(); 334259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEventIfQueryDone(token); 3352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 339259b8f9a21fffd3858218581e9daaf689b6b888fErik private void sendAccessibilityEventIfQueryDone(int token) { 340259b8f9a21fffd3858218581e9daaf689b6b888fErik mCurrentQuery |= token; 341259b8f9a21fffd3858218581e9daaf689b6b888fErik if (mCurrentQuery == TOKEN_QUERY_ALL) { 342259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEvent(); 343259b8f9a21fffd3858218581e9daaf689b6b888fErik } 344259b8f9a21fffd3858218581e9daaf689b6b888fErik } 345259b8f9a21fffd3858218581e9daaf689b6b888fErik 3460a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan public EventInfoFragment(Context context, Uri uri, long startMillis, long endMillis, 34760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson int attendeeResponse, boolean isDialog) { 3480b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson 3490a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan if (mScale == 0) { 3500a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan mScale = context.getResources().getDisplayMetrics().density; 3510a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan if (mScale != 1) { 3520a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan DIALOG_WIDTH *= mScale; 3530a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan DIALOG_HEIGHT *= mScale; 3540a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan } 3550a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan } 35660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mIsDialog = isDialog; 357c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson 3582fc6b79dfb06812baf2e6c547f3ffee83b5c3e9aMichael Chan setStyle(DialogFragment.STYLE_NO_TITLE, 0); 3592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mUri = uri; 3602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mStartMillis = startMillis; 3612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEndMillis = endMillis; 3622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeeResponseFromIntent = attendeeResponse; 3632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 365ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden // This is currently required by the fragment manager. 36660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson public EventInfoFragment() { 36760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 36860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 36960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 37060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 3710a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan public EventInfoFragment(Context context, long eventId, long startMillis, long endMillis, 37260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson int attendeeResponse, boolean isDialog) { 3730a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan this(context, ContentUris.withAppendedId(Events.CONTENT_URI, eventId), startMillis, 37460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson endMillis, attendeeResponse, isDialog); 3754003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = eventId; 3764003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 3774003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 37871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan @Override 37971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan public void onActivityCreated(Bundle savedInstanceState) { 38071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onActivityCreated(savedInstanceState); 38171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 38271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (savedInstanceState != null) { 38371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mIsDialog = savedInstanceState.getBoolean(BUNDLE_KEY_IS_DIALOG, false); 38471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 38571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 38671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (mIsDialog) { 38771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan applyDialogParams(); 38871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 38971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 39071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 39171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private void applyDialogParams() { 39271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Dialog dialog = getDialog(); 39371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan dialog.setCanceledOnTouchOutside(true); 39471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 39571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Window window = dialog.getWindow(); 39671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 39771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 39871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan WindowManager.LayoutParams a = window.getAttributes(); 39971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.dimAmount = .4f; 40071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 40171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.width = DIALOG_WIDTH; 402352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan a.height = DIALOG_HEIGHT; 40371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 4040b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson 4050b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson // On tablets , do smart positioning of dialog 4060b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson // On phones , use the whole screen 4070b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson 40860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (mX != -1 || mY != -1) { 40960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson a.x = mX - a.width - 64; 41060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (a.x < 0) { 41160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson a.x = mX + 64; 4120a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan } 41360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson a.y = mY - 64; 41460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson a.gravity = Gravity.LEFT | Gravity.TOP; 41571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 41671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.setAttributes(a); 41771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 41871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 41960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson public void setDialogParams(int x, int y) { 42071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mX = x; 42171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mY = y; 42271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 42371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 424f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan // Implements OnCheckedChangeListener 425f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan @Override 426f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan public void onCheckedChanged(RadioGroup group, int checkedId) { 4272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If this is not a repeating event, then don't display the dialog 4282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // asking which events to change. 4292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 4302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the selection is the same as the original, then don't display the 4342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // dialog asking which events to change. 435f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan if (checkedId == findButtonIdForResponse(mOriginalAttendeeResponse)) { 4362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 4372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event. We need to ask the user if they mean to 4402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // change just this one instance or all instances. 4412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEditResponseHelper.showDialog(mEditResponseHelper.getWhichEvents()); 4422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onNothingSelected(AdapterView<?> parent) { 4452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 4482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onAttach(Activity activity) { 4492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onAttach(activity); 4502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEditResponseHelper = new EditResponseHelper(activity); 4512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler = new QueryHandler(activity); 45260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mDescLineNum = activity.getResources().getInteger((R.integer.event_info_desc_line_num)); 45360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mMoreLabel = activity.getResources().getString((R.string.event_info_desc_more)); 45460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mLessLabel = activity.getResources().getString((R.string.event_info_desc_less)); 45560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (!mIsDialog) { 45660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson setHasOptionsMenu(true); 45760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 4582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 4612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public View onCreateView(LayoutInflater inflater, ViewGroup container, 4622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Bundle savedInstanceState) { 4638b71d11235e7ebc02f62435d2c6583edb43c26a2Michael Chan mView = inflater.inflate(R.layout.event_info, container, false); 464259b8f9a21fffd3858218581e9daaf689b6b888fErik mTitle = (TextView) mView.findViewById(R.id.title); 465259b8f9a21fffd3858218581e9daaf689b6b888fErik mWhen = (TextView) mView.findViewById(R.id.when); 466259b8f9a21fffd3858218581e9daaf689b6b888fErik mWhere = (TextView) mView.findViewById(R.id.where); 467259b8f9a21fffd3858218581e9daaf689b6b888fErik mWhat = (TextView) mView.findViewById(R.id.description); 468259b8f9a21fffd3858218581e9daaf689b6b888fErik mAttendees = (TextView) mView.findViewById(R.id.attendee_list); 469c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mLongAttendees = (AttendeesView)mView.findViewById(R.id.long_attendee_list); 470259b8f9a21fffd3858218581e9daaf689b6b888fErik mCalendar = (TextView) mView.findViewById(R.id.calendar); 471c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton = (Button)mView.findViewById(R.id.desc_expand); 472c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton.setOnClickListener(new View.OnClickListener() { 473ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden @Override 474c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson public void onClick(View v) { 475c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mShowMaxDescription = !mShowMaxDescription; 476c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson updateDescription(); 477c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson } 478c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson }); 479c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mShowMaxDescription = false; // Show short version of description as default. 4802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4814003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (mUri == null) { 4824003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // restore event ID from bundle 4834003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = savedInstanceState.getLong(BUNDLE_KEY_EVENT_ID); 4844003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 4854003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mStartMillis = savedInstanceState.getLong(BUNDLE_KEY_START_MILLIS); 4864003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEndMillis = savedInstanceState.getLong(BUNDLE_KEY_END_MILLIS); 4874003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 4884003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 4892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start loading the data 4902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION, 4912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, null); 4922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 49389ad0822f104015625f4ca88bfdf5c1d522b6e74Erik Button b = (Button) mView.findViewById(R.id.delete); 4948ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan b.setOnClickListener(new OnClickListener() { 4958ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan @Override 4968ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan public void onClick(View v) { 49769be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik if (!mCanModifyCalendar) { 49869be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik return; 49969be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik } 50089ad0822f104015625f4ca88bfdf5c1d522b6e74Erik DeleteEventHelper deleteHelper = new DeleteEventHelper( 50160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson getActivity(), getActivity(), !mIsDialog /* exitWhenDone */); 50289ad0822f104015625f4ca88bfdf5c1d522b6e74Erik deleteHelper.delete(mStartMillis, mEndMillis, mEventId, -1, onDeleteRunnable); 5038ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan }}); 5048ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 50560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson // Hide Edit/Delete buttons if in full screen mode 50660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (!mIsDialog) { 50760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mView.findViewById(R.id.event_info_buttons_container).setVisibility(View.GONE); 50860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 50960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 5102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return mView; 5112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 51389ad0822f104015625f4ca88bfdf5c1d522b6e74Erik private Runnable onDeleteRunnable = new Runnable() { 51489ad0822f104015625f4ca88bfdf5c1d522b6e74Erik @Override 51589ad0822f104015625f4ca88bfdf5c1d522b6e74Erik public void run() { 5167c6236d5553dc9f3d004ebbed794249713a11d19RoboErik if (EventInfoFragment.this.mIsPaused) { 5177c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mDismissOnResume = true; 5187c6236d5553dc9f3d004ebbed794249713a11d19RoboErik return; 5197c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 52089ad0822f104015625f4ca88bfdf5c1d522b6e74Erik if (EventInfoFragment.this.isVisible()) { 52189ad0822f104015625f4ca88bfdf5c1d522b6e74Erik EventInfoFragment.this.dismiss(); 52289ad0822f104015625f4ca88bfdf5c1d522b6e74Erik } 52389ad0822f104015625f4ca88bfdf5c1d522b6e74Erik } 52489ad0822f104015625f4ca88bfdf5c1d522b6e74Erik }; 52589ad0822f104015625f4ca88bfdf5c1d522b6e74Erik 526c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson // Sets the description: 527c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson // Set the expand/collapse button 528c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson // Expand/collapse the description according the the current status 529c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private void updateDescription() { 530c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson // Description is short, hide button 531c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson if (mWhat.getLineCount() <= mDescLineNum) { 532c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton.setVisibility(View.GONE); 533c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson return; 534c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson } 535c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson // Show button and set label according to the expand/collapse status 536c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton.setVisibility(View.VISIBLE); 537c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson if (mShowMaxDescription) { 538c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton.setText(mLessLabel); 539c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mWhat.setLines(mWhat.getLineCount()); 540c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson } else { 541c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton.setText(mMoreLabel); 542c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mWhat.setLines(mDescLineNum); 543c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson } 544c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson } 545c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson 5462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateTitle() { 5472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Resources res = getActivity().getResources(); 5482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCanModifyCalendar && !mIsOrganizer) { 5492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title_invite)); 5502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 5512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title)); 5522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 5562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Initializes the event cursor, which is expected to point to the first 5572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * (and only) result from a query. 5582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @return true if the cursor is empty. 5592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 5602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean initEventCursor() { 5612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if ((mEventCursor == null) || (mEventCursor.getCount() == 0)) { 5622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 5632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.moveToFirst(); 5652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventId = mEventCursor.getInt(EVENT_INDEX_ID); 5662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 56766b2067e0a389180f909eb0a528bea5f6becca23Michael Chan mIsRepeating = !TextUtils.isEmpty(rRule); 5682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 5692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @SuppressWarnings("fallthrough") 5722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void initAttendeesCursor(View view) { 573deced8999da73effe4133e2317c262fea7910090Michael Chan mOriginalAttendeeResponse = CalendarController.ATTENDEE_NO_RESPONSE; 574d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 5752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = 0; 5762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 5772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = mAttendeesCursor.getCount(); 5782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor.moveToFirst()) { 5792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAcceptedAttendees.clear(); 5802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDeclinedAttendees.clear(); 5812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mTentativeAttendees.clear(); 5822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNoResponseAttendees.clear(); 5832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang do { 5852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 5862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String name = mAttendeesCursor.getString(ATTENDEES_INDEX_NAME); 5872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String email = mAttendeesCursor.getString(ATTENDEES_INDEX_EMAIL); 5882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 589d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE && 5902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount.equalsIgnoreCase(email)) { 5912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAttendeeId = mAttendeesCursor.getInt(ATTENDEES_INDEX_ID); 5922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalAttendeeResponse = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 5932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 5942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Don't show your own status in the list because: 5952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 1) it doesn't make sense for event without other guests. 5962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 2) there's a spinner for that for events with guests. 5972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch(status) { 5982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_ACCEPTED: 599fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mAcceptedAttendees.add(new Attendee(name, email, 600fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson Attendees.ATTENDEE_STATUS_ACCEPTED)); 6012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 6022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_DECLINED: 603fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mDeclinedAttendees.add(new Attendee(name, email, 604fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson Attendees.ATTENDEE_STATUS_DECLINED)); 6052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 6068ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_TENTATIVE: 607fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mTentativeAttendees.add(new Attendee(name, email, 608fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson Attendees.ATTENDEE_STATUS_TENTATIVE)); 6098ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 6108ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan default: 611fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mNoResponseAttendees.add(new Attendee(name, email, 612fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson Attendees.ATTENDEE_STATUS_NONE)); 6132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } while (mAttendeesCursor.moveToNext()); 6162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.moveToFirst(); 6172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateAttendees(view); 6192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 6244003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public void onSaveInstanceState(Bundle outState) { 6254003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang super.onSaveInstanceState(outState); 6264003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_EVENT_ID, mEventId); 6274003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_START_MILLIS, mStartMillis); 6284003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_END_MILLIS, mEndMillis); 62971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan outState.putBoolean(BUNDLE_KEY_IS_DIALOG, mIsDialog); 63060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson outState.putInt(BUNDLE_KEY_ATTENDEE_RESPONSE, mAttendeeResponseFromIntent); 63160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 63260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 63360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 63460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson @Override 63560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 63660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson super.onCreateOptionsMenu(menu, inflater); 63760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (!mIsDialog) { 63860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson inflater.inflate(R.menu.event_info_title_bar, menu); 63960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mMenu = menu; 64060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 6414003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 6424003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 6434003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 6444003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang @Override 6454003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public void onDestroyView() { 64671b221ae5d0f514352584a955630f5494f686c51Michael Chan if (saveResponse()) { 6472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Toast.makeText(getActivity(), R.string.saving_event, Toast.LENGTH_SHORT).show(); 6482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6494003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang super.onDestroyView(); 6502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 6532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onDestroy() { 6542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor != null) { 6552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.close(); 6562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null) { 6582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.close(); 6592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 6612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.close(); 6622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 66371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onDestroy(); 6642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 6672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Asynchronously saves the response to an invitation if the user changed 6682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * the response. Returns true if the database will be updated. 6692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 6702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @param cr the ContentResolver 6712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @return true if the database will be changed 6722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 6732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean saveResponse() { 6742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor == null || mEventCursor == null) { 6752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 6762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 677f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 678f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan RadioGroup radioGroup = (RadioGroup) getView().findViewById(R.id.response_value); 679f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int status = getResponseFromButtonId(radioGroup.getCheckedRadioButtonId()); 680f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan if (status == Attendees.ATTENDEE_STATUS_NONE) { 6812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 6822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the status has not changed, then don't update the database 6852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (status == mOriginalAttendeeResponse) { 6862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 6872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If we never got an owner attendee id we can't set the status 690d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE) { 6912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 6922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 6952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a non-repeating event 6962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 6972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 6982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event 7012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int whichEvents = mEditResponseHelper.getWhichEvents(); 7022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (whichEvents) { 7032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case -1: 7042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 7052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_SINGLE: 7062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang createExceptionResponse(mEventId, mCalendarOwnerAttendeeId, status); 7072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 7082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_ALL: 7092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 7102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 7112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang default: 7122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "Unexpected choice for updating invitation response"); 7132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 7142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 7162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateResponse(long eventId, long attendeeId, int status) { 7192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Update the attendee status in the attendees table. the provider 7202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // takes care of updating the self attendance status. 7212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 7222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(mCalendarOwnerAccount)) { 7242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_EMAIL, mCalendarOwnerAccount); 7252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_STATUS, status); 7272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.EVENT_ID, eventId); 7282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = ContentUris.withAppendedId(Attendees.CONTENT_URI, attendeeId); 7302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startUpdate(mHandler.getNextToken(), null, uri, values, 7322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, Utils.UNDO_DELAY); 7332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void createExceptionResponse(long eventId, long attendeeId, 7362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status) { 7372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor == null || !mEventCursor.moveToFirst()) { 7382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 7392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 740364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik // TODO change this fragment to build a CalendarEventModel and save via 741364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik // EditEventHelper 7422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 7442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String title = mEventCursor.getString(EVENT_INDEX_TITLE); 7462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String timezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE); 7472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int calendarId = mEventCursor.getInt(EVENT_INDEX_CALENDAR_ID); 7482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0; 7492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String syncId = mEventCursor.getString(EVENT_INDEX_SYNC_ID); 7502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.TITLE, title); 7522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.EVENT_TIMEZONE, timezone); 7532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ALL_DAY, allDay ? 1 : 0); 7542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.CALENDAR_ID, calendarId); 7552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.DTSTART, mStartMillis); 7562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.DTEND, mEndMillis); 7570e1e62408b96e1532eb6f6a609ae4c817751aaf3RoboErik values.put(Events.ORIGINAL_SYNC_ID, syncId); 7582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_INSTANCE_TIME, mStartMillis); 7592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_ALL_DAY, allDay ? 1 : 0); 7602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.STATUS, Events.STATUS_CONFIRMED); 7612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.SELF_ATTENDEE_STATUS, status); 7622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 763364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 764364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik int eventIdIndex = ops.size(); 765364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik 766364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik ops.add(ContentProviderOperation.newInsert(Events.CONTENT_URI).withValues(values).build()); 767364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik 768364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik if (mHasAttendeeData) { 769364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik // Insert the new attendees 770364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik for (Attendee attendee : mAcceptedAttendees) { 771364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik addAttendee( 772364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik values, ops, eventIdIndex, attendee, Attendees.ATTENDEE_STATUS_ACCEPTED); 773364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik } 774364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik for (Attendee attendee : mDeclinedAttendees) { 775364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik addAttendee( 776364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik values, ops, eventIdIndex, attendee, Attendees.ATTENDEE_STATUS_DECLINED); 777364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik } 778364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik for (Attendee attendee : mTentativeAttendees) { 779364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik addAttendee( 780364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik values, ops, eventIdIndex, attendee, Attendees.ATTENDEE_STATUS_TENTATIVE); 781364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik } 782364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik for (Attendee attendee : mNoResponseAttendees) { 783364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik addAttendee(values, ops, eventIdIndex, attendee, Attendees.ATTENDEE_STATUS_NONE); 784364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik } 785364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik } 786364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik 7872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Create a recurrence exception 788364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik mHandler.startBatch( 789364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik mHandler.getNextToken(), null, Calendar.AUTHORITY, ops, Utils.UNDO_DELAY); 790364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik } 791364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik 792364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik /** 793364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik * @param values 794364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik * @param ops 795364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik * @param eventIdIndex 796364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik * @param attendee 797364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik */ 798364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik private void addAttendee(ContentValues values, ArrayList<ContentProviderOperation> ops, 799364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik int eventIdIndex, Attendee attendee, int attendeeStatus) { 800364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik ContentProviderOperation.Builder b; 801364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik values.clear(); 802364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik values.put(Attendees.ATTENDEE_NAME, attendee.mName); 803364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik values.put(Attendees.ATTENDEE_EMAIL, attendee.mEmail); 804364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik values.put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE); 805364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik values.put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE); 806364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik values.put(Attendees.ATTENDEE_STATUS, attendeeStatus); 807364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik 808364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik b = ContentProviderOperation.newInsert(Attendees.CONTENT_URI).withValues(values); 809364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik b.withValueBackReference(Attendees.EVENT_ID, eventIdIndex); 810364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik ops.add(b.build()); 8112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 813f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan public static int getResponseFromButtonId(int buttonId) { 814f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int response; 815f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan switch (buttonId) { 816f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case R.id.response_yes: 817f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = Attendees.ATTENDEE_STATUS_ACCEPTED; 818f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 819f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case R.id.response_maybe: 820f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = Attendees.ATTENDEE_STATUS_TENTATIVE; 821f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 822f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case R.id.response_no: 823f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = Attendees.ATTENDEE_STATUS_DECLINED; 824f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 825f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan default: 826f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = Attendees.ATTENDEE_STATUS_NONE; 8272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 828f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan return response; 829f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan } 830f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 831f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan public static int findButtonIdForResponse(int response) { 832f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int buttonId; 833f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan switch (response) { 834f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case Attendees.ATTENDEE_STATUS_ACCEPTED: 835f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = R.id.response_yes; 836f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 837f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case Attendees.ATTENDEE_STATUS_TENTATIVE: 838f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = R.id.response_maybe; 839f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 840f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case Attendees.ATTENDEE_STATUS_DECLINED: 841f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = R.id.response_no; 842f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 843f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan default: 844f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = -1; 845f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan } 846f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan return buttonId; 8472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void doEdit() { 850c41b99be504e395b8c7264a0d626906ccbff1c57Erik Context c = getActivity(); 851c41b99be504e395b8c7264a0d626906ccbff1c57Erik // This ensures that we aren't in the process of closing and have been 852c41b99be504e395b8c7264a0d626906ccbff1c57Erik // unattached already 853c41b99be504e395b8c7264a0d626906ccbff1c57Erik if (c != null) { 854c41b99be504e395b8c7264a0d626906ccbff1c57Erik CalendarController.getInstance(c).sendEventRelatedEvent( 85560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson this, EventType.VIEW_EVENT_DETAILS, mEventId, mStartMillis, mEndMillis, 0 85660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson , 0, -1); 857c41b99be504e395b8c7264a0d626906ccbff1c57Erik } 8582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateEvent(View view) { 861b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson if (mEventCursor == null || view == null) { 8622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 8632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventName = mEventCursor.getString(EVENT_INDEX_TITLE); 8662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventName == null || eventName.length() == 0) { 8672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventName = getActivity().getString(R.string.no_title_label); 8682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0; 8712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String location = mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION); 8722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String description = mEventCursor.getString(EVENT_INDEX_DESCRIPTION); 8732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 874f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson String eventTimezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE); 875f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson String organizer = mEventCursor.getString(EVENT_INDEX_ORGANIZER); 8762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 877f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson mColor = mEventCursor.getInt(EVENT_INDEX_COLOR) & 0xbbffffff; 8788ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan view.findViewById(R.id.color).setBackgroundColor(mColor); 8792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // What 8812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventName != null) { 8822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.title, eventName); 8832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // When 88674c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson String whenDate; 88774c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson int flagsTime = DateUtils.FORMAT_SHOW_TIME; 88874c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson int flagsDate = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY | 88974c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson DateUtils.FORMAT_SHOW_YEAR; 89074c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson 89174c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson if (DateFormat.is24HourFormat(getActivity())) { 89274c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson flagsTime |= DateUtils.FORMAT_24HOUR; 89374c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson } 8942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (allDay) { 89574c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson Formatter f = new Formatter(new StringBuilder(50), Locale.getDefault()); 89674c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson whenDate = DateUtils.formatDateRange(getActivity(), f, mStartMillis, mStartMillis, 89774c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson flagsDate, Time.TIMEZONE_UTC).toString(); 89874c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson setTextCommon(view, R.id.when_date, whenDate); 89974c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson view.findViewById(R.id.when_time).setVisibility(View.GONE); 90074c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson 9012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 90274c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson whenDate = Utils.formatDateRange(getActivity(), mStartMillis, mEndMillis, flagsDate); 90374c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson String whenTime = Utils.formatDateRange(getActivity(), mStartMillis, mEndMillis, 90474c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson flagsTime); 90574c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson setTextCommon(view, R.id.when_date, whenDate); 90674c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson setTextCommon(view, R.id.when_time, whenTime); 9072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 909f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson // Show the event timezone if it is different from the local timezone 910f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson // TODO: Fix comparison of Timezone 911f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson Time time = new Time(); 912f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson String localTimezone = time.timezone; 913f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson if (eventTimezone != null && !localTimezone.equals(eventTimezone) && !allDay) { 914f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson String displayName; 915f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson TimeZone tz = TimeZone.getTimeZone(localTimezone); 916f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson if (tz == null || tz.getID().equals("GMT")) { 917f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson displayName = localTimezone; 918f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson } else { 919f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson displayName = tz.getDisplayName(); 920f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson } 921f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson 922f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson setTextCommon(view, R.id.timezone, displayName); 923f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson setVisibilityCommon(view, R.id.timezone_container, View.VISIBLE); 924f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson } else { 925f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson setVisibilityCommon(view, R.id.timezone_container, View.GONE); 926f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson } 927f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson 9282e46cff640b123ba5f7a67c934ae98e6b02a905fIsaac Katzenelson // Organizer view is setup in the updateCalendar method 9292e46cff640b123ba5f7a67c934ae98e6b02a905fIsaac Katzenelson 9302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Repeat 931bfa0e3f8ccd13c7ef2f334ff431d4fd85f624929Michael Chan if (!TextUtils.isEmpty(rRule)) { 9322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang EventRecurrence eventRecurrence = new EventRecurrence(); 9332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventRecurrence.parse(rRule); 934cb81189e4868769ea016253eca104e46df2f033aErik Time date = new Time(Utils.getTimeZone(getActivity(), mTZUpdater)); 9352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (allDay) { 9362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang date.timezone = Time.TIMEZONE_UTC; 9372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang date.set(mStartMillis); 9392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventRecurrence.setStartDate(date); 9402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String repeatString = EventRecurrenceFormatter.getRepeatString( 9412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().getResources(), eventRecurrence); 9422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.repeat, repeatString); 9439c1989989b8f633210ef1761b0e4e7ecd5b43581Mason Tang setVisibilityCommon(view, R.id.repeat_container, View.VISIBLE); 9442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 9452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.repeat_container, View.GONE); 9462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Where 949ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan if (location == null || location.trim().length() == 0) { 9502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.where, View.GONE); 9512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 952259b8f9a21fffd3858218581e9daaf689b6b888fErik final TextView textView = mWhere; 9532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView != null) { 954ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan textView.setAutoLinkMask(0); 955ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan textView.setText(location.trim()); 956ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan if (!Linkify.addLinks(textView, Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES 957ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan | Linkify.MAP_ADDRESSES)) { 958ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan Linkify.addLinks(textView, mWildcardPattern, "geo:0,0?q="); 959ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan } 960ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan textView.setOnTouchListener(new OnTouchListener() { 961ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan public boolean onTouch(View v, MotionEvent event) { 962ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan try { 963ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan return v.onTouchEvent(event); 964ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan } catch (ActivityNotFoundException e) { 965ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan // ignore 966ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan return true; 9672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 968ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan } 969ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan }); 9702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Description 974352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (description != null && description.length() != 0) { 9752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.description, description); 9762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 977c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson updateDescription (); // Expand or collapse full description 9782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 980259b8f9a21fffd3858218581e9daaf689b6b888fErik private void sendAccessibilityEvent() { 981ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden AccessibilityManager am = 982ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden (AccessibilityManager) getActivity().getSystemService(Service.ACCESSIBILITY_SERVICE); 983259b8f9a21fffd3858218581e9daaf689b6b888fErik if (!am.isEnabled()) { 984259b8f9a21fffd3858218581e9daaf689b6b888fErik return; 985259b8f9a21fffd3858218581e9daaf689b6b888fErik } 986259b8f9a21fffd3858218581e9daaf689b6b888fErik 987259b8f9a21fffd3858218581e9daaf689b6b888fErik AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_FOCUSED); 988259b8f9a21fffd3858218581e9daaf689b6b888fErik event.setClassName(getClass().getName()); 989259b8f9a21fffd3858218581e9daaf689b6b888fErik event.setPackageName(getActivity().getPackageName()); 990259b8f9a21fffd3858218581e9daaf689b6b888fErik List<CharSequence> text = event.getText(); 991259b8f9a21fffd3858218581e9daaf689b6b888fErik 992259b8f9a21fffd3858218581e9daaf689b6b888fErik addFieldToAccessibilityEvent(text, mTitle); 993259b8f9a21fffd3858218581e9daaf689b6b888fErik addFieldToAccessibilityEvent(text, mCalendar); 994259b8f9a21fffd3858218581e9daaf689b6b888fErik addFieldToAccessibilityEvent(text, mWhen); 995259b8f9a21fffd3858218581e9daaf689b6b888fErik addFieldToAccessibilityEvent(text, mWhere); 996259b8f9a21fffd3858218581e9daaf689b6b888fErik addFieldToAccessibilityEvent(text, mWhat); 997259b8f9a21fffd3858218581e9daaf689b6b888fErik addFieldToAccessibilityEvent(text, mAttendees); 998259b8f9a21fffd3858218581e9daaf689b6b888fErik 999259b8f9a21fffd3858218581e9daaf689b6b888fErik RadioGroup response = (RadioGroup) getView().findViewById(R.id.response_value); 1000259b8f9a21fffd3858218581e9daaf689b6b888fErik if (response.getVisibility() == View.VISIBLE) { 1001259b8f9a21fffd3858218581e9daaf689b6b888fErik int id = response.getCheckedRadioButtonId(); 1002259b8f9a21fffd3858218581e9daaf689b6b888fErik if (id != View.NO_ID) { 1003259b8f9a21fffd3858218581e9daaf689b6b888fErik text.add(((TextView) getView().findViewById(R.id.response_label)).getText()); 1004259b8f9a21fffd3858218581e9daaf689b6b888fErik text.add((((RadioButton) (response.findViewById(id))).getText() + PERIOD_SPACE)); 1005259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1006259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1007259b8f9a21fffd3858218581e9daaf689b6b888fErik 1008259b8f9a21fffd3858218581e9daaf689b6b888fErik am.sendAccessibilityEvent(event); 1009259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1010259b8f9a21fffd3858218581e9daaf689b6b888fErik 1011259b8f9a21fffd3858218581e9daaf689b6b888fErik /** 1012259b8f9a21fffd3858218581e9daaf689b6b888fErik * @param text 1013259b8f9a21fffd3858218581e9daaf689b6b888fErik */ 1014259b8f9a21fffd3858218581e9daaf689b6b888fErik private void addFieldToAccessibilityEvent(List<CharSequence> text, TextView view) { 10159ceed1f3df98c5fc85441da0c6e7e5d45cf17a1eIsaac Katzenelson if (view == null) { 10169ceed1f3df98c5fc85441da0c6e7e5d45cf17a1eIsaac Katzenelson return; 10179ceed1f3df98c5fc85441da0c6e7e5d45cf17a1eIsaac Katzenelson } 1018259b8f9a21fffd3858218581e9daaf689b6b888fErik String str = view.toString().trim(); 1019259b8f9a21fffd3858218581e9daaf689b6b888fErik if (!TextUtils.isEmpty(str)) { 1020259b8f9a21fffd3858218581e9daaf689b6b888fErik text.add(mTitle.getText()); 1021259b8f9a21fffd3858218581e9daaf689b6b888fErik text.add(PERIOD_SPACE); 1022259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1023259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1024259b8f9a21fffd3858218581e9daaf689b6b888fErik 10252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateCalendar(View view) { 10262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = ""; 10272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null && mEventCursor != null) { 10282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.moveToFirst(); 10292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String tempAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 10302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = (tempAccount == null) ? "" : tempAccount; 1031352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOwnerCanRespond = mCalendarsCursor.getInt(CALENDARS_INDEX_OWNER_CAN_RESPOND) != 0; 10322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String displayName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 10342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start duplicate calendars query 10362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startQuery(TOKEN_QUERY_DUPLICATE_CALENDARS, null, Calendars.CONTENT_URI, 10372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CALENDARS_PROJECTION, CALENDARS_DUPLICATE_NAME_WHERE, 10382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang new String[] {displayName}, null); 10392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventOrganizer = mEventCursor.getString(EVENT_INDEX_ORGANIZER); 10412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsOrganizer = mCalendarOwnerAccount.equalsIgnoreCase(eventOrganizer); 10422e46cff640b123ba5f7a67c934ae98e6b02a905fIsaac Katzenelson setTextCommon(view, R.id.organizer, eventOrganizer); 1043b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson if (!mIsOrganizer) { 1044b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson setVisibilityCommon(view, R.id.organizer_container, View.VISIBLE); 1045b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson } else { 1046b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson setVisibilityCommon(view, R.id.organizer_container, View.GONE); 1047b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson } 10482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHasAttendeeData = mEventCursor.getInt(EVENT_INDEX_HAS_ATTENDEE_DATA) != 0; 10492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCanModifyCalendar = 10502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) >= Calendars.CONTRIBUTOR_ACCESS; 10512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsBusyFreeCalendar = 10522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) == Calendars.FREEBUSY_ACCESS; 1053352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 1054352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (!mIsBusyFreeCalendar) { 10558ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Button b = (Button) mView.findViewById(R.id.edit); 1056352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan b.setEnabled(true); 10578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan b.setOnClickListener(new OnClickListener() { 10588ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan @Override 10598ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan public void onClick(View v) { 10608ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan doEdit(); 106160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (mIsDialog) { 106260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson EventInfoFragment.this.dismiss(); 106360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 106460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson else { 106560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson getActivity().finish(); 106660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 1067352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 1068352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan }); 10698ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 107069be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik if (!mCanModifyCalendar) { 107160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (mIsDialog) { 107260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mView.findViewById(R.id.delete).setEnabled(false); 107360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 107460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson else { 107560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson MenuItem item = mMenu.findItem(R.id.info_action_delete); 107660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (item != null) { 107760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson item.setVisible(false); 107860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 107960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 108069be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik } 10812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 108271b221ae5d0f514352584a955630f5494f686c51Michael Chan setVisibilityCommon(view, R.id.calendar, View.GONE); 1083259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEventIfQueryDone(TOKEN_QUERY_DUPLICATE_CALENDARS); 10842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateAttendees(View view) { 1088c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson 108960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson // Create a list of attendees: 109060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson // In Dialog mode: a short list of names only 109160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson // In full screen: a full list with photos 109260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (mIsDialog) { 109360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson TextView tv = mAttendees; 109460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson SpannableStringBuilder sb = new SpannableStringBuilder(); 109560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson formatAttendees(mAcceptedAttendees, sb, Attendees.ATTENDEE_STATUS_ACCEPTED); 109660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson formatAttendees(mDeclinedAttendees, sb, Attendees.ATTENDEE_STATUS_DECLINED); 109760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson formatAttendees(mTentativeAttendees, sb, Attendees.ATTENDEE_STATUS_TENTATIVE); 109860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson formatAttendees(mNoResponseAttendees, sb, Attendees.ATTENDEE_STATUS_NONE); 109960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 110060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (sb.length() > 0) { 110160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson // Add the label after the attendees are formatted because 110260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson // formatAttendees would prepend ", " if sb.length != 0 110360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson String label = getActivity().getResources().getString(R.string.attendees_label); 110460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson sb.insert(0, label); 110560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson sb.insert(label.length(), " "); 110660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson sb.setSpan(new StyleSpan(Typeface.BOLD), 0, label.length(), 110760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 1108c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson 110960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson tv.setText(sb); 111060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson tv.setVisibility(View.VISIBLE); 111160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 111260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson else { 111360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson tv.setVisibility(View.GONE); 111460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 111560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } else { 111660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (mAcceptedAttendees.size() + mDeclinedAttendees.size() + 111760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mTentativeAttendees.size() + mNoResponseAttendees.size() > 0) { 111860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson ((AttendeesView)mLongAttendees).addAttendees(mAcceptedAttendees); 111960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson ((AttendeesView)mLongAttendees).addAttendees(mDeclinedAttendees); 112060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson ((AttendeesView)mLongAttendees).addAttendees(mTentativeAttendees); 112160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson ((AttendeesView)mLongAttendees).addAttendees(mNoResponseAttendees); 112260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mLongAttendees.setEnabled(false); 112360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mLongAttendees.setVisibility(View.VISIBLE); 112460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } else { 112560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mLongAttendees.setVisibility(View.GONE); 112660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 112771b221ae5d0f514352584a955630f5494f686c51Michael Chan } 1128c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson 11298ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 11308ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11318ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan private void formatAttendees(ArrayList<Attendee> attendees, SpannableStringBuilder sb, int type) { 11328ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (attendees.size() <= 0) { 11338ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan return; 11348ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 11358ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11368ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan int begin = sb.length(); 11378ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan boolean firstTime = sb.length() == 0; 11388ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11398ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (firstTime == false) { 11408ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan begin += 2; // skip over the ", " for formatting. 11418ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 11428ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11438ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan for (Attendee attendee : attendees) { 11448ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (firstTime) { 11458ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan firstTime = false; 11468ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } else { 11478ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.append(", "); 11488ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 11498ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11508ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan String name = attendee.getDisplayName(); 11518ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.append(name); 11528ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 11538ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11548ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan switch (type) { 11558ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_ACCEPTED: 11568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 11578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_DECLINED: 11588ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.setSpan(new StrikethroughSpan(), begin, sb.length(), 11598ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 11608ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // fall through 11618ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan default: 11628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // The last INCLUSIVE causes the foreground color to be applied 11638ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // to the rest of the span. If not, the comma at the end of the 11648ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // declined or tentative may be black. 11650a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan sb.setSpan(new ForegroundColorSpan(0xFF999999), begin, sb.length(), 11668ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 11678ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 11682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang void updateResponse(View view) { 11722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // we only let the user accept/reject/etc. a meeting if: 11732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // a) you can edit the event's containing calendar AND 11742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // b) you're not the organizer and only attendee AND 11752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // c) organizerCanRespond is enabled for the calendar 11762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (if the attendee data has been hidden, the visible number of attendees 11772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // will be 1 -- the calendar owner's). 11782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (there are more cases involved to be 100% accurate, such as 11792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // paying attention to whether or not an attendee status was 11802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // included in the feed, but we're currently omitting those corner cases 11812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // for simplicity). 1182352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 1183352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // TODO Switch to EditEventHelper.canRespond when this class uses CalendarEventModel. 1184d785cd533f6a3c23813c15315aed74efa9a116f5Michael Chan if (!mCanModifyCalendar || (mHasAttendeeData && mIsOrganizer && mNumOfAttendees <= 1) || 1185352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan (mIsOrganizer && !mOwnerCanRespond)) { 11862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.GONE); 11872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 11882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.VISIBLE); 11912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1192f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 1193f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int response; 1194deced8999da73effe4133e2317c262fea7910090Michael Chan if (mAttendeeResponseFromIntent != CalendarController.ATTENDEE_NO_RESPONSE) { 1195f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = mAttendeeResponseFromIntent; 11962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 1197f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = mOriginalAttendeeResponse; 11982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 1199f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 1200f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int buttonToCheck = findButtonIdForResponse(response); 1201f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan RadioGroup radioGroup = (RadioGroup) view.findViewById(R.id.response_value); 1202f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan radioGroup.check(buttonToCheck); // -1 clear all radio buttons 1203f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan radioGroup.setOnCheckedChangeListener(this); 12042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setTextCommon(View view, int id, CharSequence text) { 12072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView textView = (TextView) view.findViewById(id); 12082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView == null) 12092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setText(text); 12112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setVisibilityCommon(View view, int id, int visibility) { 12142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View v = view.findViewById(id); 12152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (v != null) { 12162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang v.setVisibility(visibility); 12172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 12222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Taken from com.google.android.gm.HtmlConversationActivity 12232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 12242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Send the intent that shows the Contact info corresponding to the email address. 12252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 12262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void showContactInfo(Attendee attendee, Rect rect) { 12272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // First perform lookup query to find existing contact 12282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final ContentResolver resolver = getActivity().getContentResolver(); 12292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String address = attendee.mEmail; 12302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri dataUri = Uri.withAppendedPath(CommonDataKinds.Email.CONTENT_FILTER_URI, 12312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri.encode(address)); 12322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri lookupUri = ContactsContract.Data.getContactLookupUri(resolver, dataUri); 12332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (lookupUri != null) { 12352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Found matching contact, trigger QuickContact 12362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.showQuickContact(getActivity(), rect, lookupUri, 12372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.MODE_MEDIUM, null); 12382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 12392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // No matching contact, ask user to create one 12402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri mailUri = Uri.fromParts("mailto", address, null); 12412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, mailUri); 12422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Pass along full E-mail string for possible create dialog 12442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Rfc822Token sender = new Rfc822Token(attendee.mName, attendee.mEmail, null); 12452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.EXTRA_CREATE_DESCRIPTION, sender.toString()); 12462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Only provide personal name hint if we have one 12482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String senderPersonal = attendee.mName; 12492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(senderPersonal)) { 12502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.Insert.NAME, senderPersonal); 12512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startActivity(intent); 12542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 1256cb81189e4868769ea016253eca104e46df2f033aErik 1257cb81189e4868769ea016253eca104e46df2f033aErik @Override 12587c6236d5553dc9f3d004ebbed794249713a11d19RoboErik public void onPause() { 12597c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mIsPaused = true; 12607c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mHandler.removeCallbacks(onDeleteRunnable); 12617c6236d5553dc9f3d004ebbed794249713a11d19RoboErik super.onPause(); 12627c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 12637c6236d5553dc9f3d004ebbed794249713a11d19RoboErik 12647c6236d5553dc9f3d004ebbed794249713a11d19RoboErik @Override 12657c6236d5553dc9f3d004ebbed794249713a11d19RoboErik public void onResume() { 12667c6236d5553dc9f3d004ebbed794249713a11d19RoboErik super.onResume(); 12677c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mIsPaused = false; 12687c6236d5553dc9f3d004ebbed794249713a11d19RoboErik if (mDismissOnResume) { 12697c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mHandler.post(onDeleteRunnable); 12707c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 12717c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 12727c6236d5553dc9f3d004ebbed794249713a11d19RoboErik 12737c6236d5553dc9f3d004ebbed794249713a11d19RoboErik @Override 1274cb81189e4868769ea016253eca104e46df2f033aErik public void eventsChanged() { 1275cb81189e4868769ea016253eca104e46df2f033aErik } 1276cb81189e4868769ea016253eca104e46df2f033aErik 1277cb81189e4868769ea016253eca104e46df2f033aErik @Override 1278cb81189e4868769ea016253eca104e46df2f033aErik public long getSupportedEventTypes() { 1279cb81189e4868769ea016253eca104e46df2f033aErik return EventType.EVENTS_CHANGED; 1280cb81189e4868769ea016253eca104e46df2f033aErik } 1281cb81189e4868769ea016253eca104e46df2f033aErik 1282cb81189e4868769ea016253eca104e46df2f033aErik @Override 1283cb81189e4868769ea016253eca104e46df2f033aErik public void handleEvent(EventInfo event) { 1284cb81189e4868769ea016253eca104e46df2f033aErik if (event.eventType == EventType.EVENTS_CHANGED) { 1285cb81189e4868769ea016253eca104e46df2f033aErik // reload the data 1286cb81189e4868769ea016253eca104e46df2f033aErik mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION, 1287cb81189e4868769ea016253eca104e46df2f033aErik null, null, null); 1288cb81189e4868769ea016253eca104e46df2f033aErik } 1289cb81189e4868769ea016253eca104e46df2f033aErik 1290cb81189e4868769ea016253eca104e46df2f033aErik } 12912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang} 1292