EditEventFragment.java revision e134cd5c96507107048a50b55fe2fee85fe8e2e7
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;
384afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport android.provider.CalendarContract.Colors;
39a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Events;
40a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Reminders;
4179f228124de7d98146ca526d743436f6419e2365Erikimport android.text.TextUtils;
42c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErikimport android.text.format.Time;
4379f228124de7d98146ca526d743436f6419e2365Erikimport android.util.Log;
4479f228124de7d98146ca526d743436f6419e2365Erikimport android.view.LayoutInflater;
455f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.Menu;
465f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.MenuInflater;
475f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.MenuItem;
4879f228124de7d98146ca526d743436f6419e2365Erikimport android.view.View;
4979f228124de7d98146ca526d743436f6419e2365Erikimport android.view.ViewGroup;
505c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawaimport android.view.inputmethod.InputMethodManager;
51135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huangimport android.widget.LinearLayout;
5279f228124de7d98146ca526d743436f6419e2365Erikimport android.widget.Toast;
5379f228124de7d98146ca526d743436f6419e2365Erik
54c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.AsyncQueryService;
55c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController;
56c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventHandler;
57c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventInfo;
58c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventType;
59c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel;
60c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel.Attendee;
61c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel.ReminderEntry;
62c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.DeleteEventHelper;
63c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.R;
64c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.Utils;
65e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kungimport com.android.calendar.color.HsvColorComparator;
664afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport com.android.calendar.color.ColorPickerSwatch.OnColorSelectedListener;
67c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan
68c130d9d5e0d178585721428e394df0c8e0a6729fErikimport java.io.Serializable;
695f62079ab9daefe95ede87631766e99e8b4a2220Erikimport java.util.ArrayList;
709645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFaddenimport java.util.Collections;
715f62079ab9daefe95ede87631766e99e8b4a2220Erik
72dd95df57c8c5a58a85c4c0effad5652dec14f621Erikpublic class EditEventFragment extends Fragment implements EventHandler {
7379f228124de7d98146ca526d743436f6419e2365Erik    private static final String TAG = "EditEventActivity";
7479f228124de7d98146ca526d743436f6419e2365Erik
7559ead671b50514b49749fcd6a1d4186a270239d2Erik    private static final String BUNDLE_KEY_MODEL = "key_model";
7659ead671b50514b49749fcd6a1d4186a270239d2Erik    private static final String BUNDLE_KEY_EDIT_STATE = "key_edit_state";
77c130d9d5e0d178585721428e394df0c8e0a6729fErik    private static final String BUNDLE_KEY_EVENT = "key_event";
78a7694eead7cbb293990bc89c3906e17bad36194cErik    private static final String BUNDLE_KEY_READ_ONLY = "key_read_only";
792d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira    private static final String BUNDLE_KEY_EDIT_ON_LAUNCH = "key_edit_on_launch";
8059ead671b50514b49749fcd6a1d4186a270239d2Erik
8179f228124de7d98146ca526d743436f6419e2365Erik    private static final boolean DEBUG = false;
8279f228124de7d98146ca526d743436f6419e2365Erik
83352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_EVENT = 1;
84352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_ATTENDEES = 1 << 1;
85352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_REMINDERS = 1 << 2;
86352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_CALENDARS = 1 << 3;
874afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final int TOKEN_COLORS = 1 << 4;
884afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
89352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    private static final int TOKEN_ALL = TOKEN_EVENT | TOKEN_ATTENDEES | TOKEN_REMINDERS
904afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            | TOKEN_CALENDARS | TOKEN_COLORS;
915f62079ab9daefe95ede87631766e99e8b4a2220Erik    private static final int TOKEN_UNITIALIZED = 1 << 31;
92352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
93352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan    /**
94352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     * A bitfield of TOKEN_* to keep track which query hasn't been completed
95352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     * yet. Once all queries have returned, the model can be applied to the
96352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     * view.
97352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan     */
985f62079ab9daefe95ede87631766e99e8b4a2220Erik    private int mOutstandingQueries = TOKEN_UNITIALIZED;
9979f228124de7d98146ca526d743436f6419e2365Erik
10079f228124de7d98146ca526d743436f6419e2365Erik    EditEventHelper mHelper;
10179f228124de7d98146ca526d743436f6419e2365Erik    CalendarEventModel mModel;
10279f228124de7d98146ca526d743436f6419e2365Erik    CalendarEventModel mOriginalModel;
10359ead671b50514b49749fcd6a1d4186a270239d2Erik    CalendarEventModel mRestoreModel;
10479f228124de7d98146ca526d743436f6419e2365Erik    EditEventView mView;
10579f228124de7d98146ca526d743436f6419e2365Erik    QueryHandler mHandler;
10679f228124de7d98146ca526d743436f6419e2365Erik
10779f228124de7d98146ca526d743436f6419e2365Erik    private AlertDialog mModifyDialog;
10879f228124de7d98146ca526d743436f6419e2365Erik    int mModification = Utils.MODIFY_UNINITIALIZED;
10979f228124de7d98146ca526d743436f6419e2365Erik
1106bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private final EventInfo mEvent;
111c130d9d5e0d178585721428e394df0c8e0a6729fErik    private EventBundle mEventBundle;
11279f228124de7d98146ca526d743436f6419e2365Erik    private Uri mUri;
11379f228124de7d98146ca526d743436f6419e2365Erik    private long mBegin;
11479f228124de7d98146ca526d743436f6419e2365Erik    private long mEnd;
11509fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung    private long mCalendarId = -1;
11679f228124de7d98146ca526d743436f6419e2365Erik
1174afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private EventColorPickerDialog mDialog;
1184afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
11979f228124de7d98146ca526d743436f6419e2365Erik    private Activity mContext;
1206bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private final Done mOnDone = new Done();
121dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
122dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    private boolean mSaveOnDetach = true;
123a7694eead7cbb293990bc89c3906e17bad36194cErik    private boolean mIsReadOnly = false;
124a7694eead7cbb293990bc89c3906e17bad36194cErik    public boolean mShowModifyDialogOnLaunch = false;
12579f228124de7d98146ca526d743436f6419e2365Erik
1265c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa    private InputMethodManager mInputMethodManager;
1275c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa
1286bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private final Intent mIntent;
129c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan
130135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    private boolean mUseCustomActionBar;
131135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
1326bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private final View.OnClickListener mActionBarListener = new View.OnClickListener() {
133135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        @Override
134135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        public void onClick(View v) {
135135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            onActionBarItemSelected(v.getId());
136135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        }
137135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    };
138135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
139364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik    // TODO turn this into a helper function in EditEventHelper for building the
140364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik    // model
14179f228124de7d98146ca526d743436f6419e2365Erik    private class QueryHandler extends AsyncQueryHandler {
14279f228124de7d98146ca526d743436f6419e2365Erik        public QueryHandler(ContentResolver cr) {
14379f228124de7d98146ca526d743436f6419e2365Erik            super(cr);
14479f228124de7d98146ca526d743436f6419e2365Erik        }
14579f228124de7d98146ca526d743436f6419e2365Erik
14679f228124de7d98146ca526d743436f6419e2365Erik        @Override
14779f228124de7d98146ca526d743436f6419e2365Erik        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
14879f228124de7d98146ca526d743436f6419e2365Erik            // If the query didn't return a cursor for some reason return
14979f228124de7d98146ca526d743436f6419e2365Erik            if (cursor == null) {
15079f228124de7d98146ca526d743436f6419e2365Erik                return;
15179f228124de7d98146ca526d743436f6419e2365Erik            }
15279f228124de7d98146ca526d743436f6419e2365Erik
15379f228124de7d98146ca526d743436f6419e2365Erik            // If the Activity is finishing, then close the cursor.
15479f228124de7d98146ca526d743436f6419e2365Erik            // Otherwise, use the new cursor in the adapter.
1556a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan            final Activity activity = EditEventFragment.this.getActivity();
1566a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan            if (activity == null || activity.isFinishing()) {
15779f228124de7d98146ca526d743436f6419e2365Erik                cursor.close();
15879f228124de7d98146ca526d743436f6419e2365Erik                return;
15979f228124de7d98146ca526d743436f6419e2365Erik            }
16079f228124de7d98146ca526d743436f6419e2365Erik            long eventId;
16179f228124de7d98146ca526d743436f6419e2365Erik            switch (token) {
16279f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_EVENT:
16379f228124de7d98146ca526d743436f6419e2365Erik                    if (cursor.getCount() == 0) {
16479f228124de7d98146ca526d743436f6419e2365Erik                        // The cursor is empty. This can happen if the event
16579f228124de7d98146ca526d743436f6419e2365Erik                        // was deleted.
16679f228124de7d98146ca526d743436f6419e2365Erik                        cursor.close();
167352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        mOnDone.setDoneCode(Utils.DONE_EXIT);
16816bfd177ebb7e14703cc4b198cc86c2778ed7fe6RoboErik                        mSaveOnDetach = false;
169352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        mOnDone.run();
17079f228124de7d98146ca526d743436f6419e2365Erik                        return;
17179f228124de7d98146ca526d743436f6419e2365Erik                    }
17279f228124de7d98146ca526d743436f6419e2365Erik                    mOriginalModel = new CalendarEventModel();
17379f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.setModelFromCursor(mOriginalModel, cursor);
17479f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.setModelFromCursor(mModel, cursor);
17579f228124de7d98146ca526d743436f6419e2365Erik                    cursor.close();
17679f228124de7d98146ca526d743436f6419e2365Erik
17759ead671b50514b49749fcd6a1d4186a270239d2Erik                    mOriginalModel.mUri = mUri.toString();
17879f228124de7d98146ca526d743436f6419e2365Erik
17959ead671b50514b49749fcd6a1d4186a270239d2Erik                    mModel.mUri = mUri.toString();
18079f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mOriginalStart = mBegin;
18179f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mOriginalEnd = mEnd;
18279f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mIsFirstEventInSeries = mBegin == mOriginalModel.mStart;
18379f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mStart = mBegin;
18479f228124de7d98146ca526d743436f6419e2365Erik                    mModel.mEnd = mEnd;
18579f228124de7d98146ca526d743436f6419e2365Erik
18679f228124de7d98146ca526d743436f6419e2365Erik                    eventId = mModel.mId;
187352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
188352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // TOKEN_ATTENDEES
18979f228124de7d98146ca526d743436f6419e2365Erik                    if (mModel.mHasAttendeeData && eventId != -1) {
19079f228124de7d98146ca526d743436f6419e2365Erik                        Uri attUri = Attendees.CONTENT_URI;
19179f228124de7d98146ca526d743436f6419e2365Erik                        String[] whereArgs = {
19279f228124de7d98146ca526d743436f6419e2365Erik                            Long.toString(eventId)
19379f228124de7d98146ca526d743436f6419e2365Erik                        };
19479f228124de7d98146ca526d743436f6419e2365Erik                        mHandler.startQuery(TOKEN_ATTENDEES, null, attUri,
19579f228124de7d98146ca526d743436f6419e2365Erik                                EditEventHelper.ATTENDEES_PROJECTION,
196d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                EditEventHelper.ATTENDEES_WHERE /* selection */,
19779f228124de7d98146ca526d743436f6419e2365Erik                                whereArgs /* selection args */, null /* sort order */);
198352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    } else {
199352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        setModelIfDone(TOKEN_ATTENDEES);
200352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    }
201352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
202352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // TOKEN_REMINDERS
203352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    if (mModel.mHasAlarm) {
204d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                        Uri rUri = Reminders.CONTENT_URI;
205d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                        String[] remArgs = {
2069645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                Long.toString(eventId)
207d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                        };
2089645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        mHandler.startQuery(TOKEN_REMINDERS, null, rUri,
2099645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                EditEventHelper.REMINDERS_PROJECTION,
2109645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                EditEventHelper.REMINDERS_WHERE /* selection */,
2119645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                                remArgs /* selection args */, null /* sort order */);
21279f228124de7d98146ca526d743436f6419e2365Erik                    } else {
213352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        setModelIfDone(TOKEN_REMINDERS);
21479f228124de7d98146ca526d743436f6419e2365Erik                    }
215352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
216352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    // TOKEN_CALENDARS
217352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    String[] selArgs = {
218352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        Long.toString(mModel.mCalendarId)
219352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    };
220352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI,
221352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            EditEventHelper.CALENDARS_PROJECTION, EditEventHelper.CALENDARS_WHERE,
222352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            selArgs /* selection args */, null /* sort order */);
223352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
224352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_EVENT);
22579f228124de7d98146ca526d743436f6419e2365Erik                    break;
22679f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_ATTENDEES:
22779f228124de7d98146ca526d743436f6419e2365Erik                    try {
22879f228124de7d98146ca526d743436f6419e2365Erik                        while (cursor.moveToNext()) {
22979f228124de7d98146ca526d743436f6419e2365Erik                            String name = cursor.getString(EditEventHelper.ATTENDEES_INDEX_NAME);
23079f228124de7d98146ca526d743436f6419e2365Erik                            String email = cursor.getString(EditEventHelper.ATTENDEES_INDEX_EMAIL);
231d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            int status = cursor.getInt(EditEventHelper.ATTENDEES_INDEX_STATUS);
23279f228124de7d98146ca526d743436f6419e2365Erik                            int relationship = cursor
23379f228124de7d98146ca526d743436f6419e2365Erik                                    .getInt(EditEventHelper.ATTENDEES_INDEX_RELATIONSHIP);
234352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            if (relationship == Attendees.RELATIONSHIP_ORGANIZER) {
235352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                if (email != null) {
23679f228124de7d98146ca526d743436f6419e2365Erik                                    mModel.mOrganizer = email;
237352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                    mModel.mIsOrganizer = mModel.mOwnerAccount
238352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                            .equalsIgnoreCase(email);
239a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mOrganizer = email;
240a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mIsOrganizer = mOriginalModel.mOwnerAccount
241a7694eead7cbb293990bc89c3906e17bad36194cErik                                            .equalsIgnoreCase(email);
242352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                }
243352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
244352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                if (TextUtils.isEmpty(name)) {
245352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                    mModel.mOrganizerDisplayName = mModel.mOrganizer;
246a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mOrganizerDisplayName =
247a7694eead7cbb293990bc89c3906e17bad36194cErik                                            mOriginalModel.mOrganizer;
248352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                } else {
249352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                    mModel.mOrganizerDisplayName = name;
250a7694eead7cbb293990bc89c3906e17bad36194cErik                                    mOriginalModel.mOrganizerDisplayName = name;
25179f228124de7d98146ca526d743436f6419e2365Erik                                }
252352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            }
253352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
254352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            if (email != null) {
255d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                if (mModel.mOwnerAccount != null &&
256d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                        mModel.mOwnerAccount.equalsIgnoreCase(email)) {
257d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    int attendeeId =
258d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                        cursor.getInt(EditEventHelper.ATTENDEES_INDEX_ID);
259d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mModel.mOwnerAttendeeId = attendeeId;
260d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mModel.mSelfAttendeeStatus = status;
261d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mOriginalModel.mOwnerAttendeeId = attendeeId;
262d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    mOriginalModel.mSelfAttendeeStatus = status;
263d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                    continue;
264d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                                }
26579f228124de7d98146ca526d743436f6419e2365Erik                            }
266d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            Attendee attendee = new Attendee(name, email);
267d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            attendee.mStatus = status;
268d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            mModel.addAttendee(attendee);
269d845fbe558d5229102b58cce70a1b29fe6cb6967Erik                            mOriginalModel.addAttendee(attendee);
27079f228124de7d98146ca526d743436f6419e2365Erik                        }
27179f228124de7d98146ca526d743436f6419e2365Erik                    } finally {
27279f228124de7d98146ca526d743436f6419e2365Erik                        cursor.close();
27379f228124de7d98146ca526d743436f6419e2365Erik                    }
274352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
275352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_ATTENDEES);
27679f228124de7d98146ca526d743436f6419e2365Erik                    break;
27779f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_REMINDERS:
27879f228124de7d98146ca526d743436f6419e2365Erik                    try {
279d290a01420234214d73d31b8bfa61652625bb149Erik                        // Add all reminders to the models
28079f228124de7d98146ca526d743436f6419e2365Erik                        while (cursor.moveToNext()) {
28179f228124de7d98146ca526d743436f6419e2365Erik                            int minutes = cursor.getInt(EditEventHelper.REMINDERS_INDEX_MINUTES);
282fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            int method = cursor.getInt(EditEventHelper.REMINDERS_INDEX_METHOD);
283fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            ReminderEntry re = ReminderEntry.valueOf(minutes, method);
284fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            mModel.mReminders.add(re);
285fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                            mOriginalModel.mReminders.add(re);
28679f228124de7d98146ca526d743436f6419e2365Erik                        }
2879645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden
2889645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        // Sort appropriately for display
2899645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        Collections.sort(mModel.mReminders);
2909645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden                        Collections.sort(mOriginalModel.mReminders);
29179f228124de7d98146ca526d743436f6419e2365Erik                    } finally {
29279f228124de7d98146ca526d743436f6419e2365Erik                        cursor.close();
29379f228124de7d98146ca526d743436f6419e2365Erik                    }
294352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan
295352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_REMINDERS);
29679f228124de7d98146ca526d743436f6419e2365Erik                    break;
29779f228124de7d98146ca526d743436f6419e2365Erik                case TOKEN_CALENDARS:
298352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    try {
29909fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung                        if (mModel.mId == -1) {
30009fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung                            // Populate Calendar spinner only if no event id is set.
301352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            MatrixCursor matrixCursor = Utils.matrixCursorFromCursor(cursor);
302352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            if (DEBUG) {
303352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                Log.d(TAG, "onQueryComplete: setting cursor with "
304352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                                        + matrixCursor.getCount() + " calendars");
305352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            }
30609fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung                            mView.setCalendarsCursor(matrixCursor, isAdded() && isResumed(),
30709fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung                                    mCalendarId);
308352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        } else {
309352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            // Populate model for an existing event
310352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                            EditEventHelper.setModelFromCalendarCursor(mModel, cursor);
311a7694eead7cbb293990bc89c3906e17bad36194cErik                            EditEventHelper.setModelFromCalendarCursor(mOriginalModel, cursor);
312352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        }
3134afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        startQuery(TOKEN_COLORS, null, Colors.CONTENT_URI,
3144afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                                EditEventHelper.COLORS_PROJECTION,
3154afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                                Colors.COLOR_TYPE + "=" + Colors.TYPE_EVENT, null, null);
316352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    } finally {
317352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                        cursor.close();
31879f228124de7d98146ca526d743436f6419e2365Erik                    }
319352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                    setModelIfDone(TOKEN_CALENDARS);
32079f228124de7d98146ca526d743436f6419e2365Erik                    break;
3214afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                case TOKEN_COLORS:
3224afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    if (cursor.moveToFirst()) {
3234afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        EventColorCache cache = new EventColorCache();
3244afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        do
3254afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        {
3264afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            int colorKey = cursor.getInt(EditEventHelper.COLORS_INDEX_COLOR_KEY);
3274afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            int rawColor = cursor.getInt(EditEventHelper.COLORS_INDEX_COLOR);
3284afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            int displayColor = Utils.getDisplayColorFromColor(rawColor);
3294afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            String accountName = cursor
3304afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                                    .getString(EditEventHelper.COLORS_INDEX_ACCOUNT_NAME);
3314afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            String accountType = cursor
3324afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                                    .getString(EditEventHelper.COLORS_INDEX_ACCOUNT_TYPE);
3334afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            cache.insertColor(accountName, accountType,
3344afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                                    displayColor, colorKey);
3354afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        } while (cursor.moveToNext());
336e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung                        cache.sortPalettes(new HsvColorComparator());
3374afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
3384afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        mModel.mEventColorCache = cache;
3394afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        mView.mColorPickerNewEvent.setOnClickListener(mOnColorPickerClicked);
3404afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        mView.mColorPickerExistingEvent.setOnClickListener(mOnColorPickerClicked);
3414afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        mView.setColorPickerButtonStates(mModel.getCalendarEventColors());
3424afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    }
3434afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    if (cursor != null) {
3444afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        cursor.close();
3454afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    }
3464afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    setModelIfDone(TOKEN_COLORS);
3474afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    break;
348fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson                default:
349fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson                    cursor.close();
350fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson                    break;
35179f228124de7d98146ca526d743436f6419e2365Erik            }
35279f228124de7d98146ca526d743436f6419e2365Erik        }
35379f228124de7d98146ca526d743436f6419e2365Erik    }
35479f228124de7d98146ca526d743436f6419e2365Erik
3554afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private View.OnClickListener mOnColorPickerClicked = new View.OnClickListener() {
3564afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
3574afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        @Override
3584afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        public void onClick(View v) {
3594afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            int[] colors = mModel.getCalendarEventColors();
3604afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            if (mDialog == null) {
3614afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                mDialog = new EventColorPickerDialog(colors, mModel.mEventColor,
3624afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        mModel.mCalendarColor, mView.mIsMultipane);
3634afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                mDialog.setOnColorSelectedListener(new OnColorSelectedListener() {
3644afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
3654afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    @Override
3664afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    public void onColorSelected(int color) {
3674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        if (mModel.mEventColor != color) {
3684afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            mModel.mEventColor = color;
3694afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                            mView.updateHeadlineColor(mModel, color);
3704afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                        }
3714afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                    }
3724afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                });
3734afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            } else {
3744afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                mDialog.setCalendarColor(mModel.mCalendarColor);
3754afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                mDialog.setColors(colors, mModel.mEventColor);
3764afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            }
3774afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            if (!mDialog.isAdded()) {
3784afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                mDialog.show(getFragmentManager(), TAG);
3794afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            }
3804afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
3814afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    };
3824afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
383bdcb9fcc732d52708fafb068f535a2c93ff2356fDaisuke Miyakawa    private void setModelIfDone(int queryType) {
384352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan        synchronized (this) {
385352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mOutstandingQueries &= ~queryType;
386352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            if (mOutstandingQueries == 0) {
38759ead671b50514b49749fcd6a1d4186a270239d2Erik                if (mRestoreModel != null) {
38859ead671b50514b49749fcd6a1d4186a270239d2Erik                    mModel = mRestoreModel;
38959ead671b50514b49749fcd6a1d4186a270239d2Erik                }
3901bd94537b630fbc5556307ea92f37d4a5facecb4Erik                if (mShowModifyDialogOnLaunch && mModification == Utils.MODIFY_UNINITIALIZED) {
3911bd94537b630fbc5556307ea92f37d4a5facecb4Erik                    if (!TextUtils.isEmpty(mModel.mRrule)) {
3921bd94537b630fbc5556307ea92f37d4a5facecb4Erik                        displayEditWhichDialog();
3931bd94537b630fbc5556307ea92f37d4a5facecb4Erik                    } else {
3941bd94537b630fbc5556307ea92f37d4a5facecb4Erik                        mModification = Utils.MODIFY_ALL;
3951bd94537b630fbc5556307ea92f37d4a5facecb4Erik                    }
3961bd94537b630fbc5556307ea92f37d4a5facecb4Erik
3971bd94537b630fbc5556307ea92f37d4a5facecb4Erik                }
398352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                mView.setModel(mModel);
3993400a2bfc1e6be435ea2bb0f436a6ef338446504Erik                mView.setModification(mModification);
400c07a57fb7436d807ad505fa7319b9de13f91e741Erik            }
4015f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
4025f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
4035f62079ab9daefe95ede87631766e99e8b4a2220Erik
404dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public EditEventFragment() {
405c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan        this(null, false, null);
406a7694eead7cbb293990bc89c3906e17bad36194cErik    }
407a7694eead7cbb293990bc89c3906e17bad36194cErik
408c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan    public EditEventFragment(EventInfo event, boolean readOnly, Intent intent) {
409dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mEvent = event;
410a7694eead7cbb293990bc89c3906e17bad36194cErik        mIsReadOnly = readOnly;
411c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan        mIntent = intent;
4125f62079ab9daefe95ede87631766e99e8b4a2220Erik        setHasOptionsMenu(true);
41379f228124de7d98146ca526d743436f6419e2365Erik    }
41479f228124de7d98146ca526d743436f6419e2365Erik
41579f228124de7d98146ca526d743436f6419e2365Erik    private void startQuery() {
416dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mUri = null;
417dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mBegin = -1;
418dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mEnd = -1;
419dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        if (mEvent != null) {
420dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            if (mEvent.id != -1) {
421352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                mModel.mId = mEvent.id;
422dd95df57c8c5a58a85c4c0effad5652dec14f621Erik                mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEvent.id);
423edecd9a97e02ff14bd5abeec3414e1bf3cc631dfMichael Chan            } else {
424edecd9a97e02ff14bd5abeec3414e1bf3cc631dfMichael Chan                // New event. All day?
425edecd9a97e02ff14bd5abeec3414e1bf3cc631dfMichael Chan                mModel.mAllDay = mEvent.extraLong == CalendarController.EXTRA_CREATE_ALL_DAY;
426dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            }
427dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            if (mEvent.startTime != null) {
428dd95df57c8c5a58a85c4c0effad5652dec14f621Erik                mBegin = mEvent.startTime.toMillis(true);
429dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            }
430dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            if (mEvent.endTime != null) {
431dd95df57c8c5a58a85c4c0effad5652dec14f621Erik                mEnd = mEvent.endTime.toMillis(true);
432dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            }
43309fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung            if (mEvent.calendarId != -1) {
43409fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung                mCalendarId = mEvent.calendarId;
43509fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung            }
436c130d9d5e0d178585721428e394df0c8e0a6729fErik        } else if (mEventBundle != null) {
4373400a2bfc1e6be435ea2bb0f436a6ef338446504Erik            if (mEventBundle.id != -1) {
4383400a2bfc1e6be435ea2bb0f436a6ef338446504Erik                mModel.mId = mEventBundle.id;
4393400a2bfc1e6be435ea2bb0f436a6ef338446504Erik                mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventBundle.id);
4403400a2bfc1e6be435ea2bb0f436a6ef338446504Erik            }
441c130d9d5e0d178585721428e394df0c8e0a6729fErik            mBegin = mEventBundle.start;
442c130d9d5e0d178585721428e394df0c8e0a6729fErik            mEnd = mEventBundle.end;
443dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        }
444e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
445e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        if (mBegin <= 0) {
446e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            // use a default value instead
447e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            mBegin = mHelper.constructDefaultStartTime(System.currentTimeMillis());
448e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        }
449e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        if (mEnd < mBegin) {
450e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            // use a default value instead
451e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang            mEnd = mHelper.constructDefaultEndTime(mBegin);
452e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        }
45379f228124de7d98146ca526d743436f6419e2365Erik
45479f228124de7d98146ca526d743436f6419e2365Erik        // Kick off the query for the event
45579f228124de7d98146ca526d743436f6419e2365Erik        boolean newEvent = mUri == null;
45679f228124de7d98146ca526d743436f6419e2365Erik        if (!newEvent) {
457ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik            mModel.mCalendarAccessLevel = Calendars.CAL_ACCESS_NONE;
458352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mOutstandingQueries = TOKEN_ALL;
45979f228124de7d98146ca526d743436f6419e2365Erik            if (DEBUG) {
460352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                Log.d(TAG, "startQuery: uri for event is " + mUri.toString());
46179f228124de7d98146ca526d743436f6419e2365Erik            }
46279f228124de7d98146ca526d743436f6419e2365Erik            mHandler.startQuery(TOKEN_EVENT, null, mUri, EditEventHelper.EVENT_PROJECTION,
46379f228124de7d98146ca526d743436f6419e2365Erik                    null /* selection */, null /* selection args */, null /* sort order */);
46479f228124de7d98146ca526d743436f6419e2365Erik        } else {
465352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan            mOutstandingQueries = TOKEN_CALENDARS;
46679f228124de7d98146ca526d743436f6419e2365Erik            if (DEBUG) {
467352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan                Log.d(TAG, "startQuery: Editing a new event.");
46879f228124de7d98146ca526d743436f6419e2365Erik            }
469f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan            mModel.mOriginalStart = mBegin;
470f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan            mModel.mOriginalEnd = mEnd;
47179f228124de7d98146ca526d743436f6419e2365Erik            mModel.mStart = mBegin;
47279f228124de7d98146ca526d743436f6419e2365Erik            mModel.mEnd = mEnd;
47309fbd8e9ef61f667c0f20d36fbf40e5a4479c8d9James Kung            mModel.mCalendarId = mCalendarId;
474d845fbe558d5229102b58cce70a1b29fe6cb6967Erik            mModel.mSelfAttendeeStatus = Attendees.ATTENDEE_STATUS_ACCEPTED;
47579f228124de7d98146ca526d743436f6419e2365Erik
47679f228124de7d98146ca526d743436f6419e2365Erik            // Start a query in the background to read the list of calendars
47779f228124de7d98146ca526d743436f6419e2365Erik            mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI,
47879f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.CALENDARS_PROJECTION,
47979f228124de7d98146ca526d743436f6419e2365Erik                    EditEventHelper.CALENDARS_WHERE_WRITEABLE_VISIBLE, null /* selection args */,
48079f228124de7d98146ca526d743436f6419e2365Erik                    null /* sort order */);
481c07a57fb7436d807ad505fa7319b9de13f91e741Erik
482c07a57fb7436d807ad505fa7319b9de13f91e741Erik            mModification = Utils.MODIFY_ALL;
483c07a57fb7436d807ad505fa7319b9de13f91e741Erik            mView.setModification(mModification);
48479f228124de7d98146ca526d743436f6419e2365Erik        }
48579f228124de7d98146ca526d743436f6419e2365Erik    }
48679f228124de7d98146ca526d743436f6419e2365Erik
48779f228124de7d98146ca526d743436f6419e2365Erik    @Override
48879f228124de7d98146ca526d743436f6419e2365Erik    public void onAttach(Activity activity) {
48979f228124de7d98146ca526d743436f6419e2365Erik        super.onAttach(activity);
49079f228124de7d98146ca526d743436f6419e2365Erik        mContext = activity;
49179f228124de7d98146ca526d743436f6419e2365Erik
492dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mHelper = new EditEventHelper(activity, null);
49379f228124de7d98146ca526d743436f6419e2365Erik        mHandler = new QueryHandler(activity.getContentResolver());
494c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan        mModel = new CalendarEventModel(activity, mIntent);
4955c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa        mInputMethodManager = (InputMethodManager)
4965c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa                activity.getSystemService(Context.INPUT_METHOD_SERVICE);
497135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
4987ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson        mUseCustomActionBar = !Utils.getConfigBool(mContext, R.bool.multiple_pane_config);
49979f228124de7d98146ca526d743436f6419e2365Erik    }
50079f228124de7d98146ca526d743436f6419e2365Erik
50179f228124de7d98146ca526d743436f6419e2365Erik    @Override
50279f228124de7d98146ca526d743436f6419e2365Erik    public View onCreateView(LayoutInflater inflater, ViewGroup container,
50379f228124de7d98146ca526d743436f6419e2365Erik            Bundle savedInstanceState) {
50479f228124de7d98146ca526d743436f6419e2365Erik//        mContext.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
505a7694eead7cbb293990bc89c3906e17bad36194cErik        View view;
506a7694eead7cbb293990bc89c3906e17bad36194cErik        if (mIsReadOnly) {
507a7694eead7cbb293990bc89c3906e17bad36194cErik            view = inflater.inflate(R.layout.edit_event_single_column, null);
508a7694eead7cbb293990bc89c3906e17bad36194cErik        } else {
509a7694eead7cbb293990bc89c3906e17bad36194cErik            view = inflater.inflate(R.layout.edit_event, null);
510a7694eead7cbb293990bc89c3906e17bad36194cErik        }
511dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        mView = new EditEventView(mContext, view, mOnDone);
51279f228124de7d98146ca526d743436f6419e2365Erik        startQuery();
513135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
514135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        if (mUseCustomActionBar) {
515135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            View actionBarButtons = inflater.inflate(R.layout.edit_event_custom_actionbar,
516135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang                    new LinearLayout(mContext), false);
517135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            View cancelActionView = actionBarButtons.findViewById(R.id.action_cancel);
518135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            cancelActionView.setOnClickListener(mActionBarListener);
519135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            View doneActionView = actionBarButtons.findViewById(R.id.action_done);
520135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            doneActionView.setOnClickListener(mActionBarListener);
521135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
522135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            mContext.getActionBar().setCustomView(actionBarButtons);
523135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        }
524135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
52579f228124de7d98146ca526d743436f6419e2365Erik        return view;
52679f228124de7d98146ca526d743436f6419e2365Erik    }
52779f228124de7d98146ca526d743436f6419e2365Erik
52879f228124de7d98146ca526d743436f6419e2365Erik    @Override
529135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    public void onDestroyView() {
530135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        super.onDestroyView();
531135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
532135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        if (mUseCustomActionBar) {
533135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            mContext.getActionBar().setCustomView(null);
534135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        }
535135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    }
536135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
537135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    @Override
53879f228124de7d98146ca526d743436f6419e2365Erik    public void onCreate(Bundle savedInstanceState) {
53979f228124de7d98146ca526d743436f6419e2365Erik        super.onCreate(savedInstanceState);
54059ead671b50514b49749fcd6a1d4186a270239d2Erik        if (savedInstanceState != null) {
54159ead671b50514b49749fcd6a1d4186a270239d2Erik            if (savedInstanceState.containsKey(BUNDLE_KEY_MODEL)) {
54259ead671b50514b49749fcd6a1d4186a270239d2Erik                mRestoreModel = (CalendarEventModel) savedInstanceState.getSerializable(
54359ead671b50514b49749fcd6a1d4186a270239d2Erik                        BUNDLE_KEY_MODEL);
54459ead671b50514b49749fcd6a1d4186a270239d2Erik            }
54559ead671b50514b49749fcd6a1d4186a270239d2Erik            if (savedInstanceState.containsKey(BUNDLE_KEY_EDIT_STATE)) {
54659ead671b50514b49749fcd6a1d4186a270239d2Erik                mModification = savedInstanceState.getInt(BUNDLE_KEY_EDIT_STATE);
54759ead671b50514b49749fcd6a1d4186a270239d2Erik            }
5482d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira            if (savedInstanceState.containsKey(BUNDLE_KEY_EDIT_ON_LAUNCH)) {
5492d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira                mShowModifyDialogOnLaunch = savedInstanceState
5502d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira                        .getBoolean(BUNDLE_KEY_EDIT_ON_LAUNCH);
5512d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira            }
552c130d9d5e0d178585721428e394df0c8e0a6729fErik            if (savedInstanceState.containsKey(BUNDLE_KEY_EVENT)) {
553c130d9d5e0d178585721428e394df0c8e0a6729fErik                mEventBundle = (EventBundle) savedInstanceState.getSerializable(BUNDLE_KEY_EVENT);
554c130d9d5e0d178585721428e394df0c8e0a6729fErik            }
555a7694eead7cbb293990bc89c3906e17bad36194cErik            if (savedInstanceState.containsKey(BUNDLE_KEY_READ_ONLY)) {
556a7694eead7cbb293990bc89c3906e17bad36194cErik                mIsReadOnly = savedInstanceState.getBoolean(BUNDLE_KEY_READ_ONLY);
557a7694eead7cbb293990bc89c3906e17bad36194cErik            }
55859ead671b50514b49749fcd6a1d4186a270239d2Erik        }
55979f228124de7d98146ca526d743436f6419e2365Erik    }
5605f62079ab9daefe95ede87631766e99e8b4a2220Erik
5615f62079ab9daefe95ede87631766e99e8b4a2220Erik
5625f62079ab9daefe95ede87631766e99e8b4a2220Erik    @Override
5635f62079ab9daefe95ede87631766e99e8b4a2220Erik    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
5645f62079ab9daefe95ede87631766e99e8b4a2220Erik        super.onCreateOptionsMenu(menu, inflater);
565135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
566135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        if (!mUseCustomActionBar) {
567135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang            inflater.inflate(R.menu.edit_event_title_bar, menu);
5685f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
5695f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
5705f62079ab9daefe95ede87631766e99e8b4a2220Erik
5715f62079ab9daefe95ede87631766e99e8b4a2220Erik    @Override
5725f62079ab9daefe95ede87631766e99e8b4a2220Erik    public boolean onOptionsItemSelected(MenuItem item) {
573135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang        return onActionBarItemSelected(item.getItemId());
574135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    }
575135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang
576135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    /**
577135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     * Handles menu item selections, whether they come from our custom action bar buttons or from
578135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     * the standard menu items. Depends on the menu item ids matching the custom action bar button
579135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     * ids.
580135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     *
581135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     * @param itemId the button or menu item id
582135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     * @return whether the event was handled here
583135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang     */
584135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang    private boolean onActionBarItemSelected(int itemId) {
585bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        if (itemId == R.id.action_done) {
586bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            if (EditEventHelper.canModifyEvent(mModel) || EditEventHelper.canRespond(mModel)) {
587bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                if (mView != null && mView.prepareForSave()) {
588bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                    if (mModification == Utils.MODIFY_UNINITIALIZED) {
589bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                        mModification = Utils.MODIFY_ALL;
5905f62079ab9daefe95ede87631766e99e8b4a2220Erik                    }
591bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                    mOnDone.setDoneCode(Utils.DONE_SAVE | Utils.DONE_EXIT);
5925f62079ab9daefe95ede87631766e99e8b4a2220Erik                    mOnDone.run();
5935f62079ab9daefe95ede87631766e99e8b4a2220Erik                } else {
5945f62079ab9daefe95ede87631766e99e8b4a2220Erik                    mOnDone.setDoneCode(Utils.DONE_REVERT);
5955f62079ab9daefe95ede87631766e99e8b4a2220Erik                    mOnDone.run();
5965f62079ab9daefe95ede87631766e99e8b4a2220Erik                }
597bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            } else if (EditEventHelper.canAddReminders(mModel) && mModel.mId != -1
598bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                    && mOriginalModel != null && mView.prepareForSave()) {
599bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                saveReminders();
600bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                mOnDone.setDoneCode(Utils.DONE_EXIT);
601bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan                mOnDone.run();
602bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            } else {
6035f62079ab9daefe95ede87631766e99e8b4a2220Erik                mOnDone.setDoneCode(Utils.DONE_REVERT);
6045f62079ab9daefe95ede87631766e99e8b4a2220Erik                mOnDone.run();
605bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            }
606bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan        } else if (itemId == R.id.action_cancel) {
607bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            mOnDone.setDoneCode(Utils.DONE_REVERT);
608bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan            mOnDone.run();
6095f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
6105f62079ab9daefe95ede87631766e99e8b4a2220Erik        return true;
6115f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
6125f62079ab9daefe95ede87631766e99e8b4a2220Erik
6135f62079ab9daefe95ede87631766e99e8b4a2220Erik    private void saveReminders() {
6145f62079ab9daefe95ede87631766e99e8b4a2220Erik        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3);
615fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        boolean changed = EditEventHelper.saveReminders(ops, mModel.mId, mModel.mReminders,
616fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mOriginalModel.mReminders, false /* no force save */);
6175f62079ab9daefe95ede87631766e99e8b4a2220Erik
6185f62079ab9daefe95ede87631766e99e8b4a2220Erik        if (!changed) {
6195f62079ab9daefe95ede87631766e99e8b4a2220Erik            return;
6205f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
6215f62079ab9daefe95ede87631766e99e8b4a2220Erik
6225f62079ab9daefe95ede87631766e99e8b4a2220Erik        AsyncQueryService service = new AsyncQueryService(getActivity());
6235f62079ab9daefe95ede87631766e99e8b4a2220Erik        service.startBatch(0, null, Calendars.CONTENT_URI.getAuthority(), ops, 0);
6245f62079ab9daefe95ede87631766e99e8b4a2220Erik        // Update the "hasAlarm" field for the event
6255f62079ab9daefe95ede87631766e99e8b4a2220Erik        Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mModel.mId);
626fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        int len = mModel.mReminders.size();
6275f62079ab9daefe95ede87631766e99e8b4a2220Erik        boolean hasAlarm = len > 0;
6285f62079ab9daefe95ede87631766e99e8b4a2220Erik        if (hasAlarm != mOriginalModel.mHasAlarm) {
6295f62079ab9daefe95ede87631766e99e8b4a2220Erik            ContentValues values = new ContentValues();
6305f62079ab9daefe95ede87631766e99e8b4a2220Erik            values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0);
6315f62079ab9daefe95ede87631766e99e8b4a2220Erik            service.startUpdate(0, null, uri, values, null, null, 0);
6325f62079ab9daefe95ede87631766e99e8b4a2220Erik        }
6335f62079ab9daefe95ede87631766e99e8b4a2220Erik
6345f62079ab9daefe95ede87631766e99e8b4a2220Erik        Toast.makeText(mContext, R.string.saving_event, Toast.LENGTH_SHORT).show();
6355f62079ab9daefe95ede87631766e99e8b4a2220Erik    }
6365f62079ab9daefe95ede87631766e99e8b4a2220Erik
63746cde5cff48d6862f492f60c6a6336bfc047ce25Erik    protected void displayEditWhichDialog() {
6382d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira        if (mModification == Utils.MODIFY_UNINITIALIZED) {
639e0dbac67413c2ca910f357ddf51a6d43162d7843RoboErik            final boolean notSynced = TextUtils.isEmpty(mModel.mSyncId);
64079f228124de7d98146ca526d743436f6419e2365Erik            boolean isFirstEventInSeries = mModel.mIsFirstEventInSeries;
64179f228124de7d98146ca526d743436f6419e2365Erik            int itemIndex = 0;
64279f228124de7d98146ca526d743436f6419e2365Erik            CharSequence[] items;
6431ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan
6441ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan            if (notSynced) {
6451ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan                // If this event has not been synced, then don't allow deleting
6461ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan                // or changing a single instance.
64779f228124de7d98146ca526d743436f6419e2365Erik                if (isFirstEventInSeries) {
64879f228124de7d98146ca526d743436f6419e2365Erik                    // Still display the option so the user knows all events are
64979f228124de7d98146ca526d743436f6419e2365Erik                    // changing
65079f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[1];
65179f228124de7d98146ca526d743436f6419e2365Erik                } else {
65279f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[2];
65379f228124de7d98146ca526d743436f6419e2365Erik                }
65479f228124de7d98146ca526d743436f6419e2365Erik            } else {
65579f228124de7d98146ca526d743436f6419e2365Erik                if (isFirstEventInSeries) {
65679f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[2];
65779f228124de7d98146ca526d743436f6419e2365Erik                } else {
65879f228124de7d98146ca526d743436f6419e2365Erik                    items = new CharSequence[3];
65979f228124de7d98146ca526d743436f6419e2365Erik                }
66079f228124de7d98146ca526d743436f6419e2365Erik                items[itemIndex++] = mContext.getText(R.string.modify_event);
66179f228124de7d98146ca526d743436f6419e2365Erik            }
66279f228124de7d98146ca526d743436f6419e2365Erik            items[itemIndex++] = mContext.getText(R.string.modify_all);
66379f228124de7d98146ca526d743436f6419e2365Erik
66479f228124de7d98146ca526d743436f6419e2365Erik            // Do one more check to make sure this remains at the end of the list
66579f228124de7d98146ca526d743436f6419e2365Erik            if (!isFirstEventInSeries) {
66679f228124de7d98146ca526d743436f6419e2365Erik                items[itemIndex++] = mContext.getText(R.string.modify_all_following);
66779f228124de7d98146ca526d743436f6419e2365Erik            }
66879f228124de7d98146ca526d743436f6419e2365Erik
66979f228124de7d98146ca526d743436f6419e2365Erik            // Display the modification dialog.
67079f228124de7d98146ca526d743436f6419e2365Erik            if (mModifyDialog != null) {
67179f228124de7d98146ca526d743436f6419e2365Erik                mModifyDialog.dismiss();
67279f228124de7d98146ca526d743436f6419e2365Erik                mModifyDialog = null;
67379f228124de7d98146ca526d743436f6419e2365Erik            }
67428dab653f55caccbed32f700274f5274abaee089RoboErik            mModifyDialog = new AlertDialog.Builder(mContext).setTitle(R.string.edit_event_label)
67528dab653f55caccbed32f700274f5274abaee089RoboErik                    .setItems(items, new OnClickListener() {
676f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan                        @Override
67728dab653f55caccbed32f700274f5274abaee089RoboErik                        public void onClick(DialogInterface dialog, int which) {
67828dab653f55caccbed32f700274f5274abaee089RoboErik                            if (which == 0) {
67928dab653f55caccbed32f700274f5274abaee089RoboErik                                // Update this if we start allowing exceptions
68028dab653f55caccbed32f700274f5274abaee089RoboErik                                // to unsynced events in the app
68128dab653f55caccbed32f700274f5274abaee089RoboErik                                mModification = notSynced ? Utils.MODIFY_ALL
68228dab653f55caccbed32f700274f5274abaee089RoboErik                                        : Utils.MODIFY_SELECTED;
68328dab653f55caccbed32f700274f5274abaee089RoboErik                                if (mModification == Utils.MODIFY_SELECTED) {
68428dab653f55caccbed32f700274f5274abaee089RoboErik                                    mModel.mOriginalSyncId = notSynced ? null : mModel.mSyncId;
68528dab653f55caccbed32f700274f5274abaee089RoboErik                                    mModel.mOriginalId = mModel.mId;
68628dab653f55caccbed32f700274f5274abaee089RoboErik                                }
68728dab653f55caccbed32f700274f5274abaee089RoboErik                            } else if (which == 1) {
68828dab653f55caccbed32f700274f5274abaee089RoboErik                                mModification = notSynced ? Utils.MODIFY_ALL_FOLLOWING
68928dab653f55caccbed32f700274f5274abaee089RoboErik                                        : Utils.MODIFY_ALL;
69028dab653f55caccbed32f700274f5274abaee089RoboErik                            } else if (which == 2) {
69128dab653f55caccbed32f700274f5274abaee089RoboErik                                mModification = Utils.MODIFY_ALL_FOLLOWING;
69228dab653f55caccbed32f700274f5274abaee089RoboErik                            }
69379f228124de7d98146ca526d743436f6419e2365Erik
69428dab653f55caccbed32f700274f5274abaee089RoboErik                            mView.setModification(mModification);
69528dab653f55caccbed32f700274f5274abaee089RoboErik                        }
69628dab653f55caccbed32f700274f5274abaee089RoboErik                    }).show();
697d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan
698d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan            mModifyDialog.setOnCancelListener(new OnCancelListener() {
699d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                @Override
700d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                public void onCancel(DialogInterface dialog) {
701d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                    Activity a = EditEventFragment.this.getActivity();
702d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                    if (a != null) {
703d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                        a.finish();
704d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                    }
705d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan                }
706d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan            });
70779f228124de7d98146ca526d743436f6419e2365Erik        }
70879f228124de7d98146ca526d743436f6419e2365Erik    }
70979f228124de7d98146ca526d743436f6419e2365Erik
71079f228124de7d98146ca526d743436f6419e2365Erik    class Done implements EditEventHelper.EditDoneRunnable {
71179f228124de7d98146ca526d743436f6419e2365Erik        private int mCode = -1;
71279f228124de7d98146ca526d743436f6419e2365Erik
713f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan        @Override
71479f228124de7d98146ca526d743436f6419e2365Erik        public void setDoneCode(int code) {
71579f228124de7d98146ca526d743436f6419e2365Erik            mCode = code;
71679f228124de7d98146ca526d743436f6419e2365Erik        }
71779f228124de7d98146ca526d743436f6419e2365Erik
718f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan        @Override
71979f228124de7d98146ca526d743436f6419e2365Erik        public void run() {
720dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            // We only want this to get called once, either because the user
721dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            // pressed back/home or one of the buttons on screen
722dd95df57c8c5a58a85c4c0effad5652dec14f621Erik            mSaveOnDetach = false;
723aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik            if (mModification == Utils.MODIFY_UNINITIALIZED) {
724aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik                // If this is uninitialized the user hit back, the only
725aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik                // changeable item is response to default to all events.
726aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik                mModification = Utils.MODIFY_ALL;
727aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik            }
7287b92da258a480284dcc15a518ea570072329a31dErik
729a7694eead7cbb293990bc89c3906e17bad36194cErik            if ((mCode & Utils.DONE_SAVE) != 0 && mModel != null
730a7694eead7cbb293990bc89c3906e17bad36194cErik                    && (EditEventHelper.canRespond(mModel)
731a7694eead7cbb293990bc89c3906e17bad36194cErik                            || EditEventHelper.canModifyEvent(mModel))
7326a7003d1b9bf20f4c6e001d054b1ab556ddec4a4RoboErik                    && mView.prepareForSave()
733d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan                    && !isEmptyNewEvent()
734ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden                    && mModel.normalizeReminders()
735304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan                    && mHelper.saveEvent(mModel, mOriginalModel, mModification)) {
736304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan                int stringResource;
737ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                if (!mModel.mAttendeesList.isEmpty()) {
738ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    if (mModel.mUri != null) {
739ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.saving_event_with_guest;
740ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    } else {
741ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.creating_event_with_guest;
742ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    }
743304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan                } else {
744ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    if (mModel.mUri != null) {
745ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.saving_event;
746ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    } else {
747ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                        stringResource = R.string.creating_event;
748ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan                    }
7497b92da258a480284dcc15a518ea570072329a31dErik                }
750304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan                Toast.makeText(mContext, stringResource, Toast.LENGTH_SHORT).show();
7512bd5cc06a7a89a848688416456f1b8f915542d57RoboErik            } else if ((mCode & Utils.DONE_SAVE) != 0 && mModel != null && isEmptyNewEvent()) {
7522bd5cc06a7a89a848688416456f1b8f915542d57RoboErik                Toast.makeText(mContext, R.string.empty_event, Toast.LENGTH_SHORT).show();
7537b92da258a480284dcc15a518ea570072329a31dErik            }
7547b92da258a480284dcc15a518ea570072329a31dErik
7552fda24534978f55711526dbde747aa50d68dec40RoboErik            if ((mCode & Utils.DONE_DELETE) != 0 && mOriginalModel != null
7562fda24534978f55711526dbde747aa50d68dec40RoboErik                    && EditEventHelper.canModifyCalendar(mOriginalModel)) {
7577b92da258a480284dcc15a518ea570072329a31dErik                long begin = mModel.mStart;
7587b92da258a480284dcc15a518ea570072329a31dErik                long end = mModel.mEnd;
7597b92da258a480284dcc15a518ea570072329a31dErik                int which = -1;
7607b92da258a480284dcc15a518ea570072329a31dErik                switch (mModification) {
7617b92da258a480284dcc15a518ea570072329a31dErik                    case Utils.MODIFY_SELECTED:
7627b92da258a480284dcc15a518ea570072329a31dErik                        which = DeleteEventHelper.DELETE_SELECTED;
7637b92da258a480284dcc15a518ea570072329a31dErik                        break;
7647b92da258a480284dcc15a518ea570072329a31dErik                    case Utils.MODIFY_ALL_FOLLOWING:
7657b92da258a480284dcc15a518ea570072329a31dErik                        which = DeleteEventHelper.DELETE_ALL_FOLLOWING;
7667b92da258a480284dcc15a518ea570072329a31dErik                        break;
7677b92da258a480284dcc15a518ea570072329a31dErik                    case Utils.MODIFY_ALL:
7687b92da258a480284dcc15a518ea570072329a31dErik                        which = DeleteEventHelper.DELETE_ALL;
7697b92da258a480284dcc15a518ea570072329a31dErik                        break;
7707b92da258a480284dcc15a518ea570072329a31dErik                }
771a7694eead7cbb293990bc89c3906e17bad36194cErik                DeleteEventHelper deleteHelper = new DeleteEventHelper(
772a7694eead7cbb293990bc89c3906e17bad36194cErik                        mContext, mContext, !mIsReadOnly /* exitWhenDone */);
7736663f36972c0e9df10d4d79568658cec9c8a79ccErik                deleteHelper.delete(begin, end, mOriginalModel, which);
77479f228124de7d98146ca526d743436f6419e2365Erik            }
7757b92da258a480284dcc15a518ea570072329a31dErik
7767b92da258a480284dcc15a518ea570072329a31dErik            if ((mCode & Utils.DONE_EXIT) != 0) {
7777b92da258a480284dcc15a518ea570072329a31dErik                // This will exit the edit event screen, should be called
7787b92da258a480284dcc15a518ea570072329a31dErik                // when we want to return to the main calendar views
7794024dee06fbe7c4bbd5b56e7d58917e86b66802eIsaac Katzenelson                if ((mCode & Utils.DONE_SAVE) != 0) {
7804024dee06fbe7c4bbd5b56e7d58917e86b66802eIsaac Katzenelson                    if (mContext != null) {
781c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                        long start = mModel.mStart;
782c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                        long end = mModel.mEnd;
783c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                        if (mModel.mAllDay) {
784c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            // For allday events we want to go to the day in the
785c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            // user's current tz
786c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            String tz = Utils.getTimeZone(mContext, null);
787c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            Time t = new Time(Time.TIMEZONE_UTC);
788c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            t.set(start);
789c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            t.timezone = tz;
790c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            start = t.toMillis(true);
791c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik
792c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            t.timezone = Time.TIMEZONE_UTC;
793c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            t.set(end);
794c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            t.timezone = tz;
795c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                            end = t.toMillis(true);
796c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik                        }
7976bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson                        CalendarController.getInstance(mContext).launchViewEvent(-1, start, end,
7986bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson                                Attendees.ATTENDEE_STATUS_NONE);
7994024dee06fbe7c4bbd5b56e7d58917e86b66802eIsaac Katzenelson                    }
8004024dee06fbe7c4bbd5b56e7d58917e86b66802eIsaac Katzenelson                }
8010d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan                Activity a = EditEventFragment.this.getActivity();
8020d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan                if (a != null) {
8030d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan                    a.finish();
8040d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan                }
8057b92da258a480284dcc15a518ea570072329a31dErik            }
8067b92da258a480284dcc15a518ea570072329a31dErik
8075c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            // Hide a software keyboard so that user won't see it even after this Fragment's
8085c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            // disappearing.
8095c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            final View focusedView = mContext.getCurrentFocus();
8105c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            if (focusedView != null) {
8115c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa                mInputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0);
8125c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa                focusedView.clearFocus();
8135c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa            }
81479f228124de7d98146ca526d743436f6419e2365Erik        }
81579f228124de7d98146ca526d743436f6419e2365Erik    }
81679f228124de7d98146ca526d743436f6419e2365Erik
817d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan    boolean isEmptyNewEvent() {
818d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        if (mOriginalModel != null) {
819d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            // Not new
820d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan            return false;
821d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        }
822d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
823f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan        if (mModel.mOriginalStart != mModel.mStart || mModel.mOriginalEnd != mModel.mEnd) {
824f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan            return false;
825d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        }
826d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
827f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan        if (!mModel.mAttendeesList.isEmpty()) {
828f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan            return false;
829d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan        }
830d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
831f9fa0ab81b8f17679af806c0edc2e227aa798ad4Michael Chan        return mModel.isEmpty();
832d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan    }
833d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan
83479f228124de7d98146ca526d743436f6419e2365Erik    @Override
835a7694eead7cbb293990bc89c3906e17bad36194cErik    public void onPause() {
836a7694eead7cbb293990bc89c3906e17bad36194cErik        Activity act = getActivity();
83755d4c8c75b2442aee44cab0a8e52aacd7856a53aErik        if (mSaveOnDetach && act != null && !mIsReadOnly && !act.isChangingConfigurations()
83855d4c8c75b2442aee44cab0a8e52aacd7856a53aErik                && mView.prepareForSave()) {
839a7694eead7cbb293990bc89c3906e17bad36194cErik            mOnDone.setDoneCode(Utils.DONE_SAVE);
840a7694eead7cbb293990bc89c3906e17bad36194cErik            mOnDone.run();
841a7694eead7cbb293990bc89c3906e17bad36194cErik        }
842a7694eead7cbb293990bc89c3906e17bad36194cErik        super.onPause();
843a7694eead7cbb293990bc89c3906e17bad36194cErik    }
844a7694eead7cbb293990bc89c3906e17bad36194cErik
845a7694eead7cbb293990bc89c3906e17bad36194cErik    @Override
84679f228124de7d98146ca526d743436f6419e2365Erik    public void onDestroy() {
847ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov        if (mView != null) {
848ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov            mView.setModel(null);
849ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov        }
85079f228124de7d98146ca526d743436f6419e2365Erik        if (mModifyDialog != null) {
85179f228124de7d98146ca526d743436f6419e2365Erik            mModifyDialog.dismiss();
85279f228124de7d98146ca526d743436f6419e2365Erik            mModifyDialog = null;
85379f228124de7d98146ca526d743436f6419e2365Erik        }
8547b92da258a480284dcc15a518ea570072329a31dErik        super.onDestroy();
85579f228124de7d98146ca526d743436f6419e2365Erik    }
856dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
857dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    @Override
858dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public void eventsChanged() {
859dd95df57c8c5a58a85c4c0effad5652dec14f621Erik        // TODO Requery to see if event has changed
860dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    }
861dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
862dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    @Override
86359ead671b50514b49749fcd6a1d4186a270239d2Erik    public void onSaveInstanceState(Bundle outState) {
86459ead671b50514b49749fcd6a1d4186a270239d2Erik        mView.prepareForSave();
86559ead671b50514b49749fcd6a1d4186a270239d2Erik        outState.putSerializable(BUNDLE_KEY_MODEL, mModel);
86659ead671b50514b49749fcd6a1d4186a270239d2Erik        outState.putInt(BUNDLE_KEY_EDIT_STATE, mModification);
867c130d9d5e0d178585721428e394df0c8e0a6729fErik        if (mEventBundle == null && mEvent != null) {
868c130d9d5e0d178585721428e394df0c8e0a6729fErik            mEventBundle = new EventBundle();
869c130d9d5e0d178585721428e394df0c8e0a6729fErik            mEventBundle.id = mEvent.id;
870c130d9d5e0d178585721428e394df0c8e0a6729fErik            if (mEvent.startTime != null) {
871c130d9d5e0d178585721428e394df0c8e0a6729fErik                mEventBundle.start = mEvent.startTime.toMillis(true);
872c130d9d5e0d178585721428e394df0c8e0a6729fErik            }
873c130d9d5e0d178585721428e394df0c8e0a6729fErik            if (mEvent.endTime != null) {
874c130d9d5e0d178585721428e394df0c8e0a6729fErik                mEventBundle.end = mEvent.startTime.toMillis(true);
875c130d9d5e0d178585721428e394df0c8e0a6729fErik            }
876c130d9d5e0d178585721428e394df0c8e0a6729fErik        }
8772d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira        outState.putBoolean(BUNDLE_KEY_EDIT_ON_LAUNCH, mShowModifyDialogOnLaunch);
878c130d9d5e0d178585721428e394df0c8e0a6729fErik        outState.putSerializable(BUNDLE_KEY_EVENT, mEventBundle);
879a7694eead7cbb293990bc89c3906e17bad36194cErik        outState.putBoolean(BUNDLE_KEY_READ_ONLY, mIsReadOnly);
88059ead671b50514b49749fcd6a1d4186a270239d2Erik    }
88159ead671b50514b49749fcd6a1d4186a270239d2Erik
88259ead671b50514b49749fcd6a1d4186a270239d2Erik    @Override
883dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public long getSupportedEventTypes() {
8847b92da258a480284dcc15a518ea570072329a31dErik        return EventType.USER_HOME;
885dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    }
886dd95df57c8c5a58a85c4c0effad5652dec14f621Erik
887dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    @Override
888dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    public void handleEvent(EventInfo event) {
8897b92da258a480284dcc15a518ea570072329a31dErik        // It's currently unclear if we want to save the event or not when home
8907b92da258a480284dcc15a518ea570072329a31dErik        // is pressed. When creating a new event we shouldn't save since we
8917b92da258a480284dcc15a518ea570072329a31dErik        // can't get the id of the new event easily.
8927b92da258a480284dcc15a518ea570072329a31dErik        if ((false && event.eventType == EventType.USER_HOME) || (event.eventType == EventType.GO_TO
8937b92da258a480284dcc15a518ea570072329a31dErik                && mSaveOnDetach)) {
8947b92da258a480284dcc15a518ea570072329a31dErik            if (mView != null && mView.prepareForSave()) {
8957b92da258a480284dcc15a518ea570072329a31dErik                mOnDone.setDoneCode(Utils.DONE_SAVE);
8967b92da258a480284dcc15a518ea570072329a31dErik                mOnDone.run();
8977b92da258a480284dcc15a518ea570072329a31dErik            }
8987b92da258a480284dcc15a518ea570072329a31dErik        }
899dd95df57c8c5a58a85c4c0effad5652dec14f621Erik    }
900c130d9d5e0d178585721428e394df0c8e0a6729fErik
901a7694eead7cbb293990bc89c3906e17bad36194cErik    private static class EventBundle implements Serializable {
90217c0cea5c4e5eee7b6c1676038e9223dd971007bMichael Chan        private static final long serialVersionUID = 1L;
903c130d9d5e0d178585721428e394df0c8e0a6729fErik        long id = -1;
904c130d9d5e0d178585721428e394df0c8e0a6729fErik        long start = -1;
905c130d9d5e0d178585721428e394df0c8e0a6729fErik        long end = -1;
906c130d9d5e0d178585721428e394df0c8e0a6729fErik    }
90779f228124de7d98146ca526d743436f6419e2365Erik}
908