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
192c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport static android.provider.CalendarContract.EXTRA_EVENT_ALL_DAY;
202c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport static android.provider.CalendarContract.EXTRA_EVENT_BEGIN_TIME;
212c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport static android.provider.CalendarContract.EXTRA_EVENT_END_TIME;
222c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport static com.android.calendar.CalendarController.EVENT_EDIT_ON_LAUNCH;
232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
248f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelsonimport android.animation.Animator;
258f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelsonimport android.animation.AnimatorListenerAdapter;
268f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelsonimport android.animation.ObjectAnimator;
272bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.app.Activity;
2871d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.Dialog;
2971d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.DialogFragment;
3095e9538c2e504ea5528b07e3abdf54bb3d91c88aJames Kungimport android.app.FragmentManager;
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;
38b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelsonimport android.content.DialogInterface;
392bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Intent;
401ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport android.content.SharedPreferences;
412c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport android.content.pm.ApplicationInfo;
422c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport android.content.pm.PackageManager;
432c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport android.content.pm.PackageManager.NameNotFoundException;
442bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.res.Resources;
452bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.Cursor;
464afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport android.graphics.Color;
472bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.Rect;
482c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport android.graphics.drawable.Drawable;
492bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.net.Uri;
502bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.os.Bundle;
51a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract;
52a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Attendees;
53a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Calendars;
544afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport android.provider.CalendarContract.Colors;
55a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Events;
561ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport android.provider.CalendarContract.Reminders;
57cb81189e4868769ea016253eca104e46df2f033aErikimport android.provider.ContactsContract;
582bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.CommonDataKinds;
592bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Intents;
602bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.QuickContact;
618ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.Spannable;
628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.SpannableStringBuilder;
632bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.TextUtils;
642bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.Time;
6573b07655afcea1ba2ce8ed580a50992bf0baf857Andy McFaddenimport android.text.method.LinkMovementMethod;
6673b07655afcea1ba2ce8ed580a50992bf0baf857Andy McFaddenimport android.text.method.MovementMethod;
678ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.ForegroundColorSpan;
682bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Rfc822Token;
692bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.util.Log;
704afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport android.util.SparseIntArray;
7171d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Gravity;
722bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.LayoutInflater;
7360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.Menu;
7460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.MenuInflater;
7560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.view.MenuItem;
762bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MotionEvent;
772bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.View;
78cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnClickListener;
79cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnTouchListener;
802bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.ViewGroup;
8171d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Window;
8271d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.WindowManager;
83259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.view.accessibility.AccessibilityEvent;
84259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.view.accessibility.AccessibilityManager;
852bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.AdapterView;
868b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErikimport android.widget.AdapterView.OnItemSelectedListener;
878ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.widget.Button;
881ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport android.widget.LinearLayout;
89259b8f9a21fffd3858218581e9daaf689b6b888fErikimport android.widget.RadioButton;
90f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanimport android.widget.RadioGroup;
91f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanimport android.widget.RadioGroup.OnCheckedChangeListener;
928b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErikimport android.widget.ScrollView;
932bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.TextView;
942bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Toast;
952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
962c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.CalendarController.EventInfo;
972c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.CalendarController.EventType;
982c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.CalendarEventModel.Attendee;
992c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.CalendarEventModel.ReminderEntry;
1007da27670d2a62e213e230989b250f047012a3bbdSara Tingimport com.android.calendar.alerts.QuickResponseActivity;
1012c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.event.AttendeesView;
1022c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.event.EditEventActivity;
1032c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.event.EditEventHelper;
1044afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport com.android.calendar.event.EventColorPickerDialog;
1052c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chanimport com.android.calendar.event.EventViewUtils;
106da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Tingimport com.android.calendarcommon2.DateException;
107da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Tingimport com.android.calendarcommon2.Duration;
1088a528adbba5d46fe0d566f474bc3be190511198eMichael Chanimport com.android.calendarcommon2.EventRecurrence;
109a8b8c0d17adf3e8f9b34a5da89592aa7069c0bddJames Kungimport com.android.colorpicker.ColorPickerSwatch.OnColorSelectedListener;
110a8b8c0d17adf3e8f9b34a5da89592aa7069c0bddJames Kungimport com.android.colorpicker.HsvColorComparator;
1112c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
1122bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.ArrayList;
1131ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport java.util.Arrays;
1141ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelsonimport java.util.Collections;
115259b8f9a21fffd3858218581e9daaf689b6b888fErikimport java.util.List;
116f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson
117f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chanpublic class EventInfoFragment extends DialogFragment implements OnCheckedChangeListener,
118b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung        CalendarController.EventHandler, OnClickListener, DeleteEventHelper.DeleteNotifyListener,
119b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung        OnColorSelectedListener {
12083efa2d50deca53c9937b19a379045c31b541cb7Michael Chan
121e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung    public static final boolean DEBUG = false;
1222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1232c7c851a4e40afa83a741ec39d44425b705a712eMichael Chan    public static final String TAG = "EventInfoFragment";
1242fca024254c9de09f8d87933cc8c9a2046e37c52James Kung    public static final String COLOR_PICKER_DIALOG_TAG = "EventColorPickerDialog";
1252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
126b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung    private static final int REQUEST_CODE_COLOR_PICKER = 0;
127b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung
12860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    protected static final String BUNDLE_KEY_EVENT_ID = "key_event_id";
12960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    protected static final String BUNDLE_KEY_START_MILLIS = "key_start_millis";
13060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    protected static final String BUNDLE_KEY_END_MILLIS = "key_end_millis";
13160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    protected static final String BUNDLE_KEY_IS_DIALOG = "key_fragment_is_dialog";
132b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson    protected static final String BUNDLE_KEY_DELETE_DIALOG_VISIBLE = "key_delete_dialog_visible";
1337ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson    protected static final String BUNDLE_KEY_WINDOW_STYLE = "key_window_style";
1344afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    protected static final String BUNDLE_KEY_CALENDAR_COLOR = "key_calendar_color";
135f56b14972130233fd7e7c64160084793a7a0a55bJames Kung    protected static final String BUNDLE_KEY_CALENDAR_COLOR_INIT = "key_calendar_color_init";
1364afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    protected static final String BUNDLE_KEY_CURRENT_COLOR = "key_current_color";
137497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung    protected static final String BUNDLE_KEY_CURRENT_COLOR_KEY = "key_current_color_key";
138f56b14972130233fd7e7c64160084793a7a0a55bJames Kung    protected static final String BUNDLE_KEY_CURRENT_COLOR_INIT = "key_current_color_init";
1394afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    protected static final String BUNDLE_KEY_ORIGINAL_COLOR = "key_original_color";
140f56b14972130233fd7e7c64160084793a7a0a55bJames Kung    protected static final String BUNDLE_KEY_ORIGINAL_COLOR_INIT = "key_original_color_init";
14194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein    protected static final String BUNDLE_KEY_ATTENDEE_RESPONSE = "key_attendee_response";
14294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein    protected static final String BUNDLE_KEY_USER_SET_ATTENDEE_RESPONSE =
14394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            "key_user_set_attendee_response";
14494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein    protected static final String BUNDLE_KEY_TENTATIVE_USER_RESPONSE =
14594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            "key_tentative_user_response";
14694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein    protected static final String BUNDLE_KEY_RESPONSE_WHICH_EVENTS = "key_response_which_events";
14794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein    protected static final String BUNDLE_KEY_REMINDER_MINUTES = "key_reminder_minutes";
14894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein    protected static final String BUNDLE_KEY_REMINDER_METHODS = "key_reminder_methods";
14994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein
1504afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
151259b8f9a21fffd3858218581e9daaf689b6b888fErik    private static final String PERIOD_SPACE = ". ";
152259b8f9a21fffd3858218581e9daaf689b6b888fErik
1534afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final String NO_EVENT_COLOR = "";
1544afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
1552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    /**
1562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * These are the corresponding indices into the array of strings
1572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * "R.array.change_response_labels" in the resource file.
1582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     */
1592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final int UPDATE_SINGLE = 0;
1602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final int UPDATE_ALL = 1;
1612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1627ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson    // Style of view
1637ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson    public static final int FULL_WINDOW_STYLE = 0;
1647ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson    public static final int DIALOG_WINDOW_STYLE = 1;
1657ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson
1667ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson    private int mWindowStyle = DIALOG_WINDOW_STYLE;
1677ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson
1682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    // Query tokens for QueryHandler
169259b8f9a21fffd3858218581e9daaf689b6b888fErik    private static final int TOKEN_QUERY_EVENT = 1 << 0;
170259b8f9a21fffd3858218581e9daaf689b6b888fErik    private static final int TOKEN_QUERY_CALENDARS = 1 << 1;
171259b8f9a21fffd3858218581e9daaf689b6b888fErik    private static final int TOKEN_QUERY_ATTENDEES = 1 << 2;
172259b8f9a21fffd3858218581e9daaf689b6b888fErik    private static final int TOKEN_QUERY_DUPLICATE_CALENDARS = 1 << 3;
1731ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private static final int TOKEN_QUERY_REMINDERS = 1 << 4;
1746aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting    private static final int TOKEN_QUERY_VISIBLE_CALENDARS = 1 << 5;
1754afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int TOKEN_QUERY_COLORS = 1 << 6;
1764afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
177259b8f9a21fffd3858218581e9daaf689b6b888fErik    private static final int TOKEN_QUERY_ALL = TOKEN_QUERY_DUPLICATE_CALENDARS
1781ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            | TOKEN_QUERY_ATTENDEES | TOKEN_QUERY_CALENDARS | TOKEN_QUERY_EVENT
1794afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            | TOKEN_QUERY_REMINDERS | TOKEN_QUERY_VISIBLE_CALENDARS | TOKEN_QUERY_COLORS;
1806aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting
181259b8f9a21fffd3858218581e9daaf689b6b888fErik    private int mCurrentQuery = 0;
1822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String[] EVENT_PROJECTION = new String[] {
1842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events._ID,                  // 0  do not remove; used in DeleteEventHelper
1852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.TITLE,                // 1  do not remove; used in DeleteEventHelper
1862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.RRULE,                // 2  do not remove; used in DeleteEventHelper
1872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.ALL_DAY,              // 3  do not remove; used in DeleteEventHelper
1882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.CALENDAR_ID,          // 4  do not remove; used in DeleteEventHelper
1892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.DTSTART,              // 5  do not remove; used in DeleteEventHelper
1902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events._SYNC_ID,             // 6  do not remove; used in DeleteEventHelper
1912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.EVENT_TIMEZONE,       // 7  do not remove; used in DeleteEventHelper
1922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.DESCRIPTION,          // 8
1932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.EVENT_LOCATION,       // 9
194693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan        Calendars.CALENDAR_ACCESS_LEVEL, // 10
1954afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Events.CALENDAR_COLOR,       // 11
1964afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Events.EVENT_COLOR,          // 12
1974afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Events.HAS_ATTENDEE_DATA,    // 13
1984afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Events.ORGANIZER,            // 14
1994afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Events.HAS_ALARM,            // 15
2004afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Calendars.MAX_REMINDERS,     // 16
2014afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Calendars.ALLOWED_REMINDERS, // 17
2024afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Events.CUSTOM_APP_PACKAGE,   // 18
2034afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Events.CUSTOM_APP_URI,       // 19
204da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting        Events.DTEND,                // 20
205da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting        Events.DURATION,             // 21
2064afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Events.ORIGINAL_SYNC_ID      // 22 do not remove; used in DeleteEventHelper
2072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    };
2082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_ID = 0;
2092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_TITLE = 1;
2102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_RRULE = 2;
2112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_ALL_DAY = 3;
2122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_CALENDAR_ID = 4;
213da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting    private static final int EVENT_INDEX_DTSTART = 5;
2142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_SYNC_ID = 6;
2152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_EVENT_TIMEZONE = 7;
2162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_DESCRIPTION = 8;
2172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_EVENT_LOCATION = 9;
21871b221ae5d0f514352584a955630f5494f686c51Michael Chan    private static final int EVENT_INDEX_ACCESS_LEVEL = 10;
2194afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int EVENT_INDEX_CALENDAR_COLOR = 11;
2204afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int EVENT_INDEX_EVENT_COLOR = 12;
2214afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int EVENT_INDEX_HAS_ATTENDEE_DATA = 13;
2224afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int EVENT_INDEX_ORGANIZER = 14;
2234afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int EVENT_INDEX_HAS_ALARM = 15;
2244afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int EVENT_INDEX_MAX_REMINDERS = 16;
2254afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int EVENT_INDEX_ALLOWED_REMINDERS = 17;
2264afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int EVENT_INDEX_CUSTOM_APP_PACKAGE = 18;
2274afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int EVENT_INDEX_CUSTOM_APP_URI = 19;
228da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting    private static final int EVENT_INDEX_DTEND = 20;
229da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting    private static final int EVENT_INDEX_DURATION = 21;
2301ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
2312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String[] ATTENDEES_PROJECTION = new String[] {
2322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Attendees._ID,                      // 0
2332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Attendees.ATTENDEE_NAME,            // 1
2342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Attendees.ATTENDEE_EMAIL,           // 2
2352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Attendees.ATTENDEE_RELATIONSHIP,    // 3
2362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Attendees.ATTENDEE_STATUS,          // 4
237ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting        Attendees.ATTENDEE_IDENTITY,        // 5
238ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting        Attendees.ATTENDEE_ID_NAMESPACE     // 6
2392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    };
2402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int ATTENDEES_INDEX_ID = 0;
2412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int ATTENDEES_INDEX_NAME = 1;
2422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int ATTENDEES_INDEX_EMAIL = 2;
2432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int ATTENDEES_INDEX_RELATIONSHIP = 3;
2442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int ATTENDEES_INDEX_STATUS = 4;
245ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting    private static final int ATTENDEES_INDEX_IDENTITY = 5;
246ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting    private static final int ATTENDEES_INDEX_ID_NAMESPACE = 6;
2472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
248693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan    static {
249fac2d1594f7ecae8e50dc7790ce67de0c9b70d22Sara Ting        if (!Utils.isJellybeanOrLater()) {
250693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan            EVENT_PROJECTION[EVENT_INDEX_CUSTOM_APP_PACKAGE] = Events._ID; // dummy value
251693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan            EVENT_PROJECTION[EVENT_INDEX_CUSTOM_APP_URI] = Events._ID; // dummy value
252693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan
253693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan            ATTENDEES_PROJECTION[ATTENDEES_INDEX_IDENTITY] = Attendees._ID; // dummy value
254693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan            ATTENDEES_PROJECTION[ATTENDEES_INDEX_ID_NAMESPACE] = Attendees._ID; // dummy value
255693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan        }
256693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan    }
257693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan
2582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?";
2592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String ATTENDEES_SORT_ORDER = Attendees.ATTENDEE_NAME + " ASC, "
2612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            + Attendees.ATTENDEE_EMAIL + " ASC";
2622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2631ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private static final String[] REMINDERS_PROJECTION = new String[] {
2641ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        Reminders._ID,                      // 0
2651ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        Reminders.MINUTES,            // 1
2661ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        Reminders.METHOD           // 2
2671ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    };
2681ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private static final int REMINDERS_INDEX_ID = 0;
2691ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private static final int REMINDERS_MINUTES_ID = 1;
2701ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private static final int REMINDERS_METHOD_ID = 2;
2711ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
2721ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private static final String REMINDERS_WHERE = Reminders.EVENT_ID + "=?";
2731ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
2742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final String[] CALENDARS_PROJECTION = new String[] {
2752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Calendars._ID,           // 0
276ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik        Calendars.CALENDAR_DISPLAY_NAME,  // 1
2772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Calendars.OWNER_ACCOUNT, // 2
27842896f76d81dbae873614340a3a78b29e7d463d2Sara Ting        Calendars.CAN_ORGANIZER_RESPOND, // 3
2794afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Calendars.ACCOUNT_NAME, // 4
2804afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Calendars.ACCOUNT_TYPE  // 5
2812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    };
2822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final int CALENDARS_INDEX_DISPLAY_NAME = 1;
2832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2;
2842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final int CALENDARS_INDEX_OWNER_CAN_RESPOND = 3;
28542896f76d81dbae873614340a3a78b29e7d463d2Sara Ting    static final int CALENDARS_INDEX_ACCOUNT_NAME = 4;
2864afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    static final int CALENDARS_INDEX_ACCOUNT_TYPE = 5;
2872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final String CALENDARS_WHERE = Calendars._ID + "=?";
289ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik    static final String CALENDARS_DUPLICATE_NAME_WHERE = Calendars.CALENDAR_DISPLAY_NAME + "=?";
2906aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting    static final String CALENDARS_VISIBLE_WHERE = Calendars.VISIBLE + "=?";
2912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2924afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    static final String[] COLORS_PROJECTION = new String[] {
2934afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Colors._ID, // 0
2944afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Colors.COLOR, // 1
2954afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Colors.COLOR_KEY // 2
2964afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    };
2974afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
2984afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    static final String COLORS_WHERE = Colors.ACCOUNT_NAME + "=? AND " + Colors.ACCOUNT_TYPE +
2994afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        "=? AND " + Colors.COLOR_TYPE + "=" + Colors.TYPE_EVENT;
3004afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
3014afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    public static final int COLORS_INDEX_COLOR = 1;
3024afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    public static final int COLORS_INDEX_COLOR_KEY = 2;
303fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden
3042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private View mView;
3052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
3062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private Uri mUri;
3072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private long mEventId;
3082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private Cursor mEventCursor;
3092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private Cursor mAttendeesCursor;
3102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private Cursor mCalendarsCursor;
3111ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private Cursor mRemindersCursor;
3121ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
3130a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan    private static float mScale = 0; // Used for supporting different screen densities
3142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
3152c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan    private static int mCustomAppIconSize = 32;
3162c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
3172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private long mStartMillis;
3182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private long mEndMillis;
3198b1119b1b58381c7fc550974f53cf93bd95dffa8Michael Chan    private boolean mAllDay;
3202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
3212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mHasAttendeeData;
32283efa2d50deca53c9937b19a379045c31b541cb7Michael Chan    private String mEventOrganizerEmail;
32383efa2d50deca53c9937b19a379045c31b541cb7Michael Chan    private String mEventOrganizerDisplayName = "";
3242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mIsOrganizer;
325d845fbe558d5229102b58cce70a1b29fe6cb6967Erik    private long mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE;
326352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private boolean mOwnerCanRespond;
32742896f76d81dbae873614340a3a78b29e7d463d2Sara Ting    private String mSyncAccountName;
3282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private String mCalendarOwnerAccount;
3292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mCanModifyCalendar;
33065eeb79e62034d706503ce29d88c0e05ebd726feRoboErik    private boolean mCanModifyEvent;
3312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mIsBusyFreeCalendar;
3322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private int mNumOfAttendees;
3332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private EditResponseHelper mEditResponseHelper;
334b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson    private boolean mDeleteDialogVisible = false;
335b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson    private DeleteEventHelper mDeleteHelper;
3362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
3372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private int mOriginalAttendeeResponse;
3386bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private int mAttendeeResponseFromIntent = Attendees.ATTENDEE_STATUS_NONE;
3396bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private int mUserSetResponse = Attendees.ATTENDEE_STATUS_NONE;
3403b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein    private int mWhichEvents = -1;
3413b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein    // Used as the temporary response until the dialog is confirmed. It is also
3423b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein    // able to be used as a state marker for configuration changes.
3433b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein    private int mTentativeUserSetResponse = Attendees.ATTENDEE_STATUS_NONE;
3442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mIsRepeating;
3451ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private boolean mHasAlarm;
3461ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private int mMaxReminders;
3471ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private String mCalendarAllowedReminders;
348b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson    // Used to prevent saving changes in event if it is being deleted.
349b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson    private boolean mEventDeletionStarted = false;
3502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
351259b8f9a21fffd3858218581e9daaf689b6b888fErik    private TextView mTitle;
35275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting    private TextView mWhenDateTime;
353259b8f9a21fffd3858218581e9daaf689b6b888fErik    private TextView mWhere;
35499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan    private ExpandableTextView mDesc;
355c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson    private AttendeesView mLongAttendees;
3567ffa24cba2977925b737e6bd39be59ba39609611Sara Ting    private Button emailAttendeesButton;
357d8353fb85ef59a88580125207be9c914a8586758RoboErik    private Menu mMenu = null;
358fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson    private View mHeadlines;
3591ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private ScrollView mScrollView;
3608f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson    private View mLoadingMsgView;
3611aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski    private View mErrorMsgView;
3628f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson    private ObjectAnimator mAnimateAlpha;
363263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson    private long mLoadingMsgStartTime;
3644afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
3652fca024254c9de09f8d87933cc8c9a2046e37c52James Kung    private EventColorPickerDialog mColorPickerDialog;
366e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung    private SparseIntArray mDisplayColorKeyMap = new SparseIntArray();
3674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private int[] mColors;
3684afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private int mOriginalColor = -1;
369f56b14972130233fd7e7c64160084793a7a0a55bJames Kung    private boolean mOriginalColorInitialized = false;
3704afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private int mCalendarColor = -1;
371f56b14972130233fd7e7c64160084793a7a0a55bJames Kung    private boolean mCalendarColorInitialized = false;
3724afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private int mCurrentColor = -1;
373f56b14972130233fd7e7c64160084793a7a0a55bJames Kung    private boolean mCurrentColorInitialized = false;
374497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung    private int mCurrentColorKey = -1;
3754afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
3768f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson    private static final int FADE_IN_TIME = 300;   // in milliseconds
377263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson    private static final int LOADING_MSG_DELAY = 600;   // in milliseconds
378263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson    private static final int LOADING_MSG_MIN_DISPLAY_TIME = 600;
37980d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson    private boolean mNoCrossFade = false;  // Used to prevent repeated cross-fade
3803b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein    private RadioGroup mResponseRadioGroup;
3818f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson
3822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    ArrayList<Attendee> mAcceptedAttendees = new ArrayList<Attendee>();
3832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    ArrayList<Attendee> mDeclinedAttendees = new ArrayList<Attendee>();
3842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    ArrayList<Attendee> mTentativeAttendees = new ArrayList<Attendee>();
3852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    ArrayList<Attendee> mNoResponseAttendees = new ArrayList<Attendee>();
386cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting    ArrayList<String> mToEmails = new ArrayList<String>();
387cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting    ArrayList<String> mCcEmails = new ArrayList<String>();
3881ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
3891ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private int mDefaultReminderMinutes;
390ac4350b25b794d1b2935266cf8c480e4fbf97b8fIsaac Katzenelson    private final ArrayList<LinearLayout> mReminderViews = new ArrayList<LinearLayout>(0);
3911ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    public ArrayList<ReminderEntry> mReminders;
3927f078b716fa7f1d374af9af3dad05d2e249e18c8RoboErik    public ArrayList<ReminderEntry> mOriginalReminders = new ArrayList<ReminderEntry>();
3937f078b716fa7f1d374af9af3dad05d2e249e18c8RoboErik    public ArrayList<ReminderEntry> mUnsupportedReminders = new ArrayList<ReminderEntry>();
3948b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik    private boolean mUserModifiedReminders = false;
3951ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
3961ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    /**
3971ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     * Contents of the "minutes" spinner.  This has default values from the XML file, augmented
3981ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     * with any additional values that were already associated with the event.
3991ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     */
4001ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private ArrayList<Integer> mReminderMinuteValues;
4011ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private ArrayList<String> mReminderMinuteLabels;
4021ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
4031ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    /**
4041ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     * Contents of the "methods" spinner.  The "values" list specifies the method constant
4051ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     * (e.g. {@link Reminders#METHOD_ALERT}) associated with the labels.  Any methods that
4061ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     * aren't allowed by the Calendar will be removed.
4071ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     */
4081ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private ArrayList<Integer> mReminderMethodValues;
4091ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private ArrayList<String> mReminderMethodLabels;
4101ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
4112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private QueryHandler mHandler;
4122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
413b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson
414ac4350b25b794d1b2935266cf8c480e4fbf97b8fIsaac Katzenelson    private final Runnable mTZUpdater = new Runnable() {
415cb81189e4868769ea016253eca104e46df2f033aErik        @Override
416cb81189e4868769ea016253eca104e46df2f033aErik        public void run() {
417cb81189e4868769ea016253eca104e46df2f033aErik            updateEvent(mView);
418cb81189e4868769ea016253eca104e46df2f033aErik        }
419cb81189e4868769ea016253eca104e46df2f033aErik    };
420cb81189e4868769ea016253eca104e46df2f033aErik
421ac4350b25b794d1b2935266cf8c480e4fbf97b8fIsaac Katzenelson    private final Runnable mLoadingMsgAlphaUpdater = new Runnable() {
422263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson        @Override
423263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson        public void run() {
424263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson            // Since this is run after a delay, make sure to only show the message
425263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson            // if the event's data is not shown yet.
426263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson            if (!mAnimateAlpha.isRunning() && mScrollView.getAlpha() == 0) {
427263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                mLoadingMsgStartTime = System.currentTimeMillis();
428263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                mLoadingMsgView.setAlpha(1);
429263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson            }
430263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson        }
431263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson    };
432263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson
4338b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik    private OnItemSelectedListener mReminderChangeListener;
4348b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik
4357ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson    private static int mDialogWidth = 500;
4367ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson    private static int mDialogHeight = 600;
4370aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson    private static int DIALOG_TOP_MARGIN = 8;
43871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    private boolean mIsDialog = false;
4397c6236d5553dc9f3d004ebbed794249713a11d19RoboErik    private boolean mIsPaused = true;
4407c6236d5553dc9f3d004ebbed794249713a11d19RoboErik    private boolean mDismissOnResume = false;
44171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    private int mX = -1;
44271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    private int mY = -1;
4430aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson    private int mMinTop;         // Dialog cannot be above this location
44410b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson    private boolean mIsTabletConfig;
44510b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson    private Activity mActivity;
446be2a432034e96c9f2fbf333cd7fe6489312bbeaaMichael Chan    private Context mContext;
44771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
4484afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private CalendarController mController;
4494afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
4502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private class QueryHandler extends AsyncQueryService {
4512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        public QueryHandler(Context context) {
4522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            super(context);
4532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
4542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
4552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        @Override
4562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
4574003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            // if the activity is finishing, then close the cursor and return
4584003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            final Activity activity = getActivity();
4594003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            if (activity == null || activity.isFinishing()) {
46047f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                if (cursor != null) {
46147f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                    cursor.close();
46247f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                }
4634003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang                return;
4644003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            }
4654003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
4662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            switch (token) {
4672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case TOKEN_QUERY_EVENT:
4682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mEventCursor = Utils.matrixCursorFromCursor(cursor);
4691aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski                if (!initEventCursor()) {
4701aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski                    displayEventNotFound();
4712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    return;
4722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                }
473f56b14972130233fd7e7c64160084793a7a0a55bJames Kung                if (!mCalendarColorInitialized) {
4744afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    mCalendarColor = Utils.getDisplayColorFromColor(
4754afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            mEventCursor.getInt(EVENT_INDEX_CALENDAR_COLOR));
476f56b14972130233fd7e7c64160084793a7a0a55bJames Kung                    mCalendarColorInitialized = true;
4774afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                }
4784afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
479f56b14972130233fd7e7c64160084793a7a0a55bJames Kung                if (!mOriginalColorInitialized) {
4804afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    mOriginalColor = mEventCursor.isNull(EVENT_INDEX_EVENT_COLOR)
4814afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            ? mCalendarColor : Utils.getDisplayColorFromColor(
4824afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                                    mEventCursor.getInt(EVENT_INDEX_EVENT_COLOR));
483f56b14972130233fd7e7c64160084793a7a0a55bJames Kung                    mOriginalColorInitialized = true;
4844afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                }
4854afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
486f56b14972130233fd7e7c64160084793a7a0a55bJames Kung                if (!mCurrentColorInitialized) {
4874afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    mCurrentColor = mOriginalColor;
488f56b14972130233fd7e7c64160084793a7a0a55bJames Kung                    mCurrentColorInitialized = true;
4894afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                }
4904afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
4912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateEvent(mView);
492e35a032c939f357ce435711b2fd8de1887a05011RoboErik                prepareReminders();
4932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
4942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                // start calendar query
4952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                Uri uri = Calendars.CONTENT_URI;
4962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                String[] args = new String[] {
4972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        Long.toString(mEventCursor.getLong(EVENT_INDEX_CALENDAR_ID))};
4982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                startQuery(TOKEN_QUERY_CALENDARS, null, uri, CALENDARS_PROJECTION,
4992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        CALENDARS_WHERE, args, null);
5002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                break;
5012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case TOKEN_QUERY_CALENDARS:
5022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mCalendarsCursor = Utils.matrixCursorFromCursor(cursor);
5032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateCalendar(mView);
5044003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang                // FRAG_TODO fragments shouldn't set the title anymore
5052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateTitle();
5062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5074afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                args = new String[] {
5084afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        mCalendarsCursor.getString(CALENDARS_INDEX_ACCOUNT_NAME),
5094afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        mCalendarsCursor.getString(CALENDARS_INDEX_ACCOUNT_TYPE) };
5104afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                uri = Colors.CONTENT_URI;
5114afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                startQuery(TOKEN_QUERY_COLORS, null, uri, COLORS_PROJECTION, COLORS_WHERE, args,
5124afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        null);
5134afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
514352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                if (!mIsBusyFreeCalendar) {
515352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    args = new String[] { Long.toString(mEventId) };
516352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
517352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // start attendees query
518352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    uri = Attendees.CONTENT_URI;
519352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    startQuery(TOKEN_QUERY_ATTENDEES, null, uri, ATTENDEES_PROJECTION,
520352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            ATTENDEES_WHERE, args, ATTENDEES_SORT_ORDER);
521259b8f9a21fffd3858218581e9daaf689b6b888fErik                } else {
522259b8f9a21fffd3858218581e9daaf689b6b888fErik                    sendAccessibilityEventIfQueryDone(TOKEN_QUERY_ATTENDEES);
5232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                }
5241ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                if (mHasAlarm) {
5251ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                    // start reminders query
5261ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                    args = new String[] { Long.toString(mEventId) };
5271ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                    uri = Reminders.CONTENT_URI;
5281ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                    startQuery(TOKEN_QUERY_REMINDERS, null, uri,
5291ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                            REMINDERS_PROJECTION, REMINDERS_WHERE, args, null);
5301ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                } else {
5311ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                    sendAccessibilityEventIfQueryDone(TOKEN_QUERY_REMINDERS);
5321ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                }
5332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                break;
5344afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            case TOKEN_QUERY_COLORS:
5354afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                ArrayList<Integer> colors = new ArrayList<Integer>();
5364afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                if (cursor.moveToFirst()) {
5374afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    do
5384afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    {
5394afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        int colorKey = cursor.getInt(COLORS_INDEX_COLOR_KEY);
5404afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        int rawColor = cursor.getInt(COLORS_INDEX_COLOR);
5414afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        int displayColor = Utils.getDisplayColorFromColor(rawColor);
542e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung                        mDisplayColorKeyMap.put(displayColor, colorKey);
5434afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        colors.add(displayColor);
5444afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    } while (cursor.moveToNext());
5454afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                }
5464afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                cursor.close();
5474afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                Integer[] sortedColors = new Integer[colors.size()];
548e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung                Arrays.sort(colors.toArray(sortedColors), new HsvColorComparator());
5494afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                mColors = new int[sortedColors.length];
5504afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                for (int i = 0; i < sortedColors.length; i++) {
5514afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    mColors[i] = sortedColors[i].intValue();
5524afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
5534afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    float[] hsv = new float[3];
5544afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    Color.colorToHSV(mColors[i], hsv);
555e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung                    if (DEBUG) {
556e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung                        Log.d("Color", "H:" + hsv[0] + ",S:" + hsv[1] + ",V:" + hsv[2]);
557e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung                    }
5584afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                }
5596090ba2c18b94b78953495ee5ace9c6116a40009James Kung                if (mCanModifyCalendar) {
5606090ba2c18b94b78953495ee5ace9c6116a40009James Kung                    View button = mView.findViewById(R.id.change_color);
5616090ba2c18b94b78953495ee5ace9c6116a40009James Kung                    if (button != null && mColors.length > 0) {
5626090ba2c18b94b78953495ee5ace9c6116a40009James Kung                        button.setEnabled(true);
5636090ba2c18b94b78953495ee5ace9c6116a40009James Kung                        button.setVisibility(View.VISIBLE);
5646090ba2c18b94b78953495ee5ace9c6116a40009James Kung                    }
5654afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                }
5664afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                updateMenu();
5674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                break;
5682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case TOKEN_QUERY_ATTENDEES:
5692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mAttendeesCursor = Utils.matrixCursorFromCursor(cursor);
5702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                initAttendeesCursor(mView);
5712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateResponse(mView);
5722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                break;
5731ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            case TOKEN_QUERY_REMINDERS:
5741ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                mRemindersCursor = Utils.matrixCursorFromCursor(cursor);
5751ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                initReminders(mView, mRemindersCursor);
5761ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                break;
5776aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting            case TOKEN_QUERY_VISIBLE_CALENDARS:
5786aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                if (cursor.getCount() > 1) {
5796aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                    // Start duplicate calendars query to detect whether to add the calendar
5806aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                    // email to the calendar owner display.
5816aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                    String displayName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME);
5826aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                    mHandler.startQuery(TOKEN_QUERY_DUPLICATE_CALENDARS, null,
5836aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                            Calendars.CONTENT_URI, CALENDARS_PROJECTION,
5846aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                            CALENDARS_DUPLICATE_NAME_WHERE, new String[] {displayName}, null);
5856aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                } else {
5866aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                    // Don't need to display the calendar owner when there is only a single
5876aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                    // calendar.  Skip the duplicate calendars query.
5886aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                    setVisibilityCommon(mView, R.id.calendar_container, View.GONE);
5896aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                    mCurrentQuery |= TOKEN_QUERY_DUPLICATE_CALENDARS;
5906aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                }
5916aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                break;
5922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case TOKEN_QUERY_DUPLICATE_CALENDARS:
59371b221ae5d0f514352584a955630f5494f686c51Michael Chan                SpannableStringBuilder sb = new SpannableStringBuilder();
59471b221ae5d0f514352584a955630f5494f686c51Michael Chan
59571b221ae5d0f514352584a955630f5494f686c51Michael Chan                // Calendar display name
5962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                String calendarName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME);
59771b221ae5d0f514352584a955630f5494f686c51Michael Chan                sb.append(calendarName);
59871b221ae5d0f514352584a955630f5494f686c51Michael Chan
59971b221ae5d0f514352584a955630f5494f686c51Michael Chan                // Show email account if display name is not unique and
60071b221ae5d0f514352584a955630f5494f686c51Michael Chan                // display name != email
60171b221ae5d0f514352584a955630f5494f686c51Michael Chan                String email = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT);
6026aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                if (cursor.getCount() > 1 && !calendarName.equalsIgnoreCase(email) &&
6036aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                        Utils.isValidEmail(email)) {
60471b221ae5d0f514352584a955630f5494f686c51Michael Chan                    sb.append(" (").append(email).append(")");
60571b221ae5d0f514352584a955630f5494f686c51Michael Chan                }
60671b221ae5d0f514352584a955630f5494f686c51Michael Chan
6076aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                setVisibilityCommon(mView, R.id.calendar_container, View.VISIBLE);
6086aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                setTextCommon(mView, R.id.calendar_name, sb);
6092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                break;
6102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
6112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            cursor.close();
612259b8f9a21fffd3858218581e9daaf689b6b888fErik            sendAccessibilityEventIfQueryDone(token);
6136aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting
6146aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting            // All queries are done, show the view.
615263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson            if (mCurrentQuery == TOKEN_QUERY_ALL) {
616263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                if (mLoadingMsgView.getAlpha() == 1) {
617263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                    // Loading message is showing, let it stay a bit more (to prevent
618263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                    // flashing) by adding a start delay to the event animation
619263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                    long timeDiff = LOADING_MSG_MIN_DISPLAY_TIME - (System.currentTimeMillis() -
620263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                            mLoadingMsgStartTime);
621263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                    if (timeDiff > 0) {
622263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                        mAnimateAlpha.setStartDelay(timeDiff);
623263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                    }
624263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                }
62580d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson                if (!mAnimateAlpha.isRunning() &&!mAnimateAlpha.isStarted() && !mNoCrossFade) {
62680d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson                    mAnimateAlpha.start();
62780d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson                } else {
62880d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson                    mScrollView.setAlpha(1);
62980d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson                    mLoadingMsgView.setVisibility(View.GONE);
63080d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson                }
631263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson            }
6322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
6332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
6342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
635259b8f9a21fffd3858218581e9daaf689b6b888fErik    private void sendAccessibilityEventIfQueryDone(int token) {
636259b8f9a21fffd3858218581e9daaf689b6b888fErik        mCurrentQuery |= token;
637259b8f9a21fffd3858218581e9daaf689b6b888fErik        if (mCurrentQuery == TOKEN_QUERY_ALL) {
638259b8f9a21fffd3858218581e9daaf689b6b888fErik            sendAccessibilityEvent();
639259b8f9a21fffd3858218581e9daaf689b6b888fErik        }
640259b8f9a21fffd3858218581e9daaf689b6b888fErik    }
641259b8f9a21fffd3858218581e9daaf689b6b888fErik
6420a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan    public EventInfoFragment(Context context, Uri uri, long startMillis, long endMillis,
64394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            int attendeeResponse, boolean isDialog, int windowStyle,
64494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            ArrayList<ReminderEntry> reminders) {
6457ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson
6462c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan        Resources r = context.getResources();
6472c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan        if (mScale == 0) {
6482c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            mScale = context.getResources().getDisplayMetrics().density;
6492c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            if (mScale != 1) {
6502c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                mCustomAppIconSize *= mScale;
6512c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                if (isDialog) {
6527ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson                    DIALOG_TOP_MARGIN *= mScale;
6537ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson                }
6540a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan            }
6550a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan        }
656363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan        if (isDialog) {
657363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan            setDialogSize(r);
658363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan        }
65960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        mIsDialog = isDialog;
660c0624ee90e59386b06a01b3415d0bb4e38f40db7Isaac Katzenelson
6612fc6b79dfb06812baf2e6c547f3ffee83b5c3e9aMichael Chan        setStyle(DialogFragment.STYLE_NO_TITLE, 0);
6622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mUri = uri;
6632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mStartMillis = startMillis;
6642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mEndMillis = endMillis;
6652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mAttendeeResponseFromIntent = attendeeResponse;
6667ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        mWindowStyle = windowStyle;
66794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein
66894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        // Pass in null if no reminders are being specified.
66994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        // This may be used to explicitly show certain reminders already known
67094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        // about, such as during configuration changes.
67194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        mReminders = reminders;
6722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
6732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
674ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden    // This is currently required by the fragment manager.
67560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    public EventInfoFragment() {
67660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    }
67760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
6780a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan    public EventInfoFragment(Context context, long eventId, long startMillis, long endMillis,
67994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            int attendeeResponse, boolean isDialog, int windowStyle,
68094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            ArrayList<ReminderEntry> reminders) {
6810a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan        this(context, ContentUris.withAppendedId(Events.CONTENT_URI, eventId), startMillis,
68294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                endMillis, attendeeResponse, isDialog, windowStyle, reminders);
6834003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        mEventId = eventId;
6844003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    }
6854003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
68671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    @Override
68771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    public void onActivityCreated(Bundle savedInstanceState) {
68871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        super.onActivityCreated(savedInstanceState);
68971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
6908b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik        mReminderChangeListener = new OnItemSelectedListener() {
6918b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik            @Override
6928b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
6938b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                Integer prevValue = (Integer) parent.getTag();
6948b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                if (prevValue == null || prevValue != position) {
6958b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                    parent.setTag(position);
6968b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                    mUserModifiedReminders = true;
6978b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                }
6988b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik            }
6998b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik
7008b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik            @Override
7018b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik            public void onNothingSelected(AdapterView<?> parent) {
7028b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                // do nothing
7038b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik            }
7048b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik
7058b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik        };
7068b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik
70771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        if (savedInstanceState != null) {
70871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan            mIsDialog = savedInstanceState.getBoolean(BUNDLE_KEY_IS_DIALOG, false);
7097ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson            mWindowStyle = savedInstanceState.getInt(BUNDLE_KEY_WINDOW_STYLE,
7107ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson                    DIALOG_WINDOW_STYLE);
71171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        }
71271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
71371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        if (mIsDialog) {
71471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan            applyDialogParams();
71571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        }
7162fca024254c9de09f8d87933cc8c9a2046e37c52James Kung
7172fca024254c9de09f8d87933cc8c9a2046e37c52James Kung        final Activity activity = getActivity();
7182fca024254c9de09f8d87933cc8c9a2046e37c52James Kung        mContext = activity;
7192fca024254c9de09f8d87933cc8c9a2046e37c52James Kung        mColorPickerDialog = (EventColorPickerDialog) activity.getFragmentManager()
7202fca024254c9de09f8d87933cc8c9a2046e37c52James Kung                .findFragmentByTag(COLOR_PICKER_DIALOG_TAG);
7212fca024254c9de09f8d87933cc8c9a2046e37c52James Kung        if (mColorPickerDialog != null) {
7222fca024254c9de09f8d87933cc8c9a2046e37c52James Kung            mColorPickerDialog.setOnColorSelectedListener(this);
7232fca024254c9de09f8d87933cc8c9a2046e37c52James Kung        }
72471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    }
72571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
72671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    private void applyDialogParams() {
72771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        Dialog dialog = getDialog();
72871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        dialog.setCanceledOnTouchOutside(true);
72971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
73071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        Window window = dialog.getWindow();
73171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
73271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
73371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        WindowManager.LayoutParams a = window.getAttributes();
73471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        a.dimAmount = .4f;
73571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
7367ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        a.width = mDialogWidth;
7377ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        a.height = mDialogHeight;
73871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
7390b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson
7400b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson        // On tablets , do smart positioning of dialog
7410b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson        // On phones , use the whole screen
7420b1bd10dbf90e55821a555c68a8a444854e31252Isaac Katzenelson
74360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        if (mX != -1 || mY != -1) {
7447ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson            a.x = mX - mDialogWidth / 2;
7457ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson            a.y = mY - mDialogHeight / 2;
7460aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson            if (a.y < mMinTop) {
7470aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson                a.y = mMinTop + DIALOG_TOP_MARGIN;
7480a01fd383c6c3ae46e28c89fa1a55cc0132a15f7Michael Chan            }
74960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            a.gravity = Gravity.LEFT | Gravity.TOP;
75071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        }
75171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        window.setAttributes(a);
75271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    }
75371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
7540aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson    public void setDialogParams(int x, int y, int minTop) {
75571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        mX = x;
75671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        mY = y;
7570aa0c61fcd2464f034d15f33db265b6d080f4af9Isaac Katzenelson        mMinTop = minTop;
75871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    }
75971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
760f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan    // Implements OnCheckedChangeListener
761f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan    @Override
762f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan    public void onCheckedChanged(RadioGroup group, int checkedId) {
7633b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        // If we haven't finished the return from the dialog yet, don't display.
7643b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) {
7653b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            return;
7663b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        }
7673b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein
7682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // If this is not a repeating event, then don't display the dialog
7692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // asking which events to change.
7703b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        int response = getResponseFromButtonId(checkedId);
7712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (!mIsRepeating) {
7723b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            mUserSetResponse = response;
7732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
7742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // If the selection is the same as the original, then don't display the
7772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // dialog asking which events to change.
778f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan        if (checkedId == findButtonIdForResponse(mOriginalAttendeeResponse)) {
7793b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            mUserSetResponse = response;
7802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
7812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // This is a repeating event. We need to ask the user if they mean to
7842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // change just this one instance or all instances.
7853b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        mTentativeUserSetResponse = response;
7863b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        mEditResponseHelper.showDialog(mWhichEvents);
7872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
7882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public void onNothingSelected(AdapterView<?> parent) {
7902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
7912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    @Override
7934afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    public void onDetach() {
7944afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        super.onDetach();
7954afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        mController.deregisterEventHandler(R.layout.event_info);
7964afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    }
7974afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
7984afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    @Override
7992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public void onAttach(Activity activity) {
8002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        super.onAttach(activity);
80110b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson        mActivity = activity;
8021dadfa267acd2f6e190c945db3ae59cd7b06a1c8James Kung        // Ensure that mIsTabletConfig is set before creating the menu.
80300544123439268a9f391396712560bd6cb8ee586James Kung        mIsTabletConfig = Utils.getConfigBool(mActivity, R.bool.tablet_config);
8044afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        mController = CalendarController.getInstance(mActivity);
8054afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        mController.registerEventHandler(R.layout.event_info, this);
8062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mEditResponseHelper = new EditResponseHelper(activity);
8073b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        mEditResponseHelper.setDismissListener(
8083b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                new DialogInterface.OnDismissListener() {
8093b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            @Override
8103b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            public void onDismiss(DialogInterface dialog) {
8113b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                // If the user dismisses the dialog (without hitting OK),
8123b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                // then we want to revert the selection that opened the dialog.
8133b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                if (mEditResponseHelper.getWhichEvents() != -1) {
8143b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    mUserSetResponse = mTentativeUserSetResponse;
8153b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    mWhichEvents = mEditResponseHelper.getWhichEvents();
8163b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                } else {
8173b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    // Revert the attending response radio selection to whatever
8183b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    // was selected prior to this selection (possibly nothing).
8193b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    int oldResponse;
8203b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    if (mUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) {
8213b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                        oldResponse = mUserSetResponse;
8223b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    } else {
8233b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                        oldResponse = mOriginalAttendeeResponse;
8243b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    }
8253b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    int buttonToCheck = findButtonIdForResponse(oldResponse);
8263b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein
8273b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    if (mResponseRadioGroup != null) {
8283b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                        mResponseRadioGroup.check(buttonToCheck);
8293b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    }
8303b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein
8313b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    // If the radio group is being cleared, also clear the
8323b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    // dialog's selection of which events should be included
8333b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    // in this response.
8343b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    if (buttonToCheck == -1) {
8353b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                        mEditResponseHelper.setWhichEvents(-1);
8363b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    }
8373b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                }
8383b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein
8393b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                // Since OnPause will force the dialog to dismiss, do
8403b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                // not change the dialog status
8413b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                if (!mIsPaused) {
8423b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    mTentativeUserSetResponse = Attendees.ATTENDEE_STATUS_NONE;
8433b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                }
8443b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            }
8453b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        });
84686550ce5323f7e3971977702fca259986c048bf6RoboErik
84786550ce5323f7e3971977702fca259986c048bf6RoboErik        if (mAttendeeResponseFromIntent != Attendees.ATTENDEE_STATUS_NONE) {
84886550ce5323f7e3971977702fca259986c048bf6RoboErik            mEditResponseHelper.setWhichEvents(UPDATE_ALL);
84996267164b5f536ae0d341ed46a55098423bf33ebJames Kung            mWhichEvents = mEditResponseHelper.getWhichEvents();
85086550ce5323f7e3971977702fca259986c048bf6RoboErik        }
8512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mHandler = new QueryHandler(activity);
85260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        if (!mIsDialog) {
85360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            setHasOptionsMenu(true);
85460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        }
8552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
8562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    @Override
8582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public View onCreateView(LayoutInflater inflater, ViewGroup container,
8592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            Bundle savedInstanceState) {
860320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson
861320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson        if (savedInstanceState != null) {
862320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson            mIsDialog = savedInstanceState.getBoolean(BUNDLE_KEY_IS_DIALOG, false);
863320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson            mWindowStyle = savedInstanceState.getInt(BUNDLE_KEY_WINDOW_STYLE,
864320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson                    DIALOG_WINDOW_STYLE);
865320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson            mDeleteDialogVisible =
866320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson                savedInstanceState.getBoolean(BUNDLE_KEY_DELETE_DIALOG_VISIBLE,false);
8674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            mCalendarColor = savedInstanceState.getInt(BUNDLE_KEY_CALENDAR_COLOR);
868f56b14972130233fd7e7c64160084793a7a0a55bJames Kung            mCalendarColorInitialized =
869f56b14972130233fd7e7c64160084793a7a0a55bJames Kung                    savedInstanceState.getBoolean(BUNDLE_KEY_CALENDAR_COLOR_INIT);
8704afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            mOriginalColor = savedInstanceState.getInt(BUNDLE_KEY_ORIGINAL_COLOR);
871f56b14972130233fd7e7c64160084793a7a0a55bJames Kung            mOriginalColorInitialized = savedInstanceState.getBoolean(
872f56b14972130233fd7e7c64160084793a7a0a55bJames Kung                    BUNDLE_KEY_ORIGINAL_COLOR_INIT);
8734afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            mCurrentColor = savedInstanceState.getInt(BUNDLE_KEY_CURRENT_COLOR);
874f56b14972130233fd7e7c64160084793a7a0a55bJames Kung            mCurrentColorInitialized = savedInstanceState.getBoolean(
875f56b14972130233fd7e7c64160084793a7a0a55bJames Kung                    BUNDLE_KEY_CURRENT_COLOR_INIT);
876497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung            mCurrentColorKey = savedInstanceState.getInt(BUNDLE_KEY_CURRENT_COLOR_KEY);
87794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein
8783b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            mTentativeUserSetResponse = savedInstanceState.getInt(
8793b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                            BUNDLE_KEY_TENTATIVE_USER_RESPONSE,
8803b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                            Attendees.ATTENDEE_STATUS_NONE);
8813b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE &&
8823b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    mEditResponseHelper != null) {
8833b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                // If the edit response helper dialog is open, we'll need to
8843b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                // know if either of the choices were selected.
8853b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                mEditResponseHelper.setWhichEvents(savedInstanceState.getInt(
8863b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                        BUNDLE_KEY_RESPONSE_WHICH_EVENTS, -1));
8873b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            }
88894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            mUserSetResponse = savedInstanceState.getInt(
88994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                    BUNDLE_KEY_USER_SET_ATTENDEE_RESPONSE,
89094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                    Attendees.ATTENDEE_STATUS_NONE);
89194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            if (mUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) {
89294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                // If the response was set by the user before a configuration
89394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                // change, we'll need to know which choice was selected.
89494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                mWhichEvents = savedInstanceState.getInt(
89594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                        BUNDLE_KEY_RESPONSE_WHICH_EVENTS, -1);
89694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            }
89794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein
89894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            mReminders = Utils.readRemindersFromBundle(savedInstanceState);
899320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson        }
900320c1b11a8238ef299a401655d1ae06ffad45a47Isaac Katzenelson
9017ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        if (mWindowStyle == DIALOG_WINDOW_STYLE) {
902cba7f1fd22e1d7ee9d8d0828f37bc08512bf6b75Michael Chan            mView = inflater.inflate(R.layout.event_info_dialog, container, false);
9037ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        } else {
9047ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson            mView = inflater.inflate(R.layout.event_info, container, false);
9057ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        }
9061ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        mScrollView = (ScrollView) mView.findViewById(R.id.event_info_scroll_view);
9078f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson        mLoadingMsgView = mView.findViewById(R.id.event_info_loading_msg);
9081aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski        mErrorMsgView = mView.findViewById(R.id.event_info_error_msg);
909259b8f9a21fffd3858218581e9daaf689b6b888fErik        mTitle = (TextView) mView.findViewById(R.id.title);
91075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting        mWhenDateTime = (TextView) mView.findViewById(R.id.when_datetime);
911259b8f9a21fffd3858218581e9daaf689b6b888fErik        mWhere = (TextView) mView.findViewById(R.id.where);
91299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan        mDesc = (ExpandableTextView) mView.findViewById(R.id.description);
913fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson        mHeadlines = mView.findViewById(R.id.event_info_headline);
9144afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        mLongAttendees = (AttendeesView) mView.findViewById(R.id.long_attendee_list);
9154afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
9163b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        mResponseRadioGroup = (RadioGroup) mView.findViewById(R.id.response_value);
9172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
9184003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        if (mUri == null) {
9194003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            // restore event ID from bundle
9204003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            mEventId = savedInstanceState.getLong(BUNDLE_KEY_EVENT_ID);
9214003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId);
9224003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            mStartMillis = savedInstanceState.getLong(BUNDLE_KEY_START_MILLIS);
9234003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            mEndMillis = savedInstanceState.getLong(BUNDLE_KEY_END_MILLIS);
9244003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        }
9254003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
9268f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson        mAnimateAlpha = ObjectAnimator.ofFloat(mScrollView, "Alpha", 0, 1);
9278f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson        mAnimateAlpha.setDuration(FADE_IN_TIME);
9288f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson        mAnimateAlpha.addListener(new AnimatorListenerAdapter() {
9298f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson            int defLayerType;
9308f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson
9318f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson            @Override
9328f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson            public void onAnimationStart(Animator animation) {
9338f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson                // Use hardware layer for better performance during animation
9348f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson                defLayerType = mScrollView.getLayerType();
9358f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson                mScrollView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
9368f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson                // Ensure that the loading message is gone before showing the
9378f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson                // event info
938263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson                mLoadingMsgView.removeCallbacks(mLoadingMsgAlphaUpdater);
9398f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson                mLoadingMsgView.setVisibility(View.GONE);
9408f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson            }
9418f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson
9428f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson            @Override
9438f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson            public void onAnimationCancel(Animator animation) {
9448f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson                mScrollView.setLayerType(defLayerType, null);
9458f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson            }
9468f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson
9478f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson            @Override
9488f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson            public void onAnimationEnd(Animator animation) {
9498f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson                mScrollView.setLayerType(defLayerType, null);
95080d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson                // Do not cross fade after the first time
95180d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson                mNoCrossFade = true;
9528f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson            }
9538f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson        });
9548f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson
9558f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson        mLoadingMsgView.setAlpha(0);
9568f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson        mScrollView.setAlpha(0);
9571aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski        mErrorMsgView.setVisibility(View.INVISIBLE);
958263b0291b701dc2b5df7ebab53f8e6808e7be9a8Isaac Katzenelson        mLoadingMsgView.postDelayed(mLoadingMsgAlphaUpdater, LOADING_MSG_DELAY);
9598f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson
9602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // start loading the data
9618f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson
9622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION,
9632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                null, null, null);
9642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
965d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson        View b = mView.findViewById(R.id.delete);
9668ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        b.setOnClickListener(new OnClickListener() {
9678ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            @Override
9688ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            public void onClick(View v) {
96969be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik                if (!mCanModifyCalendar) {
97069be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik                    return;
97169be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik                }
972d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson                mDeleteHelper =
973d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson                        new DeleteEventHelper(mContext, mActivity, !mIsDialog && !mIsTabletConfig /* exitWhenDone */);
974b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                mDeleteHelper.setDeleteNotificationListener(EventInfoFragment.this);
975b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                mDeleteHelper.setOnDismissListener(createDeleteOnDismissListener());
976b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                mDeleteDialogVisible = true;
977b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                mDeleteHelper.delete(mStartMillis, mEndMillis, mEventId, -1, onDeleteRunnable);
978d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson            }
979d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson        });
9808ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan
9814afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        b = mView.findViewById(R.id.change_color);
9824afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        b.setOnClickListener(new OnClickListener() {
9834afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            @Override
9844afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            public void onClick(View v) {
9854afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                if (!mCanModifyCalendar) {
9864afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    return;
9874afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                }
9884afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                showEventColorPickerDialog();
9894afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            }
9904afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        });
9914afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
99210b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson        // Hide Edit/Delete buttons if in full screen mode on a phone
9937ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        if (!mIsDialog && !mIsTabletConfig || mWindowStyle == EventInfoFragment.FULL_WINDOW_STYLE) {
99460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            mView.findViewById(R.id.event_info_buttons_container).setVisibility(View.GONE);
99560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        }
99660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
997cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting        // Create a listener for the email guests button
9987ffa24cba2977925b737e6bd39be59ba39609611Sara Ting        emailAttendeesButton = (Button) mView.findViewById(R.id.email_attendees_button);
999cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting        if (emailAttendeesButton != null) {
1000cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting            emailAttendeesButton.setOnClickListener(new View.OnClickListener() {
1001cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting                @Override
1002cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting                public void onClick(View v) {
1003cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting                    emailAttendees();
1004cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting                }
1005cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting            });
1006cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting        }
10071ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
1008cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting        // Create a listener for the add reminder button
1009b20942b3087dbef5483669b76e00e9b8b4d5a7b1Michael Chan        View reminderAddButton = mView.findViewById(R.id.reminder_add);
10101ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        View.OnClickListener addReminderOnClickListener = new View.OnClickListener() {
10111ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            @Override
10121ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            public void onClick(View v) {
10131ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                addReminder();
10148b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                mUserModifiedReminders = true;
10151ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            }
10161ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        };
10171ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        reminderAddButton.setOnClickListener(addReminderOnClickListener);
10181ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
10191ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        // Set reminders variables
10201ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
10211ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        SharedPreferences prefs = GeneralPreferences.getSharedPreferences(mActivity);
10221ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        String defaultReminderString = prefs.getString(
10231ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                GeneralPreferences.KEY_DEFAULT_REMINDER, GeneralPreferences.NO_REMINDER_STRING);
10241ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        mDefaultReminderMinutes = Integer.parseInt(defaultReminderString);
10251ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        prepareReminders();
10261ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
10272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        return mView;
10282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
10292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1030ac4350b25b794d1b2935266cf8c480e4fbf97b8fIsaac Katzenelson    private final Runnable onDeleteRunnable = new Runnable() {
103189ad0822f104015625f4ca88bfdf5c1d522b6e74Erik        @Override
103289ad0822f104015625f4ca88bfdf5c1d522b6e74Erik        public void run() {
10337c6236d5553dc9f3d004ebbed794249713a11d19RoboErik            if (EventInfoFragment.this.mIsPaused) {
10347c6236d5553dc9f3d004ebbed794249713a11d19RoboErik                mDismissOnResume = true;
10357c6236d5553dc9f3d004ebbed794249713a11d19RoboErik                return;
10367c6236d5553dc9f3d004ebbed794249713a11d19RoboErik            }
103789ad0822f104015625f4ca88bfdf5c1d522b6e74Erik            if (EventInfoFragment.this.isVisible()) {
103889ad0822f104015625f4ca88bfdf5c1d522b6e74Erik                EventInfoFragment.this.dismiss();
103989ad0822f104015625f4ca88bfdf5c1d522b6e74Erik            }
104089ad0822f104015625f4ca88bfdf5c1d522b6e74Erik        }
104189ad0822f104015625f4ca88bfdf5c1d522b6e74Erik    };
104289ad0822f104015625f4ca88bfdf5c1d522b6e74Erik
10432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void updateTitle() {
10442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Resources res = getActivity().getResources();
10452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mCanModifyCalendar && !mIsOrganizer) {
10462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            getActivity().setTitle(res.getString(R.string.event_info_title_invite));
10472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
10482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            getActivity().setTitle(res.getString(R.string.event_info_title));
10492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
10502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
10512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
10522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    /**
10532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * Initializes the event cursor, which is expected to point to the first
10542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * (and only) result from a query.
10551aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski     * @return false if the cursor is empty, true otherwise
10562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     */
10572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean initEventCursor() {
10582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if ((mEventCursor == null) || (mEventCursor.getCount() == 0)) {
10591aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski            return false;
10602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
10612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mEventCursor.moveToFirst();
10622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mEventId = mEventCursor.getInt(EVENT_INDEX_ID);
10632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String rRule = mEventCursor.getString(EVENT_INDEX_RRULE);
106466b2067e0a389180f909eb0a528bea5f6becca23Michael Chan        mIsRepeating = !TextUtils.isEmpty(rRule);
106594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        // mHasAlarm will be true if it was saved in the event already, or if
106694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        // we've explicitly been provided reminders (e.g. during rotation).
106794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        mHasAlarm = (mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) == 1)? true :
106894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            (mReminders != null && mReminders.size() > 0);
10691ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        mMaxReminders = mEventCursor.getInt(EVENT_INDEX_MAX_REMINDERS);
10701ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        mCalendarAllowedReminders =  mEventCursor.getString(EVENT_INDEX_ALLOWED_REMINDERS);
10711aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski        return true;
10722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
10732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
10742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    @SuppressWarnings("fallthrough")
10752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void initAttendeesCursor(View view) {
10766bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson        mOriginalAttendeeResponse = Attendees.ATTENDEE_STATUS_NONE;
1077d845fbe558d5229102b58cce70a1b29fe6cb6967Erik        mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE;
10782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mNumOfAttendees = 0;
10792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mAttendeesCursor != null) {
10802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mNumOfAttendees = mAttendeesCursor.getCount();
10812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            if (mAttendeesCursor.moveToFirst()) {
10822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mAcceptedAttendees.clear();
10832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mDeclinedAttendees.clear();
10842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mTentativeAttendees.clear();
10852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mNoResponseAttendees.clear();
10862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
10872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                do {
10882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    int status = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS);
10892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    String name = mAttendeesCursor.getString(ATTENDEES_INDEX_NAME);
10902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    String email = mAttendeesCursor.getString(ATTENDEES_INDEX_EMAIL);
10912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
109283efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                    if (mAttendeesCursor.getInt(ATTENDEES_INDEX_RELATIONSHIP) ==
109383efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                            Attendees.RELATIONSHIP_ORGANIZER) {
109483efa2d50deca53c9937b19a379045c31b541cb7Michael Chan
109583efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                        // Overwrites the one from Event table if available
109683efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                        if (!TextUtils.isEmpty(name)) {
109783efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                            mEventOrganizerDisplayName = name;
109883efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                            if (!mIsOrganizer) {
109983efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                                setVisibilityCommon(view, R.id.organizer_container, View.VISIBLE);
110083efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                                setTextCommon(view, R.id.organizer, mEventOrganizerDisplayName);
110183efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                            }
110283efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                        }
110383efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                    }
110483efa2d50deca53c9937b19a379045c31b541cb7Michael Chan
1105d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                    if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE &&
11062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            mCalendarOwnerAccount.equalsIgnoreCase(email)) {
11072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        mCalendarOwnerAttendeeId = mAttendeesCursor.getInt(ATTENDEES_INDEX_ID);
11082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        mOriginalAttendeeResponse = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS);
11092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    } else {
1110693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan                        String identity = null;
1111693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan                        String idNamespace = null;
1112693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan
1113fac2d1594f7ecae8e50dc7790ce67de0c9b70d22Sara Ting                        if (Utils.isJellybeanOrLater()) {
1114693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan                            identity = mAttendeesCursor.getString(ATTENDEES_INDEX_IDENTITY);
1115693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan                            idNamespace = mAttendeesCursor.getString(ATTENDEES_INDEX_ID_NAMESPACE);
1116693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan                        }
1117ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting
11182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        // Don't show your own status in the list because:
11192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        //  1) it doesn't make sense for event without other guests.
11202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        //  2) there's a spinner for that for events with guests.
11212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        switch(status) {
11222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            case Attendees.ATTENDEE_STATUS_ACCEPTED:
1123fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson                                mAcceptedAttendees.add(new Attendee(name, email,
1124ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting                                        Attendees.ATTENDEE_STATUS_ACCEPTED, identity,
1125ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting                                        idNamespace));
11262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                break;
11272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            case Attendees.ATTENDEE_STATUS_DECLINED:
1128fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson                                mDeclinedAttendees.add(new Attendee(name, email,
1129ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting                                        Attendees.ATTENDEE_STATUS_DECLINED, identity,
1130ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting                                        idNamespace));
11312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                break;
11328ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                            case Attendees.ATTENDEE_STATUS_TENTATIVE:
1133fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson                                mTentativeAttendees.add(new Attendee(name, email,
1134ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting                                        Attendees.ATTENDEE_STATUS_TENTATIVE, identity,
1135ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting                                        idNamespace));
11368ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                                break;
11378ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                            default:
1138fe25c502fa0822a57201c7be8b00f0f26b22a385Isaac Katzenelson                                mNoResponseAttendees.add(new Attendee(name, email,
1139ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting                                        Attendees.ATTENDEE_STATUS_NONE, identity,
1140ddbc002f3471e224fc112d406116e396ee1c50aeSara Ting                                        idNamespace));
11412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        }
11422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    }
11432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                } while (mAttendeesCursor.moveToNext());
11442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mAttendeesCursor.moveToFirst();
11452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateAttendees(view);
11472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
11482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
11492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
11502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    @Override
11524003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    public void onSaveInstanceState(Bundle outState) {
11534003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        super.onSaveInstanceState(outState);
11544003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        outState.putLong(BUNDLE_KEY_EVENT_ID, mEventId);
11554003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        outState.putLong(BUNDLE_KEY_START_MILLIS, mStartMillis);
11564003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        outState.putLong(BUNDLE_KEY_END_MILLIS, mEndMillis);
115771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        outState.putBoolean(BUNDLE_KEY_IS_DIALOG, mIsDialog);
11587ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        outState.putInt(BUNDLE_KEY_WINDOW_STYLE, mWindowStyle);
1159b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson        outState.putBoolean(BUNDLE_KEY_DELETE_DIALOG_VISIBLE, mDeleteDialogVisible);
11604afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        outState.putInt(BUNDLE_KEY_CALENDAR_COLOR, mCalendarColor);
1161f56b14972130233fd7e7c64160084793a7a0a55bJames Kung        outState.putBoolean(BUNDLE_KEY_CALENDAR_COLOR_INIT, mCalendarColorInitialized);
11624afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        outState.putInt(BUNDLE_KEY_ORIGINAL_COLOR, mOriginalColor);
1163f56b14972130233fd7e7c64160084793a7a0a55bJames Kung        outState.putBoolean(BUNDLE_KEY_ORIGINAL_COLOR_INIT, mOriginalColorInitialized);
11644afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        outState.putInt(BUNDLE_KEY_CURRENT_COLOR, mCurrentColor);
1165f56b14972130233fd7e7c64160084793a7a0a55bJames Kung        outState.putBoolean(BUNDLE_KEY_CURRENT_COLOR_INIT, mCurrentColorInitialized);
1166497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung        outState.putInt(BUNDLE_KEY_CURRENT_COLOR_KEY, mCurrentColorKey);
1167f56b14972130233fd7e7c64160084793a7a0a55bJames Kung
11683b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        // We'll need the temporary response for configuration changes.
11693b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        outState.putInt(BUNDLE_KEY_TENTATIVE_USER_RESPONSE, mTentativeUserSetResponse);
11703b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE &&
11713b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                mEditResponseHelper != null) {
11723b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            outState.putInt(BUNDLE_KEY_RESPONSE_WHICH_EVENTS,
11733b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                    mEditResponseHelper.getWhichEvents());
11743b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        }
117594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein
117694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        // Save the current response.
117794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        int response;
117894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        if (mAttendeeResponseFromIntent != Attendees.ATTENDEE_STATUS_NONE) {
117994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            response = mAttendeeResponseFromIntent;
118094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        } else {
118194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            response = mOriginalAttendeeResponse;
118294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        }
118394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        outState.putInt(BUNDLE_KEY_ATTENDEE_RESPONSE, response);
118494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        if (mUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) {
118594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            response = mUserSetResponse;
118694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            outState.putInt(BUNDLE_KEY_USER_SET_ATTENDEE_RESPONSE, response);
118794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            outState.putInt(BUNDLE_KEY_RESPONSE_WHICH_EVENTS, mWhichEvents);
118894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        }
118994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein
119094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        // Save the reminders.
119194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        mReminders = EventViewUtils.reminderItemsToReminders(mReminderViews,
119294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                mReminderMinuteValues, mReminderMethodValues);
119394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        int numReminders = mReminders.size();
119494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        ArrayList<Integer> reminderMinutes =
119594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                new ArrayList<Integer>(numReminders);
119694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        ArrayList<Integer> reminderMethods =
119794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                new ArrayList<Integer>(numReminders);
119894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        for (ReminderEntry reminder : mReminders) {
119994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            reminderMinutes.add(reminder.getMinutes());
120094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            reminderMethods.add(reminder.getMethod());
120194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        }
120294a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        outState.putIntegerArrayList(
120394a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                BUNDLE_KEY_REMINDER_MINUTES, reminderMinutes);
120494a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        outState.putIntegerArrayList(
120594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                BUNDLE_KEY_REMINDER_METHODS, reminderMethods);
120660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    }
120760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
120860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    @Override
120960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
121060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        super.onCreateOptionsMenu(menu, inflater);
12111dadfa267acd2f6e190c945db3ae59cd7b06a1c8James Kung        // Show color/edit/delete buttons only in non-dialog configuration
12127ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        if (!mIsDialog && !mIsTabletConfig || mWindowStyle == EventInfoFragment.FULL_WINDOW_STYLE) {
121360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            inflater.inflate(R.menu.event_info_title_bar, menu);
1214d8353fb85ef59a88580125207be9c914a8586758RoboErik            mMenu = menu;
1215d8353fb85ef59a88580125207be9c914a8586758RoboErik            updateMenu();
121660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        }
12174003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    }
12184003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
1219d8353fb85ef59a88580125207be9c914a8586758RoboErik    @Override
1220d8353fb85ef59a88580125207be9c914a8586758RoboErik    public boolean onOptionsItemSelected(MenuItem item) {
1221d8353fb85ef59a88580125207be9c914a8586758RoboErik
12227ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        // If we're a dialog we don't want to handle menu buttons
12237ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        if (mIsDialog) {
1224d8353fb85ef59a88580125207be9c914a8586758RoboErik            return false;
1225d8353fb85ef59a88580125207be9c914a8586758RoboErik        }
1226d8353fb85ef59a88580125207be9c914a8586758RoboErik        // Handles option menu selections:
1227d8353fb85ef59a88580125207be9c914a8586758RoboErik        // Home button - close event info activity and start the main calendar
1228d8353fb85ef59a88580125207be9c914a8586758RoboErik        // one
1229d8353fb85ef59a88580125207be9c914a8586758RoboErik        // Edit button - start the event edit activity and close the info
1230d8353fb85ef59a88580125207be9c914a8586758RoboErik        // activity
1231d8353fb85ef59a88580125207be9c914a8586758RoboErik        // Delete button - start a delete query that calls a runnable that close
1232d8353fb85ef59a88580125207be9c914a8586758RoboErik        // the info activity
1233d8353fb85ef59a88580125207be9c914a8586758RoboErik
1234bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        final int itemId = item.getItemId();
1235bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        if (itemId == android.R.id.home) {
1236bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            Utils.returnToCalendarHome(mContext);
1237bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            mActivity.finish();
1238bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            return true;
1239bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        } else if (itemId == R.id.info_action_edit) {
12401d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            doEdit();
1241bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            mActivity.finish();
1242bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        } else if (itemId == R.id.info_action_delete) {
1243bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            mDeleteHelper =
1244bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                    new DeleteEventHelper(mActivity, mActivity, true /* exitWhenDone */);
1245bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            mDeleteHelper.setDeleteNotificationListener(EventInfoFragment.this);
1246bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            mDeleteHelper.setOnDismissListener(createDeleteOnDismissListener());
1247bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            mDeleteDialogVisible = true;
1248bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            mDeleteHelper.delete(mStartMillis, mEndMillis, mEventId, -1, onDeleteRunnable);
12494afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        } else if (itemId == R.id.info_action_change_color) {
12504afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            showEventColorPickerDialog();
1251d8353fb85ef59a88580125207be9c914a8586758RoboErik        }
1252d8353fb85ef59a88580125207be9c914a8586758RoboErik        return super.onOptionsItemSelected(item);
1253d8353fb85ef59a88580125207be9c914a8586758RoboErik    }
12544003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
12554afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private void showEventColorPickerDialog() {
12562fca024254c9de09f8d87933cc8c9a2046e37c52James Kung        if (mColorPickerDialog == null) {
12572fca024254c9de09f8d87933cc8c9a2046e37c52James Kung            mColorPickerDialog = EventColorPickerDialog.newInstance(mColors, mCurrentColor,
12582fca024254c9de09f8d87933cc8c9a2046e37c52James Kung                    mCalendarColor, mIsTabletConfig);
12592fca024254c9de09f8d87933cc8c9a2046e37c52James Kung            mColorPickerDialog.setOnColorSelectedListener(this);
12604afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
126195e9538c2e504ea5528b07e3abdf54bb3d91c88aJames Kung        final FragmentManager fragmentManager = getFragmentManager();
126295e9538c2e504ea5528b07e3abdf54bb3d91c88aJames Kung        fragmentManager.executePendingTransactions();
12632fca024254c9de09f8d87933cc8c9a2046e37c52James Kung        if (!mColorPickerDialog.isAdded()) {
12642fca024254c9de09f8d87933cc8c9a2046e37c52James Kung            mColorPickerDialog.show(fragmentManager, COLOR_PICKER_DIALOG_TAG);
12654afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
12664afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    }
12674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
12684afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private boolean saveEventColor() {
12694afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        if (mCurrentColor == mOriginalColor) {
12704afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            return false;
12714afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
12724afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
12734afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        ContentValues values = new ContentValues();
12744afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        if (mCurrentColor != mCalendarColor) {
1275497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung            values.put(Events.EVENT_COLOR_KEY, mCurrentColorKey);
12764afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        } else {
12774afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            values.put(Events.EVENT_COLOR_KEY, NO_EVENT_COLOR);
12784afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
12794afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId);
12804afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        mHandler.startUpdate(mHandler.getNextToken(), null, uri, values,
12814afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                null, null, Utils.UNDO_DELAY);
12824afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        return true;
12834afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    }
12844afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
12854003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    @Override
12869d4a952f846a5758965897b88715e49106638120Sam Blitzstein    public void onStop() {
12879d4a952f846a5758965897b88715e49106638120Sam Blitzstein        Activity act = getActivity();
12889d4a952f846a5758965897b88715e49106638120Sam Blitzstein        if (!mEventDeletionStarted && act != null && !act.isChangingConfigurations()) {
1289497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung
1290ac4350b25b794d1b2935266cf8c480e4fbf97b8fIsaac Katzenelson            boolean responseSaved = saveResponse();
12914afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            boolean eventColorSaved = saveEventColor();
12924afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            if (saveReminders() || responseSaved || eventColorSaved) {
1293b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson                Toast.makeText(getActivity(), R.string.saving_event, Toast.LENGTH_SHORT).show();
1294b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson            }
12952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
12969d4a952f846a5758965897b88715e49106638120Sam Blitzstein        super.onStop();
12972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
12982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    @Override
13002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public void onDestroy() {
13012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mEventCursor != null) {
13022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mEventCursor.close();
13032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
13042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mCalendarsCursor != null) {
13052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mCalendarsCursor.close();
13062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
13072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mAttendeesCursor != null) {
13082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mAttendeesCursor.close();
13092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
131071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        super.onDestroy();
13112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
13122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
13132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    /**
13142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * Asynchronously saves the response to an invitation if the user changed
13152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * the response. Returns true if the database will be updated.
13162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     *
13172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * @return true if the database will be changed
13182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     */
13192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean saveResponse() {
13202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mAttendeesCursor == null || mEventCursor == null) {
13212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return false;
13222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
1323f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan
13243b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        int status = getResponseFromButtonId(
13253b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                mResponseRadioGroup.getCheckedRadioButtonId());
1326f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan        if (status == Attendees.ATTENDEE_STATUS_NONE) {
13272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return false;
13282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
13292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
13302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // If the status has not changed, then don't update the database
13312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (status == mOriginalAttendeeResponse) {
13322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return false;
13332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
13342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
13352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // If we never got an owner attendee id we can't set the status
1336d845fbe558d5229102b58cce70a1b29fe6cb6967Erik        if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE) {
13372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return false;
13382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
13392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
13402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (!mIsRepeating) {
13412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // This is a non-repeating event
13422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            updateResponse(mEventId, mCalendarOwnerAttendeeId, status);
13439d4a952f846a5758965897b88715e49106638120Sam Blitzstein            mOriginalAttendeeResponse = status;
13442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return true;
13452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
13462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
134796267164b5f536ae0d341ed46a55098423bf33ebJames Kung        if (DEBUG) {
134896267164b5f536ae0d341ed46a55098423bf33ebJames Kung            Log.d(TAG, "Repeating event: mWhichEvents=" + mWhichEvents);
134996267164b5f536ae0d341ed46a55098423bf33ebJames Kung        }
13502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // This is a repeating event
13513b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        switch (mWhichEvents) {
13522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case -1:
13532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                return false;
13542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case UPDATE_SINGLE:
1355c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden                createExceptionResponse(mEventId, status);
13569d4a952f846a5758965897b88715e49106638120Sam Blitzstein                mOriginalAttendeeResponse = status;
13572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                return true;
13582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case UPDATE_ALL:
13592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateResponse(mEventId, mCalendarOwnerAttendeeId, status);
13609d4a952f846a5758965897b88715e49106638120Sam Blitzstein                mOriginalAttendeeResponse = status;
13612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                return true;
13622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            default:
13632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                Log.e(TAG, "Unexpected choice for updating invitation response");
13642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                break;
13652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
13662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        return false;
13672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
13682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
13692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void updateResponse(long eventId, long attendeeId, int status) {
13702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Update the attendee status in the attendees table.  the provider
13712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // takes care of updating the self attendance status.
13722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        ContentValues values = new ContentValues();
13732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
13742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (!TextUtils.isEmpty(mCalendarOwnerAccount)) {
13752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            values.put(Attendees.ATTENDEE_EMAIL, mCalendarOwnerAccount);
13762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
13772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Attendees.ATTENDEE_STATUS, status);
13782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Attendees.EVENT_ID, eventId);
13792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
13802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Uri uri = ContentUris.withAppendedId(Attendees.CONTENT_URI, attendeeId);
13812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
13822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mHandler.startUpdate(mHandler.getNextToken(), null, uri, values,
13832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                null, null, Utils.UNDO_DELAY);
13842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
13852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1386c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden    /**
1387c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden     * Creates an exception to a recurring event.  The only change we're making is to the
1388c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden     * "self attendee status" value.  The provider will take care of updating the corresponding
1389c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden     * Attendees.attendeeStatus entry.
1390c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden     *
1391c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden     * @param eventId The recurring event.
1392c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden     * @param status The new value for selfAttendeeStatus.
1393c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden     */
1394c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden    private void createExceptionResponse(long eventId, int status) {
13952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        ContentValues values = new ContentValues();
13962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.ORIGINAL_INSTANCE_TIME, mStartMillis);
13972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.SELF_ATTENDEE_STATUS, status);
1398c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden        values.put(Events.STATUS, Events.STATUS_CONFIRMED);
13992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1400364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
140179b2c8c946c29ea9107957fe72a9fa9f560da345Andy McFadden        Uri exceptionUri = Uri.withAppendedPath(Events.CONTENT_EXCEPTION_URI,
1402c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden                String.valueOf(eventId));
1403c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden        ops.add(ContentProviderOperation.newInsert(exceptionUri).withValues(values).build());
1404364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik
1405c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden        mHandler.startBatch(mHandler.getNextToken(), null, CalendarContract.AUTHORITY, ops,
1406c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden                Utils.UNDO_DELAY);
1407c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden   }
14082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1409f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan    public static int getResponseFromButtonId(int buttonId) {
1410f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan        int response;
1411bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        if (buttonId == R.id.response_yes) {
1412bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            response = Attendees.ATTENDEE_STATUS_ACCEPTED;
1413bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        } else if (buttonId == R.id.response_maybe) {
1414bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            response = Attendees.ATTENDEE_STATUS_TENTATIVE;
1415bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        } else if (buttonId == R.id.response_no) {
1416bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            response = Attendees.ATTENDEE_STATUS_DECLINED;
1417bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        } else {
1418bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            response = Attendees.ATTENDEE_STATUS_NONE;
14192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
1420f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan        return response;
1421f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan    }
1422f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan
1423f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan    public static int findButtonIdForResponse(int response) {
1424f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan        int buttonId;
1425f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan        switch (response) {
1426f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan            case Attendees.ATTENDEE_STATUS_ACCEPTED:
1427f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan                buttonId = R.id.response_yes;
1428f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan                break;
1429f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan            case Attendees.ATTENDEE_STATUS_TENTATIVE:
1430f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan                buttonId = R.id.response_maybe;
1431f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan                break;
1432f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan            case Attendees.ATTENDEE_STATUS_DECLINED:
1433f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan                buttonId = R.id.response_no;
1434f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan                break;
1435f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan                default:
1436f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan                    buttonId = -1;
1437f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan        }
1438f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan        return buttonId;
14392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
14402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
14412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void doEdit() {
1442c41b99be504e395b8c7264a0d626906ccbff1c57Erik        Context c = getActivity();
1443c41b99be504e395b8c7264a0d626906ccbff1c57Erik        // This ensures that we aren't in the process of closing and have been
1444c41b99be504e395b8c7264a0d626906ccbff1c57Erik        // unattached already
1445c41b99be504e395b8c7264a0d626906ccbff1c57Erik        if (c != null) {
14461d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId);
14471d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            Intent intent = new Intent(Intent.ACTION_EDIT, uri);
14481d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            intent.setClass(mActivity, EditEventActivity.class);
14491d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            intent.putExtra(EXTRA_EVENT_BEGIN_TIME, mStartMillis);
14501d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            intent.putExtra(EXTRA_EVENT_END_TIME, mEndMillis);
14511d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            intent.putExtra(EXTRA_EVENT_ALL_DAY, mAllDay);
14521d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            intent.putExtra(EditEventActivity.EXTRA_EVENT_COLOR, mCurrentColor);
14531d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            intent.putExtra(EditEventActivity.EXTRA_EVENT_REMINDERS, EventViewUtils
14541d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung                    .reminderItemsToReminders(mReminderViews, mReminderMinuteValues,
14551d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung                    mReminderMethodValues));
14561d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            intent.putExtra(EVENT_EDIT_ON_LAUNCH, true);
14571d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            startActivity(intent);
1458c41b99be504e395b8c7264a0d626906ccbff1c57Erik        }
14592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
14602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
14611aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski    private void displayEventNotFound() {
14621aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski        mErrorMsgView.setVisibility(View.VISIBLE);
14631aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski        mScrollView.setVisibility(View.GONE);
14641aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski        mLoadingMsgView.setVisibility(View.GONE);
14651aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski    }
14661aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski
14672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void updateEvent(View view) {
1468b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson        if (mEventCursor == null || view == null) {
14692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
14702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
14712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
14725f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan        Context context = view.getContext();
14735f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan        if (context == null) {
14745f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan            return;
14755f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan        }
14765f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan
14772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String eventName = mEventCursor.getString(EVENT_INDEX_TITLE);
14782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (eventName == null || eventName.length() == 0) {
14792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            eventName = getActivity().getString(R.string.no_title_label);
14802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
14812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1482da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting        // 3rd parties might not have specified the start/end time when firing the
1483da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting        // Events.CONTENT_URI intent.  Update these with values read from the db.
1484da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting        if (mStartMillis == 0 && mEndMillis == 0) {
1485da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting            mStartMillis = mEventCursor.getLong(EVENT_INDEX_DTSTART);
1486da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting            mEndMillis = mEventCursor.getLong(EVENT_INDEX_DTEND);
1487da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting            if (mEndMillis == 0) {
1488da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                String duration = mEventCursor.getString(EVENT_INDEX_DURATION);
1489da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                if (!TextUtils.isEmpty(duration)) {
1490da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                    try {
1491da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                        Duration d = new Duration();
1492da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                        d.parse(duration);
1493da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                        long endMillis = mStartMillis + d.getMillis();
1494da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                        if (endMillis >= mStartMillis) {
1495da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                            mEndMillis = endMillis;
1496da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                        } else {
1497da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                            Log.d(TAG, "Invalid duration string: " + duration);
1498da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                        }
1499da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                    } catch (DateException e) {
1500da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                        Log.d(TAG, "Error parsing duration string " + duration, e);
1501da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                    }
1502da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                }
1503da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                if (mEndMillis == 0) {
1504da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                    mEndMillis = mStartMillis;
1505da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                }
1506da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting            }
1507da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting        }
1508da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting
15098b1119b1b58381c7fc550974f53cf93bd95dffa8Michael Chan        mAllDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0;
15102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String location = mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION);
15112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String description = mEventCursor.getString(EVENT_INDEX_DESCRIPTION);
15122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String rRule = mEventCursor.getString(EVENT_INDEX_RRULE);
1513f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson        String eventTimezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE);
15142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1515497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung        mHeadlines.setBackgroundColor(mCurrentColor);
15162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
15174e92627c5eb10de50c49c57e116b080d48360c70Sara Ting        // What
15184e92627c5eb10de50c49c57e116b080d48360c70Sara Ting        if (eventName != null) {
15194e92627c5eb10de50c49c57e116b080d48360c70Sara Ting            setTextCommon(view, R.id.title, eventName);
15204e92627c5eb10de50c49c57e116b080d48360c70Sara Ting        }
15214e92627c5eb10de50c49c57e116b080d48360c70Sara Ting
15222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // When
1523fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson        // Set the date and repeats (if any)
152475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting        String localTimezone = Utils.getTimeZone(mActivity, mTZUpdater);
15255f5ef752bfd4640016c4dedef53be47c5b8842afMichael Chan
152623acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting        Resources resources = context.getResources();
152723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting        String displayedDatetime = Utils.getDisplayedDatetime(mStartMillis, mEndMillis,
152823acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting                System.currentTimeMillis(), localTimezone, mAllDay, context);
1529e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan
1530e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan        String displayedTimezone = null;
1531e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan        if (!mAllDay) {
1532e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan            displayedTimezone = Utils.getDisplayedTimezone(mStartMillis, localTimezone,
1533e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan                    eventTimezone);
153423acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting        }
153523acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting        // Display the datetime.  Make the timezone (if any) transparent.
153623acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting        if (displayedTimezone == null) {
153723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting            setTextCommon(view, R.id.when_datetime, displayedDatetime);
153823acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting        } else {
1539e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan            int timezoneIndex = displayedDatetime.length();
1540e8e557260ec1f907d257dcbb08c49bc5d0926795Michael Chan            displayedDatetime += "  " + displayedTimezone;
154123acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting            SpannableStringBuilder sb = new SpannableStringBuilder(displayedDatetime);
154223acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting            ForegroundColorSpan transparentColorSpan = new ForegroundColorSpan(
154323acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting                    resources.getColor(R.color.event_info_headline_transparent_color));
154423acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting            sb.setSpan(transparentColorSpan, timezoneIndex, displayedDatetime.length(),
154523acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting                    Spannable.SPAN_INCLUSIVE_INCLUSIVE);
154623acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting            setTextCommon(view, R.id.when_datetime, sb);
154723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting        }
1548fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson
154975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting        // Display the repeat string (if any)
1550fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson        String repeatString = null;
1551fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson        if (!TextUtils.isEmpty(rRule)) {
1552fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson            EventRecurrence eventRecurrence = new EventRecurrence();
1553fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson            eventRecurrence.parse(rRule);
155475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting            Time date = new Time(localTimezone);
155575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting            date.set(mStartMillis);
15568b1119b1b58381c7fc550974f53cf93bd95dffa8Michael Chan            if (mAllDay) {
1557fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson                date.timezone = Time.TIMEZONE_UTC;
1558fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson            }
1559fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson            eventRecurrence.setStartDate(date);
1560b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            repeatString = EventRecurrenceFormatter.getRepeatString(mContext, resources,
1561b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    eventRecurrence, true);
1562fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson        }
156375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting        if (repeatString == null) {
156475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting            view.findViewById(R.id.when_repeat).setVisibility(View.GONE);
15652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
156675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting            setTextCommon(view, R.id.when_repeat, repeatString);
1567f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson        }
1568f6f797769a5cac9f9796574fe6c5ca767b1c269aIsaac Katzenelson
15692e46cff640b123ba5f7a67c934ae98e6b02a905fIsaac Katzenelson        // Organizer view is setup in the updateCalendar method
15702e46cff640b123ba5f7a67c934ae98e6b02a905fIsaac Katzenelson
15712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
15722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Where
1573ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan        if (location == null || location.trim().length() == 0) {
15742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            setVisibilityCommon(view, R.id.where, View.GONE);
15752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
1576259b8f9a21fffd3858218581e9daaf689b6b888fErik            final TextView textView = mWhere;
15772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            if (textView != null) {
1578ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan                textView.setAutoLinkMask(0);
1579ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan                textView.setText(location.trim());
1580af577fd49d334060f34d3e40e48c762ff5f0de4fAndy McFadden                try {
158129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein                    textView.setText(Utils.extendedLinkify(textView.getText().toString(), true));
158229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein
158329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein                    // Linkify.addLinks() sets the TextView movement method if it finds any links.
1584da3ee395bf1cc677c0f9fe6eb9dc40cebc2062dcSara Ting                    // We must do the same here, in case linkify by itself did not find any.
158529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein                    // (This is cloned from Linkify.addLinkMovementMethod().)
158629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein                    MovementMethod mm = textView.getMovementMethod();
158729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein                    if ((mm == null) || !(mm instanceof LinkMovementMethod)) {
158829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein                        if (textView.getLinksClickable()) {
158929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein                            textView.setMovementMethod(LinkMovementMethod.getInstance());
159029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein                        }
159129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein                    }
1592af577fd49d334060f34d3e40e48c762ff5f0de4fAndy McFadden                } catch (Exception ex) {
1593af577fd49d334060f34d3e40e48c762ff5f0de4fAndy McFadden                    // unexpected
1594af577fd49d334060f34d3e40e48c762ff5f0de4fAndy McFadden                    Log.e(TAG, "Linkification failed", ex);
1595af577fd49d334060f34d3e40e48c762ff5f0de4fAndy McFadden                }
159673b07655afcea1ba2ce8ed580a50992bf0baf857Andy McFadden
1597ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan                textView.setOnTouchListener(new OnTouchListener() {
1598c928e3d4ce097389b59eea82a5ca9827a44a8c9cAndy McFadden                    @Override
1599ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan                    public boolean onTouch(View v, MotionEvent event) {
1600ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan                        try {
1601ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan                            return v.onTouchEvent(event);
1602ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan                        } catch (ActivityNotFoundException e) {
1603ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan                            // ignore
1604ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan                            return true;
16052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        }
1606ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan                    }
1607ddfb59d54494c97c0c0b5326821a9594b1fe8896Michael Chan                });
16082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
16092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
16102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
16112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Description
1612352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        if (description != null && description.length() != 0) {
161399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan            mDesc.setText(description);
16142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
16152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
16162c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan        // Launch Custom App
1617fac2d1594f7ecae8e50dc7790ce67de0c9b70d22Sara Ting        if (Utils.isJellybeanOrLater()) {
1618693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan            updateCustomAppButton();
1619693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan        }
16202c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan    }
16212c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16222c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan    private void updateCustomAppButton() {
16232c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan        buttonSetup: {
16242c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            final Button launchButton = (Button) mView.findViewById(R.id.launch_custom_app_button);
16252c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            if (launchButton == null)
16262c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                break buttonSetup;
16272c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16282c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            final String customAppPackage = mEventCursor.getString(EVENT_INDEX_CUSTOM_APP_PACKAGE);
16292c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            final String customAppUri = mEventCursor.getString(EVENT_INDEX_CUSTOM_APP_URI);
16302c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16312c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            if (TextUtils.isEmpty(customAppPackage) || TextUtils.isEmpty(customAppUri))
16322c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                break buttonSetup;
16332c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16342c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            PackageManager pm = mContext.getPackageManager();
16352c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            if (pm == null)
16362c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                break buttonSetup;
16372c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16382c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            ApplicationInfo info;
16392c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            try {
16402c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                info = pm.getApplicationInfo(customAppPackage, 0);
16412c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                if (info == null)
16422c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                    break buttonSetup;
16432c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            } catch (NameNotFoundException e) {
16442c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                break buttonSetup;
16452c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            }
16462c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16472c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId);
16482c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            final Intent intent = new Intent(CalendarContract.ACTION_HANDLE_CUSTOM_EVENT, uri);
16492c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            intent.setPackage(customAppPackage);
16502c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            intent.putExtra(CalendarContract.EXTRA_CUSTOM_APP_URI, customAppUri);
16512c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            intent.putExtra(EXTRA_EVENT_BEGIN_TIME, mStartMillis);
16522c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16532c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            // See if we have a taker for our intent
16542c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            if (pm.resolveActivity(intent, 0) == null)
16552c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                break buttonSetup;
16562c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16572c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            Drawable icon = pm.getApplicationIcon(info);
16582c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            if (icon != null) {
16592c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16602c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                Drawable[] d = launchButton.getCompoundDrawables();
16612c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                icon.setBounds(0, 0, mCustomAppIconSize, mCustomAppIconSize);
16622c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                launchButton.setCompoundDrawables(icon, d[1], d[2], d[3]);
16632c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            }
16642c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16652c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            CharSequence label = pm.getApplicationLabel(info);
16662c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            if (label != null && label.length() != 0) {
16672c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                launchButton.setText(label);
16682c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            } else if (icon == null) {
16692c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                // No icon && no label. Hide button?
16702c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                break buttonSetup;
16712c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            }
16722c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16732c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            // Launch custom app
16742c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            launchButton.setOnClickListener(new View.OnClickListener() {
16752c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                @Override
16762c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                public void onClick(View v) {
16772c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                    try {
16782c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                        startActivityForResult(intent, 0);
16792c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                    } catch (ActivityNotFoundException e) {
16802c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                        // Shouldn't happen as we checked it already
16812c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                        setVisibilityCommon(mView, R.id.launch_custom_app_container, View.GONE);
16822c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                    }
16832c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan                }
16842c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            });
16852c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16862c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            setVisibilityCommon(mView, R.id.launch_custom_app_container, View.VISIBLE);
16872c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan            return;
16882c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16892c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan        }
16902c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan
16912c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan        setVisibilityCommon(mView, R.id.launch_custom_app_container, View.GONE);
16922c8485c84855545a0a8a0a7cb26d7c401a32cdd5Michael Chan        return;
16938f4d969064ceeec166f709b81cc7b8427686154eIsaac Katzenelson    }
169475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting
1695259b8f9a21fffd3858218581e9daaf689b6b888fErik    private void sendAccessibilityEvent() {
1696ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden        AccessibilityManager am =
1697ef31a98202852807f460af49ae3313d1ccf5e288Andy McFadden            (AccessibilityManager) getActivity().getSystemService(Service.ACCESSIBILITY_SERVICE);
1698259b8f9a21fffd3858218581e9daaf689b6b888fErik        if (!am.isEnabled()) {
1699259b8f9a21fffd3858218581e9daaf689b6b888fErik            return;
1700259b8f9a21fffd3858218581e9daaf689b6b888fErik        }
1701259b8f9a21fffd3858218581e9daaf689b6b888fErik
1702259b8f9a21fffd3858218581e9daaf689b6b888fErik        AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_FOCUSED);
17031aba96aa9678633c22eb14490195177b059c574ePaul Sliwowski        event.setClassName(EventInfoFragment.class.getName());
1704259b8f9a21fffd3858218581e9daaf689b6b888fErik        event.setPackageName(getActivity().getPackageName());
1705259b8f9a21fffd3858218581e9daaf689b6b888fErik        List<CharSequence> text = event.getText();
1706259b8f9a21fffd3858218581e9daaf689b6b888fErik
170799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan        addFieldToAccessibilityEvent(text, mTitle, null);
170875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting        addFieldToAccessibilityEvent(text, mWhenDateTime, null);
170999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan        addFieldToAccessibilityEvent(text, mWhere, null);
171099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan        addFieldToAccessibilityEvent(text, null, mDesc);
1711259b8f9a21fffd3858218581e9daaf689b6b888fErik
17123b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        if (mResponseRadioGroup.getVisibility() == View.VISIBLE) {
17133b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            int id = mResponseRadioGroup.getCheckedRadioButtonId();
1714259b8f9a21fffd3858218581e9daaf689b6b888fErik            if (id != View.NO_ID) {
1715259b8f9a21fffd3858218581e9daaf689b6b888fErik                text.add(((TextView) getView().findViewById(R.id.response_label)).getText());
17163b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                text.add((((RadioButton) (mResponseRadioGroup.findViewById(id)))
17173b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                        .getText() + PERIOD_SPACE));
1718259b8f9a21fffd3858218581e9daaf689b6b888fErik            }
1719259b8f9a21fffd3858218581e9daaf689b6b888fErik        }
1720259b8f9a21fffd3858218581e9daaf689b6b888fErik
1721259b8f9a21fffd3858218581e9daaf689b6b888fErik        am.sendAccessibilityEvent(event);
1722259b8f9a21fffd3858218581e9daaf689b6b888fErik    }
1723259b8f9a21fffd3858218581e9daaf689b6b888fErik
172499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan    private void addFieldToAccessibilityEvent(List<CharSequence> text, TextView tv,
172599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan            ExpandableTextView etv) {
17263389397186b93936747d4009a35f5bae605c246eMichael Chan        CharSequence cs;
172799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan        if (tv != null) {
17283389397186b93936747d4009a35f5bae605c246eMichael Chan            cs = tv.getText();
172999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan        } else if (etv != null) {
17303389397186b93936747d4009a35f5bae605c246eMichael Chan            cs = etv.getText();
173199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan        } else {
17329ceed1f3df98c5fc85441da0c6e7e5d45cf17a1eIsaac Katzenelson            return;
17339ceed1f3df98c5fc85441da0c6e7e5d45cf17a1eIsaac Katzenelson        }
173499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan
17353389397186b93936747d4009a35f5bae605c246eMichael Chan        if (!TextUtils.isEmpty(cs)) {
17363389397186b93936747d4009a35f5bae605c246eMichael Chan            cs = cs.toString().trim();
17373389397186b93936747d4009a35f5bae605c246eMichael Chan            if (cs.length() > 0) {
17383389397186b93936747d4009a35f5bae605c246eMichael Chan                text.add(cs);
17393389397186b93936747d4009a35f5bae605c246eMichael Chan                text.add(PERIOD_SPACE);
17403389397186b93936747d4009a35f5bae605c246eMichael Chan            }
1741259b8f9a21fffd3858218581e9daaf689b6b888fErik        }
1742259b8f9a21fffd3858218581e9daaf689b6b888fErik    }
1743259b8f9a21fffd3858218581e9daaf689b6b888fErik
17442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void updateCalendar(View view) {
17454afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
17462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mCalendarOwnerAccount = "";
17472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mCalendarsCursor != null && mEventCursor != null) {
17482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mCalendarsCursor.moveToFirst();
17492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            String tempAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT);
17502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mCalendarOwnerAccount = (tempAccount == null) ? "" : tempAccount;
1751352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mOwnerCanRespond = mCalendarsCursor.getInt(CALENDARS_INDEX_OWNER_CAN_RESPOND) != 0;
175242896f76d81dbae873614340a3a78b29e7d463d2Sara Ting            mSyncAccountName = mCalendarsCursor.getString(CALENDARS_INDEX_ACCOUNT_NAME);
17532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
17546aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting            // start visible calendars query
17556aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting            mHandler.startQuery(TOKEN_QUERY_VISIBLE_CALENDARS, null, Calendars.CONTENT_URI,
17566aad0ffcbdda48fc895543e2780b1d1c9fef3942Sara Ting                    CALENDARS_PROJECTION, CALENDARS_VISIBLE_WHERE, new String[] {"1"}, null);
17572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
175883efa2d50deca53c9937b19a379045c31b541cb7Michael Chan            mEventOrganizerEmail = mEventCursor.getString(EVENT_INDEX_ORGANIZER);
175983efa2d50deca53c9937b19a379045c31b541cb7Michael Chan            mIsOrganizer = mCalendarOwnerAccount.equalsIgnoreCase(mEventOrganizerEmail);
176083efa2d50deca53c9937b19a379045c31b541cb7Michael Chan
17610c0da940484dc8966576634475daa126b4a6ede2Sara Ting            if (!TextUtils.isEmpty(mEventOrganizerEmail) &&
17620c0da940484dc8966576634475daa126b4a6ede2Sara Ting                    !mEventOrganizerEmail.endsWith(Utils.MACHINE_GENERATED_ADDRESS)) {
176383efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                mEventOrganizerDisplayName = mEventOrganizerEmail;
176483efa2d50deca53c9937b19a379045c31b541cb7Michael Chan            }
176583efa2d50deca53c9937b19a379045c31b541cb7Michael Chan
176683efa2d50deca53c9937b19a379045c31b541cb7Michael Chan            if (!mIsOrganizer && !TextUtils.isEmpty(mEventOrganizerDisplayName)) {
176783efa2d50deca53c9937b19a379045c31b541cb7Michael Chan                setTextCommon(view, R.id.organizer, mEventOrganizerDisplayName);
1768b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson                setVisibilityCommon(view, R.id.organizer_container, View.VISIBLE);
1769b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson            } else {
1770b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson                setVisibilityCommon(view, R.id.organizer_container, View.GONE);
1771b7762cf45d4606916b54edca5f31fd225e4a2b03Isaac Katzenelson            }
17722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mHasAttendeeData = mEventCursor.getInt(EVENT_INDEX_HAS_ATTENDEE_DATA) != 0;
177365eeb79e62034d706503ce29d88c0e05ebd726feRoboErik            mCanModifyCalendar = mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL)
177465eeb79e62034d706503ce29d88c0e05ebd726feRoboErik                    >= Calendars.CAL_ACCESS_CONTRIBUTOR;
177565eeb79e62034d706503ce29d88c0e05ebd726feRoboErik            // TODO add "|| guestCanModify" after b/1299071 is fixed
177665eeb79e62034d706503ce29d88c0e05ebd726feRoboErik            mCanModifyEvent = mCanModifyCalendar && mIsOrganizer;
17772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mIsBusyFreeCalendar =
1778ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik                    mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) == Calendars.CAL_ACCESS_FREEBUSY;
1779352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
1780352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            if (!mIsBusyFreeCalendar) {
1781d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson
1782d4e45fa96c8c377d91271fbb368db64dc1fd5b48Isaac Katzenelson                View b = mView.findViewById(R.id.edit);
1783352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                b.setEnabled(true);
17848ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                b.setOnClickListener(new OnClickListener() {
17858ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                    @Override
17868ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                    public void onClick(View v) {
17878ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                        doEdit();
178810b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson                        // For dialogs, just close the fragment
178910b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson                        // For full screen, close activity on phone, leave it for tablet
179060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson                        if (mIsDialog) {
179160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson                            EventInfoFragment.this.dismiss();
179260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson                        }
179310b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson                        else if (!mIsTabletConfig){
179460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson                            getActivity().finish();
179560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson                        }
1796352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    }
1797352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                });
17988ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            }
1799dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira            View button;
180042896f76d81dbae873614340a3a78b29e7d463d2Sara Ting            if (mCanModifyCalendar) {
1801dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira                button = mView.findViewById(R.id.delete);
1802dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira                if (button != null) {
180342896f76d81dbae873614340a3a78b29e7d463d2Sara Ting                    button.setEnabled(true);
180442896f76d81dbae873614340a3a78b29e7d463d2Sara Ting                    button.setVisibility(View.VISIBLE);
180565eeb79e62034d706503ce29d88c0e05ebd726feRoboErik                }
1806dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira            }
180742896f76d81dbae873614340a3a78b29e7d463d2Sara Ting            if (mCanModifyEvent) {
1808dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira                button = mView.findViewById(R.id.edit);
1809dd15169500bc687107370366c3bbd8339bbcaa74Mindy Pereira                if (button != null) {
181042896f76d81dbae873614340a3a78b29e7d463d2Sara Ting                    button.setEnabled(true);
181142896f76d81dbae873614340a3a78b29e7d463d2Sara Ting                    button.setVisibility(View.VISIBLE);
181260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson                }
1813d8353fb85ef59a88580125207be9c914a8586758RoboErik            }
18147ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson            if ((!mIsDialog && !mIsTabletConfig ||
18157ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson                    mWindowStyle == EventInfoFragment.FULL_WINDOW_STYLE) && mMenu != null) {
1816d8353fb85ef59a88580125207be9c914a8586758RoboErik                mActivity.invalidateOptionsMenu();
181769be855eccf7d1e0a4c93377db66eb4b843a1403RoboErik            }
18182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
181971b221ae5d0f514352584a955630f5494f686c51Michael Chan            setVisibilityCommon(view, R.id.calendar, View.GONE);
1820259b8f9a21fffd3858218581e9daaf689b6b888fErik            sendAccessibilityEventIfQueryDone(TOKEN_QUERY_DUPLICATE_CALENDARS);
18212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
18222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
18232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1824d8353fb85ef59a88580125207be9c914a8586758RoboErik    /**
1825d8353fb85ef59a88580125207be9c914a8586758RoboErik     *
1826d8353fb85ef59a88580125207be9c914a8586758RoboErik     */
1827d8353fb85ef59a88580125207be9c914a8586758RoboErik    private void updateMenu() {
1828d8353fb85ef59a88580125207be9c914a8586758RoboErik        if (mMenu == null) {
1829d8353fb85ef59a88580125207be9c914a8586758RoboErik            return;
1830d8353fb85ef59a88580125207be9c914a8586758RoboErik        }
1831d8353fb85ef59a88580125207be9c914a8586758RoboErik        MenuItem delete = mMenu.findItem(R.id.info_action_delete);
1832d8353fb85ef59a88580125207be9c914a8586758RoboErik        MenuItem edit = mMenu.findItem(R.id.info_action_edit);
18334afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        MenuItem changeColor = mMenu.findItem(R.id.info_action_change_color);
1834d8353fb85ef59a88580125207be9c914a8586758RoboErik        if (delete != null) {
1835d8353fb85ef59a88580125207be9c914a8586758RoboErik            delete.setVisible(mCanModifyCalendar);
1836d8353fb85ef59a88580125207be9c914a8586758RoboErik            delete.setEnabled(mCanModifyCalendar);
1837d8353fb85ef59a88580125207be9c914a8586758RoboErik        }
1838d8353fb85ef59a88580125207be9c914a8586758RoboErik        if (edit != null) {
183965eeb79e62034d706503ce29d88c0e05ebd726feRoboErik            edit.setVisible(mCanModifyEvent);
184065eeb79e62034d706503ce29d88c0e05ebd726feRoboErik            edit.setEnabled(mCanModifyEvent);
1841d8353fb85ef59a88580125207be9c914a8586758RoboErik        }
18424afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        if (changeColor != null && mColors != null && mColors.length > 0) {
18434afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            changeColor.setVisible(mCanModifyCalendar);
18444afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            changeColor.setEnabled(mCanModifyCalendar);
18454afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
1846d8353fb85ef59a88580125207be9c914a8586758RoboErik    }
1847d8353fb85ef59a88580125207be9c914a8586758RoboErik
18482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void updateAttendees(View view) {
1849fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson        if (mAcceptedAttendees.size() + mDeclinedAttendees.size() +
1850fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson                mTentativeAttendees.size() + mNoResponseAttendees.size() > 0) {
1851c7f3c3896f1bc4cad43aa7f0bca1dee603704613RoboErik            mLongAttendees.clearAttendees();
18524acb2fd087308dea146b8b10f5278c59df387680RoboErik            (mLongAttendees).addAttendees(mAcceptedAttendees);
18534acb2fd087308dea146b8b10f5278c59df387680RoboErik            (mLongAttendees).addAttendees(mDeclinedAttendees);
18544acb2fd087308dea146b8b10f5278c59df387680RoboErik            (mLongAttendees).addAttendees(mTentativeAttendees);
18554acb2fd087308dea146b8b10f5278c59df387680RoboErik            (mLongAttendees).addAttendees(mNoResponseAttendees);
1856fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson            mLongAttendees.setEnabled(false);
1857fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson            mLongAttendees.setVisibility(View.VISIBLE);
185860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        } else {
1859fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson            mLongAttendees.setVisibility(View.GONE);
186071b221ae5d0f514352584a955630f5494f686c51Michael Chan        }
1861cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting
18627ffa24cba2977925b737e6bd39be59ba39609611Sara Ting        if (hasEmailableAttendees()) {
18637da27670d2a62e213e230989b250f047012a3bbdSara Ting            setVisibilityCommon(mView, R.id.email_attendees_container, View.VISIBLE);
18647ffa24cba2977925b737e6bd39be59ba39609611Sara Ting            if (emailAttendeesButton != null) {
18657ffa24cba2977925b737e6bd39be59ba39609611Sara Ting                emailAttendeesButton.setText(R.string.email_guests_label);
18667ffa24cba2977925b737e6bd39be59ba39609611Sara Ting            }
18677ffa24cba2977925b737e6bd39be59ba39609611Sara Ting        } else if (hasEmailableOrganizer()) {
18687ffa24cba2977925b737e6bd39be59ba39609611Sara Ting            setVisibilityCommon(mView, R.id.email_attendees_container, View.VISIBLE);
18697ffa24cba2977925b737e6bd39be59ba39609611Sara Ting            if (emailAttendeesButton != null) {
18707ffa24cba2977925b737e6bd39be59ba39609611Sara Ting                emailAttendeesButton.setText(R.string.email_organizer_label);
18717ffa24cba2977925b737e6bd39be59ba39609611Sara Ting            }
18727da27670d2a62e213e230989b250f047012a3bbdSara Ting        } else {
18737da27670d2a62e213e230989b250f047012a3bbdSara Ting            setVisibilityCommon(mView, R.id.email_attendees_container, View.GONE);
18747da27670d2a62e213e230989b250f047012a3bbdSara Ting        }
1875cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting    }
1876cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting
1877cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting    /**
18787da27670d2a62e213e230989b250f047012a3bbdSara Ting     * Returns true if there is at least 1 attendee that is not the viewer.
1879cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting     */
18807ffa24cba2977925b737e6bd39be59ba39609611Sara Ting    private boolean hasEmailableAttendees() {
1881cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting        for (Attendee attendee : mAcceptedAttendees) {
18827da27670d2a62e213e230989b250f047012a3bbdSara Ting            if (Utils.isEmailableFrom(attendee.mEmail, mSyncAccountName)) {
18837da27670d2a62e213e230989b250f047012a3bbdSara Ting                return true;
18847da27670d2a62e213e230989b250f047012a3bbdSara Ting            }
1885cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting        }
1886cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting        for (Attendee attendee : mTentativeAttendees) {
18877da27670d2a62e213e230989b250f047012a3bbdSara Ting            if (Utils.isEmailableFrom(attendee.mEmail, mSyncAccountName)) {
18887da27670d2a62e213e230989b250f047012a3bbdSara Ting                return true;
18897da27670d2a62e213e230989b250f047012a3bbdSara Ting            }
1890cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting        }
1891cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting        for (Attendee attendee : mNoResponseAttendees) {
18927da27670d2a62e213e230989b250f047012a3bbdSara Ting            if (Utils.isEmailableFrom(attendee.mEmail, mSyncAccountName)) {
18937da27670d2a62e213e230989b250f047012a3bbdSara Ting                return true;
18947da27670d2a62e213e230989b250f047012a3bbdSara Ting            }
1895cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting        }
18967da27670d2a62e213e230989b250f047012a3bbdSara Ting        for (Attendee attendee : mDeclinedAttendees) {
18977da27670d2a62e213e230989b250f047012a3bbdSara Ting            if (Utils.isEmailableFrom(attendee.mEmail, mSyncAccountName)) {
18987da27670d2a62e213e230989b250f047012a3bbdSara Ting                return true;
18997da27670d2a62e213e230989b250f047012a3bbdSara Ting            }
1900cb5f5688a4080e6a20f4f7a52adef1ed971035cbSara Ting        }
19017ffa24cba2977925b737e6bd39be59ba39609611Sara Ting        return false;
19027ffa24cba2977925b737e6bd39be59ba39609611Sara Ting    }
19037ffa24cba2977925b737e6bd39be59ba39609611Sara Ting
19047ffa24cba2977925b737e6bd39be59ba39609611Sara Ting    private boolean hasEmailableOrganizer() {
19057da27670d2a62e213e230989b250f047012a3bbdSara Ting        return mEventOrganizerEmail != null &&
19067da27670d2a62e213e230989b250f047012a3bbdSara Ting                Utils.isEmailableFrom(mEventOrganizerEmail, mSyncAccountName);
19078ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan    }
19088ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan
19091ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    public void initReminders(View view, Cursor cursor) {
19101ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
19111ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        // Add reminders
1912c7f3c3896f1bc4cad43aa7f0bca1dee603704613RoboErik        mOriginalReminders.clear();
1913c08957b48e755d34f1496d3937a24d60bdd24904RoboErik        mUnsupportedReminders.clear();
19141ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        while (cursor.moveToNext()) {
19151ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            int minutes = cursor.getInt(EditEventHelper.REMINDERS_INDEX_MINUTES);
19161ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            int method = cursor.getInt(EditEventHelper.REMINDERS_INDEX_METHOD);
1917e35a032c939f357ce435711b2fd8de1887a05011RoboErik
1918c08957b48e755d34f1496d3937a24d60bdd24904RoboErik            if (method != Reminders.METHOD_DEFAULT && !mReminderMethodValues.contains(method)) {
1919e35a032c939f357ce435711b2fd8de1887a05011RoboErik                // Stash unsupported reminder types separately so we don't alter
1920e35a032c939f357ce435711b2fd8de1887a05011RoboErik                // them in the UI
1921e35a032c939f357ce435711b2fd8de1887a05011RoboErik                mUnsupportedReminders.add(ReminderEntry.valueOf(minutes, method));
1922e35a032c939f357ce435711b2fd8de1887a05011RoboErik            } else {
1923e35a032c939f357ce435711b2fd8de1887a05011RoboErik                mOriginalReminders.add(ReminderEntry.valueOf(minutes, method));
1924e35a032c939f357ce435711b2fd8de1887a05011RoboErik            }
19251ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        }
19261ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        // Sort appropriately for display (by time, then type)
19271ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        Collections.sort(mOriginalReminders);
19281ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
19298b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik        if (mUserModifiedReminders) {
19308b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik            // If the user has changed the list of reminders don't change what's
19318b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik            // shown.
19328b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik            return;
19338b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik        }
19348b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik
19355d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik        LinearLayout parent = (LinearLayout) mScrollView
19365d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik                .findViewById(R.id.reminder_items_container);
19375d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik        if (parent != null) {
19385d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik            parent.removeAllViews();
19395d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik        }
1940c08957b48e755d34f1496d3937a24d60bdd24904RoboErik        if (mReminderViews != null) {
1941c08957b48e755d34f1496d3937a24d60bdd24904RoboErik            mReminderViews.clear();
1942c08957b48e755d34f1496d3937a24d60bdd24904RoboErik        }
19435d40a380fca9da181dfaf0c7756d4f53cbd2d3d3RoboErik
19441ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        if (mHasAlarm) {
194594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            ArrayList<ReminderEntry> reminders;
194694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            // If applicable, use reminders saved in the bundle.
194794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            if (mReminders != null) {
194894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                reminders = mReminders;
194994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            } else {
195094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                reminders = mOriginalReminders;
195194a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            }
19521ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            // Insert any minute values that aren't represented in the minutes list.
19531ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            for (ReminderEntry re : reminders) {
19541ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                EventViewUtils.addMinutesToList(
19551ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                        mActivity, mReminderMinuteValues, mReminderMinuteLabels, re.getMinutes());
19561ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            }
19571ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            // Create a UI element for each reminder.  We display all of the reminders we get
19581ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            // from the provider, even if the count exceeds the calendar maximum.  (Also, for
19591ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            // a new event, we won't have a maxReminders value available.)
19601ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            for (ReminderEntry re : reminders) {
1961e35a032c939f357ce435711b2fd8de1887a05011RoboErik                EventViewUtils.addReminder(mActivity, mScrollView, this, mReminderViews,
1962e35a032c939f357ce435711b2fd8de1887a05011RoboErik                        mReminderMinuteValues, mReminderMinuteLabels, mReminderMethodValues,
19638b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                        mReminderMethodLabels, re, Integer.MAX_VALUE, mReminderChangeListener);
19641ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            }
196506f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting            EventViewUtils.updateAddReminderButton(mView, mReminderViews, mMaxReminders);
1966e35a032c939f357ce435711b2fd8de1887a05011RoboErik            // TODO show unsupported reminder types in some fashion.
19671ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        }
19681ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    }
19691ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
19702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    void updateResponse(View view) {
19712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // we only let the user accept/reject/etc. a meeting if:
19722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // a) you can edit the event's containing calendar AND
19732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // b) you're not the organizer and only attendee AND
19742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // c) organizerCanRespond is enabled for the calendar
19752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // (if the attendee data has been hidden, the visible number of attendees
19762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // will be 1 -- the calendar owner's).
19772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // (there are more cases involved to be 100% accurate, such as
19782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // paying attention to whether or not an attendee status was
19792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // included in the feed, but we're currently omitting those corner cases
19802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // for simplicity).
1981352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
1982352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        // TODO Switch to EditEventHelper.canRespond when this class uses CalendarEventModel.
1983d785cd533f6a3c23813c15315aed74efa9a116f5Michael Chan        if (!mCanModifyCalendar || (mHasAttendeeData && mIsOrganizer && mNumOfAttendees <= 1) ||
1984352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                (mIsOrganizer && !mOwnerCanRespond)) {
19852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            setVisibilityCommon(view, R.id.response_container, View.GONE);
19862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
19872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
19882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
19892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        setVisibilityCommon(view, R.id.response_container, View.VISIBLE);
19902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1991f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan
1992f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan        int response;
19933b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) {
19943b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            response = mTentativeUserSetResponse;
19953b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        } else if (mUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) {
19965afc08352fb7e2679ed00d41e6e5763ad333a7ecRoboErik            response = mUserSetResponse;
19976bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson        } else if (mAttendeeResponseFromIntent != Attendees.ATTENDEE_STATUS_NONE) {
1998f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan            response = mAttendeeResponseFromIntent;
19992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
2000f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan            response = mOriginalAttendeeResponse;
20012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
2002f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan
2003f92f46b20316e71f7291f35f4cd1b64500bebf12Michael Chan        int buttonToCheck = findButtonIdForResponse(response);
20043b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        mResponseRadioGroup.check(buttonToCheck); // -1 clear all radio buttons
20053b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        mResponseRadioGroup.setOnCheckedChangeListener(this);
20062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
20072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
20082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void setTextCommon(View view, int id, CharSequence text) {
20092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        TextView textView = (TextView) view.findViewById(id);
20102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (textView == null)
20112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
20122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        textView.setText(text);
20132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
20142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
20152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void setVisibilityCommon(View view, int id, int visibility) {
20162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        View v = view.findViewById(id);
20172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (v != null) {
20182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            v.setVisibility(visibility);
20192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
20202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        return;
20212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
20222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
20232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    /**
20242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * Taken from com.google.android.gm.HtmlConversationActivity
20252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     *
20262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * Send the intent that shows the Contact info corresponding to the email address.
20272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     */
20282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public void showContactInfo(Attendee attendee, Rect rect) {
20292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // First perform lookup query to find existing contact
20302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        final ContentResolver resolver = getActivity().getContentResolver();
20312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        final String address = attendee.mEmail;
20322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        final Uri dataUri = Uri.withAppendedPath(CommonDataKinds.Email.CONTENT_FILTER_URI,
20332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                Uri.encode(address));
20342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        final Uri lookupUri = ContactsContract.Data.getContactLookupUri(resolver, dataUri);
20352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
20362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (lookupUri != null) {
20372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // Found matching contact, trigger QuickContact
20382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            QuickContact.showQuickContact(getActivity(), rect, lookupUri,
20392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    QuickContact.MODE_MEDIUM, null);
20402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
20412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // No matching contact, ask user to create one
20422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            final Uri mailUri = Uri.fromParts("mailto", address, null);
20432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, mailUri);
20442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
20452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // Pass along full E-mail string for possible create dialog
20462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            Rfc822Token sender = new Rfc822Token(attendee.mName, attendee.mEmail, null);
20472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            intent.putExtra(Intents.EXTRA_CREATE_DESCRIPTION, sender.toString());
20482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
20492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // Only provide personal name hint if we have one
20502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            final String senderPersonal = attendee.mName;
20512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            if (!TextUtils.isEmpty(senderPersonal)) {
20522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                intent.putExtra(Intents.Insert.NAME, senderPersonal);
20532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
20542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
20552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            startActivity(intent);
20562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
20572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
2058cb81189e4868769ea016253eca104e46df2f033aErik
2059cb81189e4868769ea016253eca104e46df2f033aErik    @Override
20607c6236d5553dc9f3d004ebbed794249713a11d19RoboErik    public void onPause() {
20617c6236d5553dc9f3d004ebbed794249713a11d19RoboErik        mIsPaused = true;
20627c6236d5553dc9f3d004ebbed794249713a11d19RoboErik        mHandler.removeCallbacks(onDeleteRunnable);
20637c6236d5553dc9f3d004ebbed794249713a11d19RoboErik        super.onPause();
2064b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson        // Remove event deletion alert box since it is being rebuild in the OnResume
2065b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson        // This is done to get the same behavior on OnResume since the AlertDialog is gone on
2066b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson        // rotation but not if you press the HOME key
2067b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson        if (mDeleteDialogVisible && mDeleteHelper != null) {
2068b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson            mDeleteHelper.dismissAlertDialog();
2069b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson            mDeleteHelper = null;
2070b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson        }
20713b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE
20723b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein                && mEditResponseHelper != null) {
20733b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            mEditResponseHelper.dismissAlertDialog();
20743b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        }
20757c6236d5553dc9f3d004ebbed794249713a11d19RoboErik    }
20767c6236d5553dc9f3d004ebbed794249713a11d19RoboErik
20777c6236d5553dc9f3d004ebbed794249713a11d19RoboErik    @Override
20787c6236d5553dc9f3d004ebbed794249713a11d19RoboErik    public void onResume() {
20797c6236d5553dc9f3d004ebbed794249713a11d19RoboErik        super.onResume();
2080363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan        if (mIsDialog) {
2081363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan            setDialogSize(getActivity().getResources());
2082363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan            applyDialogParams();
2083363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan        }
20847c6236d5553dc9f3d004ebbed794249713a11d19RoboErik        mIsPaused = false;
20857c6236d5553dc9f3d004ebbed794249713a11d19RoboErik        if (mDismissOnResume) {
20867c6236d5553dc9f3d004ebbed794249713a11d19RoboErik            mHandler.post(onDeleteRunnable);
20877c6236d5553dc9f3d004ebbed794249713a11d19RoboErik        }
20883b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        // Display the "delete confirmation" or "edit response helper" dialog if needed
2089b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson        if (mDeleteDialogVisible) {
2090b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson            mDeleteHelper = new DeleteEventHelper(
2091b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                    mContext, mActivity,
2092b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                    !mIsDialog && !mIsTabletConfig /* exitWhenDone */);
2093b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson            mDeleteHelper.setOnDismissListener(createDeleteOnDismissListener());
2094b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson            mDeleteHelper.delete(mStartMillis, mEndMillis, mEventId, -1, onDeleteRunnable);
20953b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein        } else if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) {
20963b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            int buttonId = findButtonIdForResponse(mTentativeUserSetResponse);
20973b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            mResponseRadioGroup.check(buttonId);
20983b91cc08db7c19d2d90446b9e85a38054bb25463Sam Blitzstein            mEditResponseHelper.showDialog(mEditResponseHelper.getWhichEvents());
2099b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson        }
21007c6236d5553dc9f3d004ebbed794249713a11d19RoboErik    }
21017c6236d5553dc9f3d004ebbed794249713a11d19RoboErik
21027c6236d5553dc9f3d004ebbed794249713a11d19RoboErik    @Override
2103cb81189e4868769ea016253eca104e46df2f033aErik    public void eventsChanged() {
2104cb81189e4868769ea016253eca104e46df2f033aErik    }
2105cb81189e4868769ea016253eca104e46df2f033aErik
2106cb81189e4868769ea016253eca104e46df2f033aErik    @Override
2107cb81189e4868769ea016253eca104e46df2f033aErik    public long getSupportedEventTypes() {
2108cb81189e4868769ea016253eca104e46df2f033aErik        return EventType.EVENTS_CHANGED;
2109cb81189e4868769ea016253eca104e46df2f033aErik    }
2110cb81189e4868769ea016253eca104e46df2f033aErik
2111cb81189e4868769ea016253eca104e46df2f033aErik    @Override
2112cb81189e4868769ea016253eca104e46df2f033aErik    public void handleEvent(EventInfo event) {
21134afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        reloadEvents();
2114cb81189e4868769ea016253eca104e46df2f033aErik    }
21151ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
211680d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson    public void reloadEvents() {
21174afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        if (mHandler != null) {
21184afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION,
21194afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    null, null, null);
21204afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
212180d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson    }
21221ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
21231ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    @Override
21241ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    public void onClick(View view) {
21251ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
21261ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        // This must be a click on one of the "remove reminder" buttons
21271ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        LinearLayout reminderItem = (LinearLayout) view.getParent();
21281ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        LinearLayout parent = (LinearLayout) reminderItem.getParent();
21291ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        parent.removeView(reminderItem);
21301ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        mReminderViews.remove(reminderItem);
21318b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik        mUserModifiedReminders = true;
213206f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting        EventViewUtils.updateAddReminderButton(mView, mReminderViews, mMaxReminders);
21331ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    }
21341ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
21351ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
21361ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    /**
21371ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     * Add a new reminder when the user hits the "add reminder" button.  We use the default
21381ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     * reminder time and method.
21391ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     */
21401ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private void addReminder() {
21411ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        // TODO: when adding a new reminder, make it different from the
21421ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        // last one in the list (if any).
21431ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        if (mDefaultReminderMinutes == GeneralPreferences.NO_REMINDER) {
21441ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            EventViewUtils.addReminder(mActivity, mScrollView, this, mReminderViews,
21458b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                    mReminderMinuteValues, mReminderMinuteLabels, mReminderMethodValues,
21468b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                    mReminderMethodLabels,
21478b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                    ReminderEntry.valueOf(GeneralPreferences.REMINDER_DEFAULT_TIME), mMaxReminders,
21488b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                    mReminderChangeListener);
21491ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        } else {
21501ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            EventViewUtils.addReminder(mActivity, mScrollView, this, mReminderViews,
21518b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                    mReminderMinuteValues, mReminderMinuteLabels, mReminderMethodValues,
21528b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                    mReminderMethodLabels, ReminderEntry.valueOf(mDefaultReminderMinutes),
21538b5743c1bcff53f13b4890ba05fb013bbf8f29bcRoboErik                    mMaxReminders, mReminderChangeListener);
21541ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        }
21551ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
215606f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting        EventViewUtils.updateAddReminderButton(mView, mReminderViews, mMaxReminders);
215706f3d6d0d3bd6d194f5a3822efd63830098284dcSara Ting    }
21581ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
2159e35a032c939f357ce435711b2fd8de1887a05011RoboErik    synchronized private void prepareReminders() {
2160e35a032c939f357ce435711b2fd8de1887a05011RoboErik        // Nothing to do if we've already built these lists _and_ we aren't
2161e35a032c939f357ce435711b2fd8de1887a05011RoboErik        // removing not allowed methods
2162e35a032c939f357ce435711b2fd8de1887a05011RoboErik        if (mReminderMinuteValues != null && mReminderMinuteLabels != null
2163e35a032c939f357ce435711b2fd8de1887a05011RoboErik                && mReminderMethodValues != null && mReminderMethodLabels != null
2164e35a032c939f357ce435711b2fd8de1887a05011RoboErik                && mCalendarAllowedReminders == null) {
2165e35a032c939f357ce435711b2fd8de1887a05011RoboErik            return;
2166e35a032c939f357ce435711b2fd8de1887a05011RoboErik        }
2167e35a032c939f357ce435711b2fd8de1887a05011RoboErik        // Load the labels and corresponding numeric values for the minutes and methods lists
2168e35a032c939f357ce435711b2fd8de1887a05011RoboErik        // from the assets.  If we're switching calendars, we need to clear and re-populate the
2169e35a032c939f357ce435711b2fd8de1887a05011RoboErik        // lists (which may have elements added and removed based on calendar properties).  This
2170e35a032c939f357ce435711b2fd8de1887a05011RoboErik        // is mostly relevant for "methods", since we shouldn't have any "minutes" values in a
2171e35a032c939f357ce435711b2fd8de1887a05011RoboErik        // new event that aren't in the default set.
21721ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        Resources r = mActivity.getResources();
21731ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        mReminderMinuteValues = loadIntegerArray(r, R.array.reminder_minutes_values);
21741ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        mReminderMinuteLabels = loadStringArray(r, R.array.reminder_minutes_labels);
21751ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        mReminderMethodValues = loadIntegerArray(r, R.array.reminder_methods_values);
21761ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        mReminderMethodLabels = loadStringArray(r, R.array.reminder_methods_labels);
2177e35a032c939f357ce435711b2fd8de1887a05011RoboErik
2178e35a032c939f357ce435711b2fd8de1887a05011RoboErik        // Remove any reminder methods that aren't allowed for this calendar.  If this is
2179e35a032c939f357ce435711b2fd8de1887a05011RoboErik        // a new event, mCalendarAllowedReminders may not be set the first time we're called.
2180e35a032c939f357ce435711b2fd8de1887a05011RoboErik        if (mCalendarAllowedReminders != null) {
2181e35a032c939f357ce435711b2fd8de1887a05011RoboErik            EventViewUtils.reduceMethodList(mReminderMethodValues, mReminderMethodLabels,
2182e35a032c939f357ce435711b2fd8de1887a05011RoboErik                    mCalendarAllowedReminders);
2183e35a032c939f357ce435711b2fd8de1887a05011RoboErik        }
2184e35a032c939f357ce435711b2fd8de1887a05011RoboErik        if (mView != null) {
2185e35a032c939f357ce435711b2fd8de1887a05011RoboErik            mView.invalidate();
2186e35a032c939f357ce435711b2fd8de1887a05011RoboErik        }
21871ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    }
21881ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
21891ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
21901ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private boolean saveReminders() {
21911ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3);
21921ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
21931ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        // Read reminders from UI
21941ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        mReminders = EventViewUtils.reminderItemsToReminders(mReminderViews,
21951ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                mReminderMinuteValues, mReminderMethodValues);
2196e35a032c939f357ce435711b2fd8de1887a05011RoboErik        mOriginalReminders.addAll(mUnsupportedReminders);
2197e35a032c939f357ce435711b2fd8de1887a05011RoboErik        Collections.sort(mOriginalReminders);
2198e35a032c939f357ce435711b2fd8de1887a05011RoboErik        mReminders.addAll(mUnsupportedReminders);
2199e35a032c939f357ce435711b2fd8de1887a05011RoboErik        Collections.sort(mReminders);
22001ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
22011ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        // Check if there are any changes in the reminder
22021ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        boolean changed = EditEventHelper.saveReminders(ops, mEventId, mReminders,
22031ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson                mOriginalReminders, false /* no force save */);
22041ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
22051ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        if (!changed) {
22061ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            return false;
22071ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        }
22081ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
22091ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        // save new reminders
22101ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        AsyncQueryService service = new AsyncQueryService(getActivity());
22111ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        service.startBatch(0, null, Calendars.CONTENT_URI.getAuthority(), ops, 0);
22129d4a952f846a5758965897b88715e49106638120Sam Blitzstein        mOriginalReminders = mReminders;
22131ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        // Update the "hasAlarm" field for the event
22141ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId);
22151ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        int len = mReminders.size();
22161ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        boolean hasAlarm = len > 0;
22171ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        if (hasAlarm != mHasAlarm) {
22181ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            ContentValues values = new ContentValues();
22191ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0);
22201ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            service.startUpdate(0, null, uri, values, null, null, 0);
22211ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        }
22221ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        return true;
22231ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    }
22241ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
22251ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    /**
222642896f76d81dbae873614340a3a78b29e7d463d2Sara Ting     * Email all the attendees of the event, except for the viewer (so as to not email
222742896f76d81dbae873614340a3a78b29e7d463d2Sara Ting     * himself) and resources like conference rooms.
222842896f76d81dbae873614340a3a78b29e7d463d2Sara Ting     */
222942896f76d81dbae873614340a3a78b29e7d463d2Sara Ting    private void emailAttendees() {
22307da27670d2a62e213e230989b250f047012a3bbdSara Ting        Intent i = new Intent(getActivity(), QuickResponseActivity.class);
22317da27670d2a62e213e230989b250f047012a3bbdSara Ting        i.putExtra(QuickResponseActivity.EXTRA_EVENT_ID, mEventId);
22327da27670d2a62e213e230989b250f047012a3bbdSara Ting        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
22337da27670d2a62e213e230989b250f047012a3bbdSara Ting        startActivity(i);
223442896f76d81dbae873614340a3a78b29e7d463d2Sara Ting    }
223542896f76d81dbae873614340a3a78b29e7d463d2Sara Ting
223642896f76d81dbae873614340a3a78b29e7d463d2Sara Ting    /**
22371ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     * Loads an integer array asset into a list.
22381ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     */
22391ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private static ArrayList<Integer> loadIntegerArray(Resources r, int resNum) {
22401ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        int[] vals = r.getIntArray(resNum);
22411ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        int size = vals.length;
22421ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        ArrayList<Integer> list = new ArrayList<Integer>(size);
22431ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
22441ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        for (int i = 0; i < size; i++) {
22451ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson            list.add(vals[i]);
22461ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        }
22471ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
22481ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        return list;
22491ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    }
22501ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    /**
22511ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     * Loads a String array asset into a list.
22521ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson     */
22531ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    private static ArrayList<String> loadStringArray(Resources r, int resNum) {
22541ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        String[] labels = r.getStringArray(resNum);
22551ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        ArrayList<String> list = new ArrayList<String>(Arrays.asList(labels));
22561ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson        return list;
22571ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson    }
22581ce35aadf71e3d68b72940bc327f285530a85032Isaac Katzenelson
225948bcc4cb015dbf802341698a3a04e28d2cfb2ddcMichael Chan    @Override
2260b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson    public void onDeleteStarted() {
2261b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson        mEventDeletionStarted = true;
2262b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson    }
2263b33cdf41092c79ca3502868d494bc284f4090267Isaac Katzenelson
2264b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson    private Dialog.OnDismissListener createDeleteOnDismissListener() {
2265b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson        return new Dialog.OnDismissListener() {
2266b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                    @Override
2267b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                    public void onDismiss(DialogInterface dialog) {
2268b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                        // Since OnPause will force the dialog to dismiss , do
2269b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                        // not change the dialog status
2270b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                        if (!mIsPaused) {
2271b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                            mDeleteDialogVisible = false;
2272b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                        }
2273b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                    }
2274b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson                };
2275b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson    }
2276b0a313a3c216e3eeceebd81d3edc6fc60357a055Isaac Katzenelson
227780d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson    public long getEventId() {
227880d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson        return mEventId;
227980d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson    }
228080d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson
228180d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson    public long getStartMillis() {
228280d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson        return mStartMillis;
228380d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson    }
228480d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson    public long getEndMillis() {
228580d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson        return mEndMillis;
228680d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson    }
2287363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan    private void setDialogSize(Resources r) {
2288363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan        mDialogWidth = (int)r.getDimension(R.dimen.event_info_dialog_width);
2289363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan        mDialogHeight = (int)r.getDimension(R.dimen.event_info_dialog_height);
2290363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0Michael Chan    }
2291b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung
2292b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung    @Override
2293b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung    public void onColorSelected(int color) {
2294497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung        mCurrentColor = color;
2295497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung        mCurrentColorKey = mDisplayColorKeyMap.get(color);
2296497a6259757e4b61ef8f15aa516284d5b0ac3451James Kung        mHeadlines.setBackgroundColor(color);
2297b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung    }
22982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang}
2299