EditEventFragment.java revision 17c0cea5c4e5eee7b6c1676038e9223dd971007b
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;
2279f228124de7d98146ca526d743436f6419e2365Erikimport android.content.AsyncQueryHandler;
235f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.content.ContentProviderOperation;
2479f228124de7d98146ca526d743436f6419e2365Erikimport android.content.ContentResolver;
25dd95df57c8c5a58a85c4c0effad5652dec14f621Erikimport android.content.ContentUris;
265f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.content.ContentValues;
275c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawaimport android.content.Context;
2879f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface;
29d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chanimport android.content.DialogInterface.OnCancelListener;
3079f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface.OnClickListener;
31c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport android.content.Intent;
3279f228124de7d98146ca526d743436f6419e2365Erikimport android.database.Cursor;
3379f228124de7d98146ca526d743436f6419e2365Erikimport android.database.MatrixCursor;
3479f228124de7d98146ca526d743436f6419e2365Erikimport android.net.Uri;
3579f228124de7d98146ca526d743436f6419e2365Erikimport android.os.Bundle;
36a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Attendees;
37a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Calendars;
38a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Events;
39a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Reminders;
4079f228124de7d98146ca526d743436f6419e2365Erikimport android.text.TextUtils;
4179f228124de7d98146ca526d743436f6419e2365Erikimport android.util.Log;
4279f228124de7d98146ca526d743436f6419e2365Erikimport android.view.LayoutInflater;
435f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.Menu;
445f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.MenuInflater;
455f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.MenuItem;
4679f228124de7d98146ca526d743436f6419e2365Erikimport android.view.View;
4779f228124de7d98146ca526d743436f6419e2365Erikimport android.view.ViewGroup;
485c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawaimport android.view.inputmethod.InputMethodManager;
4979f228124de7d98146ca526d743436f6419e2365Erikimport android.widget.Toast;
5079f228124de7d98146ca526d743436f6419e2365Erik
51c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.AsyncQueryService;
52c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController;
53c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventHandler;
54c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventInfo;
55c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventType;
56c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel;
57c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel.Attendee;
58c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel.ReminderEntry;
59c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.DeleteEventHelper;
60c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.R;
61c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.Utils;
62c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan
63c130d9d5e0d178585721428e394df0c8e0a6729fErikimport java.io.Serializable;
645f62079ab9daefe95ede87631766e99e8b4a2220Erikimport java.util.ArrayList;
659645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFaddenimport java.util.Collections;
665f62079ab9daefe95ede87631766e99e8b4a2220Erik
67dd95df57c8c5a58a85c4c0effad5652dec14f621Erikpublic class EditEventFragment extends Fragment implements EventHandler {
6879f228124de7d98146ca526d743436f6419e2365Erik    private static final String TAG = "EditEventActivity";
6979f228124de7d98146ca526d743436f6419e2365Erik
7059ead671b50514b49749fcd6a1d4186a270239d2Erik    private static final String BUNDLE_KEY_MODEL = "key_model";
7159ead671b50514b49749fcd6a1d4186a270239d2Erik    private static final String BUNDLE_KEY_EDIT_STATE = "key_edit_state";
72c130d9d5e0d178585721428e394df0c8e0a6729fErik    private static final String BUNDLE_KEY_EVENT = "key_event";
73a7694eead7cbb293990bc89c3906e17bad36194cErik    private static final String BUNDLE_KEY_READ_ONLY = "key_read_only";
7459ead671b50514b49749fcd6a1d4186a270239d2Erik
7579f228124de7d98146ca526d743436f6419e2365Erik    private static final boolean DEBUG = false;
7679f228124de7d98146ca526d743436f6419e2365Erik
77352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_EVENT = 1;
78352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_ATTENDEES = 1 << 1;
79352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_REMINDERS = 1 << 2;
80352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_CALENDARS = 1 << 3;
81352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_ALL = TOKEN_EVENT | TOKEN_ATTENDEES | TOKEN_REMINDERS
82352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            | TOKEN_CALENDARS;
835f62079ab9daefe95ede87631766e99e8b4a2220Erik    private static final int TOKEN_UNITIALIZED = 1 << 31;
84352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
85352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    /**
86352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     * A bitfield of TOKEN_* to keep track which query hasn't been completed
87352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     * yet. Once all queries have returned, the model can be applied to the
88352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     * view.
89352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     */
905f62079ab9daefe95ede87631766e99e8b4a2220Erik    private int mOutstandingQueries = TOKEN_UNITIALIZED;
9179f228124de7d98146ca526d743436f6419e2365Erik
9279f228124de7d98146ca526d743436f6419e2365Erik    EditEventHelper mHelper;
9379f228124de7d98146ca526d743436f6419e2365Erik    CalendarEventModel mModel;
9479f228124de7d98146ca526d743436f6419e2365Erik    CalendarEventModel mOriginalModel;
9559ead671b50514b49749fcd6a1d4186a270239d2Erik    CalendarEventModel mRestoreModel;
9679f228124de7d98146ca526d743436f6419e2365Erik    EditEventView mView;
9779f228124de7d98146ca526d743436f6419e2365Erik    QueryHandler mHandler;
9879f228124de7d98146ca526d743436f6419e2365Erik
9979f228124de7d98146ca526d743436f6419e2365Erik    private AlertDialog mModifyDialog;
10079f228124de7d98146ca526d743436f6419e2365Erik    int mModification = Utils.MODIFY_UNINITIALIZED;
10179f228124de7d98146ca526d743436f6419e2365Erik
102dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    private EventInfo mEvent;
103c130d9d5e0d178585721428e394df0c8e0a6729fErik    private EventBundle mEventBundle;
10479f228124de7d98146ca526d743436f6419e2365Erik    private Uri mUri;
10579f228124de7d98146ca526d743436f6419e2365Erik    private long mBegin;
10679f228124de7d98146ca526d743436f6419e2365Erik    private long mEnd;
10779f228124de7d98146ca526d743436f6419e2365Erik
10879f228124de7d98146ca526d743436f6419e2365Erik    private Activity mContext;
109dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    private Done mOnDone = new Done();
1105f62079ab9daefe95ede87631766e99e8b4a2220Erik    private Menu mMenu;
111dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
112dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    private boolean mSaveOnDetach = true;
113a7694eead7cbb293990bc89c3906e17bad36194cErik    private boolean mIsReadOnly = false;
114a7694eead7cbb293990bc89c3906e17bad36194cErik    public boolean mShowModifyDialogOnLaunch = false;
11579f228124de7d98146ca526d743436f6419e2365Erik
1165c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa    private InputMethodManager mInputMethodManager;
1175c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa
118c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan    private Intent mIntent;
119c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan
120364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik    // TODO turn this into a helper function in EditEventHelper for building the
121364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik    // model
12279f228124de7d98146ca526d743436f6419e2365Erik    private class QueryHandler extends AsyncQueryHandler {
12379f228124de7d98146ca526d743436f6419e2365Erik        public QueryHandler(ContentResolver cr) {
12479f228124de7d98146ca526d743436f6419e2365Erik            super(cr);
12579f228124de7d98146ca526d743436f6419e2365Erik        }
12679f228124de7d98146ca526d743436f6419e2365Erik
12779f228124de7d98146ca526d743436f6419e2365Erik        @Override
12879f228124de7d98146ca526d743436f6419e2365Erik        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
12979f228124de7d98146ca526d743436f6419e2365Erik            // If the query didn't return a cursor for some reason return
13079f228124de7d98146ca526d743436f6419e2365Erik            if (cursor == null) {
13179f228124de7d98146ca526d743436f6419e2365Erik                return;
13279f228124de7d98146ca526d743436f6419e2365Erik            }
13379f228124de7d98146ca526d743436f6419e2365Erik
13479f228124de7d98146ca526d743436f6419e2365Erik            // If the Activity is finishing, then close the cursor.
13579f228124de7d98146ca526d743436f6419e2365Erik            // Otherwise, use the new cursor in the adapter.
1366a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan            final Activity activity = EditEventFragment.this.getActivity();
1376a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan            if (activity == null || activity.isFinishing()) {
13879f228124de7d98146ca526d743436f6419e2365Erik                cursor.close();
13979f228124de7d98146ca526d743436f6419e2365Erik                return;
14079f228124de7d98146ca526d743436f6419e2365Erik            }
14179f228124de7d98146ca526d743436f6419e2365Erik            long eventId;
14279f228124de7d98146ca526d743436f6419e2365Erik            switch (token) {
14379f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_EVENT:
14479f228124de7d98146ca526d743436f6419e2365Erik                    if (cursor.getCount() == 0) {
14579f228124de7d98146ca526d743436f6419e2365Erik                        // The cursor is empty. This can happen if the event
14679f228124de7d98146ca526d743436f6419e2365Erik                        // was deleted.
14779f228124de7d98146ca526d743436f6419e2365Erik                        cursor.close();
148352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        mOnDone.setDoneCode(Utils.DONE_EXIT);
14916bfd177ebb7e14703cc4b198cc86c2778ed7fe6RoboErik                        mSaveOnDetach = false;
150352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        mOnDone.run();
15179f228124de7d98146ca526d743436f6419e2365Erik                        return;
15279f228124de7d98146ca526d743436f6419e2365Erik                    }
15379f228124de7d98146ca526d743436f6419e2365Erik                    mOriginalModel = new CalendarEventModel();
15479f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.setModelFromCursor(mOriginalModel, cursor);
15579f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.setModelFromCursor(mModel, cursor);
15679f228124de7d98146ca526d743436f6419e2365Erik                    cursor.close();
15779f228124de7d98146ca526d743436f6419e2365Erik
15859ead671b50514b49749fcd6a1d4186a270239d2Erik                    mOriginalModel.mUri = mUri.toString();
15979f228124de7d98146ca526d743436f6419e2365Erik
16059ead671b50514b49749fcd6a1d4186a270239d2Erik                    mModel.mUri = mUri.toString();
16179f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mOriginalStart = mBegin;
16279f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mOriginalEnd = mEnd;
16379f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mIsFirstEventInSeries = mBegin == mOriginalModel.mStart;
16479f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mStart = mBegin;
16579f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mEnd = mEnd;
16679f228124de7d98146ca526d743436f6419e2365Erik
16779f228124de7d98146ca526d743436f6419e2365Erik                    eventId = mModel.mId;
168352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
169352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // TOKEN_ATTENDEES
17079f228124de7d98146ca526d743436f6419e2365Erik                    if (mModel.mHasAttendeeData && eventId != -1) {
17179f228124de7d98146ca526d743436f6419e2365Erik                        Uri attUri = Attendees.CONTENT_URI;
17279f228124de7d98146ca526d743436f6419e2365Erik                        String[] whereArgs = {
17379f228124de7d98146ca526d743436f6419e2365Erik                            Long.toString(eventId)
17479f228124de7d98146ca526d743436f6419e2365Erik                        };
17579f228124de7d98146ca526d743436f6419e2365Erik                        mHandler.startQuery(TOKEN_ATTENDEES, null, attUri,
17679f228124de7d98146ca526d743436f6419e2365Erik                                EditEventHelper.ATTENDEES_PROJECTION,
177d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                EditEventHelper.ATTENDEES_WHERE /* selection */,
17879f228124de7d98146ca526d743436f6419e2365Erik                                whereArgs /* selection args */, null /* sort order */);
179352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    } else {
180352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        setModelIfDone(TOKEN_ATTENDEES);
181352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    }
182352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
183352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // TOKEN_REMINDERS
184352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    if (mModel.mHasAlarm) {
185d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                        Uri rUri = Reminders.CONTENT_URI;
186d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                        String[] remArgs = {
1879645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                Long.toString(eventId)
188d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                        };
1899645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        mHandler.startQuery(TOKEN_REMINDERS, null, rUri,
1909645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                EditEventHelper.REMINDERS_PROJECTION,
1919645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                EditEventHelper.REMINDERS_WHERE /* selection */,
1929645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                remArgs /* selection args */, null /* sort order */);
19379f228124de7d98146ca526d743436f6419e2365Erik                    } else {
194352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        setModelIfDone(TOKEN_REMINDERS);
19579f228124de7d98146ca526d743436f6419e2365Erik                    }
196352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
197352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // TOKEN_CALENDARS
198352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    String[] selArgs = {
199352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        Long.toString(mModel.mCalendarId)
200352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    };
201352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI,
202352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            EditEventHelper.CALENDARS_PROJECTION, EditEventHelper.CALENDARS_WHERE,
203352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            selArgs /* selection args */, null /* sort order */);
204352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
205352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_EVENT);
20679f228124de7d98146ca526d743436f6419e2365Erik                    break;
20779f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_ATTENDEES:
20879f228124de7d98146ca526d743436f6419e2365Erik                    try {
20979f228124de7d98146ca526d743436f6419e2365Erik                        while (cursor.moveToNext()) {
21079f228124de7d98146ca526d743436f6419e2365Erik                            String name = cursor.getString(EditEventHelper.ATTENDEES_INDEX_NAME);
21179f228124de7d98146ca526d743436f6419e2365Erik                            String email = cursor.getString(EditEventHelper.ATTENDEES_INDEX_EMAIL);
212d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            int status = cursor.getInt(EditEventHelper.ATTENDEES_INDEX_STATUS);
21379f228124de7d98146ca526d743436f6419e2365Erik                            int relationship = cursor
21479f228124de7d98146ca526d743436f6419e2365Erik                                    .getInt(EditEventHelper.ATTENDEES_INDEX_RELATIONSHIP);
215352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            if (relationship == Attendees.RELATIONSHIP_ORGANIZER) {
216352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                if (email != null) {
21779f228124de7d98146ca526d743436f6419e2365Erik                                    mModel.mOrganizer = email;
218352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                    mModel.mIsOrganizer = mModel.mOwnerAccount
219352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                            .equalsIgnoreCase(email);
220a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mOrganizer = email;
221a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mIsOrganizer = mOriginalModel.mOwnerAccount
222a7694eead7cbb293990bc89c3906e17bad36194cErik                                            .equalsIgnoreCase(email);
223352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                }
224352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
225352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                if (TextUtils.isEmpty(name)) {
226352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                    mModel.mOrganizerDisplayName = mModel.mOrganizer;
227a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mOrganizerDisplayName =
228a7694eead7cbb293990bc89c3906e17bad36194cErik                                            mOriginalModel.mOrganizer;
229352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                } else {
230352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                    mModel.mOrganizerDisplayName = name;
231a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mOrganizerDisplayName = name;
23279f228124de7d98146ca526d743436f6419e2365Erik                                }
233352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            }
234352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
235352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            if (email != null) {
236d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                if (mModel.mOwnerAccount != null &&
237d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                        mModel.mOwnerAccount.equalsIgnoreCase(email)) {
238d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    int attendeeId =
239d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                        cursor.getInt(EditEventHelper.ATTENDEES_INDEX_ID);
240d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mModel.mOwnerAttendeeId = attendeeId;
241d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mModel.mSelfAttendeeStatus = status;
242d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mOriginalModel.mOwnerAttendeeId = attendeeId;
243d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mOriginalModel.mSelfAttendeeStatus = status;
244d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    continue;
245d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                }
24679f228124de7d98146ca526d743436f6419e2365Erik                            }
247d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            Attendee attendee = new Attendee(name, email);
248d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            attendee.mStatus = status;
249d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            mModel.addAttendee(attendee);
250d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            mOriginalModel.addAttendee(attendee);
25179f228124de7d98146ca526d743436f6419e2365Erik                        }
25279f228124de7d98146ca526d743436f6419e2365Erik                    } finally {
25379f228124de7d98146ca526d743436f6419e2365Erik                        cursor.close();
25479f228124de7d98146ca526d743436f6419e2365Erik                    }
255352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
256352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_ATTENDEES);
25779f228124de7d98146ca526d743436f6419e2365Erik                    break;
25879f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_REMINDERS:
25979f228124de7d98146ca526d743436f6419e2365Erik                    try {
260d290a01420234214d73d31b8bfa61652625bb149Erik                        // Add all reminders to the models
26179f228124de7d98146ca526d743436f6419e2365Erik                        while (cursor.moveToNext()) {
26279f228124de7d98146ca526d743436f6419e2365Erik                            int minutes = cursor.getInt(EditEventHelper.REMINDERS_INDEX_MINUTES);
263fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            int method = cursor.getInt(EditEventHelper.REMINDERS_INDEX_METHOD);
264fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            ReminderEntry re = ReminderEntry.valueOf(minutes, method);
265fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            mModel.mReminders.add(re);
266fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            mOriginalModel.mReminders.add(re);
26779f228124de7d98146ca526d743436f6419e2365Erik                        }
2689645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden
2699645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        // Sort appropriately for display
2709645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        Collections.sort(mModel.mReminders);
2719645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        Collections.sort(mOriginalModel.mReminders);
27279f228124de7d98146ca526d743436f6419e2365Erik                    } finally {
27379f228124de7d98146ca526d743436f6419e2365Erik                        cursor.close();
27479f228124de7d98146ca526d743436f6419e2365Erik                    }
275352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
276352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_REMINDERS);
27779f228124de7d98146ca526d743436f6419e2365Erik                    break;
27879f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_CALENDARS:
279352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    try {
280352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        if (mModel.mCalendarId == -1) {
281352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            // Populate Calendar spinner only if no calendar is set e.g. new event
282352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            MatrixCursor matrixCursor = Utils.matrixCursorFromCursor(cursor);
283352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            if (DEBUG) {
284352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                Log.d(TAG, "onQueryComplete: setting cursor with "
285352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                        + matrixCursor.getCount() + " calendars");
286352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            }
287352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            mView.setCalendarsCursor(matrixCursor, isAdded() && isResumed());
288352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        } else {
289352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            // Populate model for an existing event
290352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            EditEventHelper.setModelFromCalendarCursor(mModel, cursor);
291a7694eead7cbb293990bc89c3906e17bad36194cErik                            EditEventHelper.setModelFromCalendarCursor(mOriginalModel, cursor);
292352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        }
293352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    } finally {
294352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        cursor.close();
29579f228124de7d98146ca526d743436f6419e2365Erik                    }
296352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
297352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_CALENDARS);
29879f228124de7d98146ca526d743436f6419e2365Erik                    break;
299fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson                default:
300fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson                    cursor.close();
301fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson                    break;
30279f228124de7d98146ca526d743436f6419e2365Erik            }
30379f228124de7d98146ca526d743436f6419e2365Erik        }
30479f228124de7d98146ca526d743436f6419e2365Erik    }
30579f228124de7d98146ca526d743436f6419e2365Erik
306bdcb9fcc732d52708fafb068f535a2c93ff2356fDaisuke Miyakawa    private void setModelIfDone(int queryType) {
307352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        synchronized (this) {
308352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mOutstandingQueries &= ~queryType;
309352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            if (mOutstandingQueries == 0) {
31059ead671b50514b49749fcd6a1d4186a270239d2Erik                if (mRestoreModel != null) {
31159ead671b50514b49749fcd6a1d4186a270239d2Erik                    mModel = mRestoreModel;
31259ead671b50514b49749fcd6a1d4186a270239d2Erik                }
3131bd94537b630fbc5556307ea92f37d4a5facecb4Erik                if (mShowModifyDialogOnLaunch && mModification == Utils.MODIFY_UNINITIALIZED) {
3141bd94537b630fbc5556307ea92f37d4a5facecb4Erik                    if (!TextUtils.isEmpty(mModel.mRrule)) {
3151bd94537b630fbc5556307ea92f37d4a5facecb4Erik                        displayEditWhichDialog();
3161bd94537b630fbc5556307ea92f37d4a5facecb4Erik                    } else {
3171bd94537b630fbc5556307ea92f37d4a5facecb4Erik                        mModification = Utils.MODIFY_ALL;
3181bd94537b630fbc5556307ea92f37d4a5facecb4Erik                    }
3191bd94537b630fbc5556307ea92f37d4a5facecb4Erik
3201bd94537b630fbc5556307ea92f37d4a5facecb4Erik                }
321352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                mView.setModel(mModel);
3223400a2bfc1e6be435ea2bb0f436a6ef338446504Erik                mView.setModification(mModification);
323c07a57fb7436d807ad505fa7319b9de13f91e741Erik                if (mMenu != null) {
3245f62079ab9daefe95ede87631766e99e8b4a2220Erik                    updateActionBar();
3255f62079ab9daefe95ede87631766e99e8b4a2220Erik                }
326352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            }
327352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        }
328352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    }
329352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
3305f62079ab9daefe95ede87631766e99e8b4a2220Erik    private void updateActionBar() {
331c07a57fb7436d807ad505fa7319b9de13f91e741Erik        if (mMenu == null) {
332c07a57fb7436d807ad505fa7319b9de13f91e741Erik            return;
333c07a57fb7436d807ad505fa7319b9de13f91e741Erik        }
3345f62079ab9daefe95ede87631766e99e8b4a2220Erik        MenuItem cancelItem = mMenu.findItem(R.id.action_cancel);
335c07a57fb7436d807ad505fa7319b9de13f91e741Erik        MenuItem editItem = mMenu.findItem(R.id.action_edit);
336c07a57fb7436d807ad505fa7319b9de13f91e741Erik        boolean canModifyEvent = EditEventHelper.canModifyEvent(mModel);
337c07a57fb7436d807ad505fa7319b9de13f91e741Erik
338a7694eead7cbb293990bc89c3906e17bad36194cErik        if (mIsReadOnly) {
339a7694eead7cbb293990bc89c3906e17bad36194cErik            mMenu.findItem(R.id.action_done).setVisible(false);
340a7694eead7cbb293990bc89c3906e17bad36194cErik        }
341c07a57fb7436d807ad505fa7319b9de13f91e741Erik        if (mModification == Utils.MODIFY_UNINITIALIZED) {
342c07a57fb7436d807ad505fa7319b9de13f91e741Erik            cancelItem.setVisible(false);
343c07a57fb7436d807ad505fa7319b9de13f91e741Erik            if (canModifyEvent) {
344c07a57fb7436d807ad505fa7319b9de13f91e741Erik                editItem.setVisible(true);
345c07a57fb7436d807ad505fa7319b9de13f91e741Erik            } else {
346c07a57fb7436d807ad505fa7319b9de13f91e741Erik                editItem.setVisible(false);
347c07a57fb7436d807ad505fa7319b9de13f91e741Erik            }
348c07a57fb7436d807ad505fa7319b9de13f91e741Erik            return;
349c07a57fb7436d807ad505fa7319b9de13f91e741Erik        } else {
3506a7003d1b9bf20f4c6e001d054b1ab556ddec4a4RoboErik            cancelItem.setVisible(true);
35146cde5cff48d6862f492f60c6a6336bfc047ce25Erik            editItem.setVisible(false);
352c07a57fb7436d807ad505fa7319b9de13f91e741Erik        }
353c07a57fb7436d807ad505fa7319b9de13f91e741Erik        boolean canRespond = EditEventHelper.canRespond(mModel);
3545f62079ab9daefe95ede87631766e99e8b4a2220Erik
3555f62079ab9daefe95ede87631766e99e8b4a2220Erik        if (canRespond || canModifyEvent) {
3565f62079ab9daefe95ede87631766e99e8b4a2220Erik            cancelItem.setVisible(true);
3575f62079ab9daefe95ede87631766e99e8b4a2220Erik        } else {
3585f62079ab9daefe95ede87631766e99e8b4a2220Erik            cancelItem.setVisible(false);
3595f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
3605f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
3615f62079ab9daefe95ede87631766e99e8b4a2220Erik
362dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public EditEventFragment() {
363c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan        this(null, false, null);
364a7694eead7cbb293990bc89c3906e17bad36194cErik    }
365a7694eead7cbb293990bc89c3906e17bad36194cErik
366c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan    public EditEventFragment(EventInfo event, boolean readOnly, Intent intent) {
367dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mEvent = event;
368a7694eead7cbb293990bc89c3906e17bad36194cErik        mIsReadOnly = readOnly;
369c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan        mIntent = intent;
3705f62079ab9daefe95ede87631766e99e8b4a2220Erik        setHasOptionsMenu(true);
37179f228124de7d98146ca526d743436f6419e2365Erik    }
37279f228124de7d98146ca526d743436f6419e2365Erik
37379f228124de7d98146ca526d743436f6419e2365Erik    private void startQuery() {
374dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mUri = null;
375dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mBegin = -1;
376dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mEnd = -1;
377dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        if (mEvent != null) {
378dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            if (mEvent.id != -1) {
379352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                mModel.mId = mEvent.id;
380dd95df57c8c5a58a85c4c0effad5652dec14f621Erik                mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEvent.id);
381dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            }
382dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            if (mEvent.startTime != null) {
383dd95df57c8c5a58a85c4c0effad5652dec14f621Erik                mBegin = mEvent.startTime.toMillis(true);
384dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            }
385dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            if (mEvent.endTime != null) {
386dd95df57c8c5a58a85c4c0effad5652dec14f621Erik                mEnd = mEvent.endTime.toMillis(true);
387dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            }
388c130d9d5e0d178585721428e394df0c8e0a6729fErik        } else if (mEventBundle != null) {
3893400a2bfc1e6be435ea2bb0f436a6ef338446504Erik            if (mEventBundle.id != -1) {
3903400a2bfc1e6be435ea2bb0f436a6ef338446504Erik                mModel.mId = mEventBundle.id;
3913400a2bfc1e6be435ea2bb0f436a6ef338446504Erik                mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventBundle.id);
3923400a2bfc1e6be435ea2bb0f436a6ef338446504Erik            }
393c130d9d5e0d178585721428e394df0c8e0a6729fErik            mBegin = mEventBundle.start;
394c130d9d5e0d178585721428e394df0c8e0a6729fErik            mEnd = mEventBundle.end;
395dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        }
396e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
397e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        if (mBegin <= 0) {
398e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            // use a default value instead
399e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            mBegin = mHelper.constructDefaultStartTime(System.currentTimeMillis());
400e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        }
401e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        if (mEnd < mBegin) {
402e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            // use a default value instead
403e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            mEnd = mHelper.constructDefaultEndTime(mBegin);
404e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        }
40579f228124de7d98146ca526d743436f6419e2365Erik
40679f228124de7d98146ca526d743436f6419e2365Erik        // Kick off the query for the event
40779f228124de7d98146ca526d743436f6419e2365Erik        boolean newEvent = mUri == null;
40879f228124de7d98146ca526d743436f6419e2365Erik        if (!newEvent) {
409ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik            mModel.mCalendarAccessLevel = Calendars.CAL_ACCESS_NONE;
410352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mOutstandingQueries = TOKEN_ALL;
41179f228124de7d98146ca526d743436f6419e2365Erik            if (DEBUG) {
412352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                Log.d(TAG, "startQuery: uri for event is " + mUri.toString());
41379f228124de7d98146ca526d743436f6419e2365Erik            }
41479f228124de7d98146ca526d743436f6419e2365Erik            mHandler.startQuery(TOKEN_EVENT, null, mUri, EditEventHelper.EVENT_PROJECTION,
41579f228124de7d98146ca526d743436f6419e2365Erik                    null /* selection */, null /* selection args */, null /* sort order */);
41679f228124de7d98146ca526d743436f6419e2365Erik        } else {
417352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mOutstandingQueries = TOKEN_CALENDARS;
41879f228124de7d98146ca526d743436f6419e2365Erik            if (DEBUG) {
419352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                Log.d(TAG, "startQuery: Editing a new event.");
42079f228124de7d98146ca526d743436f6419e2365Erik            }
42179f228124de7d98146ca526d743436f6419e2365Erik            mModel.mStart = mBegin;
42279f228124de7d98146ca526d743436f6419e2365Erik            mModel.mEnd = mEnd;
423d845fbe558d5229102b58cce70a1b29fe6cb6967Erik            mModel.mSelfAttendeeStatus = Attendees.ATTENDEE_STATUS_ACCEPTED;
42479f228124de7d98146ca526d743436f6419e2365Erik
42579f228124de7d98146ca526d743436f6419e2365Erik            // Start a query in the background to read the list of calendars
42679f228124de7d98146ca526d743436f6419e2365Erik            mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI,
42779f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.CALENDARS_PROJECTION,
42879f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.CALENDARS_WHERE_WRITEABLE_VISIBLE, null /* selection args */,
42979f228124de7d98146ca526d743436f6419e2365Erik                    null /* sort order */);
430c07a57fb7436d807ad505fa7319b9de13f91e741Erik
431c07a57fb7436d807ad505fa7319b9de13f91e741Erik            mModification = Utils.MODIFY_ALL;
432c07a57fb7436d807ad505fa7319b9de13f91e741Erik            updateActionBar();
433c07a57fb7436d807ad505fa7319b9de13f91e741Erik            mView.setModification(mModification);
43479f228124de7d98146ca526d743436f6419e2365Erik        }
43579f228124de7d98146ca526d743436f6419e2365Erik    }
43679f228124de7d98146ca526d743436f6419e2365Erik
43779f228124de7d98146ca526d743436f6419e2365Erik    @Override
43879f228124de7d98146ca526d743436f6419e2365Erik    public void onAttach(Activity activity) {
43979f228124de7d98146ca526d743436f6419e2365Erik        super.onAttach(activity);
44079f228124de7d98146ca526d743436f6419e2365Erik        mContext = activity;
44179f228124de7d98146ca526d743436f6419e2365Erik
442dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mHelper = new EditEventHelper(activity, null);
44379f228124de7d98146ca526d743436f6419e2365Erik        mHandler = new QueryHandler(activity.getContentResolver());
444c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan        mModel = new CalendarEventModel(activity, mIntent);
4455c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa        mInputMethodManager = (InputMethodManager)
4465c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa                activity.getSystemService(Context.INPUT_METHOD_SERVICE);
44779f228124de7d98146ca526d743436f6419e2365Erik    }
44879f228124de7d98146ca526d743436f6419e2365Erik
44979f228124de7d98146ca526d743436f6419e2365Erik    @Override
45079f228124de7d98146ca526d743436f6419e2365Erik    public View onCreateView(LayoutInflater inflater, ViewGroup container,
45179f228124de7d98146ca526d743436f6419e2365Erik            Bundle savedInstanceState) {
45279f228124de7d98146ca526d743436f6419e2365Erik//        mContext.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
453a7694eead7cbb293990bc89c3906e17bad36194cErik        View view;
454a7694eead7cbb293990bc89c3906e17bad36194cErik        if (mIsReadOnly) {
455a7694eead7cbb293990bc89c3906e17bad36194cErik            view = inflater.inflate(R.layout.edit_event_single_column, null);
456a7694eead7cbb293990bc89c3906e17bad36194cErik        } else {
457a7694eead7cbb293990bc89c3906e17bad36194cErik            view = inflater.inflate(R.layout.edit_event, null);
458a7694eead7cbb293990bc89c3906e17bad36194cErik        }
459dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mView = new EditEventView(mContext, view, mOnDone);
46079f228124de7d98146ca526d743436f6419e2365Erik        startQuery();
46179f228124de7d98146ca526d743436f6419e2365Erik        return view;
46279f228124de7d98146ca526d743436f6419e2365Erik    }
46379f228124de7d98146ca526d743436f6419e2365Erik
46479f228124de7d98146ca526d743436f6419e2365Erik    @Override
46579f228124de7d98146ca526d743436f6419e2365Erik    public void onCreate(Bundle savedInstanceState) {
46679f228124de7d98146ca526d743436f6419e2365Erik        super.onCreate(savedInstanceState);
46759ead671b50514b49749fcd6a1d4186a270239d2Erik        if (savedInstanceState != null) {
46859ead671b50514b49749fcd6a1d4186a270239d2Erik            if (savedInstanceState.containsKey(BUNDLE_KEY_MODEL)) {
46959ead671b50514b49749fcd6a1d4186a270239d2Erik                mRestoreModel = (CalendarEventModel) savedInstanceState.getSerializable(
47059ead671b50514b49749fcd6a1d4186a270239d2Erik                        BUNDLE_KEY_MODEL);
47159ead671b50514b49749fcd6a1d4186a270239d2Erik            }
47259ead671b50514b49749fcd6a1d4186a270239d2Erik            if (savedInstanceState.containsKey(BUNDLE_KEY_EDIT_STATE)) {
47359ead671b50514b49749fcd6a1d4186a270239d2Erik                mModification = savedInstanceState.getInt(BUNDLE_KEY_EDIT_STATE);
47459ead671b50514b49749fcd6a1d4186a270239d2Erik            }
475c130d9d5e0d178585721428e394df0c8e0a6729fErik            if (savedInstanceState.containsKey(BUNDLE_KEY_EVENT)) {
476c130d9d5e0d178585721428e394df0c8e0a6729fErik                mEventBundle = (EventBundle) savedInstanceState.getSerializable(BUNDLE_KEY_EVENT);
477c130d9d5e0d178585721428e394df0c8e0a6729fErik            }
478a7694eead7cbb293990bc89c3906e17bad36194cErik            if (savedInstanceState.containsKey(BUNDLE_KEY_READ_ONLY)) {
479a7694eead7cbb293990bc89c3906e17bad36194cErik                mIsReadOnly = savedInstanceState.getBoolean(BUNDLE_KEY_READ_ONLY);
480a7694eead7cbb293990bc89c3906e17bad36194cErik            }
48159ead671b50514b49749fcd6a1d4186a270239d2Erik        }
48279f228124de7d98146ca526d743436f6419e2365Erik    }
4835f62079ab9daefe95ede87631766e99e8b4a2220Erik
4845f62079ab9daefe95ede87631766e99e8b4a2220Erik
4855f62079ab9daefe95ede87631766e99e8b4a2220Erik    @Override
4865f62079ab9daefe95ede87631766e99e8b4a2220Erik    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
4875f62079ab9daefe95ede87631766e99e8b4a2220Erik        super.onCreateOptionsMenu(menu, inflater);
4885f62079ab9daefe95ede87631766e99e8b4a2220Erik        inflater.inflate(R.menu.edit_event_title_bar, menu);
4895f62079ab9daefe95ede87631766e99e8b4a2220Erik        synchronized (this) {
4905f62079ab9daefe95ede87631766e99e8b4a2220Erik            mMenu = menu;
491c07a57fb7436d807ad505fa7319b9de13f91e741Erik            updateActionBar();
4925f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
4935f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
4945f62079ab9daefe95ede87631766e99e8b4a2220Erik
4955f62079ab9daefe95ede87631766e99e8b4a2220Erik    @Override
4965f62079ab9daefe95ede87631766e99e8b4a2220Erik    public boolean onOptionsItemSelected(MenuItem item) {
4975f62079ab9daefe95ede87631766e99e8b4a2220Erik        switch (item.getItemId()) {
4985f62079ab9daefe95ede87631766e99e8b4a2220Erik            case R.id.action_done:
4995f62079ab9daefe95ede87631766e99e8b4a2220Erik                if (EditEventHelper.canModifyEvent(mModel) || EditEventHelper.canRespond(mModel)) {
5005f62079ab9daefe95ede87631766e99e8b4a2220Erik                    if (mView != null && mView.prepareForSave()) {
50146cde5cff48d6862f492f60c6a6336bfc047ce25Erik                        if (mModification == Utils.MODIFY_UNINITIALIZED) {
50246cde5cff48d6862f492f60c6a6336bfc047ce25Erik                            mModification = Utils.MODIFY_ALL;
50346cde5cff48d6862f492f60c6a6336bfc047ce25Erik                        }
5045f62079ab9daefe95ede87631766e99e8b4a2220Erik                        mOnDone.setDoneCode(Utils.DONE_SAVE | Utils.DONE_EXIT);
5055f62079ab9daefe95ede87631766e99e8b4a2220Erik                        mOnDone.run();
5065f62079ab9daefe95ede87631766e99e8b4a2220Erik                    } else {
5075f62079ab9daefe95ede87631766e99e8b4a2220Erik                        mOnDone.setDoneCode(Utils.DONE_REVERT);
5085f62079ab9daefe95ede87631766e99e8b4a2220Erik                        mOnDone.run();
5095f62079ab9daefe95ede87631766e99e8b4a2220Erik                    }
5105f62079ab9daefe95ede87631766e99e8b4a2220Erik                } else if (EditEventHelper.canAddReminders(mModel) && mModel.mId != -1
5115f62079ab9daefe95ede87631766e99e8b4a2220Erik                        && mOriginalModel != null && mView.prepareForSave()) {
5125f62079ab9daefe95ede87631766e99e8b4a2220Erik                    saveReminders();
5135f62079ab9daefe95ede87631766e99e8b4a2220Erik                    mOnDone.setDoneCode(Utils.DONE_EXIT);
5145f62079ab9daefe95ede87631766e99e8b4a2220Erik                    mOnDone.run();
5155f62079ab9daefe95ede87631766e99e8b4a2220Erik                } else {
5165f62079ab9daefe95ede87631766e99e8b4a2220Erik                    mOnDone.setDoneCode(Utils.DONE_REVERT);
5175f62079ab9daefe95ede87631766e99e8b4a2220Erik                    mOnDone.run();
5185f62079ab9daefe95ede87631766e99e8b4a2220Erik                }
5195f62079ab9daefe95ede87631766e99e8b4a2220Erik                break;
5205f62079ab9daefe95ede87631766e99e8b4a2220Erik            case R.id.action_cancel:
5215f62079ab9daefe95ede87631766e99e8b4a2220Erik                mOnDone.setDoneCode(Utils.DONE_REVERT);
5225f62079ab9daefe95ede87631766e99e8b4a2220Erik                mOnDone.run();
5235f62079ab9daefe95ede87631766e99e8b4a2220Erik                break;
524c07a57fb7436d807ad505fa7319b9de13f91e741Erik            case R.id.action_edit:
525a7694eead7cbb293990bc89c3906e17bad36194cErik                if (mIsReadOnly) {
526a7694eead7cbb293990bc89c3906e17bad36194cErik                    CalendarController.getInstance(mContext).sendEventRelatedEvent(this,
52787f993ff96172f508d3f241f8a425f953c7eb739RoboErik                            EventType.EDIT_EVENT, mModel.mId, mModel.mStart, mModel.mEnd, -1, -1, -1);
528a7694eead7cbb293990bc89c3906e17bad36194cErik                } else if (!TextUtils.isEmpty(mModel.mRrule)) {
52946cde5cff48d6862f492f60c6a6336bfc047ce25Erik                    displayEditWhichDialog();
530c07a57fb7436d807ad505fa7319b9de13f91e741Erik                } else {
531c07a57fb7436d807ad505fa7319b9de13f91e741Erik                    mModification = Utils.MODIFY_ALL;
532c07a57fb7436d807ad505fa7319b9de13f91e741Erik                    updateActionBar();
533c07a57fb7436d807ad505fa7319b9de13f91e741Erik                    mView.setModification(mModification);
534c07a57fb7436d807ad505fa7319b9de13f91e741Erik                }
535c07a57fb7436d807ad505fa7319b9de13f91e741Erik                break;
5365f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
5375f62079ab9daefe95ede87631766e99e8b4a2220Erik        return true;
5385f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
5395f62079ab9daefe95ede87631766e99e8b4a2220Erik
5405f62079ab9daefe95ede87631766e99e8b4a2220Erik    private void saveReminders() {
5415f62079ab9daefe95ede87631766e99e8b4a2220Erik        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3);
542fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        boolean changed = EditEventHelper.saveReminders(ops, mModel.mId, mModel.mReminders,
543fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mOriginalModel.mReminders, false /* no force save */);
5445f62079ab9daefe95ede87631766e99e8b4a2220Erik
5455f62079ab9daefe95ede87631766e99e8b4a2220Erik        if (!changed) {
5465f62079ab9daefe95ede87631766e99e8b4a2220Erik            return;
5475f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
5485f62079ab9daefe95ede87631766e99e8b4a2220Erik
5495f62079ab9daefe95ede87631766e99e8b4a2220Erik        AsyncQueryService service = new AsyncQueryService(getActivity());
5505f62079ab9daefe95ede87631766e99e8b4a2220Erik        service.startBatch(0, null, Calendars.CONTENT_URI.getAuthority(), ops, 0);
5515f62079ab9daefe95ede87631766e99e8b4a2220Erik        // Update the "hasAlarm" field for the event
5525f62079ab9daefe95ede87631766e99e8b4a2220Erik        Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mModel.mId);
553fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        int len = mModel.mReminders.size();
5545f62079ab9daefe95ede87631766e99e8b4a2220Erik        boolean hasAlarm = len > 0;
5555f62079ab9daefe95ede87631766e99e8b4a2220Erik        if (hasAlarm != mOriginalModel.mHasAlarm) {
5565f62079ab9daefe95ede87631766e99e8b4a2220Erik            ContentValues values = new ContentValues();
5575f62079ab9daefe95ede87631766e99e8b4a2220Erik            values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0);
5585f62079ab9daefe95ede87631766e99e8b4a2220Erik            service.startUpdate(0, null, uri, values, null, null, 0);
5595f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
5605f62079ab9daefe95ede87631766e99e8b4a2220Erik
5615f62079ab9daefe95ede87631766e99e8b4a2220Erik        Toast.makeText(mContext, R.string.saving_event, Toast.LENGTH_SHORT).show();
5625f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
5635f62079ab9daefe95ede87631766e99e8b4a2220Erik
56446cde5cff48d6862f492f60c6a6336bfc047ce25Erik    protected void displayEditWhichDialog() {
56579f228124de7d98146ca526d743436f6419e2365Erik        if (!TextUtils.isEmpty(mModel.mRrule) && mModification == Utils.MODIFY_UNINITIALIZED) {
566e0dbac67413c2ca910f357ddf51a6d43162d7843RoboErik            final boolean notSynced = TextUtils.isEmpty(mModel.mSyncId);
56779f228124de7d98146ca526d743436f6419e2365Erik            boolean isFirstEventInSeries = mModel.mIsFirstEventInSeries;
56879f228124de7d98146ca526d743436f6419e2365Erik            int itemIndex = 0;
56979f228124de7d98146ca526d743436f6419e2365Erik            CharSequence[] items;
5701ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan
5711ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan            if (notSynced) {
5721ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan                // If this event has not been synced, then don't allow deleting
5731ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan                // or changing a single instance.
57479f228124de7d98146ca526d743436f6419e2365Erik                if (isFirstEventInSeries) {
57579f228124de7d98146ca526d743436f6419e2365Erik                    // Still display the option so the user knows all events are
57679f228124de7d98146ca526d743436f6419e2365Erik                    // changing
57779f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[1];
57879f228124de7d98146ca526d743436f6419e2365Erik                } else {
57979f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[2];
58079f228124de7d98146ca526d743436f6419e2365Erik                }
58179f228124de7d98146ca526d743436f6419e2365Erik            } else {
58279f228124de7d98146ca526d743436f6419e2365Erik                if (isFirstEventInSeries) {
58379f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[2];
58479f228124de7d98146ca526d743436f6419e2365Erik                } else {
58579f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[3];
58679f228124de7d98146ca526d743436f6419e2365Erik                }
58779f228124de7d98146ca526d743436f6419e2365Erik                items[itemIndex++] = mContext.getText(R.string.modify_event);
58879f228124de7d98146ca526d743436f6419e2365Erik            }
58979f228124de7d98146ca526d743436f6419e2365Erik            items[itemIndex++] = mContext.getText(R.string.modify_all);
59079f228124de7d98146ca526d743436f6419e2365Erik
59179f228124de7d98146ca526d743436f6419e2365Erik            // Do one more check to make sure this remains at the end of the list
59279f228124de7d98146ca526d743436f6419e2365Erik            if (!isFirstEventInSeries) {
59379f228124de7d98146ca526d743436f6419e2365Erik                items[itemIndex++] = mContext.getText(R.string.modify_all_following);
59479f228124de7d98146ca526d743436f6419e2365Erik            }
59579f228124de7d98146ca526d743436f6419e2365Erik
59679f228124de7d98146ca526d743436f6419e2365Erik            // Display the modification dialog.
59779f228124de7d98146ca526d743436f6419e2365Erik            if (mModifyDialog != null) {
59879f228124de7d98146ca526d743436f6419e2365Erik                mModifyDialog.dismiss();
59979f228124de7d98146ca526d743436f6419e2365Erik                mModifyDialog = null;
60079f228124de7d98146ca526d743436f6419e2365Erik            }
60128dab653f55caccbed32f700274f5274abaee089RoboErik            mModifyDialog = new AlertDialog.Builder(mContext).setTitle(R.string.edit_event_label)
60228dab653f55caccbed32f700274f5274abaee089RoboErik                    .setItems(items, new OnClickListener() {
60328dab653f55caccbed32f700274f5274abaee089RoboErik                        public void onClick(DialogInterface dialog, int which) {
60428dab653f55caccbed32f700274f5274abaee089RoboErik                            if (which == 0) {
60528dab653f55caccbed32f700274f5274abaee089RoboErik                                // Update this if we start allowing exceptions
60628dab653f55caccbed32f700274f5274abaee089RoboErik                                // to unsynced events in the app
60728dab653f55caccbed32f700274f5274abaee089RoboErik                                mModification = notSynced ? Utils.MODIFY_ALL
60828dab653f55caccbed32f700274f5274abaee089RoboErik                                        : Utils.MODIFY_SELECTED;
60928dab653f55caccbed32f700274f5274abaee089RoboErik                                if (mModification == Utils.MODIFY_SELECTED) {
61028dab653f55caccbed32f700274f5274abaee089RoboErik                                    mModel.mOriginalSyncId = notSynced ? null : mModel.mSyncId;
61128dab653f55caccbed32f700274f5274abaee089RoboErik                                    mModel.mOriginalId = mModel.mId;
61228dab653f55caccbed32f700274f5274abaee089RoboErik                                }
61328dab653f55caccbed32f700274f5274abaee089RoboErik                            } else if (which == 1) {
61428dab653f55caccbed32f700274f5274abaee089RoboErik                                mModification = notSynced ? Utils.MODIFY_ALL_FOLLOWING
61528dab653f55caccbed32f700274f5274abaee089RoboErik                                        : Utils.MODIFY_ALL;
61628dab653f55caccbed32f700274f5274abaee089RoboErik                            } else if (which == 2) {
61728dab653f55caccbed32f700274f5274abaee089RoboErik                                mModification = Utils.MODIFY_ALL_FOLLOWING;
61828dab653f55caccbed32f700274f5274abaee089RoboErik                            }
61979f228124de7d98146ca526d743436f6419e2365Erik
62028dab653f55caccbed32f700274f5274abaee089RoboErik                            mView.setModification(mModification);
62128dab653f55caccbed32f700274f5274abaee089RoboErik                            updateActionBar();
62228dab653f55caccbed32f700274f5274abaee089RoboErik                        }
62328dab653f55caccbed32f700274f5274abaee089RoboErik                    }).show();
624d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan
625d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan            mModifyDialog.setOnCancelListener(new OnCancelListener() {
626d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                @Override
627d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                public void onCancel(DialogInterface dialog) {
628d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                    Activity a = EditEventFragment.this.getActivity();
629d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                    if (a != null) {
630d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                        a.finish();
631d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                    }
632d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                }
633d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan            });
63479f228124de7d98146ca526d743436f6419e2365Erik        }
63579f228124de7d98146ca526d743436f6419e2365Erik    }
63679f228124de7d98146ca526d743436f6419e2365Erik
63779f228124de7d98146ca526d743436f6419e2365Erik    class Done implements EditEventHelper.EditDoneRunnable {
63879f228124de7d98146ca526d743436f6419e2365Erik        private int mCode = -1;
63979f228124de7d98146ca526d743436f6419e2365Erik
64079f228124de7d98146ca526d743436f6419e2365Erik        public void setDoneCode(int code) {
64179f228124de7d98146ca526d743436f6419e2365Erik            mCode = code;
64279f228124de7d98146ca526d743436f6419e2365Erik        }
64379f228124de7d98146ca526d743436f6419e2365Erik
64479f228124de7d98146ca526d743436f6419e2365Erik        public void run() {
645dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            // We only want this to get called once, either because the user
646dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            // pressed back/home or one of the buttons on screen
647dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            mSaveOnDetach = false;
648aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik            if (mModification == Utils.MODIFY_UNINITIALIZED) {
649aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik                // If this is uninitialized the user hit back, the only
650aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik                // changeable item is response to default to all events.
651aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik                mModification = Utils.MODIFY_ALL;
652aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik            }
6537b92da258a480284dcc15a518ea570072329a31dErik
654a7694eead7cbb293990bc89c3906e17bad36194cErik            if ((mCode & Utils.DONE_SAVE) != 0 && mModel != null
655a7694eead7cbb293990bc89c3906e17bad36194cErik                    && (EditEventHelper.canRespond(mModel)
656a7694eead7cbb293990bc89c3906e17bad36194cErik                            || EditEventHelper.canModifyEvent(mModel))
6576a7003d1b9bf20f4c6e001d054b1ab556ddec4a4RoboErik                    && mView.prepareForSave()
658d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan                    && !isEmptyNewEvent()
659ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden                    && mModel.normalizeReminders()
660304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan                    && mHelper.saveEvent(mModel, mOriginalModel, mModification)) {
661304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan                int stringResource;
662ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                if (!mModel.mAttendeesList.isEmpty()) {
663ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    if (mModel.mUri != null) {
664ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.saving_event_with_guest;
665ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    } else {
666ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.creating_event_with_guest;
667ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    }
668304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan                } else {
669ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    if (mModel.mUri != null) {
670ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.saving_event;
671ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    } else {
672ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.creating_event;
673ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    }
6747b92da258a480284dcc15a518ea570072329a31dErik                }
675304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan                Toast.makeText(mContext, stringResource, Toast.LENGTH_SHORT).show();
6762bd5cc06a7a89a848688416456f1b8f915542d57RoboErik            } else if ((mCode & Utils.DONE_SAVE) != 0 && mModel != null && isEmptyNewEvent()) {
6772bd5cc06a7a89a848688416456f1b8f915542d57RoboErik                Toast.makeText(mContext, R.string.empty_event, Toast.LENGTH_SHORT).show();
6787b92da258a480284dcc15a518ea570072329a31dErik            }
6797b92da258a480284dcc15a518ea570072329a31dErik
6802fda24534978f55711526dbde747aa50d68dec40RoboErik            if ((mCode & Utils.DONE_DELETE) != 0 && mOriginalModel != null
6812fda24534978f55711526dbde747aa50d68dec40RoboErik                    && EditEventHelper.canModifyCalendar(mOriginalModel)) {
6827b92da258a480284dcc15a518ea570072329a31dErik                long begin = mModel.mStart;
6837b92da258a480284dcc15a518ea570072329a31dErik                long end = mModel.mEnd;
6847b92da258a480284dcc15a518ea570072329a31dErik                int which = -1;
6857b92da258a480284dcc15a518ea570072329a31dErik                switch (mModification) {
6867b92da258a480284dcc15a518ea570072329a31dErik                    case Utils.MODIFY_SELECTED:
6877b92da258a480284dcc15a518ea570072329a31dErik                        which = DeleteEventHelper.DELETE_SELECTED;
6887b92da258a480284dcc15a518ea570072329a31dErik                        break;
6897b92da258a480284dcc15a518ea570072329a31dErik                    case Utils.MODIFY_ALL_FOLLOWING:
6907b92da258a480284dcc15a518ea570072329a31dErik                        which = DeleteEventHelper.DELETE_ALL_FOLLOWING;
6917b92da258a480284dcc15a518ea570072329a31dErik                        break;
6927b92da258a480284dcc15a518ea570072329a31dErik                    case Utils.MODIFY_ALL:
6937b92da258a480284dcc15a518ea570072329a31dErik                        which = DeleteEventHelper.DELETE_ALL;
6947b92da258a480284dcc15a518ea570072329a31dErik                        break;
6957b92da258a480284dcc15a518ea570072329a31dErik                }
696a7694eead7cbb293990bc89c3906e17bad36194cErik                DeleteEventHelper deleteHelper = new DeleteEventHelper(
697a7694eead7cbb293990bc89c3906e17bad36194cErik                        mContext, mContext, !mIsReadOnly /* exitWhenDone */);
6986663f36972c0e9df10d4d79568658cec9c8a79ccErik                deleteHelper.delete(begin, end, mOriginalModel, which);
69979f228124de7d98146ca526d743436f6419e2365Erik            }
7007b92da258a480284dcc15a518ea570072329a31dErik
7017b92da258a480284dcc15a518ea570072329a31dErik            if ((mCode & Utils.DONE_EXIT) != 0) {
7027b92da258a480284dcc15a518ea570072329a31dErik                // This will exit the edit event screen, should be called
7037b92da258a480284dcc15a518ea570072329a31dErik                // when we want to return to the main calendar views
7045f62079ab9daefe95ede87631766e99e8b4a2220Erik                EditEventFragment.this.getActivity().finish();
7057b92da258a480284dcc15a518ea570072329a31dErik            }
7067b92da258a480284dcc15a518ea570072329a31dErik
7075c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            // Hide a software keyboard so that user won't see it even after this Fragment's
7085c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            // disappearing.
7095c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            final View focusedView = mContext.getCurrentFocus();
7105c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            if (focusedView != null) {
7115c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa                mInputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0);
7125c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa                focusedView.clearFocus();
7135c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            }
71479f228124de7d98146ca526d743436f6419e2365Erik        }
71579f228124de7d98146ca526d743436f6419e2365Erik    }
71679f228124de7d98146ca526d743436f6419e2365Erik
717d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan    boolean isEmptyNewEvent() {
718d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        if (mOriginalModel != null) {
719d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            // Not new
720d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            return false;
721d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        }
722d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
723d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        return isEmpty();
724d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan    }
725d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
726d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan    private boolean isEmpty() {
727d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        if (mModel.mTitle != null) {
728d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            String title = mModel.mTitle.trim();
729d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            if (title.length() > 0) {
730d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan                return false;
731d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            }
732d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        }
733d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
734d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        if (mModel.mLocation != null) {
735d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            String location = mModel.mLocation.trim();
736d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            if (location.length() > 0) {
737d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan                return false;
738d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            }
739d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        }
740d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
741d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        if (mModel.mDescription != null) {
742d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            String description = mModel.mDescription.trim();
743d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            if (description.length() > 0) {
744d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan                return false;
745d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            }
746d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        }
747d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
748d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        return true;
749d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan    }
750d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
75179f228124de7d98146ca526d743436f6419e2365Erik    @Override
752a7694eead7cbb293990bc89c3906e17bad36194cErik    public void onPause() {
753a7694eead7cbb293990bc89c3906e17bad36194cErik        Activity act = getActivity();
75455d4c8c75b2442aee44cab0a8e52aacd7856a53aErik        if (mSaveOnDetach && act != null && !mIsReadOnly && !act.isChangingConfigurations()
75555d4c8c75b2442aee44cab0a8e52aacd7856a53aErik                && mView.prepareForSave()) {
756a7694eead7cbb293990bc89c3906e17bad36194cErik            mOnDone.setDoneCode(Utils.DONE_SAVE);
757a7694eead7cbb293990bc89c3906e17bad36194cErik            mOnDone.run();
758a7694eead7cbb293990bc89c3906e17bad36194cErik        }
759a7694eead7cbb293990bc89c3906e17bad36194cErik        super.onPause();
760a7694eead7cbb293990bc89c3906e17bad36194cErik    }
761a7694eead7cbb293990bc89c3906e17bad36194cErik
762a7694eead7cbb293990bc89c3906e17bad36194cErik    @Override
76379f228124de7d98146ca526d743436f6419e2365Erik    public void onDestroy() {
764ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov        if (mView != null) {
765ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov            mView.setModel(null);
766ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov        }
76779f228124de7d98146ca526d743436f6419e2365Erik        if (mModifyDialog != null) {
76879f228124de7d98146ca526d743436f6419e2365Erik            mModifyDialog.dismiss();
76979f228124de7d98146ca526d743436f6419e2365Erik            mModifyDialog = null;
77079f228124de7d98146ca526d743436f6419e2365Erik        }
7717b92da258a480284dcc15a518ea570072329a31dErik        super.onDestroy();
77279f228124de7d98146ca526d743436f6419e2365Erik    }
773dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
774dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    @Override
775dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public void eventsChanged() {
776dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        // TODO Requery to see if event has changed
777dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    }
778dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
779dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    @Override
78059ead671b50514b49749fcd6a1d4186a270239d2Erik    public void onSaveInstanceState(Bundle outState) {
78159ead671b50514b49749fcd6a1d4186a270239d2Erik        mView.prepareForSave();
78259ead671b50514b49749fcd6a1d4186a270239d2Erik        outState.putSerializable(BUNDLE_KEY_MODEL, mModel);
78359ead671b50514b49749fcd6a1d4186a270239d2Erik        outState.putInt(BUNDLE_KEY_EDIT_STATE, mModification);
784c130d9d5e0d178585721428e394df0c8e0a6729fErik        if (mEventBundle == null && mEvent != null) {
785c130d9d5e0d178585721428e394df0c8e0a6729fErik            mEventBundle = new EventBundle();
786c130d9d5e0d178585721428e394df0c8e0a6729fErik            mEventBundle.id = mEvent.id;
787c130d9d5e0d178585721428e394df0c8e0a6729fErik            if (mEvent.startTime != null) {
788c130d9d5e0d178585721428e394df0c8e0a6729fErik                mEventBundle.start = mEvent.startTime.toMillis(true);
789c130d9d5e0d178585721428e394df0c8e0a6729fErik            }
790c130d9d5e0d178585721428e394df0c8e0a6729fErik            if (mEvent.endTime != null) {
791c130d9d5e0d178585721428e394df0c8e0a6729fErik                mEventBundle.end = mEvent.startTime.toMillis(true);
792c130d9d5e0d178585721428e394df0c8e0a6729fErik            }
793c130d9d5e0d178585721428e394df0c8e0a6729fErik        }
794c130d9d5e0d178585721428e394df0c8e0a6729fErik
795c130d9d5e0d178585721428e394df0c8e0a6729fErik        outState.putSerializable(BUNDLE_KEY_EVENT, mEventBundle);
796a7694eead7cbb293990bc89c3906e17bad36194cErik        outState.putBoolean(BUNDLE_KEY_READ_ONLY, mIsReadOnly);
79759ead671b50514b49749fcd6a1d4186a270239d2Erik    }
79859ead671b50514b49749fcd6a1d4186a270239d2Erik
79959ead671b50514b49749fcd6a1d4186a270239d2Erik    @Override
800dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public long getSupportedEventTypes() {
8017b92da258a480284dcc15a518ea570072329a31dErik        return EventType.USER_HOME;
802dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    }
803dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
804dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    @Override
805dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public void handleEvent(EventInfo event) {
8067b92da258a480284dcc15a518ea570072329a31dErik        // It's currently unclear if we want to save the event or not when home
8077b92da258a480284dcc15a518ea570072329a31dErik        // is pressed. When creating a new event we shouldn't save since we
8087b92da258a480284dcc15a518ea570072329a31dErik        // can't get the id of the new event easily.
8097b92da258a480284dcc15a518ea570072329a31dErik        if ((false && event.eventType == EventType.USER_HOME) || (event.eventType == EventType.GO_TO
8107b92da258a480284dcc15a518ea570072329a31dErik                && mSaveOnDetach)) {
8117b92da258a480284dcc15a518ea570072329a31dErik            if (mView != null && mView.prepareForSave()) {
8127b92da258a480284dcc15a518ea570072329a31dErik                mOnDone.setDoneCode(Utils.DONE_SAVE);
8137b92da258a480284dcc15a518ea570072329a31dErik                mOnDone.run();
8147b92da258a480284dcc15a518ea570072329a31dErik            }
8157b92da258a480284dcc15a518ea570072329a31dErik        }
816dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    }
817c130d9d5e0d178585721428e394df0c8e0a6729fErik
818a7694eead7cbb293990bc89c3906e17bad36194cErik    private static class EventBundle implements Serializable {
81917c0cea5c4e5eee7b6c1676038e9223dd971007bMichael Chan        private static final long serialVersionUID = 1L;
820c130d9d5e0d178585721428e394df0c8e0a6729fErik        long id = -1;
821c130d9d5e0d178585721428e394df0c8e0a6729fErik        long start = -1;
822c130d9d5e0d178585721428e394df0c8e0a6729fErik        long end = -1;
823c130d9d5e0d178585721428e394df0c8e0a6729fErik    }
82479f228124de7d98146ca526d743436f6419e2365Erik}
825