EventInfoFragment.java revision 1121e409c5f504e8df75982475d8cc607d5f0dfa
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; 221ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport com.android.calendar.CalendarEventModel.ReminderEntry; 23c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelsonimport com.android.calendar.event.AttendeesView; 24fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.event.EditEventHelper; 258ed988fbac3e988f0408490a1d61101c4176686dAndy McFaddenimport com.android.calendarcommon.EventRecurrence; 261ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport com.android.calendar.event.EventViewUtils; 272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 282bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.app.Activity; 2971d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.Dialog; 3071d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.DialogFragment; 31ef31a98202852807f460af49ae3313d1ccf5e288Andy McFaddenimport android.app.Service; 322bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ActivityNotFoundException; 33364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erikimport android.content.ContentProviderOperation; 342bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentResolver; 352bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentUris; 362bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentValues; 372bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Context; 382bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Intent; 391ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport android.content.SharedPreferences; 402bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.res.Resources; 412bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.Cursor; 422bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.Rect; 4371b221ae5d0f514352584a955630f5494f686c51Michael Chanimport android.graphics.Typeface; 442bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.net.Uri; 452bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.os.Bundle; 46a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract; 47a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Attendees; 48a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Calendars; 49a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Events; 501ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport android.provider.CalendarContract.Reminders; 51cb81189e4868769ea016253eca104e46df2f033aErikimport android.provider.ContactsContract; 522bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.CommonDataKinds; 532bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Intents; 542bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.QuickContact; 558ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.Spannable; 568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.SpannableStringBuilder; 572bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.TextUtils; 582bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateFormat; 592bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateUtils; 602bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.Time; 618ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.ForegroundColorSpan; 628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.StrikethroughSpan; 6371b221ae5d0f514352584a955630f5494f686c51Michael Chanimport android.text.style.StyleSpan; 642bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Linkify; 652bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Rfc822Token; 662bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.util.Log; 6771d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Gravity; 682bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.LayoutInflater; 6960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.Menu; 7060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.MenuInflater; 7160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.MenuItem; 722bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MotionEvent; 732bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.View; 74cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnClickListener; 75cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnTouchListener; 762bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.ViewGroup; 7771d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Window; 7871d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.WindowManager; 79259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.view.accessibility.AccessibilityEvent; 80259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.view.accessibility.AccessibilityManager; 812bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.AdapterView; 828ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.widget.Button; 831ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport android.widget.ImageButton; 841ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport android.widget.LinearLayout; 85259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.widget.RadioButton; 86f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanimport android.widget.RadioGroup; 871ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport android.widget.ScrollView; 88f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanimport android.widget.RadioGroup.OnCheckedChangeListener; 892bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.TextView; 902bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Toast; 912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 922bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.ArrayList; 931ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport java.util.Arrays; 941ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport java.util.Collections; 9574c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelsonimport java.util.Formatter; 96259b8f9a21fffd3858218581e9daaf689b6b888fErikimport java.util.List; 9774c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelsonimport java.util.Locale; 982bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.regex.Pattern; 99f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelsonimport java.util.TimeZone; 100f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson 1012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 102f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanpublic class EventInfoFragment extends DialogFragment implements OnCheckedChangeListener, 1031ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson CalendarController.EventHandler, OnClickListener { 104d845fbe558d5229102b58cce70a1b29fe6cb6967Erik public static final boolean DEBUG = false; 1052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1062c7c851a4e40afa83a741ec39d44425b705a712eMichael Chan public static final String TAG = "EventInfoFragment"; 1072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_EVENT_ID = "key_event_id"; 10960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_START_MILLIS = "key_start_millis"; 11060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_END_MILLIS = "key_end_millis"; 11160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_IS_DIALOG = "key_fragment_is_dialog"; 11260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson protected static final String BUNDLE_KEY_ATTENDEE_RESPONSE = "key_attendee_response"; 11371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 114259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final String PERIOD_SPACE = ". "; 115259b8f9a21fffd3858218581e9daaf689b6b888fErik 1162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 1172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * These are the corresponding indices into the array of strings 1182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * "R.array.change_response_labels" in the resource file. 1192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 1202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_SINGLE = 0; 1212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int UPDATE_ALL = 1; 1222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Query tokens for QueryHandler 124259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_EVENT = 1 << 0; 125259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_CALENDARS = 1 << 1; 126259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_ATTENDEES = 1 << 2; 127259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_DUPLICATE_CALENDARS = 1 << 3; 1281ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final int TOKEN_QUERY_REMINDERS = 1 << 4; 129259b8f9a21fffd3858218581e9daaf689b6b888fErik private static final int TOKEN_QUERY_ALL = TOKEN_QUERY_DUPLICATE_CALENDARS 1301ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson | TOKEN_QUERY_ATTENDEES | TOKEN_QUERY_CALENDARS | TOKEN_QUERY_EVENT 1311ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson | TOKEN_QUERY_REMINDERS; 132259b8f9a21fffd3858218581e9daaf689b6b888fErik private int mCurrentQuery = 0; 1332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] EVENT_PROJECTION = new String[] { 1352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._ID, // 0 do not remove; used in DeleteEventHelper 1362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.TITLE, // 1 do not remove; used in DeleteEventHelper 1372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.RRULE, // 2 do not remove; used in DeleteEventHelper 1382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.ALL_DAY, // 3 do not remove; used in DeleteEventHelper 1392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.CALENDAR_ID, // 4 do not remove; used in DeleteEventHelper 1402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DTSTART, // 5 do not remove; used in DeleteEventHelper 1412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events._SYNC_ID, // 6 do not remove; used in DeleteEventHelper 1422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_TIMEZONE, // 7 do not remove; used in DeleteEventHelper 1432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.DESCRIPTION, // 8 1442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Events.EVENT_LOCATION, // 9 145ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik Calendars.CALENDAR_ACCESS_LEVEL, // 10 1460e1e62408b96e1532eb6f6a609ae4c817751aaf3RoboErik Calendars.CALENDAR_COLOR, // 11 14771b221ae5d0f514352584a955630f5494f686c51Michael Chan Events.HAS_ATTENDEE_DATA, // 12 14871b221ae5d0f514352584a955630f5494f686c51Michael Chan Events.ORGANIZER, // 13 1491ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Events.HAS_ALARM, // 14 1501ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Calendars.MAX_REMINDERS, //15 1511ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Calendars.ALLOWED_REMINDERS, // 16 1521ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Events.ORIGINAL_SYNC_ID // 17 do not remove; used in DeleteEventHelper 1532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ID = 0; 1552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_TITLE = 1; 1562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_RRULE = 2; 1572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_ALL_DAY = 3; 1582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_CALENDAR_ID = 4; 1592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_SYNC_ID = 6; 1602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_TIMEZONE = 7; 1612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_DESCRIPTION = 8; 1622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int EVENT_INDEX_EVENT_LOCATION = 9; 16371b221ae5d0f514352584a955630f5494f686c51Michael Chan private static final int EVENT_INDEX_ACCESS_LEVEL = 10; 16471b221ae5d0f514352584a955630f5494f686c51Michael Chan private static final int EVENT_INDEX_COLOR = 11; 16571b221ae5d0f514352584a955630f5494f686c51Michael Chan private static final int EVENT_INDEX_HAS_ATTENDEE_DATA = 12; 16671b221ae5d0f514352584a955630f5494f686c51Michael Chan private static final int EVENT_INDEX_ORGANIZER = 13; 1671ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final int EVENT_INDEX_HAS_ALARM = 14; 1681ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final int EVENT_INDEX_MAX_REMINDERS = 15; 1691ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final int EVENT_INDEX_ALLOWED_REMINDERS = 16; 1701ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 1712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String[] ATTENDEES_PROJECTION = new String[] { 1732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees._ID, // 0 1742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_NAME, // 1 1752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_EMAIL, // 2 1762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_RELATIONSHIP, // 3 1772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Attendees.ATTENDEE_STATUS, // 4 1782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 1792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_ID = 0; 1802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_NAME = 1; 1812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_EMAIL = 2; 1822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_RELATIONSHIP = 3; 1832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final int ATTENDEES_INDEX_STATUS = 4; 1842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?"; 1862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private static final String ATTENDEES_SORT_ORDER = Attendees.ATTENDEE_NAME + " ASC, " 1882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang + Attendees.ATTENDEE_EMAIL + " ASC"; 1892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1901ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final String[] REMINDERS_PROJECTION = new String[] { 1911ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Reminders._ID, // 0 1921ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Reminders.MINUTES, // 1 1931ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Reminders.METHOD // 2 1941ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson }; 1951ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final int REMINDERS_INDEX_ID = 0; 1961ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final int REMINDERS_MINUTES_ID = 1; 1971ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final int REMINDERS_METHOD_ID = 2; 1981ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 1991ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static final String REMINDERS_WHERE = Reminders.EVENT_ID + "=?"; 2001ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String[] CALENDARS_PROJECTION = new String[] { 2022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars._ID, // 0 203ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik Calendars.CALENDAR_DISPLAY_NAME, // 1 2042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Calendars.OWNER_ACCOUNT, // 2 205950e8a615f3dcca0b61b2eb8f8de72ecf6825d4bAndy McFadden Calendars.CAN_ORGANIZER_RESPOND // 3 2062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang }; 2072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_DISPLAY_NAME = 1; 2082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2; 2092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final int CALENDARS_INDEX_OWNER_CAN_RESPOND = 3; 2102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang static final String CALENDARS_WHERE = Calendars._ID + "=?"; 212ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik static final String CALENDARS_DUPLICATE_NAME_WHERE = Calendars.CALENDAR_DISPLAY_NAME + "=?"; 2132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private View mView; 2152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Uri mUri; 2172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEventId; 2182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mEventCursor; 2192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mAttendeesCursor; 2202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Cursor mCalendarsCursor; 2211ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private Cursor mRemindersCursor; 2221ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2230a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan private static float mScale = 0; // Used for supporting different screen densities 2242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mStartMillis; 2262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private long mEndMillis; 2272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mHasAttendeeData; 2292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsOrganizer; 230d845fbe558d5229102b58cce70a1b29fe6cb6967Erik private long mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 231352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private boolean mOwnerCanRespond; 2322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private String mCalendarOwnerAccount; 2332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mCanModifyCalendar; 2342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsBusyFreeCalendar; 2352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mNumOfAttendees; 2362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private EditResponseHelper mEditResponseHelper; 2382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mOriginalAttendeeResponse; 240deced8999da73effe4133e2317c262fea7910090Michael Chan private int mAttendeeResponseFromIntent = CalendarController.ATTENDEE_NO_RESPONSE; 2412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean mIsRepeating; 2421ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private boolean mHasAlarm; 2431ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private int mMaxReminders; 2441ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private String mCalendarAllowedReminders; 2452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 246259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mTitle; 247259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mWhen; 248259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mWhere; 249259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mWhat; 250259b8f9a21fffd3858218581e9daaf689b6b888fErik private TextView mAttendees; 251c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private AttendeesView mLongAttendees; 25260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson private Menu mMenu; 253fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson private View mHeadlines; 2541ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private ScrollView mScrollView; 255259b8f9a21fffd3858218581e9daaf689b6b888fErik 2562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private Pattern mWildcardPattern = Pattern.compile("^.*$"); 2572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mAcceptedAttendees = new ArrayList<Attendee>(); 2592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mDeclinedAttendees = new ArrayList<Attendee>(); 2602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mTentativeAttendees = new ArrayList<Attendee>(); 2612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ArrayList<Attendee> mNoResponseAttendees = new ArrayList<Attendee>(); 2622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private int mColor; 2632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 2641ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2651ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private int mDefaultReminderMinutes; 2661ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private ArrayList<LinearLayout> mReminderViews = new ArrayList<LinearLayout>(0); 2671ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson public ArrayList<ReminderEntry> mReminders; 2681ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson public ArrayList<ReminderEntry> mOriginalReminders; 2691ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2701ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson /** 2711ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * Contents of the "minutes" spinner. This has default values from the XML file, augmented 2721ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * with any additional values that were already associated with the event. 2731ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson */ 2741ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private ArrayList<Integer> mReminderMinuteValues; 2751ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private ArrayList<String> mReminderMinuteLabels; 2761ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2771ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson /** 2781ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * Contents of the "methods" spinner. The "values" list specifies the method constant 2791ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * (e.g. {@link Reminders#METHOD_ALERT}) associated with the labels. Any methods that 2801ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * aren't allowed by the Calendar will be removed. 2811ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson */ 2821ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private ArrayList<Integer> mReminderMethodValues; 2831ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private ArrayList<String> mReminderMethodLabels; 2841ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2851ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2861ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 2872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private QueryHandler mHandler; 2882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 289cb81189e4868769ea016253eca104e46df2f033aErik private Runnable mTZUpdater = new Runnable() { 290cb81189e4868769ea016253eca104e46df2f033aErik @Override 291cb81189e4868769ea016253eca104e46df2f033aErik public void run() { 292cb81189e4868769ea016253eca104e46df2f033aErik updateEvent(mView); 293cb81189e4868769ea016253eca104e46df2f033aErik } 294cb81189e4868769ea016253eca104e46df2f033aErik }; 295cb81189e4868769ea016253eca104e46df2f033aErik 2962fc6b79dfb06812baf2e6c547f3ffee83b5c3e9aMichael Chan private static int DIALOG_WIDTH = 500; 2972fc6b79dfb06812baf2e6c547f3ffee83b5c3e9aMichael Chan private static int DIALOG_HEIGHT = 600; 29871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private boolean mIsDialog = false; 2997c6236d5553dc9f3d004ebbed794249713a11d19RoboErik private boolean mIsPaused = true; 3007c6236d5553dc9f3d004ebbed794249713a11d19RoboErik private boolean mDismissOnResume = false; 30171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mX = -1; 30271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private int mY = -1; 303c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private Button mDescButton; // Button to expand/collapse the description 304c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private String mMoreLabel; // Labels for the button 305c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private String mLessLabel; 306c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private boolean mShowMaxDescription; // Current status of button 307c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private int mDescLineNum; // The default number of lines in the description 30810b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson private boolean mIsTabletConfig; 30910b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson private Activity mActivity; 31071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 3112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private class QueryHandler extends AsyncQueryService { 3122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public QueryHandler(Context context) { 3132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super(context); 3142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 3172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 3184003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // if the activity is finishing, then close the cursor and return 3194003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang final Activity activity = getActivity(); 3204003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (activity == null || activity.isFinishing()) { 3214003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang cursor.close(); 3224003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang return; 3234003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 3244003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 3252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (token) { 3262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_EVENT: 3272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor = Utils.matrixCursorFromCursor(cursor); 3282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (initEventCursor()) { 3292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // The cursor is empty. This can happen if the event was 3302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // deleted. 3312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // FRAG_TODO we should no longer rely on Activity.finish() 3321df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity.finish(); 3332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 3342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateEvent(mView); 3362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 3372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start calendar query 3382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = Calendars.CONTENT_URI; 3392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String[] args = new String[] { 3402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Long.toString(mEventCursor.getLong(EVENT_INDEX_CALENDAR_ID))}; 3412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startQuery(TOKEN_QUERY_CALENDARS, null, uri, CALENDARS_PROJECTION, 3422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CALENDARS_WHERE, args, null); 3432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_CALENDARS: 3452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor = Utils.matrixCursorFromCursor(cursor); 3462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateCalendar(mView); 3474003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // FRAG_TODO fragments shouldn't set the title anymore 3482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateTitle(); 3491df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang // update the action bar since our option set might have changed 3501df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang activity.invalidateOptionsMenu(); 3512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 352352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (!mIsBusyFreeCalendar) { 353352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan args = new String[] { Long.toString(mEventId) }; 354352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 355352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // start attendees query 356352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan uri = Attendees.CONTENT_URI; 357352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan startQuery(TOKEN_QUERY_ATTENDEES, null, uri, ATTENDEES_PROJECTION, 358352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan ATTENDEES_WHERE, args, ATTENDEES_SORT_ORDER); 359259b8f9a21fffd3858218581e9daaf689b6b888fErik } else { 360259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEventIfQueryDone(TOKEN_QUERY_ATTENDEES); 3612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 3621ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mOriginalReminders = new ArrayList<ReminderEntry> (); 3631ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (mHasAlarm) { 3641ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // start reminders query 3651ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson args = new String[] { Long.toString(mEventId) }; 3661ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson uri = Reminders.CONTENT_URI; 3671ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson startQuery(TOKEN_QUERY_REMINDERS, null, uri, 3681ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson REMINDERS_PROJECTION, REMINDERS_WHERE, args, null); 3691ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } else { 3701ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson sendAccessibilityEventIfQueryDone(TOKEN_QUERY_REMINDERS); 3711ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 3722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_ATTENDEES: 3742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor = Utils.matrixCursorFromCursor(cursor); 3752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang initAttendeesCursor(mView); 3762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mView); 3772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 3781ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson case TOKEN_QUERY_REMINDERS: 3791ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mRemindersCursor = Utils.matrixCursorFromCursor(cursor); 3801ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson initReminders(mView, mRemindersCursor); 3811ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson break; 3822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case TOKEN_QUERY_DUPLICATE_CALENDARS: 38371b221ae5d0f514352584a955630f5494f686c51Michael Chan Resources res = activity.getResources(); 38471b221ae5d0f514352584a955630f5494f686c51Michael Chan SpannableStringBuilder sb = new SpannableStringBuilder(); 38571b221ae5d0f514352584a955630f5494f686c51Michael Chan 38671b221ae5d0f514352584a955630f5494f686c51Michael Chan // Label 38771b221ae5d0f514352584a955630f5494f686c51Michael Chan String label = res.getString(R.string.view_event_calendar_label); 38871b221ae5d0f514352584a955630f5494f686c51Michael Chan sb.append(label).append(" "); 38971b221ae5d0f514352584a955630f5494f686c51Michael Chan sb.setSpan(new StyleSpan(Typeface.BOLD), 0, label.length(), 39071b221ae5d0f514352584a955630f5494f686c51Michael Chan Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 39171b221ae5d0f514352584a955630f5494f686c51Michael Chan 39271b221ae5d0f514352584a955630f5494f686c51Michael Chan // Calendar display name 3932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String calendarName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 39471b221ae5d0f514352584a955630f5494f686c51Michael Chan sb.append(calendarName); 39571b221ae5d0f514352584a955630f5494f686c51Michael Chan 39671b221ae5d0f514352584a955630f5494f686c51Michael Chan // Show email account if display name is not unique and 39771b221ae5d0f514352584a955630f5494f686c51Michael Chan // display name != email 39871b221ae5d0f514352584a955630f5494f686c51Michael Chan String email = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 39971b221ae5d0f514352584a955630f5494f686c51Michael Chan if (cursor.getCount() > 1 && !calendarName.equalsIgnoreCase(email)) { 40071b221ae5d0f514352584a955630f5494f686c51Michael Chan sb.append(" (").append(email).append(")"); 40171b221ae5d0f514352584a955630f5494f686c51Michael Chan } 40271b221ae5d0f514352584a955630f5494f686c51Michael Chan 4032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 4042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang cursor.close(); 406259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEventIfQueryDone(token); 4072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 4092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 411259b8f9a21fffd3858218581e9daaf689b6b888fErik private void sendAccessibilityEventIfQueryDone(int token) { 412259b8f9a21fffd3858218581e9daaf689b6b888fErik mCurrentQuery |= token; 413259b8f9a21fffd3858218581e9daaf689b6b888fErik if (mCurrentQuery == TOKEN_QUERY_ALL) { 414259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEvent(); 415259b8f9a21fffd3858218581e9daaf689b6b888fErik } 416259b8f9a21fffd3858218581e9daaf689b6b888fErik } 417259b8f9a21fffd3858218581e9daaf689b6b888fErik 4180a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan public EventInfoFragment(Context context, Uri uri, long startMillis, long endMillis, 41960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson int attendeeResponse, boolean isDialog) { 4200b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson 4210a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan if (mScale == 0) { 4220a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan mScale = context.getResources().getDisplayMetrics().density; 4230a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan if (mScale != 1) { 4240a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan DIALOG_WIDTH *= mScale; 4250a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan DIALOG_HEIGHT *= mScale; 4260a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan } 4270a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan } 42860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mIsDialog = isDialog; 429c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson 4302fc6b79dfb06812baf2e6c547f3ffee83b5c3e9aMichael Chan setStyle(DialogFragment.STYLE_NO_TITLE, 0); 4312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mUri = uri; 4322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mStartMillis = startMillis; 4332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEndMillis = endMillis; 4342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeeResponseFromIntent = attendeeResponse; 4352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 4362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 437ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden // This is currently required by the fragment manager. 43860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson public EventInfoFragment() { 43960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 44060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 44160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 44260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 4430a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan public EventInfoFragment(Context context, long eventId, long startMillis, long endMillis, 44460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson int attendeeResponse, boolean isDialog) { 4450a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan this(context, ContentUris.withAppendedId(Events.CONTENT_URI, eventId), startMillis, 44660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson endMillis, attendeeResponse, isDialog); 4474003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = eventId; 4484003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 4494003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 45071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan @Override 45171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan public void onActivityCreated(Bundle savedInstanceState) { 45271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onActivityCreated(savedInstanceState); 45371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 45471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (savedInstanceState != null) { 45571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mIsDialog = savedInstanceState.getBoolean(BUNDLE_KEY_IS_DIALOG, false); 45671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 45771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 45871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan if (mIsDialog) { 45971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan applyDialogParams(); 46071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 46171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 46271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 46371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan private void applyDialogParams() { 46471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Dialog dialog = getDialog(); 46571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan dialog.setCanceledOnTouchOutside(true); 46671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 46771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan Window window = dialog.getWindow(); 46871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 46971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 47071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan WindowManager.LayoutParams a = window.getAttributes(); 47171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.dimAmount = .4f; 47271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 47371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan a.width = DIALOG_WIDTH; 474352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan a.height = DIALOG_HEIGHT; 47571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 4760b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson 4770b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson // On tablets , do smart positioning of dialog 4780b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson // On phones , use the whole screen 4790b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson 48060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (mX != -1 || mY != -1) { 48160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson a.x = mX - a.width - 64; 48260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (a.x < 0) { 48360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson a.x = mX + 64; 4840a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan } 48560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson a.y = mY - 64; 48660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson a.gravity = Gravity.LEFT | Gravity.TOP; 48771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 48871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan window.setAttributes(a); 48971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 49071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 49160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson public void setDialogParams(int x, int y) { 49271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mX = x; 49371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan mY = y; 49471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan } 49571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan 496f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan // Implements OnCheckedChangeListener 497f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan @Override 498f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan public void onCheckedChanged(RadioGroup group, int checkedId) { 4992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If this is not a repeating event, then don't display the dialog 5002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // asking which events to change. 5012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 5022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 5032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the selection is the same as the original, then don't display the 5062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // dialog asking which events to change. 507f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan if (checkedId == findButtonIdForResponse(mOriginalAttendeeResponse)) { 5082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 5092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event. We need to ask the user if they mean to 5122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // change just this one instance or all instances. 5132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEditResponseHelper.showDialog(mEditResponseHelper.getWhichEvents()); 5142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onNothingSelected(AdapterView<?> parent) { 5172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 5202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onAttach(Activity activity) { 5212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang super.onAttach(activity); 52210b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson mActivity = activity; 5232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEditResponseHelper = new EditResponseHelper(activity); 5242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler = new QueryHandler(activity); 52560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mDescLineNum = activity.getResources().getInteger((R.integer.event_info_desc_line_num)); 52660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mMoreLabel = activity.getResources().getString((R.string.event_info_desc_more)); 52760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mLessLabel = activity.getResources().getString((R.string.event_info_desc_less)); 52860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (!mIsDialog) { 52960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson setHasOptionsMenu(true); 53060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 5312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 5322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 5342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public View onCreateView(LayoutInflater inflater, ViewGroup container, 5352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Bundle savedInstanceState) { 5368b71d11235e7ebc02f62435d2c6583edb43c26a2Michael Chan mView = inflater.inflate(R.layout.event_info, container, false); 5371ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mScrollView = (ScrollView) mView.findViewById(R.id.event_info_scroll_view); 538259b8f9a21fffd3858218581e9daaf689b6b888fErik mTitle = (TextView) mView.findViewById(R.id.title); 539259b8f9a21fffd3858218581e9daaf689b6b888fErik mWhen = (TextView) mView.findViewById(R.id.when); 540259b8f9a21fffd3858218581e9daaf689b6b888fErik mWhere = (TextView) mView.findViewById(R.id.where); 541259b8f9a21fffd3858218581e9daaf689b6b888fErik mWhat = (TextView) mView.findViewById(R.id.description); 542259b8f9a21fffd3858218581e9daaf689b6b888fErik mAttendees = (TextView) mView.findViewById(R.id.attendee_list); 543fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mHeadlines = mView.findViewById(R.id.event_info_headline); 544c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mLongAttendees = (AttendeesView)mView.findViewById(R.id.long_attendee_list); 545c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton = (Button)mView.findViewById(R.id.desc_expand); 546c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton.setOnClickListener(new View.OnClickListener() { 547ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden @Override 548c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson public void onClick(View v) { 549c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mShowMaxDescription = !mShowMaxDescription; 550c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson updateDescription(); 551c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson } 552c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson }); 553c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mShowMaxDescription = false; // Show short version of description as default. 55410b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson mIsTabletConfig = Utils.getConfigBool(mActivity, R.bool.tablet_config); 5552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 5564003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (mUri == null) { 5574003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // restore event ID from bundle 5584003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEventId = savedInstanceState.getLong(BUNDLE_KEY_EVENT_ID); 5594003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 5604003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mStartMillis = savedInstanceState.getLong(BUNDLE_KEY_START_MILLIS); 5614003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mEndMillis = savedInstanceState.getLong(BUNDLE_KEY_END_MILLIS); 5624003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 5634003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 5642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start loading the data 5652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION, 5662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, null); 5672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 56889ad0822f104015625f4ca88bfdf5c1d522b6e74Erik Button b = (Button) mView.findViewById(R.id.delete); 5698ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan b.setOnClickListener(new OnClickListener() { 5708ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan @Override 5718ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan public void onClick(View v) { 57269be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik if (!mCanModifyCalendar) { 57369be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik return; 57469be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik } 57589ad0822f104015625f4ca88bfdf5c1d522b6e74Erik DeleteEventHelper deleteHelper = new DeleteEventHelper( 5761ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson getActivity(), getActivity(), 5771ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson !mIsDialog && !mIsTabletConfig /* exitWhenDone */); 57889ad0822f104015625f4ca88bfdf5c1d522b6e74Erik deleteHelper.delete(mStartMillis, mEndMillis, mEventId, -1, onDeleteRunnable); 5798ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan }}); 5808ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 58110b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson // Hide Edit/Delete buttons if in full screen mode on a phone 582fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson if (savedInstanceState != null) { 583fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mIsDialog = savedInstanceState.getBoolean(BUNDLE_KEY_IS_DIALOG, false); 584fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson } 58510b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson if (!mIsDialog && !mIsTabletConfig) { 58660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mView.findViewById(R.id.event_info_buttons_container).setVisibility(View.GONE); 58760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 58860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 5891ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Create a listener for the add reminder button 5901ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 5911ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ImageButton reminderAddButton = (ImageButton) mView.findViewById(R.id.reminder_add); 5921ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson View.OnClickListener addReminderOnClickListener = new View.OnClickListener() { 5931ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson @Override 5941ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson public void onClick(View v) { 5951ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson addReminder(); 5961ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 5971ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson }; 5981ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson reminderAddButton.setOnClickListener(addReminderOnClickListener); 5991ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 6001ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Set reminders variables 6011ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 6021ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson SharedPreferences prefs = GeneralPreferences.getSharedPreferences(mActivity); 6031ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson String defaultReminderString = prefs.getString( 6041ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson GeneralPreferences.KEY_DEFAULT_REMINDER, GeneralPreferences.NO_REMINDER_STRING); 6051ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mDefaultReminderMinutes = Integer.parseInt(defaultReminderString); 6061ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson prepareReminders(); 6071ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 6082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return mView; 6092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 61189ad0822f104015625f4ca88bfdf5c1d522b6e74Erik private Runnable onDeleteRunnable = new Runnable() { 61289ad0822f104015625f4ca88bfdf5c1d522b6e74Erik @Override 61389ad0822f104015625f4ca88bfdf5c1d522b6e74Erik public void run() { 6147c6236d5553dc9f3d004ebbed794249713a11d19RoboErik if (EventInfoFragment.this.mIsPaused) { 6157c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mDismissOnResume = true; 6167c6236d5553dc9f3d004ebbed794249713a11d19RoboErik return; 6177c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 61889ad0822f104015625f4ca88bfdf5c1d522b6e74Erik if (EventInfoFragment.this.isVisible()) { 61989ad0822f104015625f4ca88bfdf5c1d522b6e74Erik EventInfoFragment.this.dismiss(); 62089ad0822f104015625f4ca88bfdf5c1d522b6e74Erik } 62189ad0822f104015625f4ca88bfdf5c1d522b6e74Erik } 62289ad0822f104015625f4ca88bfdf5c1d522b6e74Erik }; 62389ad0822f104015625f4ca88bfdf5c1d522b6e74Erik 624c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson // Sets the description: 625c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson // Set the expand/collapse button 626c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson // Expand/collapse the description according the the current status 627c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson private void updateDescription() { 628c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson // Description is short, hide button 629c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson if (mWhat.getLineCount() <= mDescLineNum) { 630c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton.setVisibility(View.GONE); 631c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson return; 632c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson } 633c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson // Show button and set label according to the expand/collapse status 634c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton.setVisibility(View.VISIBLE); 635c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson if (mShowMaxDescription) { 636c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton.setText(mLessLabel); 637c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mWhat.setLines(mWhat.getLineCount()); 638c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson } else { 639c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mDescButton.setText(mMoreLabel); 640c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson mWhat.setLines(mDescLineNum); 641c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson } 642c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson } 643c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson 6442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateTitle() { 6452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Resources res = getActivity().getResources(); 6462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCanModifyCalendar && !mIsOrganizer) { 6472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title_invite)); 6482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 6492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang getActivity().setTitle(res.getString(R.string.event_info_title)); 6502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 6542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Initializes the event cursor, which is expected to point to the first 6552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * (and only) result from a query. 6562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @return true if the cursor is empty. 6572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 6582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean initEventCursor() { 6592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if ((mEventCursor == null) || (mEventCursor.getCount() == 0)) { 6602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 6612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.moveToFirst(); 6632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventId = mEventCursor.getInt(EVENT_INDEX_ID); 6642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 66566b2067e0a389180f909eb0a528bea5f6becca23Michael Chan mIsRepeating = !TextUtils.isEmpty(rRule); 6661ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mHasAlarm = (mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) == 1)?true:false; 6671ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mMaxReminders = mEventCursor.getInt(EVENT_INDEX_MAX_REMINDERS); 6681ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mCalendarAllowedReminders = mEventCursor.getString(EVENT_INDEX_ALLOWED_REMINDERS); 6692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 6702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 6712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @SuppressWarnings("fallthrough") 6732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void initAttendeesCursor(View view) { 674deced8999da73effe4133e2317c262fea7910090Michael Chan mOriginalAttendeeResponse = CalendarController.ATTENDEE_NO_RESPONSE; 675d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE; 6762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = 0; 6772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 6782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNumOfAttendees = mAttendeesCursor.getCount(); 6792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor.moveToFirst()) { 6802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAcceptedAttendees.clear(); 6812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mDeclinedAttendees.clear(); 6822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mTentativeAttendees.clear(); 6832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mNoResponseAttendees.clear(); 6842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 6852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang do { 6862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int status = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 6872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String name = mAttendeesCursor.getString(ATTENDEES_INDEX_NAME); 6882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String email = mAttendeesCursor.getString(ATTENDEES_INDEX_EMAIL); 6892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 690d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE && 6912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount.equalsIgnoreCase(email)) { 6922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAttendeeId = mAttendeesCursor.getInt(ATTENDEES_INDEX_ID); 6932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mOriginalAttendeeResponse = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS); 6942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 6952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Don't show your own status in the list because: 6962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 1) it doesn't make sense for event without other guests. 6972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // 2) there's a spinner for that for events with guests. 6982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch(status) { 6992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_ACCEPTED: 700fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mAcceptedAttendees.add(new Attendee(name, email, 701fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson Attendees.ATTENDEE_STATUS_ACCEPTED)); 7022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 7032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case Attendees.ATTENDEE_STATUS_DECLINED: 704fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mDeclinedAttendees.add(new Attendee(name, email, 705fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson Attendees.ATTENDEE_STATUS_DECLINED)); 7062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 7078ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_TENTATIVE: 708fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mTentativeAttendees.add(new Attendee(name, email, 709fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson Attendees.ATTENDEE_STATUS_TENTATIVE)); 7108ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 7118ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan default: 712fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson mNoResponseAttendees.add(new Attendee(name, email, 713fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson Attendees.ATTENDEE_STATUS_NONE)); 7142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } while (mAttendeesCursor.moveToNext()); 7172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.moveToFirst(); 7182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateAttendees(view); 7202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 7254003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public void onSaveInstanceState(Bundle outState) { 7264003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang super.onSaveInstanceState(outState); 7274003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_EVENT_ID, mEventId); 7284003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_START_MILLIS, mStartMillis); 7294003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang outState.putLong(BUNDLE_KEY_END_MILLIS, mEndMillis); 73071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan outState.putBoolean(BUNDLE_KEY_IS_DIALOG, mIsDialog); 73160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson outState.putInt(BUNDLE_KEY_ATTENDEE_RESPONSE, mAttendeeResponseFromIntent); 73260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 73360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 73460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson 73560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson @Override 73660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 73760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson super.onCreateOptionsMenu(menu, inflater); 73810b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson // Show edit/delete buttons only in non-dialog configuration on a phone 73910b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson if (!mIsDialog && !mIsTabletConfig) { 74060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson inflater.inflate(R.menu.event_info_title_bar, menu); 74160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mMenu = menu; 74260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 7434003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 7444003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 7454003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 7464003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang @Override 7474003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang public void onDestroyView() { 7481ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (saveResponse() || saveReminders()) { 7492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Toast.makeText(getActivity(), R.string.saving_event, Toast.LENGTH_SHORT).show(); 7502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7514003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang super.onDestroyView(); 7522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang @Override 7552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void onDestroy() { 7562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mEventCursor != null) { 7572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mEventCursor.close(); 7582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null) { 7602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.close(); 7612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor != null) { 7632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mAttendeesCursor.close(); 7642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 76571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan super.onDestroy(); 7662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 7692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Asynchronously saves the response to an invitation if the user changed 7702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * the response. Returns true if the database will be updated. 7712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 7722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * @return true if the database will be changed 7732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 7742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private boolean saveResponse() { 7752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mAttendeesCursor == null || mEventCursor == null) { 7762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 7772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 778f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 779f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan RadioGroup radioGroup = (RadioGroup) getView().findViewById(R.id.response_value); 780f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int status = getResponseFromButtonId(radioGroup.getCheckedRadioButtonId()); 781f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan if (status == Attendees.ATTENDEE_STATUS_NONE) { 7822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 7832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If the status has not changed, then don't update the database 7862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (status == mOriginalAttendeeResponse) { 7872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 7882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // If we never got an owner attendee id we can't set the status 791d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE) { 7922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 7932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 7942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 7952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!mIsRepeating) { 7962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a non-repeating event 7972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 7982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 7992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // This is a repeating event 8022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang int whichEvents = mEditResponseHelper.getWhichEvents(); 8032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang switch (whichEvents) { 8042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case -1: 8052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_SINGLE: 807c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden createExceptionResponse(mEventId, status); 8082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 8092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang case UPDATE_ALL: 8102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang updateResponse(mEventId, mCalendarOwnerAttendeeId, status); 8112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return true; 8122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang default: 8132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Log.e(TAG, "Unexpected choice for updating invitation response"); 8142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang break; 8152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return false; 8172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateResponse(long eventId, long attendeeId, int status) { 8202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Update the attendee status in the attendees table. the provider 8212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // takes care of updating the self attendance status. 8222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 8232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(mCalendarOwnerAccount)) { 8252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_EMAIL, mCalendarOwnerAccount); 8262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.ATTENDEE_STATUS, status); 8282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Attendees.EVENT_ID, eventId); 8292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri uri = ContentUris.withAppendedId(Attendees.CONTENT_URI, attendeeId); 8312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startUpdate(mHandler.getNextToken(), null, uri, values, 8332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang null, null, Utils.UNDO_DELAY); 8342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 836c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden /** 837c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * Creates an exception to a recurring event. The only change we're making is to the 838c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * "self attendee status" value. The provider will take care of updating the corresponding 839c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * Attendees.attendeeStatus entry. 840c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * 841c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * @param eventId The recurring event. 842c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden * @param status The new value for selfAttendeeStatus. 843c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden */ 844c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden private void createExceptionResponse(long eventId, int status) { 8452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang ContentValues values = new ContentValues(); 8462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.ORIGINAL_INSTANCE_TIME, mStartMillis); 8472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang values.put(Events.SELF_ATTENDEE_STATUS, status); 848c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden values.put(Events.STATUS, Events.STATUS_CONFIRMED); 8492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 850364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 85179b2c8c946c29ea9107957fe72a9fa9f560da345Andy McFadden Uri exceptionUri = Uri.withAppendedPath(Events.CONTENT_EXCEPTION_URI, 852c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden String.valueOf(eventId)); 853c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden ops.add(ContentProviderOperation.newInsert(exceptionUri).withValues(values).build()); 854364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik 855c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden mHandler.startBatch(mHandler.getNextToken(), null, CalendarContract.AUTHORITY, ops, 856c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden Utils.UNDO_DELAY); 857c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden } 8582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 859f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan public static int getResponseFromButtonId(int buttonId) { 860f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int response; 861f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan switch (buttonId) { 862f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case R.id.response_yes: 863f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = Attendees.ATTENDEE_STATUS_ACCEPTED; 864f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 865f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case R.id.response_maybe: 866f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = Attendees.ATTENDEE_STATUS_TENTATIVE; 867f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 868f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case R.id.response_no: 869f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = Attendees.ATTENDEE_STATUS_DECLINED; 870f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 871f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan default: 872f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = Attendees.ATTENDEE_STATUS_NONE; 8732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 874f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan return response; 875f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan } 876f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 877f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan public static int findButtonIdForResponse(int response) { 878f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int buttonId; 879f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan switch (response) { 880f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case Attendees.ATTENDEE_STATUS_ACCEPTED: 881f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = R.id.response_yes; 882f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 883f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case Attendees.ATTENDEE_STATUS_TENTATIVE: 884f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = R.id.response_maybe; 885f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 886f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan case Attendees.ATTENDEE_STATUS_DECLINED: 887f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = R.id.response_no; 888f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan break; 889f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan default: 890f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan buttonId = -1; 891f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan } 892f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan return buttonId; 8932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 8942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 8952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void doEdit() { 896c41b99be504e395b8c7264a0d626906ccbff1c57Erik Context c = getActivity(); 897c41b99be504e395b8c7264a0d626906ccbff1c57Erik // This ensures that we aren't in the process of closing and have been 898c41b99be504e395b8c7264a0d626906ccbff1c57Erik // unattached already 899c41b99be504e395b8c7264a0d626906ccbff1c57Erik if (c != null) { 900c41b99be504e395b8c7264a0d626906ccbff1c57Erik CalendarController.getInstance(c).sendEventRelatedEvent( 90160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson this, EventType.VIEW_EVENT_DETAILS, mEventId, mStartMillis, mEndMillis, 0 90260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson , 0, -1); 903c41b99be504e395b8c7264a0d626906ccbff1c57Erik } 9042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateEvent(View view) { 907b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson if (mEventCursor == null || view == null) { 9082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 9092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventName = mEventCursor.getString(EVENT_INDEX_TITLE); 9122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventName == null || eventName.length() == 0) { 9132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang eventName = getActivity().getString(R.string.no_title_label); 9142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang boolean allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0; 9172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String location = mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION); 9182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String description = mEventCursor.getString(EVENT_INDEX_DESCRIPTION); 9192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); 920f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson String eventTimezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE); 921f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson String organizer = mEventCursor.getString(EVENT_INDEX_ORGANIZER); 9222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9234acb2fd087308dea146b8b10f5278c59df387680RoboErik mColor = Utils.getDisplayColorFromColor(mEventCursor.getInt(EVENT_INDEX_COLOR)); 924fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mHeadlines.setBackgroundColor(mColor); 9252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // What 9272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (eventName != null) { 9282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.title, eventName); 9292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 9302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 9312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // When 932fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson // Set the date and repeats (if any) 93374c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson String whenDate; 93474c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson int flagsTime = DateUtils.FORMAT_SHOW_TIME; 93574c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson int flagsDate = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY | 93674c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson DateUtils.FORMAT_SHOW_YEAR; 93774c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson 93874c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson if (DateFormat.is24HourFormat(getActivity())) { 93974c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson flagsTime |= DateUtils.FORMAT_24HOUR; 94074c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson } 941fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson 942fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson // Put repeat after the date (if any) 943fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson String repeatString = null; 944fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson if (!TextUtils.isEmpty(rRule)) { 945fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson EventRecurrence eventRecurrence = new EventRecurrence(); 946fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson eventRecurrence.parse(rRule); 947fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson Time date = new Time(Utils.getTimeZone(getActivity(), mTZUpdater)); 948fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson if (allDay) { 949fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson date.timezone = Time.TIMEZONE_UTC; 950fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson } 951fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson date.set(mStartMillis); 952fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson eventRecurrence.setStartDate(date); 953fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson repeatString = EventRecurrenceFormatter.getRepeatString( 954fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson getActivity().getResources(), eventRecurrence); 955fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson } 956fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson // If an all day event , show the date without the time 9572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (allDay) { 95874c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson Formatter f = new Formatter(new StringBuilder(50), Locale.getDefault()); 95974c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson whenDate = DateUtils.formatDateRange(getActivity(), f, mStartMillis, mStartMillis, 96074c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson flagsDate, Time.TIMEZONE_UTC).toString(); 961fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson if (repeatString != null) { 962fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson setTextCommon(view, R.id.when_date, whenDate + " (" + repeatString + ")"); 963fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson } else { 964fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson setTextCommon(view, R.id.when_date, whenDate); 965fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson } 96674c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson view.findViewById(R.id.when_time).setVisibility(View.GONE); 96774c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson 9682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 969fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson // Show date for none all-day events 97074c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson whenDate = Utils.formatDateRange(getActivity(), mStartMillis, mEndMillis, flagsDate); 97174c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson String whenTime = Utils.formatDateRange(getActivity(), mStartMillis, mEndMillis, 97274c90321e327fc97aa06ff893f5265661555deb1Isaac Katzenelson flagsTime); 973fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson if (repeatString != null) { 974fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson setTextCommon(view, R.id.when_date, whenDate + " (" + repeatString + ")"); 975f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson } else { 976fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson setTextCommon(view, R.id.when_date, whenDate); 977f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson } 978f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson 979fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson // Show the event timezone if it is different from the local timezone after the time 980fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson // TODO: Fix comparison of Timezone 9811121e409c5f504e8df75982475d8cc607d5f0dfaRoboErik String localTimezone = Utils.getTimeZone(mActivity, mTZUpdater); 9821121e409c5f504e8df75982475d8cc607d5f0dfaRoboErik if (!TextUtils.equals(localTimezone, eventTimezone)) { 983fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson String displayName; 9841121e409c5f504e8df75982475d8cc607d5f0dfaRoboErik // Figure out if this is in DST 9851121e409c5f504e8df75982475d8cc607d5f0dfaRoboErik Time date = new Time(Utils.getTimeZone(getActivity(), mTZUpdater)); 9861121e409c5f504e8df75982475d8cc607d5f0dfaRoboErik if (allDay) { 9871121e409c5f504e8df75982475d8cc607d5f0dfaRoboErik date.timezone = Time.TIMEZONE_UTC; 9881121e409c5f504e8df75982475d8cc607d5f0dfaRoboErik } 9891121e409c5f504e8df75982475d8cc607d5f0dfaRoboErik date.set(mStartMillis); 9901121e409c5f504e8df75982475d8cc607d5f0dfaRoboErik 9911121e409c5f504e8df75982475d8cc607d5f0dfaRoboErik TimeZone tz = TimeZone.getTimeZone(localTimezone); 992fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson if (tz == null || tz.getID().equals("GMT")) { 993fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson displayName = localTimezone; 994fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson } else { 9951121e409c5f504e8df75982475d8cc607d5f0dfaRoboErik displayName = tz.getDisplayName(date.isDst != 0, TimeZone.LONG); 996fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson } 997fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson setTextCommon(view, R.id.when_time, whenTime + " (" + displayName + ")"); 998fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson } 999fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson else { 1000fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson setTextCommon(view, R.id.when_time, whenTime); 1001fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson } 1002f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson } 1003f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson 1004fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson 10052e46cff640b123ba5f7a67c934ae98e6b02a905fIsaac Katzenelson // Organizer view is setup in the updateCalendar method 10062e46cff640b123ba5f7a67c934ae98e6b02a905fIsaac Katzenelson 10072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Where 1009ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan if (location == null || location.trim().length() == 0) { 10102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.where, View.GONE); 10112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 1012259b8f9a21fffd3858218581e9daaf689b6b888fErik final TextView textView = mWhere; 10132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView != null) { 1014ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan textView.setAutoLinkMask(0); 1015ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan textView.setText(location.trim()); 1016ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan if (!Linkify.addLinks(textView, Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES 1017ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan | Linkify.MAP_ADDRESSES)) { 1018ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan Linkify.addLinks(textView, mWildcardPattern, "geo:0,0?q="); 1019ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan } 1020ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan textView.setOnTouchListener(new OnTouchListener() { 1021c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden @Override 1022ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan public boolean onTouch(View v, MotionEvent event) { 1023ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan try { 1024ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan return v.onTouchEvent(event); 1025ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan } catch (ActivityNotFoundException e) { 1026ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan // ignore 1027ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan return true; 10282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 1029ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan } 1030ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan }); 10312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Description 1035352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (description != null && description.length() != 0) { 10362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setTextCommon(view, R.id.description, description); 10372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 1038c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson updateDescription (); // Expand or collapse full description 10392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 10402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1041259b8f9a21fffd3858218581e9daaf689b6b888fErik private void sendAccessibilityEvent() { 1042ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden AccessibilityManager am = 1043ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden (AccessibilityManager) getActivity().getSystemService(Service.ACCESSIBILITY_SERVICE); 1044259b8f9a21fffd3858218581e9daaf689b6b888fErik if (!am.isEnabled()) { 1045259b8f9a21fffd3858218581e9daaf689b6b888fErik return; 1046259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1047259b8f9a21fffd3858218581e9daaf689b6b888fErik 1048259b8f9a21fffd3858218581e9daaf689b6b888fErik AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_FOCUSED); 1049259b8f9a21fffd3858218581e9daaf689b6b888fErik event.setClassName(getClass().getName()); 1050259b8f9a21fffd3858218581e9daaf689b6b888fErik event.setPackageName(getActivity().getPackageName()); 1051259b8f9a21fffd3858218581e9daaf689b6b888fErik List<CharSequence> text = event.getText(); 1052259b8f9a21fffd3858218581e9daaf689b6b888fErik 1053259b8f9a21fffd3858218581e9daaf689b6b888fErik addFieldToAccessibilityEvent(text, mTitle); 1054259b8f9a21fffd3858218581e9daaf689b6b888fErik addFieldToAccessibilityEvent(text, mWhen); 1055259b8f9a21fffd3858218581e9daaf689b6b888fErik addFieldToAccessibilityEvent(text, mWhere); 1056259b8f9a21fffd3858218581e9daaf689b6b888fErik addFieldToAccessibilityEvent(text, mWhat); 1057259b8f9a21fffd3858218581e9daaf689b6b888fErik addFieldToAccessibilityEvent(text, mAttendees); 1058259b8f9a21fffd3858218581e9daaf689b6b888fErik 1059259b8f9a21fffd3858218581e9daaf689b6b888fErik RadioGroup response = (RadioGroup) getView().findViewById(R.id.response_value); 1060259b8f9a21fffd3858218581e9daaf689b6b888fErik if (response.getVisibility() == View.VISIBLE) { 1061259b8f9a21fffd3858218581e9daaf689b6b888fErik int id = response.getCheckedRadioButtonId(); 1062259b8f9a21fffd3858218581e9daaf689b6b888fErik if (id != View.NO_ID) { 1063259b8f9a21fffd3858218581e9daaf689b6b888fErik text.add(((TextView) getView().findViewById(R.id.response_label)).getText()); 1064259b8f9a21fffd3858218581e9daaf689b6b888fErik text.add((((RadioButton) (response.findViewById(id))).getText() + PERIOD_SPACE)); 1065259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1066259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1067259b8f9a21fffd3858218581e9daaf689b6b888fErik 1068259b8f9a21fffd3858218581e9daaf689b6b888fErik am.sendAccessibilityEvent(event); 1069259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1070259b8f9a21fffd3858218581e9daaf689b6b888fErik 1071259b8f9a21fffd3858218581e9daaf689b6b888fErik /** 1072259b8f9a21fffd3858218581e9daaf689b6b888fErik * @param text 1073259b8f9a21fffd3858218581e9daaf689b6b888fErik */ 1074259b8f9a21fffd3858218581e9daaf689b6b888fErik private void addFieldToAccessibilityEvent(List<CharSequence> text, TextView view) { 10759ceed1f3df98c5fc85441da0c6e7e5d45cf17a1eIsaac Katzenelson if (view == null) { 10769ceed1f3df98c5fc85441da0c6e7e5d45cf17a1eIsaac Katzenelson return; 10779ceed1f3df98c5fc85441da0c6e7e5d45cf17a1eIsaac Katzenelson } 1078259b8f9a21fffd3858218581e9daaf689b6b888fErik String str = view.toString().trim(); 1079259b8f9a21fffd3858218581e9daaf689b6b888fErik if (!TextUtils.isEmpty(str)) { 1080259b8f9a21fffd3858218581e9daaf689b6b888fErik text.add(mTitle.getText()); 1081259b8f9a21fffd3858218581e9daaf689b6b888fErik text.add(PERIOD_SPACE); 1082259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1083259b8f9a21fffd3858218581e9daaf689b6b888fErik } 1084259b8f9a21fffd3858218581e9daaf689b6b888fErik 10852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateCalendar(View view) { 10862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = ""; 10872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (mCalendarsCursor != null && mEventCursor != null) { 10882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarsCursor.moveToFirst(); 10892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String tempAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); 10902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCalendarOwnerAccount = (tempAccount == null) ? "" : tempAccount; 1091352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOwnerCanRespond = mCalendarsCursor.getInt(CALENDARS_INDEX_OWNER_CAN_RESPOND) != 0; 10922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String displayName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME); 10942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 10952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // start duplicate calendars query 10962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHandler.startQuery(TOKEN_QUERY_DUPLICATE_CALENDARS, null, Calendars.CONTENT_URI, 10972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang CALENDARS_PROJECTION, CALENDARS_DUPLICATE_NAME_WHERE, 10982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang new String[] {displayName}, null); 10992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang String eventOrganizer = mEventCursor.getString(EVENT_INDEX_ORGANIZER); 11012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsOrganizer = mCalendarOwnerAccount.equalsIgnoreCase(eventOrganizer); 11022e46cff640b123ba5f7a67c934ae98e6b02a905fIsaac Katzenelson setTextCommon(view, R.id.organizer, eventOrganizer); 1103b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson if (!mIsOrganizer) { 1104b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson setVisibilityCommon(view, R.id.organizer_container, View.VISIBLE); 1105b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson } else { 1106b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson setVisibilityCommon(view, R.id.organizer_container, View.GONE); 1107b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson } 11082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mHasAttendeeData = mEventCursor.getInt(EVENT_INDEX_HAS_ATTENDEE_DATA) != 0; 11092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mCanModifyCalendar = 1110ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) >= Calendars.CAL_ACCESS_CONTRIBUTOR; 11112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang mIsBusyFreeCalendar = 1112ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) == Calendars.CAL_ACCESS_FREEBUSY; 1113352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 1114352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (!mIsBusyFreeCalendar) { 11158ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Button b = (Button) mView.findViewById(R.id.edit); 1116352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan b.setEnabled(true); 11178ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan b.setOnClickListener(new OnClickListener() { 11188ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan @Override 11198ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan public void onClick(View v) { 11208ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan doEdit(); 112110b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson // For dialogs, just close the fragment 112210b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson // For full screen, close activity on phone, leave it for tablet 112360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (mIsDialog) { 112460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson EventInfoFragment.this.dismiss(); 112560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 112610b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson else if (!mIsTabletConfig){ 112760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson getActivity().finish(); 112860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 1129352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 1130352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan }); 11318ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 113269be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik if (!mCanModifyCalendar) { 113360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (mIsDialog) { 113460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson mView.findViewById(R.id.delete).setEnabled(false); 113560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 113660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson else { 113760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson MenuItem item = mMenu.findItem(R.id.info_action_delete); 113860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson if (item != null) { 113960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson item.setVisible(false); 114060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 114160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } 114269be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik } 11432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 114471b221ae5d0f514352584a955630f5494f686c51Michael Chan setVisibilityCommon(view, R.id.calendar, View.GONE); 1145259b8f9a21fffd3858218581e9daaf689b6b888fErik sendAccessibilityEventIfQueryDone(TOKEN_QUERY_DUPLICATE_CALENDARS); 11462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 11482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 11492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void updateAttendees(View view) { 1150c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson 1151fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson if (mAcceptedAttendees.size() + mDeclinedAttendees.size() + 1152fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mTentativeAttendees.size() + mNoResponseAttendees.size() > 0) { 11534acb2fd087308dea146b8b10f5278c59df387680RoboErik (mLongAttendees).addAttendees(mAcceptedAttendees); 11544acb2fd087308dea146b8b10f5278c59df387680RoboErik (mLongAttendees).addAttendees(mDeclinedAttendees); 11554acb2fd087308dea146b8b10f5278c59df387680RoboErik (mLongAttendees).addAttendees(mTentativeAttendees); 11564acb2fd087308dea146b8b10f5278c59df387680RoboErik (mLongAttendees).addAttendees(mNoResponseAttendees); 1157fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mLongAttendees.setEnabled(false); 1158fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mLongAttendees.setVisibility(View.VISIBLE); 115960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson } else { 1160fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson mLongAttendees.setVisibility(View.GONE); 116171b221ae5d0f514352584a955630f5494f686c51Michael Chan } 11628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 11638ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 11641ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson public void initReminders(View view, Cursor cursor) { 11651ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 11661ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Add reminders 11671ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson while (cursor.moveToNext()) { 11681ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson int minutes = cursor.getInt(EditEventHelper.REMINDERS_INDEX_MINUTES); 11691ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson int method = cursor.getInt(EditEventHelper.REMINDERS_INDEX_METHOD); 11701ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mOriginalReminders.add(ReminderEntry.valueOf(minutes, method)); 11711ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 11721ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Sort appropriately for display (by time, then type) 11731ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Collections.sort(mOriginalReminders); 11741ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 11751ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Load the labels and corresponding numeric values for the minutes and methods lists 11761ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // from the assets. If we're switching calendars, we need to clear and re-populate the 11771ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // lists (which may have elements added and removed based on calendar properties). This 11781ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // is mostly relevant for "methods", since we shouldn't have any "minutes" values in a 11791ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // new event that aren't in the default set. 11801ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Resources r = mActivity.getResources(); 11811ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMinuteValues = loadIntegerArray(r, R.array.reminder_minutes_values); 11821ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMinuteLabels = loadStringArray(r, R.array.reminder_minutes_labels); 11831ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMethodValues = loadIntegerArray(r, R.array.reminder_methods_values); 11841ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMethodLabels = loadStringArray(r, R.array.reminder_methods_labels); 11851ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 11861ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Remove any reminder methods that aren't allowed for this calendar. If this is 11871ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // a new event, mCalendarAllowedReminders may not be set the first time we're called. 11881ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (mCalendarAllowedReminders != null) { 11891ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson EventViewUtils.reduceMethodList(mReminderMethodValues, mReminderMethodLabels, 11901ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mCalendarAllowedReminders); 11911ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 11921ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 11931ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson int numReminders = 0; 11941ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (mHasAlarm) { 11951ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ArrayList<ReminderEntry> reminders = mOriginalReminders; 11961ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson numReminders = reminders.size(); 11971ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Insert any minute values that aren't represented in the minutes list. 11981ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson for (ReminderEntry re : reminders) { 11991ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson EventViewUtils.addMinutesToList( 12001ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mActivity, mReminderMinuteValues, mReminderMinuteLabels, re.getMinutes()); 12011ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 12021ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Create a UI element for each reminder. We display all of the reminders we get 12031ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // from the provider, even if the count exceeds the calendar maximum. (Also, for 12041ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // a new event, we won't have a maxReminders value available.) 12051ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson for (ReminderEntry re : reminders) { 12061ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson EventViewUtils.addReminder(mActivity, mScrollView, this, mReminderViews, 12071ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMinuteValues, mReminderMinuteLabels, 12081ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMethodValues, mReminderMethodLabels, 12091ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson re, Integer.MAX_VALUE); 12101ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 12111ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 12121ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 12131ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 12148ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan private void formatAttendees(ArrayList<Attendee> attendees, SpannableStringBuilder sb, int type) { 12158ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (attendees.size() <= 0) { 12168ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan return; 12178ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 12188ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 12198ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan int begin = sb.length(); 12208ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan boolean firstTime = sb.length() == 0; 12218ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 12228ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (firstTime == false) { 12238ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan begin += 2; // skip over the ", " for formatting. 12248ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 12258ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 12268ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan for (Attendee attendee : attendees) { 12278ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan if (firstTime) { 12288ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan firstTime = false; 12298ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } else { 12308ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.append(", "); 12318ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 12328ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 12338ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan String name = attendee.getDisplayName(); 12348ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.append(name); 12358ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan } 12368ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan 12378ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan switch (type) { 12388ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_ACCEPTED: 12398ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 12408ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan case Attendees.ATTENDEE_STATUS_DECLINED: 12418ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan sb.setSpan(new StrikethroughSpan(), begin, sb.length(), 12428ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 12438ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // fall through 12448ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan default: 12458ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // The last INCLUSIVE causes the foreground color to be applied 12468ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // to the rest of the span. If not, the comma at the end of the 12478ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan // declined or tentative may be black. 12480a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan sb.setSpan(new ForegroundColorSpan(0xFF999999), begin, sb.length(), 12498ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 12508ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan break; 12512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang void updateResponse(View view) { 12552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // we only let the user accept/reject/etc. a meeting if: 12562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // a) you can edit the event's containing calendar AND 12572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // b) you're not the organizer and only attendee AND 12582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // c) organizerCanRespond is enabled for the calendar 12592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (if the attendee data has been hidden, the visible number of attendees 12602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // will be 1 -- the calendar owner's). 12612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // (there are more cases involved to be 100% accurate, such as 12622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // paying attention to whether or not an attendee status was 12632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // included in the feed, but we're currently omitting those corner cases 12642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // for simplicity). 1265352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 1266352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // TODO Switch to EditEventHelper.canRespond when this class uses CalendarEventModel. 1267d785cd533f6a3c23813c15315aed74efa9a116f5Michael Chan if (!mCanModifyCalendar || (mHasAttendeeData && mIsOrganizer && mNumOfAttendees <= 1) || 1268352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan (mIsOrganizer && !mOwnerCanRespond)) { 12692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.GONE); 12702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang setVisibilityCommon(view, R.id.response_container, View.VISIBLE); 12742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 1275f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 1276f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int response; 1277deced8999da73effe4133e2317c262fea7910090Michael Chan if (mAttendeeResponseFromIntent != CalendarController.ATTENDEE_NO_RESPONSE) { 1278f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = mAttendeeResponseFromIntent; 12792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 1280f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan response = mOriginalAttendeeResponse; 12812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 1282f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan 1283f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan int buttonToCheck = findButtonIdForResponse(response); 1284f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan RadioGroup radioGroup = (RadioGroup) view.findViewById(R.id.response_value); 1285f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan radioGroup.check(buttonToCheck); // -1 clear all radio buttons 1286f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan radioGroup.setOnCheckedChangeListener(this); 12872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setTextCommon(View view, int id, CharSequence text) { 12902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang TextView textView = (TextView) view.findViewById(id); 12912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (textView == null) 12922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 12932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang textView.setText(text); 12942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 12952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 12962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang private void setVisibilityCommon(View view, int id, int visibility) { 12972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang View v = view.findViewById(id); 12982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (v != null) { 12992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang v.setVisibility(visibility); 13002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang return; 13022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang /** 13052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Taken from com.google.android.gm.HtmlConversationActivity 13062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * 13072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang * Send the intent that shows the Contact info corresponding to the email address. 13082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang */ 13092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang public void showContactInfo(Attendee attendee, Rect rect) { 13102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // First perform lookup query to find existing contact 13112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final ContentResolver resolver = getActivity().getContentResolver(); 13122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String address = attendee.mEmail; 13132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri dataUri = Uri.withAppendedPath(CommonDataKinds.Email.CONTENT_FILTER_URI, 13142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Uri.encode(address)); 13152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri lookupUri = ContactsContract.Data.getContactLookupUri(resolver, dataUri); 13162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (lookupUri != null) { 13182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Found matching contact, trigger QuickContact 13192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.showQuickContact(getActivity(), rect, lookupUri, 13202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang QuickContact.MODE_MEDIUM, null); 13212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } else { 13222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // No matching contact, ask user to create one 13232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Uri mailUri = Uri.fromParts("mailto", address, null); 13242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, mailUri); 13252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Pass along full E-mail string for possible create dialog 13272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang Rfc822Token sender = new Rfc822Token(attendee.mName, attendee.mEmail, null); 13282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.EXTRA_CREATE_DESCRIPTION, sender.toString()); 13292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang // Only provide personal name hint if we have one 13312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang final String senderPersonal = attendee.mName; 13322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang if (!TextUtils.isEmpty(senderPersonal)) { 13332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang intent.putExtra(Intents.Insert.NAME, senderPersonal); 13342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang 13362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang startActivity(intent); 13372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 13382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang } 1339cb81189e4868769ea016253eca104e46df2f033aErik 1340cb81189e4868769ea016253eca104e46df2f033aErik @Override 13417c6236d5553dc9f3d004ebbed794249713a11d19RoboErik public void onPause() { 13427c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mIsPaused = true; 13437c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mHandler.removeCallbacks(onDeleteRunnable); 13447c6236d5553dc9f3d004ebbed794249713a11d19RoboErik super.onPause(); 13457c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 13467c6236d5553dc9f3d004ebbed794249713a11d19RoboErik 13477c6236d5553dc9f3d004ebbed794249713a11d19RoboErik @Override 13487c6236d5553dc9f3d004ebbed794249713a11d19RoboErik public void onResume() { 13497c6236d5553dc9f3d004ebbed794249713a11d19RoboErik super.onResume(); 13507c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mIsPaused = false; 13517c6236d5553dc9f3d004ebbed794249713a11d19RoboErik if (mDismissOnResume) { 13527c6236d5553dc9f3d004ebbed794249713a11d19RoboErik mHandler.post(onDeleteRunnable); 13537c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 13547c6236d5553dc9f3d004ebbed794249713a11d19RoboErik } 13557c6236d5553dc9f3d004ebbed794249713a11d19RoboErik 13567c6236d5553dc9f3d004ebbed794249713a11d19RoboErik @Override 1357cb81189e4868769ea016253eca104e46df2f033aErik public void eventsChanged() { 1358cb81189e4868769ea016253eca104e46df2f033aErik } 1359cb81189e4868769ea016253eca104e46df2f033aErik 1360cb81189e4868769ea016253eca104e46df2f033aErik @Override 1361cb81189e4868769ea016253eca104e46df2f033aErik public long getSupportedEventTypes() { 1362cb81189e4868769ea016253eca104e46df2f033aErik return EventType.EVENTS_CHANGED; 1363cb81189e4868769ea016253eca104e46df2f033aErik } 1364cb81189e4868769ea016253eca104e46df2f033aErik 1365cb81189e4868769ea016253eca104e46df2f033aErik @Override 1366cb81189e4868769ea016253eca104e46df2f033aErik public void handleEvent(EventInfo event) { 1367cb81189e4868769ea016253eca104e46df2f033aErik if (event.eventType == EventType.EVENTS_CHANGED) { 1368cb81189e4868769ea016253eca104e46df2f033aErik // reload the data 1369cb81189e4868769ea016253eca104e46df2f033aErik mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION, 1370cb81189e4868769ea016253eca104e46df2f033aErik null, null, null); 1371cb81189e4868769ea016253eca104e46df2f033aErik } 1372cb81189e4868769ea016253eca104e46df2f033aErik 1373cb81189e4868769ea016253eca104e46df2f033aErik } 13741ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 13751ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 13761ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson @Override 13771ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson public void onClick(View view) { 13781ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 13791ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // This must be a click on one of the "remove reminder" buttons 13801ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson LinearLayout reminderItem = (LinearLayout) view.getParent(); 13811ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson LinearLayout parent = (LinearLayout) reminderItem.getParent(); 13821ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson parent.removeView(reminderItem); 13831ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderViews.remove(reminderItem); 13841ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 13851ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 13861ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 13871ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson /** 13881ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * Add a new reminder when the user hits the "add reminder" button. We use the default 13891ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * reminder time and method. 13901ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson */ 13911ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private void addReminder() { 13921ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // TODO: when adding a new reminder, make it different from the 13931ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // last one in the list (if any). 13941ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (mDefaultReminderMinutes == GeneralPreferences.NO_REMINDER) { 13951ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson EventViewUtils.addReminder(mActivity, mScrollView, this, mReminderViews, 13961ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMinuteValues, mReminderMinuteLabels, 13971ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMethodValues, mReminderMethodLabels, 13981ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ReminderEntry.valueOf(GeneralPreferences.REMINDER_DEFAULT_TIME), 13991ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mMaxReminders); 14001ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } else { 14011ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson EventViewUtils.addReminder(mActivity, mScrollView, this, mReminderViews, 14021ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMinuteValues, mReminderMinuteLabels, 14031ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMethodValues, mReminderMethodLabels, 14041ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ReminderEntry.valueOf(mDefaultReminderMinutes), 14051ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mMaxReminders); 14061ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 14071ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 14081ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14091ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14101ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private void prepareReminders() { 14111ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Resources r = mActivity.getResources(); 14121ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMinuteValues = loadIntegerArray(r, R.array.reminder_minutes_values); 14131ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMinuteLabels = loadStringArray(r, R.array.reminder_minutes_labels); 14141ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMethodValues = loadIntegerArray(r, R.array.reminder_methods_values); 14151ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMethodLabels = loadStringArray(r, R.array.reminder_methods_labels); 14161ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 14171ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14181ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14191ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private boolean saveReminders() { 14201ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3); 14211ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14221ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Read reminders from UI 14231ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminders = EventViewUtils.reminderItemsToReminders(mReminderViews, 14241ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mReminderMinuteValues, mReminderMethodValues); 14251ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14261ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Check if there are any changes in the reminder 14271ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson boolean changed = EditEventHelper.saveReminders(ops, mEventId, mReminders, 14281ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson mOriginalReminders, false /* no force save */); 14291ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14301ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (!changed) { 14311ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson return false; 14321ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 14331ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14341ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // save new reminders 14351ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson AsyncQueryService service = new AsyncQueryService(getActivity()); 14361ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson service.startBatch(0, null, Calendars.CONTENT_URI.getAuthority(), ops, 0); 14371ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson // Update the "hasAlarm" field for the event 14381ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId); 14391ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson int len = mReminders.size(); 14401ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson boolean hasAlarm = len > 0; 14411ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson if (hasAlarm != mHasAlarm) { 14421ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ContentValues values = new ContentValues(); 14431ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0); 14441ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson service.startUpdate(0, null, uri, values, null, null, 0); 14451ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 14461ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson return true; 14471ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 14481ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14491ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson /** 14501ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * Loads an integer array asset into a list. 14511ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson */ 14521ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static ArrayList<Integer> loadIntegerArray(Resources r, int resNum) { 14531ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson int[] vals = r.getIntArray(resNum); 14541ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson int size = vals.length; 14551ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ArrayList<Integer> list = new ArrayList<Integer>(size); 14561ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14571ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson for (int i = 0; i < size; i++) { 14581ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson list.add(vals[i]); 14591ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 14601ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14611ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson return list; 14621ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 14631ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson /** 14641ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson * Loads a String array asset into a list. 14651ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson */ 14661ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson private static ArrayList<String> loadStringArray(Resources r, int resNum) { 14671ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson String[] labels = r.getStringArray(resNum); 14681ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson ArrayList<String> list = new ArrayList<String>(Arrays.asList(labels)); 14691ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson return list; 14701ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson } 14711ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson 14722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang} 1473