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