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