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