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