179f228124de7d98146ca526d743436f6419e2365Erik/*
279f228124de7d98146ca526d743436f6419e2365Erik * Copyright (C) 2010 The Android Open Source Project
379f228124de7d98146ca526d743436f6419e2365Erik *
479f228124de7d98146ca526d743436f6419e2365Erik * Licensed under the Apache License, Version 2.0 (the "License");
579f228124de7d98146ca526d743436f6419e2365Erik * you may not use this file except in compliance with the License.
679f228124de7d98146ca526d743436f6419e2365Erik * You may obtain a copy of the License at
779f228124de7d98146ca526d743436f6419e2365Erik *
879f228124de7d98146ca526d743436f6419e2365Erik *      http://www.apache.org/licenses/LICENSE-2.0
979f228124de7d98146ca526d743436f6419e2365Erik *
1079f228124de7d98146ca526d743436f6419e2365Erik * Unless required by applicable law or agreed to in writing, software
1179f228124de7d98146ca526d743436f6419e2365Erik * distributed under the License is distributed on an "AS IS" BASIS,
1279f228124de7d98146ca526d743436f6419e2365Erik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1379f228124de7d98146ca526d743436f6419e2365Erik * See the License for the specific language governing permissions and
1479f228124de7d98146ca526d743436f6419e2365Erik * limitations under the License.
1579f228124de7d98146ca526d743436f6419e2365Erik */
1679f228124de7d98146ca526d743436f6419e2365Erik
17fbce65e53c7a111955f638db5bf8bee35381e5b7Erikpackage com.android.calendar.event;
1879f228124de7d98146ca526d743436f6419e2365Erik
1979f228124de7d98146ca526d743436f6419e2365Erikimport android.app.Activity;
2079f228124de7d98146ca526d743436f6419e2365Erikimport android.app.AlertDialog;
2179f228124de7d98146ca526d743436f6419e2365Erikimport android.app.Fragment;
2295e9538c2e504ea5528b07e3abdf54bb3d91c88aJames Kungimport android.app.FragmentManager;
2379f228124de7d98146ca526d743436f6419e2365Erikimport android.content.AsyncQueryHandler;
245f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.content.ContentProviderOperation;
2579f228124de7d98146ca526d743436f6419e2365Erikimport android.content.ContentResolver;
26dd95df57c8c5a58a85c4c0effad5652dec14f621Erikimport android.content.ContentUris;
275f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.content.ContentValues;
285c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawaimport android.content.Context;
2979f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface;
30d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chanimport android.content.DialogInterface.OnCancelListener;
3179f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface.OnClickListener;
32c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport android.content.Intent;
3379f228124de7d98146ca526d743436f6419e2365Erikimport android.database.Cursor;
3479f228124de7d98146ca526d743436f6419e2365Erikimport android.database.MatrixCursor;
3579f228124de7d98146ca526d743436f6419e2365Erikimport android.net.Uri;
3679f228124de7d98146ca526d743436f6419e2365Erikimport android.os.Bundle;
37a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Attendees;
38a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Calendars;
394afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport android.provider.CalendarContract.Colors;
40a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Events;
41a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Reminders;
4279f228124de7d98146ca526d743436f6419e2365Erikimport android.text.TextUtils;
43c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErikimport android.text.format.Time;
4479f228124de7d98146ca526d743436f6419e2365Erikimport android.util.Log;
4579f228124de7d98146ca526d743436f6419e2365Erikimport android.view.LayoutInflater;
465f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.Menu;
475f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.MenuInflater;
485f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.MenuItem;
4979f228124de7d98146ca526d743436f6419e2365Erikimport android.view.View;
5079f228124de7d98146ca526d743436f6419e2365Erikimport android.view.ViewGroup;
515c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawaimport android.view.inputmethod.InputMethodManager;
52135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huangimport android.widget.LinearLayout;
5379f228124de7d98146ca526d743436f6419e2365Erikimport android.widget.Toast;
5479f228124de7d98146ca526d743436f6419e2365Erik
55c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.AsyncQueryService;
56c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController;
57c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventHandler;
58c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventInfo;
59c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventType;
60c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel;
61c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel.Attendee;
62c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel.ReminderEntry;
63c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.DeleteEventHelper;
64c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.R;
65c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.Utils;
66a8b8c0d17adf3e8f9b34a5da89592aa7069c0bddJames Kungimport com.android.colorpicker.ColorPickerSwatch.OnColorSelectedListener;
67a8b8c0d17adf3e8f9b34a5da89592aa7069c0bddJames Kungimport com.android.colorpicker.HsvColorComparator;
68c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan
69c130d9d5e0d178585721428e394df0c8e0a6729fErikimport java.io.Serializable;
705f62079ab9daefe95ede87631766e99e8b4a2220Erikimport java.util.ArrayList;
719645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFaddenimport java.util.Collections;
725f62079ab9daefe95ede87631766e99e8b4a2220Erik
73b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kungpublic class EditEventFragment extends Fragment implements EventHandler, OnColorSelectedListener {
7479f228124de7d98146ca526d743436f6419e2365Erik    private static final String TAG = "EditEventActivity";
752fca024254c9de09f8d87933cc8c9a2046e37c52James Kung    private static final String COLOR_PICKER_DIALOG_TAG = "ColorPickerDialog";
7679f228124de7d98146ca526d743436f6419e2365Erik
77b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung    private static final int REQUEST_CODE_COLOR_PICKER = 0;
78b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung
7959ead671b50514b49749fcd6a1d4186a270239d2Erik    private static final String BUNDLE_KEY_MODEL = "key_model";
8059ead671b50514b49749fcd6a1d4186a270239d2Erik    private static final String BUNDLE_KEY_EDIT_STATE = "key_edit_state";
81c130d9d5e0d178585721428e394df0c8e0a6729fErik    private static final String BUNDLE_KEY_EVENT = "key_event";
82a7694eead7cbb293990bc89c3906e17bad36194cErik    private static final String BUNDLE_KEY_READ_ONLY = "key_read_only";
832d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira    private static final String BUNDLE_KEY_EDIT_ON_LAUNCH = "key_edit_on_launch";
8496a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung    private static final String BUNDLE_KEY_SHOW_COLOR_PALETTE = "show_color_palette";
8559ead671b50514b49749fcd6a1d4186a270239d2Erik
8656f42bfb36d710726051e8268a115697477add61James Kung    private static final String BUNDLE_KEY_DATE_BUTTON_CLICKED = "date_button_clicked";
8756f42bfb36d710726051e8268a115697477add61James Kung
8879f228124de7d98146ca526d743436f6419e2365Erik    private static final boolean DEBUG = false;
8979f228124de7d98146ca526d743436f6419e2365Erik
90352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_EVENT = 1;
91352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_ATTENDEES = 1 << 1;
92352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_REMINDERS = 1 << 2;
93352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_CALENDARS = 1 << 3;
944afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int TOKEN_COLORS = 1 << 4;
954afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
96352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_ALL = TOKEN_EVENT | TOKEN_ATTENDEES | TOKEN_REMINDERS
974afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            | TOKEN_CALENDARS | TOKEN_COLORS;
985f62079ab9daefe95ede87631766e99e8b4a2220Erik    private static final int TOKEN_UNITIALIZED = 1 << 31;
99352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
100352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    /**
101352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     * A bitfield of TOKEN_* to keep track which query hasn't been completed
102352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     * yet. Once all queries have returned, the model can be applied to the
103352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     * view.
104352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     */
1055f62079ab9daefe95ede87631766e99e8b4a2220Erik    private int mOutstandingQueries = TOKEN_UNITIALIZED;
10679f228124de7d98146ca526d743436f6419e2365Erik
10779f228124de7d98146ca526d743436f6419e2365Erik    EditEventHelper mHelper;
10879f228124de7d98146ca526d743436f6419e2365Erik    CalendarEventModel mModel;
10979f228124de7d98146ca526d743436f6419e2365Erik    CalendarEventModel mOriginalModel;
11059ead671b50514b49749fcd6a1d4186a270239d2Erik    CalendarEventModel mRestoreModel;
11179f228124de7d98146ca526d743436f6419e2365Erik    EditEventView mView;
11279f228124de7d98146ca526d743436f6419e2365Erik    QueryHandler mHandler;
11379f228124de7d98146ca526d743436f6419e2365Erik
11479f228124de7d98146ca526d743436f6419e2365Erik    private AlertDialog mModifyDialog;
11579f228124de7d98146ca526d743436f6419e2365Erik    int mModification = Utils.MODIFY_UNINITIALIZED;
11679f228124de7d98146ca526d743436f6419e2365Erik
1176bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private final EventInfo mEvent;
118c130d9d5e0d178585721428e394df0c8e0a6729fErik    private EventBundle mEventBundle;
1191d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung    private ArrayList<ReminderEntry> mReminders;
1201d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung    private int mEventColor;
121f56b14972130233fd7e7c64160084793a7a0a55bJames Kung    private boolean mEventColorInitialized = false;
12279f228124de7d98146ca526d743436f6419e2365Erik    private Uri mUri;
12379f228124de7d98146ca526d743436f6419e2365Erik    private long mBegin;
12479f228124de7d98146ca526d743436f6419e2365Erik    private long mEnd;
12509fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung    private long mCalendarId = -1;
12679f228124de7d98146ca526d743436f6419e2365Erik
1272fca024254c9de09f8d87933cc8c9a2046e37c52James Kung    private EventColorPickerDialog mColorPickerDialog;
1284afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
12996cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert    private Activity mActivity;
1306bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private final Done mOnDone = new Done();
131dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
132dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    private boolean mSaveOnDetach = true;
133a7694eead7cbb293990bc89c3906e17bad36194cErik    private boolean mIsReadOnly = false;
134a7694eead7cbb293990bc89c3906e17bad36194cErik    public boolean mShowModifyDialogOnLaunch = false;
13596a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung    private boolean mShowColorPalette = false;
13679f228124de7d98146ca526d743436f6419e2365Erik
1377674b690b018c31207830c2a196927a0c654486cSam Blitzstein    private boolean mTimeSelectedWasStartTime;
13856f42bfb36d710726051e8268a115697477add61James Kung    private boolean mDateSelectedWasStartDate;
1397674b690b018c31207830c2a196927a0c654486cSam Blitzstein
1405c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa    private InputMethodManager mInputMethodManager;
1415c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa
1426bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private final Intent mIntent;
143c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan
144135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    private boolean mUseCustomActionBar;
145135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
1466bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private final View.OnClickListener mActionBarListener = new View.OnClickListener() {
147135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        @Override
148135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        public void onClick(View v) {
149135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            onActionBarItemSelected(v.getId());
150135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        }
151135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    };
152135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
153364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik    // TODO turn this into a helper function in EditEventHelper for building the
154364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik    // model
15579f228124de7d98146ca526d743436f6419e2365Erik    private class QueryHandler extends AsyncQueryHandler {
15679f228124de7d98146ca526d743436f6419e2365Erik        public QueryHandler(ContentResolver cr) {
15779f228124de7d98146ca526d743436f6419e2365Erik            super(cr);
15879f228124de7d98146ca526d743436f6419e2365Erik        }
15979f228124de7d98146ca526d743436f6419e2365Erik
16079f228124de7d98146ca526d743436f6419e2365Erik        @Override
16179f228124de7d98146ca526d743436f6419e2365Erik        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
16279f228124de7d98146ca526d743436f6419e2365Erik            // If the query didn't return a cursor for some reason return
16379f228124de7d98146ca526d743436f6419e2365Erik            if (cursor == null) {
16479f228124de7d98146ca526d743436f6419e2365Erik                return;
16579f228124de7d98146ca526d743436f6419e2365Erik            }
16679f228124de7d98146ca526d743436f6419e2365Erik
16779f228124de7d98146ca526d743436f6419e2365Erik            // If the Activity is finishing, then close the cursor.
16879f228124de7d98146ca526d743436f6419e2365Erik            // Otherwise, use the new cursor in the adapter.
1696a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan            final Activity activity = EditEventFragment.this.getActivity();
1706a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan            if (activity == null || activity.isFinishing()) {
17179f228124de7d98146ca526d743436f6419e2365Erik                cursor.close();
17279f228124de7d98146ca526d743436f6419e2365Erik                return;
17379f228124de7d98146ca526d743436f6419e2365Erik            }
17479f228124de7d98146ca526d743436f6419e2365Erik            long eventId;
17579f228124de7d98146ca526d743436f6419e2365Erik            switch (token) {
17679f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_EVENT:
17779f228124de7d98146ca526d743436f6419e2365Erik                    if (cursor.getCount() == 0) {
17879f228124de7d98146ca526d743436f6419e2365Erik                        // The cursor is empty. This can happen if the event
17979f228124de7d98146ca526d743436f6419e2365Erik                        // was deleted.
18079f228124de7d98146ca526d743436f6419e2365Erik                        cursor.close();
181352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        mOnDone.setDoneCode(Utils.DONE_EXIT);
18216bfd177ebb7e14703cc4b198cc86c2778ed7fe6RoboErik                        mSaveOnDetach = false;
183352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        mOnDone.run();
18479f228124de7d98146ca526d743436f6419e2365Erik                        return;
18579f228124de7d98146ca526d743436f6419e2365Erik                    }
18679f228124de7d98146ca526d743436f6419e2365Erik                    mOriginalModel = new CalendarEventModel();
18779f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.setModelFromCursor(mOriginalModel, cursor);
18879f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.setModelFromCursor(mModel, cursor);
18979f228124de7d98146ca526d743436f6419e2365Erik                    cursor.close();
19079f228124de7d98146ca526d743436f6419e2365Erik
19159ead671b50514b49749fcd6a1d4186a270239d2Erik                    mOriginalModel.mUri = mUri.toString();
19279f228124de7d98146ca526d743436f6419e2365Erik
19359ead671b50514b49749fcd6a1d4186a270239d2Erik                    mModel.mUri = mUri.toString();
19479f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mOriginalStart = mBegin;
19579f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mOriginalEnd = mEnd;
19679f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mIsFirstEventInSeries = mBegin == mOriginalModel.mStart;
19779f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mStart = mBegin;
19879f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mEnd = mEnd;
199f56b14972130233fd7e7c64160084793a7a0a55bJames Kung                    if (mEventColorInitialized) {
200f56b14972130233fd7e7c64160084793a7a0a55bJames Kung                        mModel.setEventColor(mEventColor);
2011d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung                    }
20279f228124de7d98146ca526d743436f6419e2365Erik                    eventId = mModel.mId;
203352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
204352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // TOKEN_ATTENDEES
20579f228124de7d98146ca526d743436f6419e2365Erik                    if (mModel.mHasAttendeeData && eventId != -1) {
20679f228124de7d98146ca526d743436f6419e2365Erik                        Uri attUri = Attendees.CONTENT_URI;
20779f228124de7d98146ca526d743436f6419e2365Erik                        String[] whereArgs = {
20879f228124de7d98146ca526d743436f6419e2365Erik                            Long.toString(eventId)
20979f228124de7d98146ca526d743436f6419e2365Erik                        };
21079f228124de7d98146ca526d743436f6419e2365Erik                        mHandler.startQuery(TOKEN_ATTENDEES, null, attUri,
21179f228124de7d98146ca526d743436f6419e2365Erik                                EditEventHelper.ATTENDEES_PROJECTION,
212d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                EditEventHelper.ATTENDEES_WHERE /* selection */,
21379f228124de7d98146ca526d743436f6419e2365Erik                                whereArgs /* selection args */, null /* sort order */);
214352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    } else {
215352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        setModelIfDone(TOKEN_ATTENDEES);
216352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    }
217352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
218352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // TOKEN_REMINDERS
2191d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung                    if (mModel.mHasAlarm && mReminders == null) {
220d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                        Uri rUri = Reminders.CONTENT_URI;
221d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                        String[] remArgs = {
2229645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                Long.toString(eventId)
223d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                        };
2249645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        mHandler.startQuery(TOKEN_REMINDERS, null, rUri,
2259645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                EditEventHelper.REMINDERS_PROJECTION,
2269645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                EditEventHelper.REMINDERS_WHERE /* selection */,
2279645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                remArgs /* selection args */, null /* sort order */);
22879f228124de7d98146ca526d743436f6419e2365Erik                    } else {
229523cc4846b045c51d70ae59c9b66bc232eac807aSam Blitzstein                        if (mReminders == null) {
230523cc4846b045c51d70ae59c9b66bc232eac807aSam Blitzstein                            // mReminders should not be null.
231523cc4846b045c51d70ae59c9b66bc232eac807aSam Blitzstein                            mReminders = new ArrayList<ReminderEntry>();
232523cc4846b045c51d70ae59c9b66bc232eac807aSam Blitzstein                        } else {
233523cc4846b045c51d70ae59c9b66bc232eac807aSam Blitzstein                            Collections.sort(mReminders);
234523cc4846b045c51d70ae59c9b66bc232eac807aSam Blitzstein                        }
2351d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung                        mOriginalModel.mReminders = mReminders;
2361d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung                        mModel.mReminders =
2371d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung                                (ArrayList<ReminderEntry>) mReminders.clone();
238352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        setModelIfDone(TOKEN_REMINDERS);
23979f228124de7d98146ca526d743436f6419e2365Erik                    }
240352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
241352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // TOKEN_CALENDARS
242352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    String[] selArgs = {
243352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        Long.toString(mModel.mCalendarId)
244352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    };
245352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI,
246352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            EditEventHelper.CALENDARS_PROJECTION, EditEventHelper.CALENDARS_WHERE,
247352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            selArgs /* selection args */, null /* sort order */);
248352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
249b4f28b8e72f63e48102a6688ff5576e02c14069eIsaac Katzenelson                    // TOKEN_COLORS
250b4f28b8e72f63e48102a6688ff5576e02c14069eIsaac Katzenelson                    mHandler.startQuery(TOKEN_COLORS, null, Colors.CONTENT_URI,
251b4f28b8e72f63e48102a6688ff5576e02c14069eIsaac Katzenelson                            EditEventHelper.COLORS_PROJECTION,
252b4f28b8e72f63e48102a6688ff5576e02c14069eIsaac Katzenelson                            Colors.COLOR_TYPE + "=" + Colors.TYPE_EVENT, null, null);
253b4f28b8e72f63e48102a6688ff5576e02c14069eIsaac Katzenelson
254352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_EVENT);
25579f228124de7d98146ca526d743436f6419e2365Erik                    break;
25679f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_ATTENDEES:
25779f228124de7d98146ca526d743436f6419e2365Erik                    try {
25879f228124de7d98146ca526d743436f6419e2365Erik                        while (cursor.moveToNext()) {
25979f228124de7d98146ca526d743436f6419e2365Erik                            String name = cursor.getString(EditEventHelper.ATTENDEES_INDEX_NAME);
26079f228124de7d98146ca526d743436f6419e2365Erik                            String email = cursor.getString(EditEventHelper.ATTENDEES_INDEX_EMAIL);
261d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            int status = cursor.getInt(EditEventHelper.ATTENDEES_INDEX_STATUS);
26279f228124de7d98146ca526d743436f6419e2365Erik                            int relationship = cursor
26379f228124de7d98146ca526d743436f6419e2365Erik                                    .getInt(EditEventHelper.ATTENDEES_INDEX_RELATIONSHIP);
264352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            if (relationship == Attendees.RELATIONSHIP_ORGANIZER) {
265352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                if (email != null) {
26679f228124de7d98146ca526d743436f6419e2365Erik                                    mModel.mOrganizer = email;
267352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                    mModel.mIsOrganizer = mModel.mOwnerAccount
268352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                            .equalsIgnoreCase(email);
269a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mOrganizer = email;
270a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mIsOrganizer = mOriginalModel.mOwnerAccount
271a7694eead7cbb293990bc89c3906e17bad36194cErik                                            .equalsIgnoreCase(email);
272352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                }
273352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
274352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                if (TextUtils.isEmpty(name)) {
275352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                    mModel.mOrganizerDisplayName = mModel.mOrganizer;
276a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mOrganizerDisplayName =
277a7694eead7cbb293990bc89c3906e17bad36194cErik                                            mOriginalModel.mOrganizer;
278352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                } else {
279352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                    mModel.mOrganizerDisplayName = name;
280a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mOrganizerDisplayName = name;
28179f228124de7d98146ca526d743436f6419e2365Erik                                }
282352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            }
283352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
284352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            if (email != null) {
285d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                if (mModel.mOwnerAccount != null &&
286d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                        mModel.mOwnerAccount.equalsIgnoreCase(email)) {
287d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    int attendeeId =
288d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                        cursor.getInt(EditEventHelper.ATTENDEES_INDEX_ID);
289d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mModel.mOwnerAttendeeId = attendeeId;
290d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mModel.mSelfAttendeeStatus = status;
291d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mOriginalModel.mOwnerAttendeeId = attendeeId;
292d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mOriginalModel.mSelfAttendeeStatus = status;
293d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    continue;
294d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                }
29579f228124de7d98146ca526d743436f6419e2365Erik                            }
296d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            Attendee attendee = new Attendee(name, email);
297d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            attendee.mStatus = status;
298d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            mModel.addAttendee(attendee);
299d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            mOriginalModel.addAttendee(attendee);
30079f228124de7d98146ca526d743436f6419e2365Erik                        }
30179f228124de7d98146ca526d743436f6419e2365Erik                    } finally {
30279f228124de7d98146ca526d743436f6419e2365Erik                        cursor.close();
30379f228124de7d98146ca526d743436f6419e2365Erik                    }
304352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
305352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_ATTENDEES);
30679f228124de7d98146ca526d743436f6419e2365Erik                    break;
30779f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_REMINDERS:
30879f228124de7d98146ca526d743436f6419e2365Erik                    try {
309d290a01420234214d73d31b8bfa61652625bb149Erik                        // Add all reminders to the models
31079f228124de7d98146ca526d743436f6419e2365Erik                        while (cursor.moveToNext()) {
31179f228124de7d98146ca526d743436f6419e2365Erik                            int minutes = cursor.getInt(EditEventHelper.REMINDERS_INDEX_MINUTES);
312fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            int method = cursor.getInt(EditEventHelper.REMINDERS_INDEX_METHOD);
313fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            ReminderEntry re = ReminderEntry.valueOf(minutes, method);
314fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            mModel.mReminders.add(re);
315fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            mOriginalModel.mReminders.add(re);
31679f228124de7d98146ca526d743436f6419e2365Erik                        }
3179645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden
3189645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        // Sort appropriately for display
3199645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        Collections.sort(mModel.mReminders);
3209645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        Collections.sort(mOriginalModel.mReminders);
32179f228124de7d98146ca526d743436f6419e2365Erik                    } finally {
32279f228124de7d98146ca526d743436f6419e2365Erik                        cursor.close();
32379f228124de7d98146ca526d743436f6419e2365Erik                    }
324352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
325352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_REMINDERS);
32679f228124de7d98146ca526d743436f6419e2365Erik                    break;
32779f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_CALENDARS:
328352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    try {
32909fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung                        if (mModel.mId == -1) {
33009fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung                            // Populate Calendar spinner only if no event id is set.
331352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            MatrixCursor matrixCursor = Utils.matrixCursorFromCursor(cursor);
332352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            if (DEBUG) {
333352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                Log.d(TAG, "onQueryComplete: setting cursor with "
334352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                        + matrixCursor.getCount() + " calendars");
335352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            }
33609fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung                            mView.setCalendarsCursor(matrixCursor, isAdded() && isResumed(),
33709fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung                                    mCalendarId);
338352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        } else {
339352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            // Populate model for an existing event
340352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            EditEventHelper.setModelFromCalendarCursor(mModel, cursor);
341a7694eead7cbb293990bc89c3906e17bad36194cErik                            EditEventHelper.setModelFromCalendarCursor(mOriginalModel, cursor);
342352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        }
343352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    } finally {
344352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        cursor.close();
34579f228124de7d98146ca526d743436f6419e2365Erik                    }
346352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_CALENDARS);
34779f228124de7d98146ca526d743436f6419e2365Erik                    break;
3484afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                case TOKEN_COLORS:
3494afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    if (cursor.moveToFirst()) {
3504afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        EventColorCache cache = new EventColorCache();
3514afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        do
3524afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        {
3534afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            int colorKey = cursor.getInt(EditEventHelper.COLORS_INDEX_COLOR_KEY);
3544afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            int rawColor = cursor.getInt(EditEventHelper.COLORS_INDEX_COLOR);
3554afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            int displayColor = Utils.getDisplayColorFromColor(rawColor);
3564afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            String accountName = cursor
3574afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                                    .getString(EditEventHelper.COLORS_INDEX_ACCOUNT_NAME);
3584afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            String accountType = cursor
3594afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                                    .getString(EditEventHelper.COLORS_INDEX_ACCOUNT_TYPE);
3604afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            cache.insertColor(accountName, accountType,
3614afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                                    displayColor, colorKey);
3624afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        } while (cursor.moveToNext());
363e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung                        cache.sortPalettes(new HsvColorComparator());
3644afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
3654afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        mModel.mEventColorCache = cache;
3664afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        mView.mColorPickerNewEvent.setOnClickListener(mOnColorPickerClicked);
3674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        mView.mColorPickerExistingEvent.setOnClickListener(mOnColorPickerClicked);
3684afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    }
3694afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    if (cursor != null) {
3704afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        cursor.close();
3714afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    }
37296a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung
37396a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung                    // If the account name/type is null, the calendar event colors cannot be
37496a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung                    // determined, so take the default/savedInstanceState value.
37596a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung                    if (mModel.mCalendarAccountName == null
37696a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung                           || mModel.mCalendarAccountType == null) {
37796a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung                        mView.setColorPickerButtonStates(mShowColorPalette);
37896a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung                    } else {
37996a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung                        mView.setColorPickerButtonStates(mModel.getCalendarEventColors());
38096a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung                    }
38196a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung
3824afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    setModelIfDone(TOKEN_COLORS);
3834afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    break;
384fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson                default:
385fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson                    cursor.close();
386fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson                    break;
38779f228124de7d98146ca526d743436f6419e2365Erik            }
38879f228124de7d98146ca526d743436f6419e2365Erik        }
38979f228124de7d98146ca526d743436f6419e2365Erik    }
39079f228124de7d98146ca526d743436f6419e2365Erik
3914afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private View.OnClickListener mOnColorPickerClicked = new View.OnClickListener() {
3924afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
3934afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        @Override
3944afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        public void onClick(View v) {
3954afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            int[] colors = mModel.getCalendarEventColors();
3962fca024254c9de09f8d87933cc8c9a2046e37c52James Kung            if (mColorPickerDialog == null) {
3972fca024254c9de09f8d87933cc8c9a2046e37c52James Kung                mColorPickerDialog = EventColorPickerDialog.newInstance(colors,
3982fca024254c9de09f8d87933cc8c9a2046e37c52James Kung                        mModel.getEventColor(), mModel.getCalendarColor(), mView.mIsMultipane);
3992fca024254c9de09f8d87933cc8c9a2046e37c52James Kung                mColorPickerDialog.setOnColorSelectedListener(EditEventFragment.this);
4004afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            } else {
4012fca024254c9de09f8d87933cc8c9a2046e37c52James Kung                mColorPickerDialog.setCalendarColor(mModel.getCalendarColor());
4022fca024254c9de09f8d87933cc8c9a2046e37c52James Kung                mColorPickerDialog.setColors(colors, mModel.getEventColor());
4034afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            }
40495e9538c2e504ea5528b07e3abdf54bb3d91c88aJames Kung            final FragmentManager fragmentManager = getFragmentManager();
40595e9538c2e504ea5528b07e3abdf54bb3d91c88aJames Kung            fragmentManager.executePendingTransactions();
4062fca024254c9de09f8d87933cc8c9a2046e37c52James Kung            if (!mColorPickerDialog.isAdded()) {
4072fca024254c9de09f8d87933cc8c9a2046e37c52James Kung                mColorPickerDialog.show(fragmentManager, COLOR_PICKER_DIALOG_TAG);
4084afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            }
4094afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
4104afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    };
4114afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
412bdcb9fcc732d52708fafb068f535a2c93ff2356fDaisuke Miyakawa    private void setModelIfDone(int queryType) {
413352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        synchronized (this) {
414352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mOutstandingQueries &= ~queryType;
415352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            if (mOutstandingQueries == 0) {
41659ead671b50514b49749fcd6a1d4186a270239d2Erik                if (mRestoreModel != null) {
41759ead671b50514b49749fcd6a1d4186a270239d2Erik                    mModel = mRestoreModel;
41859ead671b50514b49749fcd6a1d4186a270239d2Erik                }
4191bd94537b630fbc5556307ea92f37d4a5facecb4Erik                if (mShowModifyDialogOnLaunch && mModification == Utils.MODIFY_UNINITIALIZED) {
4201bd94537b630fbc5556307ea92f37d4a5facecb4Erik                    if (!TextUtils.isEmpty(mModel.mRrule)) {
4211bd94537b630fbc5556307ea92f37d4a5facecb4Erik                        displayEditWhichDialog();
4221bd94537b630fbc5556307ea92f37d4a5facecb4Erik                    } else {
4231bd94537b630fbc5556307ea92f37d4a5facecb4Erik                        mModification = Utils.MODIFY_ALL;
4241bd94537b630fbc5556307ea92f37d4a5facecb4Erik                    }
4251bd94537b630fbc5556307ea92f37d4a5facecb4Erik
4261bd94537b630fbc5556307ea92f37d4a5facecb4Erik                }
427352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                mView.setModel(mModel);
4283400a2bfc1e6be435ea2bb0f436a6ef338446504Erik                mView.setModification(mModification);
429c07a57fb7436d807ad505fa7319b9de13f91e741Erik            }
4305f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
4315f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
4325f62079ab9daefe95ede87631766e99e8b4a2220Erik
433dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public EditEventFragment() {
434f56b14972130233fd7e7c64160084793a7a0a55bJames Kung        this(null, null, false, -1, false, null);
435a7694eead7cbb293990bc89c3906e17bad36194cErik    }
436a7694eead7cbb293990bc89c3906e17bad36194cErik
437f56b14972130233fd7e7c64160084793a7a0a55bJames Kung    public EditEventFragment(EventInfo event, ArrayList<ReminderEntry> reminders,
438f56b14972130233fd7e7c64160084793a7a0a55bJames Kung            boolean eventColorInitialized, int eventColor, boolean readOnly, Intent intent) {
439dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mEvent = event;
440a7694eead7cbb293990bc89c3906e17bad36194cErik        mIsReadOnly = readOnly;
441c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan        mIntent = intent;
4421d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung
4431d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung        mReminders = reminders;
444f56b14972130233fd7e7c64160084793a7a0a55bJames Kung        mEventColorInitialized = eventColorInitialized;
445f56b14972130233fd7e7c64160084793a7a0a55bJames Kung        if (eventColorInitialized) {
446f56b14972130233fd7e7c64160084793a7a0a55bJames Kung            mEventColor = eventColor;
447f56b14972130233fd7e7c64160084793a7a0a55bJames Kung        }
4485f62079ab9daefe95ede87631766e99e8b4a2220Erik        setHasOptionsMenu(true);
44979f228124de7d98146ca526d743436f6419e2365Erik    }
45079f228124de7d98146ca526d743436f6419e2365Erik
4512fca024254c9de09f8d87933cc8c9a2046e37c52James Kung    @Override
4522fca024254c9de09f8d87933cc8c9a2046e37c52James Kung    public void onActivityCreated(Bundle savedInstanceState) {
4532fca024254c9de09f8d87933cc8c9a2046e37c52James Kung        super.onActivityCreated(savedInstanceState);
4542fca024254c9de09f8d87933cc8c9a2046e37c52James Kung        mColorPickerDialog = (EventColorPickerDialog) getActivity().getFragmentManager()
4552fca024254c9de09f8d87933cc8c9a2046e37c52James Kung                .findFragmentByTag(COLOR_PICKER_DIALOG_TAG);
4562fca024254c9de09f8d87933cc8c9a2046e37c52James Kung        if (mColorPickerDialog != null) {
4572fca024254c9de09f8d87933cc8c9a2046e37c52James Kung            mColorPickerDialog.setOnColorSelectedListener(this);
4582fca024254c9de09f8d87933cc8c9a2046e37c52James Kung        }
4592fca024254c9de09f8d87933cc8c9a2046e37c52James Kung    }
4602fca024254c9de09f8d87933cc8c9a2046e37c52James Kung
46179f228124de7d98146ca526d743436f6419e2365Erik    private void startQuery() {
462dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mUri = null;
463dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mBegin = -1;
464dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mEnd = -1;
465dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        if (mEvent != null) {
466dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            if (mEvent.id != -1) {
467352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                mModel.mId = mEvent.id;
468dd95df57c8c5a58a85c4c0effad5652dec14f621Erik                mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEvent.id);
469edecd9a97e02ff14bd5abeec3414e1bf3cc631dfMichael Chan            } else {
470edecd9a97e02ff14bd5abeec3414e1bf3cc631dfMichael Chan                // New event. All day?
471edecd9a97e02ff14bd5abeec3414e1bf3cc631dfMichael Chan                mModel.mAllDay = mEvent.extraLong == CalendarController.EXTRA_CREATE_ALL_DAY;
472dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            }
473dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            if (mEvent.startTime != null) {
474dd95df57c8c5a58a85c4c0effad5652dec14f621Erik                mBegin = mEvent.startTime.toMillis(true);
475dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            }
476dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            if (mEvent.endTime != null) {
477dd95df57c8c5a58a85c4c0effad5652dec14f621Erik                mEnd = mEvent.endTime.toMillis(true);
478dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            }
47909fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung            if (mEvent.calendarId != -1) {
48009fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung                mCalendarId = mEvent.calendarId;
48109fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung            }
482c130d9d5e0d178585721428e394df0c8e0a6729fErik        } else if (mEventBundle != null) {
4833400a2bfc1e6be435ea2bb0f436a6ef338446504Erik            if (mEventBundle.id != -1) {
4843400a2bfc1e6be435ea2bb0f436a6ef338446504Erik                mModel.mId = mEventBundle.id;
4853400a2bfc1e6be435ea2bb0f436a6ef338446504Erik                mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventBundle.id);
4863400a2bfc1e6be435ea2bb0f436a6ef338446504Erik            }
487c130d9d5e0d178585721428e394df0c8e0a6729fErik            mBegin = mEventBundle.start;
488c130d9d5e0d178585721428e394df0c8e0a6729fErik            mEnd = mEventBundle.end;
489dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        }
490e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
4911d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung        if (mReminders != null) {
4921d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung            mModel.mReminders = mReminders;
4931d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung        }
4941d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung
495f56b14972130233fd7e7c64160084793a7a0a55bJames Kung        if (mEventColorInitialized) {
496f56b14972130233fd7e7c64160084793a7a0a55bJames Kung            mModel.setEventColor(mEventColor);
4971d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung        }
4981d1b1e4f79501c8b31a8a34c263ab3e67091a669James Kung
499e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        if (mBegin <= 0) {
500e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            // use a default value instead
501e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            mBegin = mHelper.constructDefaultStartTime(System.currentTimeMillis());
502e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        }
503e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        if (mEnd < mBegin) {
504e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            // use a default value instead
505e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            mEnd = mHelper.constructDefaultEndTime(mBegin);
506e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        }
50779f228124de7d98146ca526d743436f6419e2365Erik
50879f228124de7d98146ca526d743436f6419e2365Erik        // Kick off the query for the event
50979f228124de7d98146ca526d743436f6419e2365Erik        boolean newEvent = mUri == null;
51079f228124de7d98146ca526d743436f6419e2365Erik        if (!newEvent) {
511ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik            mModel.mCalendarAccessLevel = Calendars.CAL_ACCESS_NONE;
512352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mOutstandingQueries = TOKEN_ALL;
51379f228124de7d98146ca526d743436f6419e2365Erik            if (DEBUG) {
514352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                Log.d(TAG, "startQuery: uri for event is " + mUri.toString());
51579f228124de7d98146ca526d743436f6419e2365Erik            }
51679f228124de7d98146ca526d743436f6419e2365Erik            mHandler.startQuery(TOKEN_EVENT, null, mUri, EditEventHelper.EVENT_PROJECTION,
51779f228124de7d98146ca526d743436f6419e2365Erik                    null /* selection */, null /* selection args */, null /* sort order */);
51879f228124de7d98146ca526d743436f6419e2365Erik        } else {
519236429f2feef94aa34520f4ded34777061c36851James Kung            mOutstandingQueries = TOKEN_CALENDARS | TOKEN_COLORS;
52079f228124de7d98146ca526d743436f6419e2365Erik            if (DEBUG) {
521352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                Log.d(TAG, "startQuery: Editing a new event.");
52279f228124de7d98146ca526d743436f6419e2365Erik            }
523f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan            mModel.mOriginalStart = mBegin;
524f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan            mModel.mOriginalEnd = mEnd;
52579f228124de7d98146ca526d743436f6419e2365Erik            mModel.mStart = mBegin;
52679f228124de7d98146ca526d743436f6419e2365Erik            mModel.mEnd = mEnd;
52709fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung            mModel.mCalendarId = mCalendarId;
528d845fbe558d5229102b58cce70a1b29fe6cb6967Erik            mModel.mSelfAttendeeStatus = Attendees.ATTENDEE_STATUS_ACCEPTED;
52979f228124de7d98146ca526d743436f6419e2365Erik
530b4f28b8e72f63e48102a6688ff5576e02c14069eIsaac Katzenelson            // Start a query in the background to read the list of calendars and colors
53179f228124de7d98146ca526d743436f6419e2365Erik            mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI,
53279f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.CALENDARS_PROJECTION,
53379f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.CALENDARS_WHERE_WRITEABLE_VISIBLE, null /* selection args */,
53479f228124de7d98146ca526d743436f6419e2365Erik                    null /* sort order */);
535c07a57fb7436d807ad505fa7319b9de13f91e741Erik
536b4f28b8e72f63e48102a6688ff5576e02c14069eIsaac Katzenelson            mHandler.startQuery(TOKEN_COLORS, null, Colors.CONTENT_URI,
537b4f28b8e72f63e48102a6688ff5576e02c14069eIsaac Katzenelson                    EditEventHelper.COLORS_PROJECTION,
538b4f28b8e72f63e48102a6688ff5576e02c14069eIsaac Katzenelson                    Colors.COLOR_TYPE + "=" + Colors.TYPE_EVENT, null, null);
539b4f28b8e72f63e48102a6688ff5576e02c14069eIsaac Katzenelson
540c07a57fb7436d807ad505fa7319b9de13f91e741Erik            mModification = Utils.MODIFY_ALL;
541c07a57fb7436d807ad505fa7319b9de13f91e741Erik            mView.setModification(mModification);
54279f228124de7d98146ca526d743436f6419e2365Erik        }
54379f228124de7d98146ca526d743436f6419e2365Erik    }
54479f228124de7d98146ca526d743436f6419e2365Erik
54579f228124de7d98146ca526d743436f6419e2365Erik    @Override
54679f228124de7d98146ca526d743436f6419e2365Erik    public void onAttach(Activity activity) {
54779f228124de7d98146ca526d743436f6419e2365Erik        super.onAttach(activity);
54896cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert        mActivity = activity;
54979f228124de7d98146ca526d743436f6419e2365Erik
550dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mHelper = new EditEventHelper(activity, null);
55179f228124de7d98146ca526d743436f6419e2365Erik        mHandler = new QueryHandler(activity.getContentResolver());
552c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan        mModel = new CalendarEventModel(activity, mIntent);
5535c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa        mInputMethodManager = (InputMethodManager)
5545c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa                activity.getSystemService(Context.INPUT_METHOD_SERVICE);
555135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
55696cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert        mUseCustomActionBar = !Utils.getConfigBool(mActivity, R.bool.multiple_pane_config);
55779f228124de7d98146ca526d743436f6419e2365Erik    }
55879f228124de7d98146ca526d743436f6419e2365Erik
55979f228124de7d98146ca526d743436f6419e2365Erik    @Override
56079f228124de7d98146ca526d743436f6419e2365Erik    public View onCreateView(LayoutInflater inflater, ViewGroup container,
56179f228124de7d98146ca526d743436f6419e2365Erik            Bundle savedInstanceState) {
56279f228124de7d98146ca526d743436f6419e2365Erik//        mContext.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
563a7694eead7cbb293990bc89c3906e17bad36194cErik        View view;
564a7694eead7cbb293990bc89c3906e17bad36194cErik        if (mIsReadOnly) {
565a7694eead7cbb293990bc89c3906e17bad36194cErik            view = inflater.inflate(R.layout.edit_event_single_column, null);
566a7694eead7cbb293990bc89c3906e17bad36194cErik        } else {
567a7694eead7cbb293990bc89c3906e17bad36194cErik            view = inflater.inflate(R.layout.edit_event, null);
568a7694eead7cbb293990bc89c3906e17bad36194cErik        }
56996cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert        mView = new EditEventView(mActivity, view, mOnDone, mTimeSelectedWasStartTime,
57056f42bfb36d710726051e8268a115697477add61James Kung                mDateSelectedWasStartDate);
57179f228124de7d98146ca526d743436f6419e2365Erik        startQuery();
572135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
573135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        if (mUseCustomActionBar) {
574135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            View actionBarButtons = inflater.inflate(R.layout.edit_event_custom_actionbar,
57596cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert                    new LinearLayout(mActivity), false);
576135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            View cancelActionView = actionBarButtons.findViewById(R.id.action_cancel);
577135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            cancelActionView.setOnClickListener(mActionBarListener);
578135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            View doneActionView = actionBarButtons.findViewById(R.id.action_done);
579135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            doneActionView.setOnClickListener(mActionBarListener);
580135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
58196cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert            mActivity.getActionBar().setCustomView(actionBarButtons);
582135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        }
583135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
58479f228124de7d98146ca526d743436f6419e2365Erik        return view;
58579f228124de7d98146ca526d743436f6419e2365Erik    }
58679f228124de7d98146ca526d743436f6419e2365Erik
58779f228124de7d98146ca526d743436f6419e2365Erik    @Override
588135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    public void onDestroyView() {
589135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        super.onDestroyView();
590135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
591135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        if (mUseCustomActionBar) {
59296cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert            mActivity.getActionBar().setCustomView(null);
593135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        }
594135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    }
595135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
596135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    @Override
59779f228124de7d98146ca526d743436f6419e2365Erik    public void onCreate(Bundle savedInstanceState) {
59879f228124de7d98146ca526d743436f6419e2365Erik        super.onCreate(savedInstanceState);
59959ead671b50514b49749fcd6a1d4186a270239d2Erik        if (savedInstanceState != null) {
60059ead671b50514b49749fcd6a1d4186a270239d2Erik            if (savedInstanceState.containsKey(BUNDLE_KEY_MODEL)) {
60159ead671b50514b49749fcd6a1d4186a270239d2Erik                mRestoreModel = (CalendarEventModel) savedInstanceState.getSerializable(
60259ead671b50514b49749fcd6a1d4186a270239d2Erik                        BUNDLE_KEY_MODEL);
60359ead671b50514b49749fcd6a1d4186a270239d2Erik            }
60459ead671b50514b49749fcd6a1d4186a270239d2Erik            if (savedInstanceState.containsKey(BUNDLE_KEY_EDIT_STATE)) {
60559ead671b50514b49749fcd6a1d4186a270239d2Erik                mModification = savedInstanceState.getInt(BUNDLE_KEY_EDIT_STATE);
60659ead671b50514b49749fcd6a1d4186a270239d2Erik            }
6072d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira            if (savedInstanceState.containsKey(BUNDLE_KEY_EDIT_ON_LAUNCH)) {
6082d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira                mShowModifyDialogOnLaunch = savedInstanceState
6092d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira                        .getBoolean(BUNDLE_KEY_EDIT_ON_LAUNCH);
6102d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira            }
611c130d9d5e0d178585721428e394df0c8e0a6729fErik            if (savedInstanceState.containsKey(BUNDLE_KEY_EVENT)) {
612c130d9d5e0d178585721428e394df0c8e0a6729fErik                mEventBundle = (EventBundle) savedInstanceState.getSerializable(BUNDLE_KEY_EVENT);
613c130d9d5e0d178585721428e394df0c8e0a6729fErik            }
614a7694eead7cbb293990bc89c3906e17bad36194cErik            if (savedInstanceState.containsKey(BUNDLE_KEY_READ_ONLY)) {
615a7694eead7cbb293990bc89c3906e17bad36194cErik                mIsReadOnly = savedInstanceState.getBoolean(BUNDLE_KEY_READ_ONLY);
616a7694eead7cbb293990bc89c3906e17bad36194cErik            }
6177674b690b018c31207830c2a196927a0c654486cSam Blitzstein            if (savedInstanceState.containsKey("EditEventView_timebuttonclicked")) {
6187674b690b018c31207830c2a196927a0c654486cSam Blitzstein                mTimeSelectedWasStartTime = savedInstanceState.getBoolean(
6197674b690b018c31207830c2a196927a0c654486cSam Blitzstein                        "EditEventView_timebuttonclicked");
6207674b690b018c31207830c2a196927a0c654486cSam Blitzstein            }
62156f42bfb36d710726051e8268a115697477add61James Kung            if (savedInstanceState.containsKey(BUNDLE_KEY_DATE_BUTTON_CLICKED)) {
62256f42bfb36d710726051e8268a115697477add61James Kung                mDateSelectedWasStartDate = savedInstanceState.getBoolean(
62356f42bfb36d710726051e8268a115697477add61James Kung                        BUNDLE_KEY_DATE_BUTTON_CLICKED);
62456f42bfb36d710726051e8268a115697477add61James Kung            }
62596a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung            if (savedInstanceState.containsKey(BUNDLE_KEY_SHOW_COLOR_PALETTE)) {
62696a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung                mShowColorPalette = savedInstanceState.getBoolean(BUNDLE_KEY_SHOW_COLOR_PALETTE);
62796a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung            }
6287674b690b018c31207830c2a196927a0c654486cSam Blitzstein
62959ead671b50514b49749fcd6a1d4186a270239d2Erik        }
63079f228124de7d98146ca526d743436f6419e2365Erik    }
6315f62079ab9daefe95ede87631766e99e8b4a2220Erik
6325f62079ab9daefe95ede87631766e99e8b4a2220Erik
6335f62079ab9daefe95ede87631766e99e8b4a2220Erik    @Override
6345f62079ab9daefe95ede87631766e99e8b4a2220Erik    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
6355f62079ab9daefe95ede87631766e99e8b4a2220Erik        super.onCreateOptionsMenu(menu, inflater);
636135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
637135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        if (!mUseCustomActionBar) {
638135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            inflater.inflate(R.menu.edit_event_title_bar, menu);
6395f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
6405f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
6415f62079ab9daefe95ede87631766e99e8b4a2220Erik
6425f62079ab9daefe95ede87631766e99e8b4a2220Erik    @Override
6435f62079ab9daefe95ede87631766e99e8b4a2220Erik    public boolean onOptionsItemSelected(MenuItem item) {
644135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        return onActionBarItemSelected(item.getItemId());
645135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    }
646135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
647135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    /**
648135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     * Handles menu item selections, whether they come from our custom action bar buttons or from
649135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     * the standard menu items. Depends on the menu item ids matching the custom action bar button
650135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     * ids.
651135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     *
652135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     * @param itemId the button or menu item id
653135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     * @return whether the event was handled here
654135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     */
655135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    private boolean onActionBarItemSelected(int itemId) {
656bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        if (itemId == R.id.action_done) {
657bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            if (EditEventHelper.canModifyEvent(mModel) || EditEventHelper.canRespond(mModel)) {
658bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                if (mView != null && mView.prepareForSave()) {
659bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                    if (mModification == Utils.MODIFY_UNINITIALIZED) {
660bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                        mModification = Utils.MODIFY_ALL;
6615f62079ab9daefe95ede87631766e99e8b4a2220Erik                    }
662bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                    mOnDone.setDoneCode(Utils.DONE_SAVE | Utils.DONE_EXIT);
6635f62079ab9daefe95ede87631766e99e8b4a2220Erik                    mOnDone.run();
6645f62079ab9daefe95ede87631766e99e8b4a2220Erik                } else {
6655f62079ab9daefe95ede87631766e99e8b4a2220Erik                    mOnDone.setDoneCode(Utils.DONE_REVERT);
6665f62079ab9daefe95ede87631766e99e8b4a2220Erik                    mOnDone.run();
6675f62079ab9daefe95ede87631766e99e8b4a2220Erik                }
668bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            } else if (EditEventHelper.canAddReminders(mModel) && mModel.mId != -1
669bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                    && mOriginalModel != null && mView.prepareForSave()) {
670bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                saveReminders();
671bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                mOnDone.setDoneCode(Utils.DONE_EXIT);
672bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                mOnDone.run();
673bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            } else {
6745f62079ab9daefe95ede87631766e99e8b4a2220Erik                mOnDone.setDoneCode(Utils.DONE_REVERT);
6755f62079ab9daefe95ede87631766e99e8b4a2220Erik                mOnDone.run();
676bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            }
677bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        } else if (itemId == R.id.action_cancel) {
678bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            mOnDone.setDoneCode(Utils.DONE_REVERT);
679bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            mOnDone.run();
6805f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
6815f62079ab9daefe95ede87631766e99e8b4a2220Erik        return true;
6825f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
6835f62079ab9daefe95ede87631766e99e8b4a2220Erik
6845f62079ab9daefe95ede87631766e99e8b4a2220Erik    private void saveReminders() {
6855f62079ab9daefe95ede87631766e99e8b4a2220Erik        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3);
686fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        boolean changed = EditEventHelper.saveReminders(ops, mModel.mId, mModel.mReminders,
687fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mOriginalModel.mReminders, false /* no force save */);
6885f62079ab9daefe95ede87631766e99e8b4a2220Erik
6895f62079ab9daefe95ede87631766e99e8b4a2220Erik        if (!changed) {
6905f62079ab9daefe95ede87631766e99e8b4a2220Erik            return;
6915f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
6925f62079ab9daefe95ede87631766e99e8b4a2220Erik
6935f62079ab9daefe95ede87631766e99e8b4a2220Erik        AsyncQueryService service = new AsyncQueryService(getActivity());
6945f62079ab9daefe95ede87631766e99e8b4a2220Erik        service.startBatch(0, null, Calendars.CONTENT_URI.getAuthority(), ops, 0);
6955f62079ab9daefe95ede87631766e99e8b4a2220Erik        // Update the "hasAlarm" field for the event
6965f62079ab9daefe95ede87631766e99e8b4a2220Erik        Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mModel.mId);
697fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        int len = mModel.mReminders.size();
6985f62079ab9daefe95ede87631766e99e8b4a2220Erik        boolean hasAlarm = len > 0;
6995f62079ab9daefe95ede87631766e99e8b4a2220Erik        if (hasAlarm != mOriginalModel.mHasAlarm) {
7005f62079ab9daefe95ede87631766e99e8b4a2220Erik            ContentValues values = new ContentValues();
7015f62079ab9daefe95ede87631766e99e8b4a2220Erik            values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0);
7025f62079ab9daefe95ede87631766e99e8b4a2220Erik            service.startUpdate(0, null, uri, values, null, null, 0);
7035f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
7045f62079ab9daefe95ede87631766e99e8b4a2220Erik
70596cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert        Toast.makeText(mActivity, R.string.saving_event, Toast.LENGTH_SHORT).show();
7065f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
7075f62079ab9daefe95ede87631766e99e8b4a2220Erik
70846cde5cff48d6862f492f60c6a6336bfc047ce25Erik    protected void displayEditWhichDialog() {
7092d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira        if (mModification == Utils.MODIFY_UNINITIALIZED) {
710e0dbac67413c2ca910f357ddf51a6d43162d7843RoboErik            final boolean notSynced = TextUtils.isEmpty(mModel.mSyncId);
71179f228124de7d98146ca526d743436f6419e2365Erik            boolean isFirstEventInSeries = mModel.mIsFirstEventInSeries;
71279f228124de7d98146ca526d743436f6419e2365Erik            int itemIndex = 0;
71379f228124de7d98146ca526d743436f6419e2365Erik            CharSequence[] items;
7141ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan
7151ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan            if (notSynced) {
7161ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan                // If this event has not been synced, then don't allow deleting
7171ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan                // or changing a single instance.
71879f228124de7d98146ca526d743436f6419e2365Erik                if (isFirstEventInSeries) {
71979f228124de7d98146ca526d743436f6419e2365Erik                    // Still display the option so the user knows all events are
72079f228124de7d98146ca526d743436f6419e2365Erik                    // changing
72179f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[1];
72279f228124de7d98146ca526d743436f6419e2365Erik                } else {
72379f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[2];
72479f228124de7d98146ca526d743436f6419e2365Erik                }
72579f228124de7d98146ca526d743436f6419e2365Erik            } else {
72679f228124de7d98146ca526d743436f6419e2365Erik                if (isFirstEventInSeries) {
72779f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[2];
72879f228124de7d98146ca526d743436f6419e2365Erik                } else {
72979f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[3];
73079f228124de7d98146ca526d743436f6419e2365Erik                }
73196cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert                items[itemIndex++] = mActivity.getText(R.string.modify_event);
73279f228124de7d98146ca526d743436f6419e2365Erik            }
73396cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert            items[itemIndex++] = mActivity.getText(R.string.modify_all);
73479f228124de7d98146ca526d743436f6419e2365Erik
73579f228124de7d98146ca526d743436f6419e2365Erik            // Do one more check to make sure this remains at the end of the list
73679f228124de7d98146ca526d743436f6419e2365Erik            if (!isFirstEventInSeries) {
73796cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert                items[itemIndex++] = mActivity.getText(R.string.modify_all_following);
73879f228124de7d98146ca526d743436f6419e2365Erik            }
73979f228124de7d98146ca526d743436f6419e2365Erik
74079f228124de7d98146ca526d743436f6419e2365Erik            // Display the modification dialog.
74179f228124de7d98146ca526d743436f6419e2365Erik            if (mModifyDialog != null) {
74279f228124de7d98146ca526d743436f6419e2365Erik                mModifyDialog.dismiss();
74379f228124de7d98146ca526d743436f6419e2365Erik                mModifyDialog = null;
74479f228124de7d98146ca526d743436f6419e2365Erik            }
74596cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert            mModifyDialog = new AlertDialog.Builder(mActivity).setTitle(R.string.edit_event_label)
74628dab653f55caccbed32f700274f5274abaee089RoboErik                    .setItems(items, new OnClickListener() {
747f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan                        @Override
74828dab653f55caccbed32f700274f5274abaee089RoboErik                        public void onClick(DialogInterface dialog, int which) {
74928dab653f55caccbed32f700274f5274abaee089RoboErik                            if (which == 0) {
75028dab653f55caccbed32f700274f5274abaee089RoboErik                                // Update this if we start allowing exceptions
75128dab653f55caccbed32f700274f5274abaee089RoboErik                                // to unsynced events in the app
75228dab653f55caccbed32f700274f5274abaee089RoboErik                                mModification = notSynced ? Utils.MODIFY_ALL
75328dab653f55caccbed32f700274f5274abaee089RoboErik                                        : Utils.MODIFY_SELECTED;
75428dab653f55caccbed32f700274f5274abaee089RoboErik                                if (mModification == Utils.MODIFY_SELECTED) {
75528dab653f55caccbed32f700274f5274abaee089RoboErik                                    mModel.mOriginalSyncId = notSynced ? null : mModel.mSyncId;
75628dab653f55caccbed32f700274f5274abaee089RoboErik                                    mModel.mOriginalId = mModel.mId;
75728dab653f55caccbed32f700274f5274abaee089RoboErik                                }
75828dab653f55caccbed32f700274f5274abaee089RoboErik                            } else if (which == 1) {
75928dab653f55caccbed32f700274f5274abaee089RoboErik                                mModification = notSynced ? Utils.MODIFY_ALL_FOLLOWING
76028dab653f55caccbed32f700274f5274abaee089RoboErik                                        : Utils.MODIFY_ALL;
76128dab653f55caccbed32f700274f5274abaee089RoboErik                            } else if (which == 2) {
76228dab653f55caccbed32f700274f5274abaee089RoboErik                                mModification = Utils.MODIFY_ALL_FOLLOWING;
76328dab653f55caccbed32f700274f5274abaee089RoboErik                            }
76479f228124de7d98146ca526d743436f6419e2365Erik
76528dab653f55caccbed32f700274f5274abaee089RoboErik                            mView.setModification(mModification);
76628dab653f55caccbed32f700274f5274abaee089RoboErik                        }
76728dab653f55caccbed32f700274f5274abaee089RoboErik                    }).show();
768d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan
769d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan            mModifyDialog.setOnCancelListener(new OnCancelListener() {
770d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                @Override
771d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                public void onCancel(DialogInterface dialog) {
772d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                    Activity a = EditEventFragment.this.getActivity();
773d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                    if (a != null) {
774d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                        a.finish();
775d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                    }
776d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                }
777d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan            });
77879f228124de7d98146ca526d743436f6419e2365Erik        }
77979f228124de7d98146ca526d743436f6419e2365Erik    }
78079f228124de7d98146ca526d743436f6419e2365Erik
78179f228124de7d98146ca526d743436f6419e2365Erik    class Done implements EditEventHelper.EditDoneRunnable {
78279f228124de7d98146ca526d743436f6419e2365Erik        private int mCode = -1;
78379f228124de7d98146ca526d743436f6419e2365Erik
784f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan        @Override
78579f228124de7d98146ca526d743436f6419e2365Erik        public void setDoneCode(int code) {
78679f228124de7d98146ca526d743436f6419e2365Erik            mCode = code;
78779f228124de7d98146ca526d743436f6419e2365Erik        }
78879f228124de7d98146ca526d743436f6419e2365Erik
789f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan        @Override
79079f228124de7d98146ca526d743436f6419e2365Erik        public void run() {
791dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            // We only want this to get called once, either because the user
792dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            // pressed back/home or one of the buttons on screen
793dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            mSaveOnDetach = false;
794aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik            if (mModification == Utils.MODIFY_UNINITIALIZED) {
795aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik                // If this is uninitialized the user hit back, the only
796aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik                // changeable item is response to default to all events.
797aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik                mModification = Utils.MODIFY_ALL;
798aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik            }
7997b92da258a480284dcc15a518ea570072329a31dErik
800a7694eead7cbb293990bc89c3906e17bad36194cErik            if ((mCode & Utils.DONE_SAVE) != 0 && mModel != null
801a7694eead7cbb293990bc89c3906e17bad36194cErik                    && (EditEventHelper.canRespond(mModel)
802a7694eead7cbb293990bc89c3906e17bad36194cErik                            || EditEventHelper.canModifyEvent(mModel))
8036a7003d1b9bf20f4c6e001d054b1ab556ddec4a4RoboErik                    && mView.prepareForSave()
804d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan                    && !isEmptyNewEvent()
805ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden                    && mModel.normalizeReminders()
806304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan                    && mHelper.saveEvent(mModel, mOriginalModel, mModification)) {
807304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan                int stringResource;
808ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                if (!mModel.mAttendeesList.isEmpty()) {
809ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    if (mModel.mUri != null) {
810ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.saving_event_with_guest;
811ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    } else {
812ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.creating_event_with_guest;
813ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    }
814304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan                } else {
815ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    if (mModel.mUri != null) {
816ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.saving_event;
817ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    } else {
818ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.creating_event;
819ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    }
8207b92da258a480284dcc15a518ea570072329a31dErik                }
82196cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert                Toast.makeText(mActivity, stringResource, Toast.LENGTH_SHORT).show();
8222bd5cc06a7a89a848688416456f1b8f915542d57RoboErik            } else if ((mCode & Utils.DONE_SAVE) != 0 && mModel != null && isEmptyNewEvent()) {
82396cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert                Toast.makeText(mActivity, R.string.empty_event, Toast.LENGTH_SHORT).show();
8247b92da258a480284dcc15a518ea570072329a31dErik            }
8257b92da258a480284dcc15a518ea570072329a31dErik
8262fda24534978f55711526dbde747aa50d68dec40RoboErik            if ((mCode & Utils.DONE_DELETE) != 0 && mOriginalModel != null
8272fda24534978f55711526dbde747aa50d68dec40RoboErik                    && EditEventHelper.canModifyCalendar(mOriginalModel)) {
8287b92da258a480284dcc15a518ea570072329a31dErik                long begin = mModel.mStart;
8297b92da258a480284dcc15a518ea570072329a31dErik                long end = mModel.mEnd;
8307b92da258a480284dcc15a518ea570072329a31dErik                int which = -1;
8317b92da258a480284dcc15a518ea570072329a31dErik                switch (mModification) {
8327b92da258a480284dcc15a518ea570072329a31dErik                    case Utils.MODIFY_SELECTED:
8337b92da258a480284dcc15a518ea570072329a31dErik                        which = DeleteEventHelper.DELETE_SELECTED;
8347b92da258a480284dcc15a518ea570072329a31dErik                        break;
8357b92da258a480284dcc15a518ea570072329a31dErik                    case Utils.MODIFY_ALL_FOLLOWING:
8367b92da258a480284dcc15a518ea570072329a31dErik                        which = DeleteEventHelper.DELETE_ALL_FOLLOWING;
8377b92da258a480284dcc15a518ea570072329a31dErik                        break;
8387b92da258a480284dcc15a518ea570072329a31dErik                    case Utils.MODIFY_ALL:
8397b92da258a480284dcc15a518ea570072329a31dErik                        which = DeleteEventHelper.DELETE_ALL;
8407b92da258a480284dcc15a518ea570072329a31dErik                        break;
8417b92da258a480284dcc15a518ea570072329a31dErik                }
842a7694eead7cbb293990bc89c3906e17bad36194cErik                DeleteEventHelper deleteHelper = new DeleteEventHelper(
84396cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert                        mActivity, mActivity, !mIsReadOnly /* exitWhenDone */);
8446663f36972c0e9df10d4d79568658cec9c8a79ccErik                deleteHelper.delete(begin, end, mOriginalModel, which);
84579f228124de7d98146ca526d743436f6419e2365Erik            }
8467b92da258a480284dcc15a518ea570072329a31dErik
8477b92da258a480284dcc15a518ea570072329a31dErik            if ((mCode & Utils.DONE_EXIT) != 0) {
8487b92da258a480284dcc15a518ea570072329a31dErik                // This will exit the edit event screen, should be called
8497b92da258a480284dcc15a518ea570072329a31dErik                // when we want to return to the main calendar views
8504024dee06fbe7c4bbd5b56e7d58917e86b66802eIsaac Katzenelson                if ((mCode & Utils.DONE_SAVE) != 0) {
85196cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert                    if (mActivity != null) {
852c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                        long start = mModel.mStart;
853c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                        long end = mModel.mEnd;
854c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                        if (mModel.mAllDay) {
855c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            // For allday events we want to go to the day in the
856c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            // user's current tz
85796cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert                            String tz = Utils.getTimeZone(mActivity, null);
858c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            Time t = new Time(Time.TIMEZONE_UTC);
859c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            t.set(start);
860c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            t.timezone = tz;
861c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            start = t.toMillis(true);
862c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik
863c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            t.timezone = Time.TIMEZONE_UTC;
864c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            t.set(end);
865c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            t.timezone = tz;
866c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            end = t.toMillis(true);
867c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                        }
86896cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert                        CalendarController.getInstance(mActivity).launchViewEvent(-1, start, end,
8696bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson                                Attendees.ATTENDEE_STATUS_NONE);
8704024dee06fbe7c4bbd5b56e7d58917e86b66802eIsaac Katzenelson                    }
8714024dee06fbe7c4bbd5b56e7d58917e86b66802eIsaac Katzenelson                }
8720d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan                Activity a = EditEventFragment.this.getActivity();
8730d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan                if (a != null) {
8740d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan                    a.finish();
8750d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan                }
8767b92da258a480284dcc15a518ea570072329a31dErik            }
8777b92da258a480284dcc15a518ea570072329a31dErik
8785c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            // Hide a software keyboard so that user won't see it even after this Fragment's
8795c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            // disappearing.
88096cce4ae26c09dfc552fe98ae1dac667914d7e5cAlon Albert            final View focusedView = mActivity.getCurrentFocus();
8815c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            if (focusedView != null) {
8825c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa                mInputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0);
8835c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa                focusedView.clearFocus();
8845c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            }
88579f228124de7d98146ca526d743436f6419e2365Erik        }
88679f228124de7d98146ca526d743436f6419e2365Erik    }
88779f228124de7d98146ca526d743436f6419e2365Erik
888d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan    boolean isEmptyNewEvent() {
889d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        if (mOriginalModel != null) {
890d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            // Not new
891d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            return false;
892d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        }
893d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
894f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan        if (mModel.mOriginalStart != mModel.mStart || mModel.mOriginalEnd != mModel.mEnd) {
895f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan            return false;
896d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        }
897d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
898f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan        if (!mModel.mAttendeesList.isEmpty()) {
899f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan            return false;
900d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        }
901d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
902f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan        return mModel.isEmpty();
903d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan    }
904d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
90579f228124de7d98146ca526d743436f6419e2365Erik    @Override
906a7694eead7cbb293990bc89c3906e17bad36194cErik    public void onPause() {
907a7694eead7cbb293990bc89c3906e17bad36194cErik        Activity act = getActivity();
90855d4c8c75b2442aee44cab0a8e52aacd7856a53aErik        if (mSaveOnDetach && act != null && !mIsReadOnly && !act.isChangingConfigurations()
90955d4c8c75b2442aee44cab0a8e52aacd7856a53aErik                && mView.prepareForSave()) {
910a7694eead7cbb293990bc89c3906e17bad36194cErik            mOnDone.setDoneCode(Utils.DONE_SAVE);
911a7694eead7cbb293990bc89c3906e17bad36194cErik            mOnDone.run();
912a7694eead7cbb293990bc89c3906e17bad36194cErik        }
913a7694eead7cbb293990bc89c3906e17bad36194cErik        super.onPause();
914a7694eead7cbb293990bc89c3906e17bad36194cErik    }
915a7694eead7cbb293990bc89c3906e17bad36194cErik
916a7694eead7cbb293990bc89c3906e17bad36194cErik    @Override
91779f228124de7d98146ca526d743436f6419e2365Erik    public void onDestroy() {
918ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov        if (mView != null) {
919ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov            mView.setModel(null);
920ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov        }
92179f228124de7d98146ca526d743436f6419e2365Erik        if (mModifyDialog != null) {
92279f228124de7d98146ca526d743436f6419e2365Erik            mModifyDialog.dismiss();
92379f228124de7d98146ca526d743436f6419e2365Erik            mModifyDialog = null;
92479f228124de7d98146ca526d743436f6419e2365Erik        }
9257b92da258a480284dcc15a518ea570072329a31dErik        super.onDestroy();
92679f228124de7d98146ca526d743436f6419e2365Erik    }
927dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
928dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    @Override
929dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public void eventsChanged() {
930dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        // TODO Requery to see if event has changed
931dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    }
932dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
933dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    @Override
93459ead671b50514b49749fcd6a1d4186a270239d2Erik    public void onSaveInstanceState(Bundle outState) {
93559ead671b50514b49749fcd6a1d4186a270239d2Erik        mView.prepareForSave();
93659ead671b50514b49749fcd6a1d4186a270239d2Erik        outState.putSerializable(BUNDLE_KEY_MODEL, mModel);
93759ead671b50514b49749fcd6a1d4186a270239d2Erik        outState.putInt(BUNDLE_KEY_EDIT_STATE, mModification);
938c130d9d5e0d178585721428e394df0c8e0a6729fErik        if (mEventBundle == null && mEvent != null) {
939c130d9d5e0d178585721428e394df0c8e0a6729fErik            mEventBundle = new EventBundle();
940c130d9d5e0d178585721428e394df0c8e0a6729fErik            mEventBundle.id = mEvent.id;
941c130d9d5e0d178585721428e394df0c8e0a6729fErik            if (mEvent.startTime != null) {
942c130d9d5e0d178585721428e394df0c8e0a6729fErik                mEventBundle.start = mEvent.startTime.toMillis(true);
943c130d9d5e0d178585721428e394df0c8e0a6729fErik            }
944c130d9d5e0d178585721428e394df0c8e0a6729fErik            if (mEvent.endTime != null) {
945c130d9d5e0d178585721428e394df0c8e0a6729fErik                mEventBundle.end = mEvent.startTime.toMillis(true);
946c130d9d5e0d178585721428e394df0c8e0a6729fErik            }
947c130d9d5e0d178585721428e394df0c8e0a6729fErik        }
9482d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira        outState.putBoolean(BUNDLE_KEY_EDIT_ON_LAUNCH, mShowModifyDialogOnLaunch);
949c130d9d5e0d178585721428e394df0c8e0a6729fErik        outState.putSerializable(BUNDLE_KEY_EVENT, mEventBundle);
950a7694eead7cbb293990bc89c3906e17bad36194cErik        outState.putBoolean(BUNDLE_KEY_READ_ONLY, mIsReadOnly);
95196a36f4cb7803d50ecf47945b6a240926f48e7c3James Kung        outState.putBoolean(BUNDLE_KEY_SHOW_COLOR_PALETTE, mView.isColorPaletteVisible());
9527674b690b018c31207830c2a196927a0c654486cSam Blitzstein
9537674b690b018c31207830c2a196927a0c654486cSam Blitzstein        outState.putBoolean("EditEventView_timebuttonclicked", mView.mTimeSelectedWasStartTime);
95456f42bfb36d710726051e8268a115697477add61James Kung        outState.putBoolean(BUNDLE_KEY_DATE_BUTTON_CLICKED, mView.mDateSelectedWasStartDate);
95559ead671b50514b49749fcd6a1d4186a270239d2Erik    }
95659ead671b50514b49749fcd6a1d4186a270239d2Erik
95759ead671b50514b49749fcd6a1d4186a270239d2Erik    @Override
958dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public long getSupportedEventTypes() {
9597b92da258a480284dcc15a518ea570072329a31dErik        return EventType.USER_HOME;
960dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    }
961dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
962dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    @Override
963dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public void handleEvent(EventInfo event) {
9647b92da258a480284dcc15a518ea570072329a31dErik        // It's currently unclear if we want to save the event or not when home
9657b92da258a480284dcc15a518ea570072329a31dErik        // is pressed. When creating a new event we shouldn't save since we
9667b92da258a480284dcc15a518ea570072329a31dErik        // can't get the id of the new event easily.
9677b92da258a480284dcc15a518ea570072329a31dErik        if ((false && event.eventType == EventType.USER_HOME) || (event.eventType == EventType.GO_TO
9687b92da258a480284dcc15a518ea570072329a31dErik                && mSaveOnDetach)) {
9697b92da258a480284dcc15a518ea570072329a31dErik            if (mView != null && mView.prepareForSave()) {
9707b92da258a480284dcc15a518ea570072329a31dErik                mOnDone.setDoneCode(Utils.DONE_SAVE);
9717b92da258a480284dcc15a518ea570072329a31dErik                mOnDone.run();
9727b92da258a480284dcc15a518ea570072329a31dErik            }
9737b92da258a480284dcc15a518ea570072329a31dErik        }
974dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    }
975c130d9d5e0d178585721428e394df0c8e0a6729fErik
976a7694eead7cbb293990bc89c3906e17bad36194cErik    private static class EventBundle implements Serializable {
97717c0cea5c4e5eee7b6c1676038e9223dd971007bMichael Chan        private static final long serialVersionUID = 1L;
978c130d9d5e0d178585721428e394df0c8e0a6729fErik        long id = -1;
979c130d9d5e0d178585721428e394df0c8e0a6729fErik        long start = -1;
980c130d9d5e0d178585721428e394df0c8e0a6729fErik        long end = -1;
981c130d9d5e0d178585721428e394df0c8e0a6729fErik    }
982b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung
983b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung    @Override
984b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung    public void onColorSelected(int color) {
985f56b14972130233fd7e7c64160084793a7a0a55bJames Kung        if (!mModel.isEventColorInitialized() || mModel.getEventColor() != color) {
986f56b14972130233fd7e7c64160084793a7a0a55bJames Kung            mModel.setEventColor(color);
987b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung            mView.updateHeadlineColor(mModel, color);
988b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung        }
989b8904fb62c79d6e2bbd0f2b2539c67796abc081bJames Kung    }
99079f228124de7d98146ca526d743436f6419e2365Erik}
991