EventInfoFragment.java revision 352e1a2f834460bd54e03ce94cadd36a46debacb
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;
21fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.event.EditEventHelper;
22fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.event.EventViewUtils;
232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
242bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.app.Activity;
2571d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.Dialog;
2671d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.app.DialogFragment;
272bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ActivityNotFoundException;
282bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.AsyncQueryHandler;
292bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentProviderOperation;
302bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentResolver;
312bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentUris;
322bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.ContentValues;
332bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Context;
342bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.Intent;
352bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.SharedPreferences;
362bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.content.res.Resources;
372bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.Cursor;
382bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.database.MatrixCursor;
392bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.PorterDuff;
402bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.graphics.Rect;
412bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.net.Uri;
422bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.os.Bundle;
432bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.pim.EventRecurrence;
442bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Attendees;
452bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Calendars;
462bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Events;
472bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.Calendar.Reminders;
48cb81189e4868769ea016253eca104e46df2f033aErikimport android.provider.ContactsContract;
492bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.CommonDataKinds;
50cb81189e4868769ea016253eca104e46df2f033aErikimport android.provider.ContactsContract.CommonDataKinds.Email;
512bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Contacts;
522bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Data;
532bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Intents;
542bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.Presence;
552bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.provider.ContactsContract.QuickContact;
568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.Spannable;
578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.SpannableStringBuilder;
582bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.TextUtils;
592bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateFormat;
602bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.DateUtils;
612bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.format.Time;
628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.ForegroundColorSpan;
638ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.text.style.StrikethroughSpan;
642bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Linkify;
652bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.text.util.Rfc822Token;
662bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.util.Log;
6771d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Gravity;
682bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.LayoutInflater;
692bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.MotionEvent;
702bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.View;
71cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnClickListener;
72cb81189e4868769ea016253eca104e46df2f033aErikimport android.view.View.OnTouchListener;
732bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.view.ViewGroup;
7471d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.Window;
7571d08836af4cf5fc45d340b1883044a9f8290232Michael Chanimport android.view.WindowManager;
762bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.AdapterView;
772bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ArrayAdapter;
788ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chanimport android.widget.Button;
792bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ImageButton;
802bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.ImageView;
812bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.LinearLayout;
822bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.QuickContactBadge;
832bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Spinner;
842bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.TextView;
852bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport android.widget.Toast;
862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
872bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.ArrayList;
882bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.Arrays;
892bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.HashMap;
902bebde787f9490408ceaf14166de4b016a10daf1Mason Tangimport java.util.regex.Pattern;
912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
9271d08836af4cf5fc45d340b1883044a9f8290232Michael Chanpublic class EventInfoFragment extends DialogFragment implements View.OnClickListener,
93cb81189e4868769ea016253eca104e46df2f033aErik        AdapterView.OnItemSelectedListener, CalendarController.EventHandler {
94d845fbe558d5229102b58cce70a1b29fe6cb6967Erik    public static final boolean DEBUG = false;
952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public static final String TAG = "EventInfoActivity";
972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
984003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    private static final String BUNDLE_KEY_EVENT_ID = "key_event_id";
994003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
1004003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    private static final String BUNDLE_KEY_START_MILLIS = "key_start_millis";
1014003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
1024003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    private static final String BUNDLE_KEY_END_MILLIS = "key_end_millis";
1034003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
10471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    private static final String BUNDLE_KEY_IS_DIALOG = "key_fragment_is_dialog";
10571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
1062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int MAX_REMINDERS = 5;
1072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    /**
1092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * These are the corresponding indices into the array of strings
1102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * "R.array.change_response_labels" in the resource file.
1112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     */
1122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final int UPDATE_SINGLE = 0;
1132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final int UPDATE_ALL = 1;
1142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    // Query tokens for QueryHandler
1162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int TOKEN_QUERY_EVENT = 0;
1172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int TOKEN_QUERY_CALENDARS = 1;
1182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int TOKEN_QUERY_ATTENDEES = 2;
1192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int TOKEN_QUERY_REMINDERS = 3;
1202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int TOKEN_QUERY_DUPLICATE_CALENDARS = 4;
1212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String[] EVENT_PROJECTION = new String[] {
1232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events._ID,                  // 0  do not remove; used in DeleteEventHelper
1242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.TITLE,                // 1  do not remove; used in DeleteEventHelper
1252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.RRULE,                // 2  do not remove; used in DeleteEventHelper
1262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.ALL_DAY,              // 3  do not remove; used in DeleteEventHelper
1272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.CALENDAR_ID,          // 4  do not remove; used in DeleteEventHelper
1282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.DTSTART,              // 5  do not remove; used in DeleteEventHelper
1292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events._SYNC_ID,             // 6  do not remove; used in DeleteEventHelper
1302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.EVENT_TIMEZONE,       // 7  do not remove; used in DeleteEventHelper
1312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.DESCRIPTION,          // 8
1322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.EVENT_LOCATION,       // 9
1332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.HAS_ALARM,            // 10
1342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Calendars.ACCESS_LEVEL,      // 11
1352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Calendars.COLOR,             // 12
1362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.HAS_ATTENDEE_DATA,    // 13
1372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.GUESTS_CAN_MODIFY,    // 14
1382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // TODO Events.GUESTS_CAN_INVITE_OTHERS has not been implemented in calendar provider
1392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.GUESTS_CAN_INVITE_OTHERS, // 15
1402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.ORGANIZER,            // 16
1412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Events.ORIGINAL_EVENT        // 17 do not remove; used in DeleteEventHelper
1422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    };
1432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_ID = 0;
1442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_TITLE = 1;
1452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_RRULE = 2;
1462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_ALL_DAY = 3;
1472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_CALENDAR_ID = 4;
1482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_SYNC_ID = 6;
1492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_EVENT_TIMEZONE = 7;
1502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_DESCRIPTION = 8;
1512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_EVENT_LOCATION = 9;
1522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_HAS_ALARM = 10;
1532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_ACCESS_LEVEL = 11;
1542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_COLOR = 12;
1552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_HAS_ATTENDEE_DATA = 13;
1562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_GUESTS_CAN_MODIFY = 14;
1572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_CAN_INVITE_OTHERS = 15;
1582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int EVENT_INDEX_ORGANIZER = 16;
1592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String[] ATTENDEES_PROJECTION = new String[] {
1612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Attendees._ID,                      // 0
1622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Attendees.ATTENDEE_NAME,            // 1
1632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Attendees.ATTENDEE_EMAIL,           // 2
1642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Attendees.ATTENDEE_RELATIONSHIP,    // 3
1652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Attendees.ATTENDEE_STATUS,          // 4
1662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    };
1672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int ATTENDEES_INDEX_ID = 0;
1682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int ATTENDEES_INDEX_NAME = 1;
1692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int ATTENDEES_INDEX_EMAIL = 2;
1702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int ATTENDEES_INDEX_RELATIONSHIP = 3;
1712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int ATTENDEES_INDEX_STATUS = 4;
1722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?";
1742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String ATTENDEES_SORT_ORDER = Attendees.ATTENDEE_NAME + " ASC, "
1762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            + Attendees.ATTENDEE_EMAIL + " ASC";
1772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final String[] CALENDARS_PROJECTION = new String[] {
1792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Calendars._ID,           // 0
1802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Calendars.DISPLAY_NAME,  // 1
1812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Calendars.OWNER_ACCOUNT, // 2
1822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Calendars.ORGANIZER_CAN_RESPOND // 3
1832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    };
1842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final int CALENDARS_INDEX_DISPLAY_NAME = 1;
1852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2;
1862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final int CALENDARS_INDEX_OWNER_CAN_RESPOND = 3;
1872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final String CALENDARS_WHERE = Calendars._ID + "=?";
1892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    static final String CALENDARS_DUPLICATE_NAME_WHERE = Calendars.DISPLAY_NAME + "=?";
1902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
1912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String[] REMINDERS_PROJECTION = new String[] {
1922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Reminders._ID,      // 0
1932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Reminders.MINUTES,  // 1
1942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    };
1952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final int REMINDERS_INDEX_MINUTES = 1;
1962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String REMINDERS_WHERE = Reminders.EVENT_ID + "=? AND (" +
1972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            Reminders.METHOD + "=" + Reminders.METHOD_ALERT + " OR " + Reminders.METHOD + "=" +
1982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            Reminders.METHOD_DEFAULT + ")";
1992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String REMINDERS_SORT = Reminders.MINUTES;
2002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private View mView;
2022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private LinearLayout mRemindersContainer;
2032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private LinearLayout mOrganizerContainer;
2042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private TextView mOrganizerView;
2052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private Uri mUri;
2072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private long mEventId;
2082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private Cursor mEventCursor;
2092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private Cursor mAttendeesCursor;
2102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private Cursor mCalendarsCursor;
2112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private long mStartMillis;
2132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private long mEndMillis;
2142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mHasAttendeeData;
2162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mIsOrganizer;
217d845fbe558d5229102b58cce70a1b29fe6cb6967Erik    private long mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE;
218352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private boolean mOwnerCanRespond;
2192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private String mCalendarOwnerAccount;
2202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mCanModifyCalendar;
2212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mIsBusyFreeCalendar;
2222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mCanModifyEvent;
2232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private int mNumOfAttendees;
2242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private String mOrganizer;
2252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private ArrayList<Integer> mOriginalMinutes = new ArrayList<Integer>();
2272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private ArrayList<LinearLayout> mReminderItems = new ArrayList<LinearLayout>(0);
2282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private ArrayList<Integer> mReminderValues;
2292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private ArrayList<String> mReminderLabels;
2302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private int mDefaultReminderMinutes;
2312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mOriginalHasAlarm;
2322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private EditResponseHelper mEditResponseHelper;
2342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private int mResponseOffset;
2362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private int mOriginalAttendeeResponse;
237d845fbe558d5229102b58cce70a1b29fe6cb6967Erik    private int mAttendeeResponseFromIntent = EditEventHelper.ATTENDEE_NO_RESPONSE;
2382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mIsRepeating;
2392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean mIsDuplicateName;
2402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private Pattern mWildcardPattern = Pattern.compile("^.*$");
2422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private LayoutInflater mLayoutInflater;
2432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private LinearLayout mReminderAdder;
2442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    // TODO This can be removed when the contacts content provider doesn't return duplicates
2462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private int mUpdateCounts;
2472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static class ViewHolder {
2482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        QuickContactBadge badge;
2492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        ImageView presence;
2502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        int updateCounts;
2512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
2522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private HashMap<String, ViewHolder> mViewHolders = new HashMap<String, ViewHolder>();
2532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private PresenceQueryHandler mPresenceQueryHandler;
2542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final Uri CONTACT_DATA_WITH_PRESENCE_URI = Data.CONTENT_URI;
2562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    int PRESENCE_PROJECTION_CONTACT_ID_INDEX = 0;
2582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    int PRESENCE_PROJECTION_PRESENCE_INDEX = 1;
2592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    int PRESENCE_PROJECTION_EMAIL_INDEX = 2;
2602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    int PRESENCE_PROJECTION_PHOTO_ID_INDEX = 3;
2612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static final String[] PRESENCE_PROJECTION = new String[] {
2632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Email.CONTACT_ID,           // 0
2642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Email.CONTACT_PRESENCE,     // 1
2652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Email.DATA,                 // 2
2662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Email.PHOTO_ID,             // 3
2672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    };
2682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    ArrayList<Attendee> mAcceptedAttendees = new ArrayList<Attendee>();
2702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    ArrayList<Attendee> mDeclinedAttendees = new ArrayList<Attendee>();
2712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    ArrayList<Attendee> mTentativeAttendees = new ArrayList<Attendee>();
2722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    ArrayList<Attendee> mNoResponseAttendees = new ArrayList<Attendee>();
2732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private int mColor;
2742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private QueryHandler mHandler;
2762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
277cb81189e4868769ea016253eca104e46df2f033aErik    private Runnable mTZUpdater = new Runnable() {
278cb81189e4868769ea016253eca104e46df2f033aErik        @Override
279cb81189e4868769ea016253eca104e46df2f033aErik        public void run() {
280cb81189e4868769ea016253eca104e46df2f033aErik            updateEvent(mView);
281cb81189e4868769ea016253eca104e46df2f033aErik        }
282cb81189e4868769ea016253eca104e46df2f033aErik    };
283cb81189e4868769ea016253eca104e46df2f033aErik
28471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    private static final int DIALOG_WIDTH = 500; // FRAG_TODO scale
285352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int DIALOG_HEIGHT = 600;
28671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    private boolean mIsDialog = false;
28771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    private int mX = -1;
28871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    private int mY = -1;
28971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
2902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private class QueryHandler extends AsyncQueryService {
2912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        public QueryHandler(Context context) {
2922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            super(context);
2932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
2942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
2952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        @Override
2962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
2974003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            // if the activity is finishing, then close the cursor and return
2984003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            final Activity activity = getActivity();
2994003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            if (activity == null || activity.isFinishing()) {
3004003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang                cursor.close();
3014003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang                return;
3024003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            }
3034003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
3042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            switch (token) {
3052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case TOKEN_QUERY_EVENT:
3062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mEventCursor = Utils.matrixCursorFromCursor(cursor);
3072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                if (initEventCursor()) {
3082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    // The cursor is empty. This can happen if the event was
3092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    // deleted.
3102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    // FRAG_TODO we should no longer rely on Activity.finish()
3111df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang                    activity.finish();
3122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    return;
3132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                }
3142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateEvent(mView);
3152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
3162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                // start calendar query
3172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                Uri uri = Calendars.CONTENT_URI;
3182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                String[] args = new String[] {
3192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        Long.toString(mEventCursor.getLong(EVENT_INDEX_CALENDAR_ID))};
3202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                startQuery(TOKEN_QUERY_CALENDARS, null, uri, CALENDARS_PROJECTION,
3212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        CALENDARS_WHERE, args, null);
3222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                break;
3232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case TOKEN_QUERY_CALENDARS:
3242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mCalendarsCursor = Utils.matrixCursorFromCursor(cursor);
3252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateCalendar(mView);
3264003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang                // FRAG_TODO fragments shouldn't set the title anymore
3272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateTitle();
3281df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang                // update the action bar since our option set might have changed
3291df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang                activity.invalidateOptionsMenu();
3302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
331352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                if (!mIsBusyFreeCalendar) {
332352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // this is used for both attendees and reminders
333352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    args = new String[] { Long.toString(mEventId) };
334352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
335352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // start attendees query
336352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    uri = Attendees.CONTENT_URI;
337352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    startQuery(TOKEN_QUERY_ATTENDEES, null, uri, ATTENDEES_PROJECTION,
338352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            ATTENDEES_WHERE, args, ATTENDEES_SORT_ORDER);
339352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
340352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // start reminders query
341352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    mOriginalHasAlarm = mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) != 0;
342352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    if (mOriginalHasAlarm) {
343352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        uri = Reminders.CONTENT_URI;
344352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        startQuery(TOKEN_QUERY_REMINDERS, null, uri, REMINDERS_PROJECTION,
345352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                REMINDERS_WHERE, args, REMINDERS_SORT);
346352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    } else {
347352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        // if no reminders, hide the appropriate fields
348352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        updateRemindersVisibility();
349352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    }
3502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                } else {
3512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    updateRemindersVisibility();
3522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                }
3532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                break;
3542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case TOKEN_QUERY_ATTENDEES:
3552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mAttendeesCursor = Utils.matrixCursorFromCursor(cursor);
3562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                initAttendeesCursor(mView);
3572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateResponse(mView);
3582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                break;
3592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case TOKEN_QUERY_REMINDERS:
3602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                MatrixCursor reminderCursor = Utils.matrixCursorFromCursor(cursor);
3612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                try {
3622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    // First pass: collect all the custom reminder minutes
3632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    // (e.g., a reminder of 8 minutes) into a global list.
3642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    while (reminderCursor.moveToNext()) {
3652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        int minutes = reminderCursor.getInt(REMINDERS_INDEX_MINUTES);
3662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        EventViewUtils.addMinutesToList(
3671df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang                                activity, mReminderValues, mReminderLabels, minutes);
3682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    }
3692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
3702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    // Second pass: create the reminder spinners
3712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    reminderCursor.moveToPosition(-1);
3722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    while (reminderCursor.moveToNext()) {
3732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        int minutes = reminderCursor.getInt(REMINDERS_INDEX_MINUTES);
3742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        mOriginalMinutes.add(minutes);
3751df2ca65a852fda463b1d787cd4f81680103b6a2Mason Tang                        EventViewUtils.addReminder(activity, mRemindersContainer,
3762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                EventInfoFragment.this, mReminderItems, mReminderValues,
3772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                mReminderLabels, minutes);
3782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    }
3792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                } finally {
3802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    updateRemindersVisibility();
3812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    reminderCursor.close();
3822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                }
3832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                break;
3842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case TOKEN_QUERY_DUPLICATE_CALENDARS:
3852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mIsDuplicateName = cursor.getCount() > 1;
3862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                String calendarName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME);
3878ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP                String ownerAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT);
3888ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                if (mIsDuplicateName && !calendarName.equalsIgnoreCase(ownerAccount)) {
3898ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                    Resources res = activity.getResources();
3908ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                    TextView ownerText = (TextView) mView.findViewById(R.id.owner);
3918ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                    ownerText.setText(ownerAccount);
3928ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                    ownerText.setTextColor(res.getColor(R.color.calendar_owner_text_color));
3938ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                } else {
3948ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                    setVisibilityCommon(mView, R.id.owner, View.GONE);
3958ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                }
3962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                setTextCommon(mView, R.id.calendar, calendarName);
3972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                break;
3982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
3992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            cursor.close();
4002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
4012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
4022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
4032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
4044003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    public EventInfoFragment() {
4054003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        mUri = null;
4064003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    }
4074003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
4082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public EventInfoFragment(Uri uri, long startMillis, long endMillis, int attendeeResponse) {
40971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        setStyle(DialogFragment.STYLE_NO_TITLE, 0);
4102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mUri = uri;
4112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mStartMillis = startMillis;
4122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mEndMillis = endMillis;
4132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mAttendeeResponseFromIntent = attendeeResponse;
4142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
4152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
4164003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    public EventInfoFragment(long eventId, long startMillis, long endMillis) {
4174003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        this(ContentUris.withAppendedId(Events.CONTENT_URI, eventId),
4184003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang                startMillis, endMillis, EventInfoActivity.ATTENDEE_NO_RESPONSE);
4194003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        mEventId = eventId;
4204003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    }
4214003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
42271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    @Override
42371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    public void onActivityCreated(Bundle savedInstanceState) {
42471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        super.onActivityCreated(savedInstanceState);
42571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
42671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        if (savedInstanceState != null) {
42771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan            mIsDialog = savedInstanceState.getBoolean(BUNDLE_KEY_IS_DIALOG, false);
42871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        }
42971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
43071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        if (mIsDialog) {
43171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan            applyDialogParams();
43271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        }
43371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    }
43471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
43571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    private void applyDialogParams() {
43671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        Dialog dialog = getDialog();
43771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        dialog.setCanceledOnTouchOutside(true);
43871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
43971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        Window window = dialog.getWindow();
44071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
44171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
44271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        WindowManager.LayoutParams a = window.getAttributes();
44371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        a.dimAmount = .4f;
44471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
44571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        a.width = DIALOG_WIDTH;
446352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        a.height = DIALOG_HEIGHT;
44771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
44871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        if (mX != -1 || mY != -1) {
4498ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            a.x = mX - a.width - 64; // FRAG_TODO event sender should return the left edge or a rect
4508ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            a.y = mY - 64; // FRAG_TODO should set height after layout is done
45171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan            a.gravity = Gravity.LEFT | Gravity.TOP;
45271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        }
45371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
45471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        window.setAttributes(a);
45571d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    }
45671d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
45771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    public void setDialogParams(int x, int y) {
45871d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        mIsDialog = true;
45971d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        mX = x;
46071d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        mY = y;
46171d08836af4cf5fc45d340b1883044a9f8290232Michael Chan    }
46271d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
4632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    // This is called when one of the "remove reminder" buttons is selected.
4642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public void onClick(View v) {
4652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        LinearLayout reminderItem = (LinearLayout) v.getParent();
4662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        LinearLayout parent = (LinearLayout) reminderItem.getParent();
4672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        parent.removeView(reminderItem);
4682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mReminderItems.remove(reminderItem);
4692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        updateRemindersVisibility();
4702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
4712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
4722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
4732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // If they selected the "No response" option, then don't display the
4742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // dialog asking which events to change.
4752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (id == 0 && mResponseOffset == 0) {
4762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
4772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
4782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
4792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // If this is not a repeating event, then don't display the dialog
4802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // asking which events to change.
4812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (!mIsRepeating) {
4822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
4832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
4842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
4852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // If the selection is the same as the original, then don't display the
4862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // dialog asking which events to change.
4872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        int index = findResponseIndexFor(mOriginalAttendeeResponse);
4882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (position == index + mResponseOffset) {
4892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
4902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
4912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
4922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // This is a repeating event. We need to ask the user if they mean to
4932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // change just this one instance or all instances.
4942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mEditResponseHelper.showDialog(mEditResponseHelper.getWhichEvents());
4952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
4962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
4972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public void onNothingSelected(AdapterView<?> parent) {
4982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
4992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    @Override
5012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public void onAttach(Activity activity) {
5022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        super.onAttach(activity);
5032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mEditResponseHelper = new EditResponseHelper(activity);
5042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mHandler = new QueryHandler(activity);
5052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mPresenceQueryHandler = new PresenceQueryHandler(activity, activity.getContentResolver());
5062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
5072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    @Override
5092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public View onCreateView(LayoutInflater inflater, ViewGroup container,
5102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            Bundle savedInstanceState) {
5112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mLayoutInflater = inflater;
5122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mView = inflater.inflate(R.layout.event_info_activity, null);
5132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mRemindersContainer = (LinearLayout) mView.findViewById(R.id.reminders_container);
5142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mOrganizerContainer = (LinearLayout) mView.findViewById(R.id.organizer_container);
5152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mOrganizerView = (TextView) mView.findViewById(R.id.organizer);
5162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Initialize the reminder values array.
5182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Resources r = getActivity().getResources();
5192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String[] strings = r.getStringArray(R.array.reminder_minutes_values);
5202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        int size = strings.length;
5212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        ArrayList<Integer> list = new ArrayList<Integer>(size);
5222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        for (int i = 0 ; i < size ; i++) {
5232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            list.add(Integer.parseInt(strings[i]));
5242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
5252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mReminderValues = list;
5262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String[] labels = r.getStringArray(R.array.reminder_minutes_labels);
5272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mReminderLabels = new ArrayList<String>(Arrays.asList(labels));
5282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5294b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa        SharedPreferences prefs = GeneralPreferences.getSharedPreferences(getActivity());
5302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String durationString =
5314b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa                prefs.getString(GeneralPreferences.KEY_DEFAULT_REMINDER, "0");
5322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mDefaultReminderMinutes = Integer.parseInt(durationString);
5332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Setup the + Add Reminder Button
5352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        View.OnClickListener addReminderOnClickListener = new View.OnClickListener() {
5362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            public void onClick(View v) {
5372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                addReminder();
5382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
5392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        };
5402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        ImageButton reminderAddButton = (ImageButton) mView.findViewById(R.id.reminder_add);
5412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        reminderAddButton.setOnClickListener(addReminderOnClickListener);
5422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
543352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        mReminderAdder = (LinearLayout) mView.findViewById(R.id.reminder_adder);
5442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5454003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        if (mUri == null) {
5464003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            // restore event ID from bundle
5474003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            mEventId = savedInstanceState.getLong(BUNDLE_KEY_EVENT_ID);
5484003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId);
5494003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            mStartMillis = savedInstanceState.getLong(BUNDLE_KEY_START_MILLIS);
5504003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            mEndMillis = savedInstanceState.getLong(BUNDLE_KEY_END_MILLIS);
5514003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        }
5524003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
5532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // start loading the data
5542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION,
5552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                null, null, null);
5562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        Button b = (Button) mView.findViewById(R.id.done);
5588ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        b.setOnClickListener(new OnClickListener() {
5598ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            @Override
5608ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            public void onClick(View v) {
5618ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                EventInfoFragment.this.dismiss();
5628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            }});
5638ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan
5642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        return mView;
5652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
5662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void updateTitle() {
5682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Resources res = getActivity().getResources();
5692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mCanModifyCalendar && !mIsOrganizer) {
5702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            getActivity().setTitle(res.getString(R.string.event_info_title_invite));
5712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
5722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            getActivity().setTitle(res.getString(R.string.event_info_title));
5732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
5742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
5752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    /**
5772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * Initializes the event cursor, which is expected to point to the first
5782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * (and only) result from a query.
5792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * @return true if the cursor is empty.
5802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     */
5812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean initEventCursor() {
5822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if ((mEventCursor == null) || (mEventCursor.getCount() == 0)) {
5832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return true;
5842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
5852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mEventCursor.moveToFirst();
5862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mEventId = mEventCursor.getInt(EVENT_INDEX_ID);
5872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String rRule = mEventCursor.getString(EVENT_INDEX_RRULE);
5882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mIsRepeating = (rRule != null);
5892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        return false;
5902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
5912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private static class Attendee {
5932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String mName;
5942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String mEmail;
5952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
5962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Attendee(String name, String email) {
5972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mName = name;
5982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mEmail = email;
5992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
6008ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan
6018ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        String getDisplayName() {
6028ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            if (TextUtils.isEmpty(mName)) {
6038ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                return mEmail;
6048ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            } else {
6058ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                return mName;
6068ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            }
6078ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        }
6082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
6092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
6102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    @SuppressWarnings("fallthrough")
6112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void initAttendeesCursor(View view) {
612d845fbe558d5229102b58cce70a1b29fe6cb6967Erik        mOriginalAttendeeResponse = EditEventHelper.ATTENDEE_NO_RESPONSE;
613d845fbe558d5229102b58cce70a1b29fe6cb6967Erik        mCalendarOwnerAttendeeId = EditEventHelper.ATTENDEE_ID_NONE;
6142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mNumOfAttendees = 0;
6152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mAttendeesCursor != null) {
6162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mNumOfAttendees = mAttendeesCursor.getCount();
6172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            if (mAttendeesCursor.moveToFirst()) {
6182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mAcceptedAttendees.clear();
6192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mDeclinedAttendees.clear();
6202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mTentativeAttendees.clear();
6212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mNoResponseAttendees.clear();
6222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
6232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                do {
6242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    int status = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS);
6252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    String name = mAttendeesCursor.getString(ATTENDEES_INDEX_NAME);
6262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    String email = mAttendeesCursor.getString(ATTENDEES_INDEX_EMAIL);
6272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
6282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    if (mAttendeesCursor.getInt(ATTENDEES_INDEX_RELATIONSHIP) ==
6292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            Attendees.RELATIONSHIP_ORGANIZER) {
6302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        // Overwrites the one from Event table if available
6312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        if (name != null && name.length() > 0) {
6322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            mOrganizer = name;
6332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        } else if (email != null && email.length() > 0) {
6342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            mOrganizer = email;
6352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        }
6362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    }
6372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
638d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                    if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE &&
6392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            mCalendarOwnerAccount.equalsIgnoreCase(email)) {
6402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        mCalendarOwnerAttendeeId = mAttendeesCursor.getInt(ATTENDEES_INDEX_ID);
6412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        mOriginalAttendeeResponse = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS);
6422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    } else {
6432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        // Don't show your own status in the list because:
6442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        //  1) it doesn't make sense for event without other guests.
6452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        //  2) there's a spinner for that for events with guests.
6462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        switch(status) {
6472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            case Attendees.ATTENDEE_STATUS_ACCEPTED:
6482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                mAcceptedAttendees.add(new Attendee(name, email));
6492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                break;
6502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            case Attendees.ATTENDEE_STATUS_DECLINED:
6512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                mDeclinedAttendees.add(new Attendee(name, email));
6522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                break;
6538ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                            case Attendees.ATTENDEE_STATUS_TENTATIVE:
6542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                mTentativeAttendees.add(new Attendee(name, email));
6558ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                                break;
6568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                            default:
6578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                                mNoResponseAttendees.add(new Attendee(name, email));
6582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        }
6592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    }
6602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                } while (mAttendeesCursor.moveToNext());
6612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mAttendeesCursor.moveToFirst();
6622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
6632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateAttendees(view);
6642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
6652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
6662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // only show the organizer if we're not the organizer and if
6672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // we have attendee data (might have been removed by the server
6682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // for events with a lot of attendees).
6698ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP        if (!mIsOrganizer && mHasAttendeeData) {
6708ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            mOrganizerContainer.setVisibility(View.VISIBLE);
6718ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            mOrganizerView.setText(mOrganizer);
6728ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        } else {
6738ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            mOrganizerContainer.setVisibility(View.GONE);
6748ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        }
6752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
6762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
6772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    @Override
6784003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    public void onSaveInstanceState(Bundle outState) {
6794003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        super.onSaveInstanceState(outState);
6804003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        outState.putLong(BUNDLE_KEY_EVENT_ID, mEventId);
6814003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        outState.putLong(BUNDLE_KEY_START_MILLIS, mStartMillis);
6824003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        outState.putLong(BUNDLE_KEY_END_MILLIS, mEndMillis);
68371d08836af4cf5fc45d340b1883044a9f8290232Michael Chan
68471d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        outState.putBoolean(BUNDLE_KEY_IS_DIALOG, mIsDialog);
6854003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    }
6864003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
6874003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang
6884003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    @Override
6894003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang    public void onDestroyView() {
6902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        ArrayList<Integer> reminderMinutes = EventViewUtils.reminderItemsToMinutes(mReminderItems,
6912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mReminderValues);
6922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3);
6932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        boolean changed = EditEventHelper.saveReminders(ops, mEventId, reminderMinutes,
6942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                mOriginalMinutes, false /* no force save */);
6952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mHandler.startBatch(mHandler.getNextToken(), null,
6962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                Calendars.CONTENT_URI.getAuthority(), ops, Utils.UNDO_DELAY);
6972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
6982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Update the "hasAlarm" field for the event
6992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventId);
7002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        int len = reminderMinutes.size();
7012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        boolean hasAlarm = len > 0;
7022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (hasAlarm != mOriginalHasAlarm) {
7032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            ContentValues values = new ContentValues();
7042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0);
7052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mHandler.startUpdate(mHandler.getNextToken(), null, uri, values,
7062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    null, null, Utils.UNDO_DELAY);
7072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        changed |= saveResponse();
7102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (changed) {
7112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            Toast.makeText(getActivity(), R.string.saving_event, Toast.LENGTH_SHORT).show();
7122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7134003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        super.onDestroyView();
7142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
7152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    @Override
7172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public void onDestroy() {
7182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mEventCursor != null) {
7192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mEventCursor.close();
7202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mCalendarsCursor != null) {
7222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mCalendarsCursor.close();
7232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mAttendeesCursor != null) {
7252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mAttendeesCursor.close();
7262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
72771d08836af4cf5fc45d340b1883044a9f8290232Michael Chan        super.onDestroy();
7282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
7292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean canAddReminders() {
7312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        return !mIsBusyFreeCalendar && mReminderItems.size() < MAX_REMINDERS;
7322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
7332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void addReminder() {
7352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // TODO: when adding a new reminder, make it different from the
7362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // last one in the list (if any).
7372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mDefaultReminderMinutes == 0) {
7382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            EventViewUtils.addReminder(getActivity(), mRemindersContainer, this, mReminderItems,
7392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    mReminderValues, mReminderLabels, 10 /* minutes */);
7402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
7412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            EventViewUtils.addReminder(getActivity(), mRemindersContainer, this, mReminderItems,
7422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    mReminderValues, mReminderLabels, mDefaultReminderMinutes);
7432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        updateRemindersVisibility();
7452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
7462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void updateRemindersVisibility() {
748352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        if (mIsBusyFreeCalendar) {
749352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mRemindersContainer.setVisibility(View.GONE);
750352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        } else {
751352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mRemindersContainer.setVisibility(View.VISIBLE);
752352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mReminderAdder.setVisibility(canAddReminders() ? View.VISIBLE : View.GONE);
753352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        }
7542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
7552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    /**
7572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * Asynchronously saves the response to an invitation if the user changed
7582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * the response. Returns true if the database will be updated.
7592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     *
7602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * @param cr the ContentResolver
7612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * @return true if the database will be changed
7622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     */
7632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private boolean saveResponse() {
7642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mAttendeesCursor == null || mEventCursor == null) {
7652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return false;
7662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Spinner spinner = (Spinner) getView().findViewById(R.id.response_value);
7682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        int position = spinner.getSelectedItemPosition() - mResponseOffset;
7692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (position <= 0) {
7702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return false;
7712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
773d845fbe558d5229102b58cce70a1b29fe6cb6967Erik        int status = EditEventHelper.ATTENDEE_VALUES[position];
7742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // If the status has not changed, then don't update the database
7762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (status == mOriginalAttendeeResponse) {
7772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return false;
7782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // If we never got an owner attendee id we can't set the status
781d845fbe558d5229102b58cce70a1b29fe6cb6967Erik        if (mCalendarOwnerAttendeeId == EditEventHelper.ATTENDEE_ID_NONE) {
7822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return false;
7832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (!mIsRepeating) {
7862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // This is a non-repeating event
7872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            updateResponse(mEventId, mCalendarOwnerAttendeeId, status);
7882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return true;
7892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
7902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
7912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // This is a repeating event
7922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        int whichEvents = mEditResponseHelper.getWhichEvents();
7932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        switch (whichEvents) {
7942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case -1:
7952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                return false;
7962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case UPDATE_SINGLE:
7972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                createExceptionResponse(mEventId, mCalendarOwnerAttendeeId, status);
7982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                return true;
7992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            case UPDATE_ALL:
8002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                updateResponse(mEventId, mCalendarOwnerAttendeeId, status);
8012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                return true;
8022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            default:
8032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                Log.e(TAG, "Unexpected choice for updating invitation response");
8042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                break;
8052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
8062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        return false;
8072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
8082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void updateResponse(long eventId, long attendeeId, int status) {
8102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Update the attendee status in the attendees table.  the provider
8112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // takes care of updating the self attendance status.
8122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        ContentValues values = new ContentValues();
8132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (!TextUtils.isEmpty(mCalendarOwnerAccount)) {
8152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            values.put(Attendees.ATTENDEE_EMAIL, mCalendarOwnerAccount);
8162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
8172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Attendees.ATTENDEE_STATUS, status);
8182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Attendees.EVENT_ID, eventId);
8192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Uri uri = ContentUris.withAppendedId(Attendees.CONTENT_URI, attendeeId);
8212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mHandler.startUpdate(mHandler.getNextToken(), null, uri, values,
8232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                null, null, Utils.UNDO_DELAY);
8242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
8252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void createExceptionResponse(long eventId, long attendeeId,
8272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            int status) {
8282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mEventCursor == null || !mEventCursor.moveToFirst()) {
8292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
8302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
8312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        ContentValues values = new ContentValues();
8332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String title = mEventCursor.getString(EVENT_INDEX_TITLE);
8352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String timezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE);
8362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        int calendarId = mEventCursor.getInt(EVENT_INDEX_CALENDAR_ID);
8372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        boolean allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0;
8382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String syncId = mEventCursor.getString(EVENT_INDEX_SYNC_ID);
8392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.TITLE, title);
8412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.EVENT_TIMEZONE, timezone);
8422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.ALL_DAY, allDay ? 1 : 0);
8432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.CALENDAR_ID, calendarId);
8442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.DTSTART, mStartMillis);
8452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.DTEND, mEndMillis);
8462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.ORIGINAL_EVENT, syncId);
8472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.ORIGINAL_INSTANCE_TIME, mStartMillis);
8482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.ORIGINAL_ALL_DAY, allDay ? 1 : 0);
8492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.STATUS, Events.STATUS_CONFIRMED);
8502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        values.put(Events.SELF_ATTENDEE_STATUS, status);
8512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Create a recurrence exception
8532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mHandler.startInsert(mHandler.getNextToken(), null,
8542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                Events.CONTENT_URI, values, Utils.UNDO_DELAY);
8552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
8562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private int findResponseIndexFor(int response) {
858d845fbe558d5229102b58cce70a1b29fe6cb6967Erik        int size = EditEventHelper.ATTENDEE_VALUES.length;
8592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        for (int index = 0; index < size; index++) {
860d845fbe558d5229102b58cce70a1b29fe6cb6967Erik            if (EditEventHelper.ATTENDEE_VALUES[index] == response) {
8612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                return index;
8622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
8632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
8642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        return 0;
8652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
8662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void doEdit() {
8682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        CalendarController.getInstance(getActivity()).sendEventRelatedEvent(
8692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                this, EventType.EDIT_EVENT, mEventId, mStartMillis, mEndMillis, 0, 0);
8702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
8712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void doDelete() {
8734003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        CalendarController.getInstance(getActivity()).sendEventRelatedEvent(
8744003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang                this, EventType.DELETE_EVENT, mEventId, mStartMillis, mEndMillis, 0, 0);
8752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
8762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void updateEvent(View view) {
8782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mEventCursor == null) {
8792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
8802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
8812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String eventName = mEventCursor.getString(EVENT_INDEX_TITLE);
8832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (eventName == null || eventName.length() == 0) {
8842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            eventName = getActivity().getString(R.string.no_title_label);
8852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
8862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        boolean allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0;
8882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String location = mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION);
8892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String description = mEventCursor.getString(EVENT_INDEX_DESCRIPTION);
8902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String rRule = mEventCursor.getString(EVENT_INDEX_RRULE);
8912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        boolean hasAlarm = mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) != 0;
8922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String eventTimezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE);
8932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mColor = mEventCursor.getInt(EVENT_INDEX_COLOR) & 0xbbffffff;
8942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8958ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        view.findViewById(R.id.color).setBackgroundColor(mColor);
8962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
8972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        TextView title = (TextView) view.findViewById(R.id.title);
8982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        title.setTextColor(mColor);
8992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
9008ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        View divider = view.findViewById(R.id.divider);
9018ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        divider.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN);
9022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
9032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // What
9042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (eventName != null) {
9052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            setTextCommon(view, R.id.title, eventName);
9062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
9072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
9082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // When
9092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String when;
9102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        int flags;
9112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (allDay) {
9122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            flags = DateUtils.FORMAT_UTC | DateUtils.FORMAT_SHOW_WEEKDAY
9132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            | DateUtils.FORMAT_SHOW_DATE;
9142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
9152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            flags = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE;
9162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            if (DateFormat.is24HourFormat(getActivity())) {
9172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                flags |= DateUtils.FORMAT_24HOUR;
9182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
9192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
920cb81189e4868769ea016253eca104e46df2f033aErik        when = Utils.formatDateRange(getActivity(), mStartMillis, mEndMillis, flags);
9212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        setTextCommon(view, R.id.when, when);
9222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
9238ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP        // Show the event timezone if it is different from the local timezone
9248ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        Time time = new Time();
9258ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        String localTimezone = time.timezone;
9268ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        if (allDay) {
9278ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            localTimezone = Time.TIMEZONE_UTC;
9288ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        }
9298ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        if (eventTimezone != null && !localTimezone.equals(eventTimezone) && !allDay) {
9308ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            String displayName;
9318ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            TimeZone tz = TimeZone.getTimeZone(localTimezone);
9328ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            if (tz == null || tz.getID().equals("GMT")) {
9338ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                displayName = localTimezone;
9348ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            } else {
9358ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                displayName = tz.getDisplayName();
9368ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            }
9378ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//
9388ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            setTextCommon(view, R.id.timezone, displayName);
9398ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            setVisibilityCommon(view, R.id.timezone_container, View.VISIBLE);
9408ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        } else {
9418ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            setVisibilityCommon(view, R.id.timezone_container, View.GONE);
9428ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        }
9432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
9442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Repeat
9452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (rRule != null) {
9462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            EventRecurrence eventRecurrence = new EventRecurrence();
9472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            eventRecurrence.parse(rRule);
948cb81189e4868769ea016253eca104e46df2f033aErik            Time date = new Time(Utils.getTimeZone(getActivity(), mTZUpdater));
9492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            if (allDay) {
9502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                date.timezone = Time.TIMEZONE_UTC;
9512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
9522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            date.set(mStartMillis);
9532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            eventRecurrence.setStartDate(date);
9542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            String repeatString = EventRecurrenceFormatter.getRepeatString(
9552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    getActivity().getResources(), eventRecurrence);
9562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            setTextCommon(view, R.id.repeat, repeatString);
9579c1989989b8f633210ef1761b0e4e7ecd5b43581Mason Tang            setVisibilityCommon(view, R.id.repeat_container, View.VISIBLE);
9582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
9592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            setVisibilityCommon(view, R.id.repeat_container, View.GONE);
9602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
9612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
9622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Where
9632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (location == null || location.length() == 0) {
9642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            setVisibilityCommon(view, R.id.where, View.GONE);
9652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
9662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            final TextView textView = (TextView) view.findViewById(R.id.where);
9672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            if (textView != null) {
9682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    textView.setAutoLinkMask(0);
9692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    textView.setText(location);
9702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    Linkify.addLinks(textView, mWildcardPattern, "geo:0,0?q=");
9712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    textView.setOnTouchListener(new OnTouchListener() {
9722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        public boolean onTouch(View v, MotionEvent event) {
9732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            try {
9742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                return v.onTouchEvent(event);
9752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            } catch (ActivityNotFoundException e) {
9762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                // ignore
9772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                return true;
9782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                            }
9792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        }
9802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    });
9812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
9822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
9832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
9842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Description
985352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        if (description != null && description.length() != 0) {
9862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            setTextCommon(view, R.id.description, description);
9872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
9882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
9892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
9902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void updateCalendar(View view) {
9912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mCalendarOwnerAccount = "";
9922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (mCalendarsCursor != null && mEventCursor != null) {
9932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mCalendarsCursor.moveToFirst();
9942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            String tempAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT);
9952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mCalendarOwnerAccount = (tempAccount == null) ? "" : tempAccount;
996352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mOwnerCanRespond = mCalendarsCursor.getInt(CALENDARS_INDEX_OWNER_CAN_RESPOND) != 0;
9972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
9982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            String displayName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME);
9992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
10002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // start duplicate calendars query
10012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mHandler.startQuery(TOKEN_QUERY_DUPLICATE_CALENDARS, null, Calendars.CONTENT_URI,
10022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    CALENDARS_PROJECTION, CALENDARS_DUPLICATE_NAME_WHERE,
10032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    new String[] {displayName}, null);
10042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
10052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            String eventOrganizer = mEventCursor.getString(EVENT_INDEX_ORGANIZER);
10062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mIsOrganizer = mCalendarOwnerAccount.equalsIgnoreCase(eventOrganizer);
10072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mHasAttendeeData = mEventCursor.getInt(EVENT_INDEX_HAS_ATTENDEE_DATA) != 0;
10082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mOrganizer = eventOrganizer;
10092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mCanModifyCalendar =
10102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) >= Calendars.CONTRIBUTOR_ACCESS;
10112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mIsBusyFreeCalendar =
10122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) == Calendars.FREEBUSY_ACCESS;
10132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mCanModifyEvent = mCanModifyCalendar
10142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    && (mIsOrganizer || (mEventCursor.getInt(EVENT_INDEX_GUESTS_CAN_MODIFY) != 0));
1015352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
1016352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            if (!mIsBusyFreeCalendar) {
10178ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                Button b = (Button) mView.findViewById(R.id.edit);
1018352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                b.setEnabled(true);
10198ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                b.setOnClickListener(new OnClickListener() {
10208ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                    @Override
10218ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                    public void onClick(View v) {
10228ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                        doEdit();
10238ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                        EventInfoFragment.this.dismiss();
1024352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    }
1025352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                });
10268ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            }
10272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
10288ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP            setVisibilityCommon(view, R.id.calendar_container, View.GONE);
10292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
10302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
10312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
10322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void updateAttendees(View view) {
10338ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        TextView tv = (TextView) view.findViewById(R.id.attendee_list);
10348ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        SpannableStringBuilder sb = new SpannableStringBuilder();
10358ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        formatAttendees(mAcceptedAttendees, sb, Attendees.ATTENDEE_STATUS_ACCEPTED);
10368ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        formatAttendees(mDeclinedAttendees, sb, Attendees.ATTENDEE_STATUS_DECLINED);
10378ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        formatAttendees(mTentativeAttendees, sb, Attendees.ATTENDEE_STATUS_TENTATIVE);
10388ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        formatAttendees(mNoResponseAttendees, sb, Attendees.ATTENDEE_STATUS_NONE);
10398ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        tv.setText(sb);
10408ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan
10418ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//CLEANUP        LinearLayout attendeesLayout = (LinearLayout) view.findViewById(R.id.attendee_list);
10428ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        attendeesLayout.removeAllViewsInLayout();
10438ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        ++mUpdateCounts;
10448ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        if(mAcceptedAttendees.size() == 0 && mDeclinedAttendees.size() == 0 &&
10458ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                mTentativeAttendees.size() == mNoResponseAttendees.size()) {
10468ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            // If all guests have no response just list them as guests,
10478ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            CharSequence guestsLabel =
10488ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//                getActivity().getResources().getText(R.string.attendees_label);
10498ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            addAttendeesToLayout(mNoResponseAttendees, attendeesLayout, guestsLabel);
10508ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        } else {
10518ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            // If we have any responses then divide them up by response
10528ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            CharSequence[] entries;
10538ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            entries = getActivity().getResources().getTextArray(R.array.response_labels2);
10548ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            addAttendeesToLayout(mAcceptedAttendees, attendeesLayout, entries[0]);
10558ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            addAttendeesToLayout(mDeclinedAttendees, attendeesLayout, entries[2]);
10568ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//            addAttendeesToLayout(mTentativeAttendees, attendeesLayout, entries[1]);
10578ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan//        }
10588ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan    }
10598ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan
10608ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan    private void formatAttendees(ArrayList<Attendee> attendees, SpannableStringBuilder sb, int type) {
10618ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        if (attendees.size() <= 0) {
10628ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            return;
10638ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        }
10648ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan
10658ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        int begin = sb.length();
10668ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        boolean firstTime = sb.length() == 0;
10678ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan
10688ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        if (firstTime == false) {
10698ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            begin += 2; // skip over the ", " for formatting.
10708ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        }
10718ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan
10728ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        for (Attendee attendee : attendees) {
10738ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            if (firstTime) {
10748ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                firstTime = false;
10758ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            } else {
10768ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                sb.append(", ");
10778ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            }
10788ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan
10798ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            String name = attendee.getDisplayName();
10808ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            sb.append(name);
10818ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        }
10828ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan
10838ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan        switch (type) {
10848ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            case Attendees.ATTENDEE_STATUS_ACCEPTED:
10858ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                break;
10868ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            case Attendees.ATTENDEE_STATUS_DECLINED:
10878ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                sb.setSpan(new StrikethroughSpan(), begin, sb.length(),
10888ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
10898ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                // fall through
10908ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan            default:
10918ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                // The last INCLUSIVE causes the foreground color to be applied
10928ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                // to the rest of the span. If not, the comma at the end of the
10938ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                // declined or tentative may be black.
10948ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                sb.setSpan(new ForegroundColorSpan(0xFF888888), begin, sb.length(),
10958ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                        Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
10968ce3b7db4d7644ecc8c358fd16a06c4d9af48904Michael Chan                break;
10972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
10982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
10992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void addAttendeesToLayout(ArrayList<Attendee> attendees, LinearLayout attendeeList,
11012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            CharSequence sectionTitle) {
11022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (attendees.size() == 0) {
11032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
11042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
11052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Yes/No/Maybe Title
11072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        View titleView = mLayoutInflater.inflate(R.layout.contact_item, null);
11082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        titleView.findViewById(R.id.badge).setVisibility(View.GONE);
11092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        View divider = titleView.findViewById(R.id.separator);
11102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        divider.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN);
11112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        TextView title = (TextView) titleView.findViewById(R.id.name);
11132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        title.setText(getActivity().getString(R.string.response_label, sectionTitle,
11142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                attendees.size()));
11152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        title.setTextAppearance(getActivity(), R.style.TextAppearance_EventInfo_Label);
11162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        attendeeList.addView(titleView);
11172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // Attendees
11192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        int numOfAttendees = attendees.size();
11202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        StringBuilder selection = new StringBuilder(Email.DATA + " IN (");
11212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        String[] selectionArgs = new String[numOfAttendees];
11222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        for (int i = 0; i < numOfAttendees; ++i) {
11242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            Attendee attendee = attendees.get(i);
11252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            selectionArgs[i] = attendee.mEmail;
11262bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11272bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            View v = mLayoutInflater.inflate(R.layout.contact_item, null);
11282bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            v.setTag(attendee);
11292bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11302bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            View separator = v.findViewById(R.id.separator);
11312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            separator.getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_IN);
11322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // Text
11342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            TextView tv = (TextView) v.findViewById(R.id.name);
11352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            String name = attendee.mName;
11362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            if (name == null || name.length() == 0) {
11372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                name = attendee.mEmail;
11382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
11392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            tv.setText(name);
11402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            ViewHolder vh = new ViewHolder();
11422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            vh.badge = (QuickContactBadge) v.findViewById(R.id.badge);
11432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            vh.badge.assignContactFromEmail(attendee.mEmail, true);
11442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            vh.presence = (ImageView) v.findViewById(R.id.presence);
11452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mViewHolders.put(attendee.mEmail, vh);
11462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11472bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            if (i == 0) {
11482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                selection.append('?');
11492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            } else {
11502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                selection.append(", ?");
11512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
11522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            attendeeList.addView(v);
11542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
11552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        selection.append(')');
11562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mPresenceQueryHandler.startQuery(mUpdateCounts, attendees, CONTACT_DATA_WITH_PRESENCE_URI,
11582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                PRESENCE_PROJECTION, selection.toString(), selectionArgs, null);
11592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
11602bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private class PresenceQueryHandler extends AsyncQueryHandler {
11622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Context mContext;
11632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        public PresenceQueryHandler(Context context, ContentResolver cr) {
11652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            super(cr);
11662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mContext = context;
11672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
11682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        @Override
11702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        protected void onQueryComplete(int queryIndex, Object cookie, Cursor cursor) {
11712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            if (cursor == null) {
11722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                if (DEBUG) {
11732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    Log.e(TAG, "onQueryComplete: cursor == null");
11742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                }
11752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                return;
11762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
11772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            try {
11792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                cursor.moveToPosition(-1);
11802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                while (cursor.moveToNext()) {
11812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    String email = cursor.getString(PRESENCE_PROJECTION_EMAIL_INDEX);
11822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    int contactId = cursor.getInt(PRESENCE_PROJECTION_CONTACT_ID_INDEX);
11832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    ViewHolder vh = mViewHolders.get(email);
11842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    int photoId = cursor.getInt(PRESENCE_PROJECTION_PHOTO_ID_INDEX);
11852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    if (DEBUG) {
11862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        Log.e(TAG, "onQueryComplete Id: " + contactId + " PhotoId: " + photoId
11872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                + " Email: " + email);
11882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    }
11892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    if (vh == null) {
11902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        continue;
11912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    }
11922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    ImageView presenceView = vh.presence;
11932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    if (presenceView != null) {
11942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        int status = cursor.getInt(PRESENCE_PROJECTION_PRESENCE_INDEX);
11952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        presenceView.setImageResource(Presence.getPresenceIconResourceId(status));
11962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        presenceView.setVisibility(View.VISIBLE);
11972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    }
11982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
11992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    if (photoId > 0 && vh.updateCounts < queryIndex) {
12002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        vh.updateCounts = queryIndex;
12012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        Uri personUri = ContentUris.withAppendedId(Contacts.CONTENT_URI,
12022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                contactId);
12032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        // TODO, modify to batch queries together
12052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        ContactsAsyncHelper.updateImageViewWithContactPhotoAsync(mContext,
12062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                                vh.badge, personUri, R.drawable.ic_contact_picture);
12072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    }
12082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                }
12092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            } finally {
12102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                cursor.close();
12112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
12122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
12132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
12142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    void updateResponse(View view) {
12162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // we only let the user accept/reject/etc. a meeting if:
12172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // a) you can edit the event's containing calendar AND
12182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // b) you're not the organizer and only attendee AND
12192bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // c) organizerCanRespond is enabled for the calendar
12202bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // (if the attendee data has been hidden, the visible number of attendees
12212bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // will be 1 -- the calendar owner's).
12222bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // (there are more cases involved to be 100% accurate, such as
12232bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // paying attention to whether or not an attendee status was
12242bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // included in the feed, but we're currently omitting those corner cases
12252bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // for simplicity).
1226352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
1227352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        // TODO Switch to EditEventHelper.canRespond when this class uses CalendarEventModel.
1228352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
1229d785cd533f6a3c23813c15315aed74efa9a116f5Michael Chan        if (!mCanModifyCalendar || (mHasAttendeeData && mIsOrganizer && mNumOfAttendees <= 1) ||
1230352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                (mIsOrganizer && !mOwnerCanRespond)) {
12312bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            setVisibilityCommon(view, R.id.response_container, View.GONE);
12322bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
12332bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
12342bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12352bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        setVisibilityCommon(view, R.id.response_container, View.VISIBLE);
12362bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12372bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        Spinner spinner = (Spinner) view.findViewById(R.id.response_value);
12382bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12392bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        mResponseOffset = 0;
12402bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12412bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        /* If the user has previously responded to this event
12422bebde787f9490408ceaf14166de4b016a10daf1Mason Tang         * we should not allow them to select no response again.
12432bebde787f9490408ceaf14166de4b016a10daf1Mason Tang         * Switch the entries to a set of entries without the
12442bebde787f9490408ceaf14166de4b016a10daf1Mason Tang         * no response option.
12452bebde787f9490408ceaf14166de4b016a10daf1Mason Tang         */
12462bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if ((mOriginalAttendeeResponse != Attendees.ATTENDEE_STATUS_INVITED)
1247d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                && (mOriginalAttendeeResponse != EditEventHelper.ATTENDEE_NO_RESPONSE)
12482bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                && (mOriginalAttendeeResponse != Attendees.ATTENDEE_STATUS_NONE)) {
12492bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            CharSequence[] entries;
12502bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            entries = getActivity().getResources().getTextArray(R.array.response_labels2);
12512bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            mResponseOffset = -1;
12522bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            ArrayAdapter<CharSequence> adapter =
12532bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                new ArrayAdapter<CharSequence>(getActivity(),
12542bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                        android.R.layout.simple_spinner_item, entries);
12552bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
12562bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            spinner.setAdapter(adapter);
12572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
12582bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12592bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        int index;
1260d845fbe558d5229102b58cce70a1b29fe6cb6967Erik        if (mAttendeeResponseFromIntent != EditEventHelper.ATTENDEE_NO_RESPONSE) {
12612bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            index = findResponseIndexFor(mAttendeeResponseFromIntent);
12622bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
12632bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            index = findResponseIndexFor(mOriginalAttendeeResponse);
12642bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
12652bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        spinner.setSelection(index + mResponseOffset);
12662bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        spinner.setOnItemSelectedListener(this);
12672bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
12682bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12692bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void setTextCommon(View view, int id, CharSequence text) {
12702bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        TextView textView = (TextView) view.findViewById(id);
12712bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (textView == null)
12722bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            return;
12732bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        textView.setText(text);
12742bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
12752bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12762bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    private void setVisibilityCommon(View view, int id, int visibility) {
12772bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        View v = view.findViewById(id);
12782bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (v != null) {
12792bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            v.setVisibility(visibility);
12802bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
12812bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        return;
12822bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
12832bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12842bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    /**
12852bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * Taken from com.google.android.gm.HtmlConversationActivity
12862bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     *
12872bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     * Send the intent that shows the Contact info corresponding to the email address.
12882bebde787f9490408ceaf14166de4b016a10daf1Mason Tang     */
12892bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    public void showContactInfo(Attendee attendee, Rect rect) {
12902bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        // First perform lookup query to find existing contact
12912bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        final ContentResolver resolver = getActivity().getContentResolver();
12922bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        final String address = attendee.mEmail;
12932bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        final Uri dataUri = Uri.withAppendedPath(CommonDataKinds.Email.CONTENT_FILTER_URI,
12942bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                Uri.encode(address));
12952bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        final Uri lookupUri = ContactsContract.Data.getContactLookupUri(resolver, dataUri);
12962bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
12972bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        if (lookupUri != null) {
12982bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // Found matching contact, trigger QuickContact
12992bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            QuickContact.showQuickContact(getActivity(), rect, lookupUri,
13002bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                    QuickContact.MODE_MEDIUM, null);
13012bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        } else {
13022bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // No matching contact, ask user to create one
13032bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            final Uri mailUri = Uri.fromParts("mailto", address, null);
13042bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, mailUri);
13052bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
13062bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // Pass along full E-mail string for possible create dialog
13072bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            Rfc822Token sender = new Rfc822Token(attendee.mName, attendee.mEmail, null);
13082bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            intent.putExtra(Intents.EXTRA_CREATE_DESCRIPTION, sender.toString());
13092bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
13102bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            // Only provide personal name hint if we have one
13112bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            final String senderPersonal = attendee.mName;
13122bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            if (!TextUtils.isEmpty(senderPersonal)) {
13132bebde787f9490408ceaf14166de4b016a10daf1Mason Tang                intent.putExtra(Intents.Insert.NAME, senderPersonal);
13142bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            }
13152bebde787f9490408ceaf14166de4b016a10daf1Mason Tang
13162bebde787f9490408ceaf14166de4b016a10daf1Mason Tang            startActivity(intent);
13172bebde787f9490408ceaf14166de4b016a10daf1Mason Tang        }
13182bebde787f9490408ceaf14166de4b016a10daf1Mason Tang    }
1319cb81189e4868769ea016253eca104e46df2f033aErik
1320cb81189e4868769ea016253eca104e46df2f033aErik    @Override
1321cb81189e4868769ea016253eca104e46df2f033aErik    public void eventsChanged() {
1322cb81189e4868769ea016253eca104e46df2f033aErik    }
1323cb81189e4868769ea016253eca104e46df2f033aErik
1324cb81189e4868769ea016253eca104e46df2f033aErik    @Override
1325cb81189e4868769ea016253eca104e46df2f033aErik    public boolean getAllDay() {
1326cb81189e4868769ea016253eca104e46df2f033aErik        return false;
1327cb81189e4868769ea016253eca104e46df2f033aErik    }
1328cb81189e4868769ea016253eca104e46df2f033aErik
1329cb81189e4868769ea016253eca104e46df2f033aErik    @Override
1330cb81189e4868769ea016253eca104e46df2f033aErik    public long getSelectedTime() {
1331cb81189e4868769ea016253eca104e46df2f033aErik        return mStartMillis;
1332cb81189e4868769ea016253eca104e46df2f033aErik    }
1333cb81189e4868769ea016253eca104e46df2f033aErik
1334cb81189e4868769ea016253eca104e46df2f033aErik    @Override
1335cb81189e4868769ea016253eca104e46df2f033aErik    public long getSupportedEventTypes() {
1336cb81189e4868769ea016253eca104e46df2f033aErik        return EventType.EVENTS_CHANGED;
1337cb81189e4868769ea016253eca104e46df2f033aErik    }
1338cb81189e4868769ea016253eca104e46df2f033aErik
1339cb81189e4868769ea016253eca104e46df2f033aErik    @Override
1340cb81189e4868769ea016253eca104e46df2f033aErik    public void goTo(Time time, boolean animate) {
1341cb81189e4868769ea016253eca104e46df2f033aErik    }
1342cb81189e4868769ea016253eca104e46df2f033aErik
1343cb81189e4868769ea016253eca104e46df2f033aErik    @Override
1344cb81189e4868769ea016253eca104e46df2f033aErik    public void goToToday() {
1345cb81189e4868769ea016253eca104e46df2f033aErik
1346cb81189e4868769ea016253eca104e46df2f033aErik    }
1347cb81189e4868769ea016253eca104e46df2f033aErik
1348cb81189e4868769ea016253eca104e46df2f033aErik    @Override
1349cb81189e4868769ea016253eca104e46df2f033aErik    public void handleEvent(EventInfo event) {
1350cb81189e4868769ea016253eca104e46df2f033aErik        if (event.eventType == EventType.EVENTS_CHANGED) {
1351cb81189e4868769ea016253eca104e46df2f033aErik            // reload the data
1352cb81189e4868769ea016253eca104e46df2f033aErik            mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION,
1353cb81189e4868769ea016253eca104e46df2f033aErik                    null, null, null);
1354cb81189e4868769ea016253eca104e46df2f033aErik        }
1355cb81189e4868769ea016253eca104e46df2f033aErik
1356cb81189e4868769ea016253eca104e46df2f033aErik    }
13572bebde787f9490408ceaf14166de4b016a10daf1Mason Tang}
1358