EditEventFragment.java revision ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ff
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 195f62079ab9daefe95ede87631766e99e8b4a2220Erikimport com.android.calendar.AsyncQueryService; 20a7694eead7cbb293990bc89c3906e17bad36194cErikimport com.android.calendar.CalendarController; 21dd95df57c8c5a58a85c4c0effad5652dec14f621Erikimport com.android.calendar.CalendarController.EventHandler; 22dd95df57c8c5a58a85c4c0effad5652dec14f621Erikimport com.android.calendar.CalendarController.EventInfo; 23dd95df57c8c5a58a85c4c0effad5652dec14f621Erikimport com.android.calendar.CalendarController.EventType; 24fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.CalendarEventModel; 25d845fbe558d5229102b58cce70a1b29fe6cb6967Erikimport com.android.calendar.CalendarEventModel.Attendee; 26fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.DeleteEventHelper; 27fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.R; 28fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.Utils; 29fbce65e53c7a111955f638db5bf8bee35381e5b7Erik 3079f228124de7d98146ca526d743436f6419e2365Erikimport android.app.Activity; 3179f228124de7d98146ca526d743436f6419e2365Erikimport android.app.AlertDialog; 3279f228124de7d98146ca526d743436f6419e2365Erikimport android.app.Fragment; 3379f228124de7d98146ca526d743436f6419e2365Erikimport android.content.AsyncQueryHandler; 345f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.content.ContentProviderOperation; 3579f228124de7d98146ca526d743436f6419e2365Erikimport android.content.ContentResolver; 36dd95df57c8c5a58a85c4c0effad5652dec14f621Erikimport android.content.ContentUris; 375f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.content.ContentValues; 385c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawaimport android.content.Context; 3979f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface; 4079f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface.OnClickListener; 4179f228124de7d98146ca526d743436f6419e2365Erikimport android.database.Cursor; 4279f228124de7d98146ca526d743436f6419e2365Erikimport android.database.MatrixCursor; 4379f228124de7d98146ca526d743436f6419e2365Erikimport android.net.Uri; 4479f228124de7d98146ca526d743436f6419e2365Erikimport android.os.Bundle; 4579f228124de7d98146ca526d743436f6419e2365Erikimport android.provider.Calendar.Attendees; 4679f228124de7d98146ca526d743436f6419e2365Erikimport android.provider.Calendar.Calendars; 47dd95df57c8c5a58a85c4c0effad5652dec14f621Erikimport android.provider.Calendar.Events; 4879f228124de7d98146ca526d743436f6419e2365Erikimport android.provider.Calendar.Reminders; 4979f228124de7d98146ca526d743436f6419e2365Erikimport android.text.TextUtils; 5079f228124de7d98146ca526d743436f6419e2365Erikimport android.util.Log; 5179f228124de7d98146ca526d743436f6419e2365Erikimport android.view.LayoutInflater; 525f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.Menu; 535f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.MenuInflater; 545f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.MenuItem; 5579f228124de7d98146ca526d743436f6419e2365Erikimport android.view.View; 5679f228124de7d98146ca526d743436f6419e2365Erikimport android.view.ViewGroup; 575c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawaimport android.view.inputmethod.InputMethodManager; 5879f228124de7d98146ca526d743436f6419e2365Erikimport android.widget.Toast; 5979f228124de7d98146ca526d743436f6419e2365Erik 60c130d9d5e0d178585721428e394df0c8e0a6729fErikimport java.io.Serializable; 615f62079ab9daefe95ede87631766e99e8b4a2220Erikimport java.util.ArrayList; 625f62079ab9daefe95ede87631766e99e8b4a2220Erik 63dd95df57c8c5a58a85c4c0effad5652dec14f621Erikpublic class EditEventFragment extends Fragment implements EventHandler { 6479f228124de7d98146ca526d743436f6419e2365Erik private static final String TAG = "EditEventActivity"; 6579f228124de7d98146ca526d743436f6419e2365Erik 6659ead671b50514b49749fcd6a1d4186a270239d2Erik private static final String BUNDLE_KEY_MODEL = "key_model"; 6759ead671b50514b49749fcd6a1d4186a270239d2Erik private static final String BUNDLE_KEY_EDIT_STATE = "key_edit_state"; 68c130d9d5e0d178585721428e394df0c8e0a6729fErik private static final String BUNDLE_KEY_EVENT = "key_event"; 69a7694eead7cbb293990bc89c3906e17bad36194cErik private static final String BUNDLE_KEY_READ_ONLY = "key_read_only"; 7059ead671b50514b49749fcd6a1d4186a270239d2Erik 7179f228124de7d98146ca526d743436f6419e2365Erik private static final boolean DEBUG = false; 7279f228124de7d98146ca526d743436f6419e2365Erik 73352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private static final int TOKEN_EVENT = 1; 74352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private static final int TOKEN_ATTENDEES = 1 << 1; 75352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private static final int TOKEN_REMINDERS = 1 << 2; 76352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private static final int TOKEN_CALENDARS = 1 << 3; 77352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private static final int TOKEN_ALL = TOKEN_EVENT | TOKEN_ATTENDEES | TOKEN_REMINDERS 78352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan | TOKEN_CALENDARS; 795f62079ab9daefe95ede87631766e99e8b4a2220Erik private static final int TOKEN_UNITIALIZED = 1 << 31; 80352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 81352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan /** 82352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan * A bitfield of TOKEN_* to keep track which query hasn't been completed 83352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan * yet. Once all queries have returned, the model can be applied to the 84352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan * view. 85352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan */ 865f62079ab9daefe95ede87631766e99e8b4a2220Erik private int mOutstandingQueries = TOKEN_UNITIALIZED; 8779f228124de7d98146ca526d743436f6419e2365Erik 8879f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper mHelper; 8979f228124de7d98146ca526d743436f6419e2365Erik CalendarEventModel mModel; 9079f228124de7d98146ca526d743436f6419e2365Erik CalendarEventModel mOriginalModel; 9159ead671b50514b49749fcd6a1d4186a270239d2Erik CalendarEventModel mRestoreModel; 9279f228124de7d98146ca526d743436f6419e2365Erik EditEventView mView; 9379f228124de7d98146ca526d743436f6419e2365Erik QueryHandler mHandler; 9479f228124de7d98146ca526d743436f6419e2365Erik 9579f228124de7d98146ca526d743436f6419e2365Erik private AlertDialog mModifyDialog; 9679f228124de7d98146ca526d743436f6419e2365Erik int mModification = Utils.MODIFY_UNINITIALIZED; 9779f228124de7d98146ca526d743436f6419e2365Erik 98dd95df57c8c5a58a85c4c0effad5652dec14f621Erik private EventInfo mEvent; 99c130d9d5e0d178585721428e394df0c8e0a6729fErik private EventBundle mEventBundle; 10079f228124de7d98146ca526d743436f6419e2365Erik private Uri mUri; 10179f228124de7d98146ca526d743436f6419e2365Erik private long mBegin; 10279f228124de7d98146ca526d743436f6419e2365Erik private long mEnd; 10379f228124de7d98146ca526d743436f6419e2365Erik 10479f228124de7d98146ca526d743436f6419e2365Erik private Activity mContext; 105dd95df57c8c5a58a85c4c0effad5652dec14f621Erik private Done mOnDone = new Done(); 1065f62079ab9daefe95ede87631766e99e8b4a2220Erik private Menu mMenu; 107dd95df57c8c5a58a85c4c0effad5652dec14f621Erik 108dd95df57c8c5a58a85c4c0effad5652dec14f621Erik private boolean mSaveOnDetach = true; 109a7694eead7cbb293990bc89c3906e17bad36194cErik private boolean mIsReadOnly = false; 110a7694eead7cbb293990bc89c3906e17bad36194cErik public boolean mShowModifyDialogOnLaunch = false; 11179f228124de7d98146ca526d743436f6419e2365Erik 1125c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa private InputMethodManager mInputMethodManager; 1135c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa 114364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik // TODO turn this into a helper function in EditEventHelper for building the 115364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik // model 11679f228124de7d98146ca526d743436f6419e2365Erik private class QueryHandler extends AsyncQueryHandler { 11779f228124de7d98146ca526d743436f6419e2365Erik public QueryHandler(ContentResolver cr) { 11879f228124de7d98146ca526d743436f6419e2365Erik super(cr); 11979f228124de7d98146ca526d743436f6419e2365Erik } 12079f228124de7d98146ca526d743436f6419e2365Erik 12179f228124de7d98146ca526d743436f6419e2365Erik @Override 12279f228124de7d98146ca526d743436f6419e2365Erik protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 12379f228124de7d98146ca526d743436f6419e2365Erik // If the query didn't return a cursor for some reason return 12479f228124de7d98146ca526d743436f6419e2365Erik if (cursor == null) { 12579f228124de7d98146ca526d743436f6419e2365Erik return; 12679f228124de7d98146ca526d743436f6419e2365Erik } 12779f228124de7d98146ca526d743436f6419e2365Erik 12879f228124de7d98146ca526d743436f6419e2365Erik // If the Activity is finishing, then close the cursor. 12979f228124de7d98146ca526d743436f6419e2365Erik // Otherwise, use the new cursor in the adapter. 1306a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan final Activity activity = EditEventFragment.this.getActivity(); 1316a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan if (activity == null || activity.isFinishing()) { 13279f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 13379f228124de7d98146ca526d743436f6419e2365Erik return; 13479f228124de7d98146ca526d743436f6419e2365Erik } 13579f228124de7d98146ca526d743436f6419e2365Erik long eventId; 13679f228124de7d98146ca526d743436f6419e2365Erik switch (token) { 13779f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_EVENT: 13879f228124de7d98146ca526d743436f6419e2365Erik if (cursor.getCount() == 0) { 13979f228124de7d98146ca526d743436f6419e2365Erik // The cursor is empty. This can happen if the event 14079f228124de7d98146ca526d743436f6419e2365Erik // was deleted. 14179f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 142352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOnDone.setDoneCode(Utils.DONE_EXIT); 143352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOnDone.run(); 14479f228124de7d98146ca526d743436f6419e2365Erik return; 14579f228124de7d98146ca526d743436f6419e2365Erik } 14679f228124de7d98146ca526d743436f6419e2365Erik mOriginalModel = new CalendarEventModel(); 14779f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.setModelFromCursor(mOriginalModel, cursor); 14879f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.setModelFromCursor(mModel, cursor); 14979f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 15079f228124de7d98146ca526d743436f6419e2365Erik 15159ead671b50514b49749fcd6a1d4186a270239d2Erik mOriginalModel.mUri = mUri.toString(); 15279f228124de7d98146ca526d743436f6419e2365Erik 15359ead671b50514b49749fcd6a1d4186a270239d2Erik mModel.mUri = mUri.toString(); 15479f228124de7d98146ca526d743436f6419e2365Erik mModel.mOriginalStart = mBegin; 15579f228124de7d98146ca526d743436f6419e2365Erik mModel.mOriginalEnd = mEnd; 15679f228124de7d98146ca526d743436f6419e2365Erik mModel.mIsFirstEventInSeries = mBegin == mOriginalModel.mStart; 15779f228124de7d98146ca526d743436f6419e2365Erik mModel.mStart = mBegin; 15879f228124de7d98146ca526d743436f6419e2365Erik mModel.mEnd = mEnd; 15979f228124de7d98146ca526d743436f6419e2365Erik 16079f228124de7d98146ca526d743436f6419e2365Erik eventId = mModel.mId; 161352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 162352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // TOKEN_ATTENDEES 16379f228124de7d98146ca526d743436f6419e2365Erik if (mModel.mHasAttendeeData && eventId != -1) { 16479f228124de7d98146ca526d743436f6419e2365Erik Uri attUri = Attendees.CONTENT_URI; 16579f228124de7d98146ca526d743436f6419e2365Erik String[] whereArgs = { 16679f228124de7d98146ca526d743436f6419e2365Erik Long.toString(eventId) 16779f228124de7d98146ca526d743436f6419e2365Erik }; 16879f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_ATTENDEES, null, attUri, 16979f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.ATTENDEES_PROJECTION, 170d845fbe558d5229102b58cce70a1b29fe6cb6967Erik EditEventHelper.ATTENDEES_WHERE /* selection */, 17179f228124de7d98146ca526d743436f6419e2365Erik whereArgs /* selection args */, null /* sort order */); 172352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } else { 173352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_ATTENDEES); 174352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 175352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 176352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // TOKEN_REMINDERS 177352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (mModel.mHasAlarm) { 178d845fbe558d5229102b58cce70a1b29fe6cb6967Erik Uri rUri = Reminders.CONTENT_URI; 179d845fbe558d5229102b58cce70a1b29fe6cb6967Erik String[] remArgs = { 180d845fbe558d5229102b58cce70a1b29fe6cb6967Erik Long.toString(eventId), Integer.toString(Reminders.METHOD_ALERT), 181d845fbe558d5229102b58cce70a1b29fe6cb6967Erik Integer.toString(Reminders.METHOD_DEFAULT) 182d845fbe558d5229102b58cce70a1b29fe6cb6967Erik }; 183d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mHandler 184d845fbe558d5229102b58cce70a1b29fe6cb6967Erik .startQuery(TOKEN_REMINDERS, null, rUri, 185d845fbe558d5229102b58cce70a1b29fe6cb6967Erik EditEventHelper.REMINDERS_PROJECTION, 186d845fbe558d5229102b58cce70a1b29fe6cb6967Erik EditEventHelper.REMINDERS_WHERE /* selection */, 187ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden remArgs /* selection args */, 188ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden Reminders.MINUTES + " DESC" /* sort order */); 18979f228124de7d98146ca526d743436f6419e2365Erik } else { 190352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_REMINDERS); 19179f228124de7d98146ca526d743436f6419e2365Erik } 192352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 193352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // TOKEN_CALENDARS 194352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan String[] selArgs = { 195352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan Long.toString(mModel.mCalendarId) 196352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan }; 197352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI, 198352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan EditEventHelper.CALENDARS_PROJECTION, EditEventHelper.CALENDARS_WHERE, 199352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan selArgs /* selection args */, null /* sort order */); 200352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 201352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_EVENT); 20279f228124de7d98146ca526d743436f6419e2365Erik break; 20379f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_ATTENDEES: 20479f228124de7d98146ca526d743436f6419e2365Erik try { 20579f228124de7d98146ca526d743436f6419e2365Erik while (cursor.moveToNext()) { 20679f228124de7d98146ca526d743436f6419e2365Erik String name = cursor.getString(EditEventHelper.ATTENDEES_INDEX_NAME); 20779f228124de7d98146ca526d743436f6419e2365Erik String email = cursor.getString(EditEventHelper.ATTENDEES_INDEX_EMAIL); 208d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int status = cursor.getInt(EditEventHelper.ATTENDEES_INDEX_STATUS); 20979f228124de7d98146ca526d743436f6419e2365Erik int relationship = cursor 21079f228124de7d98146ca526d743436f6419e2365Erik .getInt(EditEventHelper.ATTENDEES_INDEX_RELATIONSHIP); 211352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (relationship == Attendees.RELATIONSHIP_ORGANIZER) { 212352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (email != null) { 21379f228124de7d98146ca526d743436f6419e2365Erik mModel.mOrganizer = email; 214352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mModel.mIsOrganizer = mModel.mOwnerAccount 215352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan .equalsIgnoreCase(email); 216a7694eead7cbb293990bc89c3906e17bad36194cErik mOriginalModel.mOrganizer = email; 217a7694eead7cbb293990bc89c3906e17bad36194cErik mOriginalModel.mIsOrganizer = mOriginalModel.mOwnerAccount 218a7694eead7cbb293990bc89c3906e17bad36194cErik .equalsIgnoreCase(email); 219352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 220352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 221352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (TextUtils.isEmpty(name)) { 222352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mModel.mOrganizerDisplayName = mModel.mOrganizer; 223a7694eead7cbb293990bc89c3906e17bad36194cErik mOriginalModel.mOrganizerDisplayName = 224a7694eead7cbb293990bc89c3906e17bad36194cErik mOriginalModel.mOrganizer; 225352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } else { 226352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mModel.mOrganizerDisplayName = name; 227a7694eead7cbb293990bc89c3906e17bad36194cErik mOriginalModel.mOrganizerDisplayName = name; 22879f228124de7d98146ca526d743436f6419e2365Erik } 229352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 230352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 231352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (email != null) { 232d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mModel.mOwnerAccount != null && 233d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mOwnerAccount.equalsIgnoreCase(email)) { 234d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int attendeeId = 235d845fbe558d5229102b58cce70a1b29fe6cb6967Erik cursor.getInt(EditEventHelper.ATTENDEES_INDEX_ID); 236d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mOwnerAttendeeId = attendeeId; 237d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mSelfAttendeeStatus = status; 238d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalModel.mOwnerAttendeeId = attendeeId; 239d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalModel.mSelfAttendeeStatus = status; 240d845fbe558d5229102b58cce70a1b29fe6cb6967Erik continue; 241d845fbe558d5229102b58cce70a1b29fe6cb6967Erik } 24279f228124de7d98146ca526d743436f6419e2365Erik } 243d845fbe558d5229102b58cce70a1b29fe6cb6967Erik Attendee attendee = new Attendee(name, email); 244d845fbe558d5229102b58cce70a1b29fe6cb6967Erik attendee.mStatus = status; 245d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.addAttendee(attendee); 246d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalModel.addAttendee(attendee); 24779f228124de7d98146ca526d743436f6419e2365Erik } 24879f228124de7d98146ca526d743436f6419e2365Erik } finally { 24979f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 25079f228124de7d98146ca526d743436f6419e2365Erik } 251352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 252352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_ATTENDEES); 25379f228124de7d98146ca526d743436f6419e2365Erik break; 25479f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_REMINDERS: 25579f228124de7d98146ca526d743436f6419e2365Erik try { 256d290a01420234214d73d31b8bfa61652625bb149Erik // Add all reminders to the models 25779f228124de7d98146ca526d743436f6419e2365Erik while (cursor.moveToNext()) { 25879f228124de7d98146ca526d743436f6419e2365Erik int minutes = cursor.getInt(EditEventHelper.REMINDERS_INDEX_MINUTES); 25979f228124de7d98146ca526d743436f6419e2365Erik mModel.mReminderMinutes.add(minutes); 260d290a01420234214d73d31b8bfa61652625bb149Erik mOriginalModel.mReminderMinutes.add(minutes); 26179f228124de7d98146ca526d743436f6419e2365Erik } 26279f228124de7d98146ca526d743436f6419e2365Erik } finally { 26379f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 26479f228124de7d98146ca526d743436f6419e2365Erik } 265352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 266352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_REMINDERS); 26779f228124de7d98146ca526d743436f6419e2365Erik break; 26879f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_CALENDARS: 269352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan try { 270352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (mModel.mCalendarId == -1) { 271352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // Populate Calendar spinner only if no calendar is set e.g. new event 272352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan MatrixCursor matrixCursor = Utils.matrixCursorFromCursor(cursor); 273352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (DEBUG) { 274352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan Log.d(TAG, "onQueryComplete: setting cursor with " 275352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan + matrixCursor.getCount() + " calendars"); 276352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 277352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mView.setCalendarsCursor(matrixCursor, isAdded() && isResumed()); 278352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } else { 279352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // Populate model for an existing event 280352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan EditEventHelper.setModelFromCalendarCursor(mModel, cursor); 281a7694eead7cbb293990bc89c3906e17bad36194cErik EditEventHelper.setModelFromCalendarCursor(mOriginalModel, cursor); 282352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 283352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } finally { 284352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan cursor.close(); 28579f228124de7d98146ca526d743436f6419e2365Erik } 286352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 287352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_CALENDARS); 28879f228124de7d98146ca526d743436f6419e2365Erik break; 28979f228124de7d98146ca526d743436f6419e2365Erik } 29079f228124de7d98146ca526d743436f6419e2365Erik } 29179f228124de7d98146ca526d743436f6419e2365Erik } 29279f228124de7d98146ca526d743436f6419e2365Erik 293bdcb9fcc732d52708fafb068f535a2c93ff2356fDaisuke Miyakawa private void setModelIfDone(int queryType) { 294352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan synchronized (this) { 295352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOutstandingQueries &= ~queryType; 296352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (mOutstandingQueries == 0) { 29759ead671b50514b49749fcd6a1d4186a270239d2Erik if (mRestoreModel != null) { 29859ead671b50514b49749fcd6a1d4186a270239d2Erik mModel = mRestoreModel; 29959ead671b50514b49749fcd6a1d4186a270239d2Erik } 3001bd94537b630fbc5556307ea92f37d4a5facecb4Erik if (mShowModifyDialogOnLaunch && mModification == Utils.MODIFY_UNINITIALIZED) { 3011bd94537b630fbc5556307ea92f37d4a5facecb4Erik if (!TextUtils.isEmpty(mModel.mRrule)) { 3021bd94537b630fbc5556307ea92f37d4a5facecb4Erik displayEditWhichDialog(); 3031bd94537b630fbc5556307ea92f37d4a5facecb4Erik } else { 3041bd94537b630fbc5556307ea92f37d4a5facecb4Erik mModification = Utils.MODIFY_ALL; 3051bd94537b630fbc5556307ea92f37d4a5facecb4Erik } 3061bd94537b630fbc5556307ea92f37d4a5facecb4Erik 3071bd94537b630fbc5556307ea92f37d4a5facecb4Erik } 308352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mView.setModel(mModel); 3093400a2bfc1e6be435ea2bb0f436a6ef338446504Erik mView.setModification(mModification); 310c07a57fb7436d807ad505fa7319b9de13f91e741Erik if (mMenu != null) { 3115f62079ab9daefe95ede87631766e99e8b4a2220Erik updateActionBar(); 3125f62079ab9daefe95ede87631766e99e8b4a2220Erik } 313352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 314352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 315352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 316352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 3175f62079ab9daefe95ede87631766e99e8b4a2220Erik private void updateActionBar() { 318c07a57fb7436d807ad505fa7319b9de13f91e741Erik if (mMenu == null) { 319c07a57fb7436d807ad505fa7319b9de13f91e741Erik return; 320c07a57fb7436d807ad505fa7319b9de13f91e741Erik } 3215f62079ab9daefe95ede87631766e99e8b4a2220Erik MenuItem cancelItem = mMenu.findItem(R.id.action_cancel); 3225f62079ab9daefe95ede87631766e99e8b4a2220Erik MenuItem deleteItem = mMenu.findItem(R.id.action_delete); 323c07a57fb7436d807ad505fa7319b9de13f91e741Erik MenuItem editItem = mMenu.findItem(R.id.action_edit); 324c07a57fb7436d807ad505fa7319b9de13f91e741Erik boolean canModifyEvent = EditEventHelper.canModifyEvent(mModel); 32546cde5cff48d6862f492f60c6a6336bfc047ce25Erik boolean canModifyCalendar = EditEventHelper.canModifyCalendar(mModel); 326c07a57fb7436d807ad505fa7319b9de13f91e741Erik 32746cde5cff48d6862f492f60c6a6336bfc047ce25Erik if (canModifyCalendar && mModel.mUri != null) { 32846cde5cff48d6862f492f60c6a6336bfc047ce25Erik deleteItem.setVisible(true); 32946cde5cff48d6862f492f60c6a6336bfc047ce25Erik } else { 33046cde5cff48d6862f492f60c6a6336bfc047ce25Erik deleteItem.setVisible(false); 33146cde5cff48d6862f492f60c6a6336bfc047ce25Erik } 332a7694eead7cbb293990bc89c3906e17bad36194cErik if (mIsReadOnly) { 333a7694eead7cbb293990bc89c3906e17bad36194cErik mMenu.findItem(R.id.action_done).setVisible(false); 334a7694eead7cbb293990bc89c3906e17bad36194cErik } 335c07a57fb7436d807ad505fa7319b9de13f91e741Erik if (mModification == Utils.MODIFY_UNINITIALIZED) { 336c07a57fb7436d807ad505fa7319b9de13f91e741Erik cancelItem.setVisible(false); 337c07a57fb7436d807ad505fa7319b9de13f91e741Erik if (canModifyEvent) { 338c07a57fb7436d807ad505fa7319b9de13f91e741Erik editItem.setVisible(true); 339c07a57fb7436d807ad505fa7319b9de13f91e741Erik } else { 340c07a57fb7436d807ad505fa7319b9de13f91e741Erik editItem.setVisible(false); 341c07a57fb7436d807ad505fa7319b9de13f91e741Erik } 342c07a57fb7436d807ad505fa7319b9de13f91e741Erik return; 343c07a57fb7436d807ad505fa7319b9de13f91e741Erik } else { 34446cde5cff48d6862f492f60c6a6336bfc047ce25Erik editItem.setVisible(false); 345c07a57fb7436d807ad505fa7319b9de13f91e741Erik } 346c07a57fb7436d807ad505fa7319b9de13f91e741Erik boolean canRespond = EditEventHelper.canRespond(mModel); 3475f62079ab9daefe95ede87631766e99e8b4a2220Erik 3485f62079ab9daefe95ede87631766e99e8b4a2220Erik if (canRespond || canModifyEvent) { 3495f62079ab9daefe95ede87631766e99e8b4a2220Erik cancelItem.setVisible(true); 3505f62079ab9daefe95ede87631766e99e8b4a2220Erik } else { 3515f62079ab9daefe95ede87631766e99e8b4a2220Erik cancelItem.setVisible(false); 3525f62079ab9daefe95ede87631766e99e8b4a2220Erik } 3535f62079ab9daefe95ede87631766e99e8b4a2220Erik } 3545f62079ab9daefe95ede87631766e99e8b4a2220Erik 355dd95df57c8c5a58a85c4c0effad5652dec14f621Erik public EditEventFragment() { 3562c7c851a4e40afa83a741ec39d44425b705a712eMichael Chan this(null, false); 357a7694eead7cbb293990bc89c3906e17bad36194cErik } 358a7694eead7cbb293990bc89c3906e17bad36194cErik 359a7694eead7cbb293990bc89c3906e17bad36194cErik public EditEventFragment(EventInfo event, boolean readOnly) { 360dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mEvent = event; 361a7694eead7cbb293990bc89c3906e17bad36194cErik mIsReadOnly = readOnly; 3625f62079ab9daefe95ede87631766e99e8b4a2220Erik setHasOptionsMenu(true); 36379f228124de7d98146ca526d743436f6419e2365Erik } 36479f228124de7d98146ca526d743436f6419e2365Erik 36579f228124de7d98146ca526d743436f6419e2365Erik private void startQuery() { 366dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mUri = null; 367dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mBegin = -1; 368dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mEnd = -1; 369dd95df57c8c5a58a85c4c0effad5652dec14f621Erik if (mEvent != null) { 370dd95df57c8c5a58a85c4c0effad5652dec14f621Erik if (mEvent.id != -1) { 371352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mModel.mId = mEvent.id; 372dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEvent.id); 373dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 374dd95df57c8c5a58a85c4c0effad5652dec14f621Erik if (mEvent.startTime != null) { 375dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mBegin = mEvent.startTime.toMillis(true); 376dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 377dd95df57c8c5a58a85c4c0effad5652dec14f621Erik if (mEvent.endTime != null) { 378dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mEnd = mEvent.endTime.toMillis(true); 379dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 380c130d9d5e0d178585721428e394df0c8e0a6729fErik } else if (mEventBundle != null) { 3813400a2bfc1e6be435ea2bb0f436a6ef338446504Erik if (mEventBundle.id != -1) { 3823400a2bfc1e6be435ea2bb0f436a6ef338446504Erik mModel.mId = mEventBundle.id; 3833400a2bfc1e6be435ea2bb0f436a6ef338446504Erik mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventBundle.id); 3843400a2bfc1e6be435ea2bb0f436a6ef338446504Erik } 385c130d9d5e0d178585721428e394df0c8e0a6729fErik mBegin = mEventBundle.start; 386c130d9d5e0d178585721428e394df0c8e0a6729fErik mEnd = mEventBundle.end; 387dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 388e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang 389e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang if (mBegin <= 0) { 390e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang // use a default value instead 391e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mBegin = mHelper.constructDefaultStartTime(System.currentTimeMillis()); 392e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang } 393e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang if (mEnd < mBegin) { 394e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang // use a default value instead 395e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mEnd = mHelper.constructDefaultEndTime(mBegin); 396e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang } 39779f228124de7d98146ca526d743436f6419e2365Erik 39879f228124de7d98146ca526d743436f6419e2365Erik // Kick off the query for the event 39979f228124de7d98146ca526d743436f6419e2365Erik boolean newEvent = mUri == null; 40079f228124de7d98146ca526d743436f6419e2365Erik if (!newEvent) { 401c07a57fb7436d807ad505fa7319b9de13f91e741Erik mModel.mCalendarAccessLevel = Calendars.NO_ACCESS; 402352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOutstandingQueries = TOKEN_ALL; 40379f228124de7d98146ca526d743436f6419e2365Erik if (DEBUG) { 404352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan Log.d(TAG, "startQuery: uri for event is " + mUri.toString()); 40579f228124de7d98146ca526d743436f6419e2365Erik } 40679f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_EVENT, null, mUri, EditEventHelper.EVENT_PROJECTION, 40779f228124de7d98146ca526d743436f6419e2365Erik null /* selection */, null /* selection args */, null /* sort order */); 40879f228124de7d98146ca526d743436f6419e2365Erik } else { 409352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOutstandingQueries = TOKEN_CALENDARS; 41079f228124de7d98146ca526d743436f6419e2365Erik if (DEBUG) { 411352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan Log.d(TAG, "startQuery: Editing a new event."); 41279f228124de7d98146ca526d743436f6419e2365Erik } 41379f228124de7d98146ca526d743436f6419e2365Erik mModel.mStart = mBegin; 41479f228124de7d98146ca526d743436f6419e2365Erik mModel.mEnd = mEnd; 415d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mSelfAttendeeStatus = Attendees.ATTENDEE_STATUS_ACCEPTED; 41679f228124de7d98146ca526d743436f6419e2365Erik 41779f228124de7d98146ca526d743436f6419e2365Erik // Start a query in the background to read the list of calendars 41879f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI, 41979f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.CALENDARS_PROJECTION, 42079f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.CALENDARS_WHERE_WRITEABLE_VISIBLE, null /* selection args */, 42179f228124de7d98146ca526d743436f6419e2365Erik null /* sort order */); 422c07a57fb7436d807ad505fa7319b9de13f91e741Erik 423c07a57fb7436d807ad505fa7319b9de13f91e741Erik mModification = Utils.MODIFY_ALL; 424c07a57fb7436d807ad505fa7319b9de13f91e741Erik updateActionBar(); 425c07a57fb7436d807ad505fa7319b9de13f91e741Erik mView.setModification(mModification); 42679f228124de7d98146ca526d743436f6419e2365Erik } 42779f228124de7d98146ca526d743436f6419e2365Erik } 42879f228124de7d98146ca526d743436f6419e2365Erik 42979f228124de7d98146ca526d743436f6419e2365Erik @Override 43079f228124de7d98146ca526d743436f6419e2365Erik public void onAttach(Activity activity) { 43179f228124de7d98146ca526d743436f6419e2365Erik super.onAttach(activity); 43279f228124de7d98146ca526d743436f6419e2365Erik mContext = activity; 43379f228124de7d98146ca526d743436f6419e2365Erik 434dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mHelper = new EditEventHelper(activity, null); 43579f228124de7d98146ca526d743436f6419e2365Erik mHandler = new QueryHandler(activity.getContentResolver()); 436dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mModel = new CalendarEventModel(activity); 4375c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa mInputMethodManager = (InputMethodManager) 4385c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa activity.getSystemService(Context.INPUT_METHOD_SERVICE); 43979f228124de7d98146ca526d743436f6419e2365Erik } 44079f228124de7d98146ca526d743436f6419e2365Erik 44179f228124de7d98146ca526d743436f6419e2365Erik @Override 44279f228124de7d98146ca526d743436f6419e2365Erik public View onCreateView(LayoutInflater inflater, ViewGroup container, 44379f228124de7d98146ca526d743436f6419e2365Erik Bundle savedInstanceState) { 44479f228124de7d98146ca526d743436f6419e2365Erik// mContext.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 445a7694eead7cbb293990bc89c3906e17bad36194cErik View view; 446a7694eead7cbb293990bc89c3906e17bad36194cErik if (mIsReadOnly) { 447a7694eead7cbb293990bc89c3906e17bad36194cErik view = inflater.inflate(R.layout.edit_event_single_column, null); 448a7694eead7cbb293990bc89c3906e17bad36194cErik } else { 449a7694eead7cbb293990bc89c3906e17bad36194cErik view = inflater.inflate(R.layout.edit_event, null); 450a7694eead7cbb293990bc89c3906e17bad36194cErik } 451dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mView = new EditEventView(mContext, view, mOnDone); 45279f228124de7d98146ca526d743436f6419e2365Erik startQuery(); 45379f228124de7d98146ca526d743436f6419e2365Erik return view; 45479f228124de7d98146ca526d743436f6419e2365Erik } 45579f228124de7d98146ca526d743436f6419e2365Erik 45679f228124de7d98146ca526d743436f6419e2365Erik @Override 45779f228124de7d98146ca526d743436f6419e2365Erik public void onCreate(Bundle savedInstanceState) { 45879f228124de7d98146ca526d743436f6419e2365Erik super.onCreate(savedInstanceState); 45959ead671b50514b49749fcd6a1d4186a270239d2Erik if (savedInstanceState != null) { 46059ead671b50514b49749fcd6a1d4186a270239d2Erik if (savedInstanceState.containsKey(BUNDLE_KEY_MODEL)) { 46159ead671b50514b49749fcd6a1d4186a270239d2Erik mRestoreModel = (CalendarEventModel) savedInstanceState.getSerializable( 46259ead671b50514b49749fcd6a1d4186a270239d2Erik BUNDLE_KEY_MODEL); 46359ead671b50514b49749fcd6a1d4186a270239d2Erik } 46459ead671b50514b49749fcd6a1d4186a270239d2Erik if (savedInstanceState.containsKey(BUNDLE_KEY_EDIT_STATE)) { 46559ead671b50514b49749fcd6a1d4186a270239d2Erik mModification = savedInstanceState.getInt(BUNDLE_KEY_EDIT_STATE); 46659ead671b50514b49749fcd6a1d4186a270239d2Erik } 467c130d9d5e0d178585721428e394df0c8e0a6729fErik if (savedInstanceState.containsKey(BUNDLE_KEY_EVENT)) { 468c130d9d5e0d178585721428e394df0c8e0a6729fErik mEventBundle = (EventBundle) savedInstanceState.getSerializable(BUNDLE_KEY_EVENT); 469c130d9d5e0d178585721428e394df0c8e0a6729fErik } 470a7694eead7cbb293990bc89c3906e17bad36194cErik if (savedInstanceState.containsKey(BUNDLE_KEY_READ_ONLY)) { 471a7694eead7cbb293990bc89c3906e17bad36194cErik mIsReadOnly = savedInstanceState.getBoolean(BUNDLE_KEY_READ_ONLY); 472a7694eead7cbb293990bc89c3906e17bad36194cErik } 47359ead671b50514b49749fcd6a1d4186a270239d2Erik } 47479f228124de7d98146ca526d743436f6419e2365Erik } 4755f62079ab9daefe95ede87631766e99e8b4a2220Erik 4765f62079ab9daefe95ede87631766e99e8b4a2220Erik 4775f62079ab9daefe95ede87631766e99e8b4a2220Erik @Override 4785f62079ab9daefe95ede87631766e99e8b4a2220Erik public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 4795f62079ab9daefe95ede87631766e99e8b4a2220Erik super.onCreateOptionsMenu(menu, inflater); 4805f62079ab9daefe95ede87631766e99e8b4a2220Erik inflater.inflate(R.menu.edit_event_title_bar, menu); 4815f62079ab9daefe95ede87631766e99e8b4a2220Erik synchronized (this) { 4825f62079ab9daefe95ede87631766e99e8b4a2220Erik mMenu = menu; 483c07a57fb7436d807ad505fa7319b9de13f91e741Erik updateActionBar(); 4845f62079ab9daefe95ede87631766e99e8b4a2220Erik } 4855f62079ab9daefe95ede87631766e99e8b4a2220Erik } 4865f62079ab9daefe95ede87631766e99e8b4a2220Erik 4875f62079ab9daefe95ede87631766e99e8b4a2220Erik @Override 4885f62079ab9daefe95ede87631766e99e8b4a2220Erik public boolean onOptionsItemSelected(MenuItem item) { 4895f62079ab9daefe95ede87631766e99e8b4a2220Erik switch (item.getItemId()) { 4905f62079ab9daefe95ede87631766e99e8b4a2220Erik case R.id.action_done: 4915f62079ab9daefe95ede87631766e99e8b4a2220Erik if (EditEventHelper.canModifyEvent(mModel) || EditEventHelper.canRespond(mModel)) { 4925f62079ab9daefe95ede87631766e99e8b4a2220Erik if (mView != null && mView.prepareForSave()) { 49346cde5cff48d6862f492f60c6a6336bfc047ce25Erik if (mModification == Utils.MODIFY_UNINITIALIZED) { 49446cde5cff48d6862f492f60c6a6336bfc047ce25Erik mModification = Utils.MODIFY_ALL; 49546cde5cff48d6862f492f60c6a6336bfc047ce25Erik } 4965f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.setDoneCode(Utils.DONE_SAVE | Utils.DONE_EXIT); 4975f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.run(); 4985f62079ab9daefe95ede87631766e99e8b4a2220Erik } else { 4995f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.setDoneCode(Utils.DONE_REVERT); 5005f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.run(); 5015f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5025f62079ab9daefe95ede87631766e99e8b4a2220Erik } else if (EditEventHelper.canAddReminders(mModel) && mModel.mId != -1 5035f62079ab9daefe95ede87631766e99e8b4a2220Erik && mOriginalModel != null && mView.prepareForSave()) { 5045f62079ab9daefe95ede87631766e99e8b4a2220Erik saveReminders(); 5055f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.setDoneCode(Utils.DONE_EXIT); 5065f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.run(); 5075f62079ab9daefe95ede87631766e99e8b4a2220Erik } else { 5085f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.setDoneCode(Utils.DONE_REVERT); 5095f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.run(); 5105f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5115f62079ab9daefe95ede87631766e99e8b4a2220Erik break; 5125f62079ab9daefe95ede87631766e99e8b4a2220Erik case R.id.action_cancel: 5135f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.setDoneCode(Utils.DONE_REVERT); 5145f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.run(); 5155f62079ab9daefe95ede87631766e99e8b4a2220Erik break; 5165f62079ab9daefe95ede87631766e99e8b4a2220Erik case R.id.action_delete: 5175f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.setDoneCode(Utils.DONE_DELETE); 5185f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.run(); 5195f62079ab9daefe95ede87631766e99e8b4a2220Erik break; 520c07a57fb7436d807ad505fa7319b9de13f91e741Erik case R.id.action_edit: 521a7694eead7cbb293990bc89c3906e17bad36194cErik if (mIsReadOnly) { 522a7694eead7cbb293990bc89c3906e17bad36194cErik CalendarController.getInstance(mContext).sendEventRelatedEvent(this, 52387f993ff96172f508d3f241f8a425f953c7eb739RoboErik EventType.EDIT_EVENT, mModel.mId, mModel.mStart, mModel.mEnd, -1, -1, -1); 524a7694eead7cbb293990bc89c3906e17bad36194cErik } else if (!TextUtils.isEmpty(mModel.mRrule)) { 52546cde5cff48d6862f492f60c6a6336bfc047ce25Erik displayEditWhichDialog(); 526c07a57fb7436d807ad505fa7319b9de13f91e741Erik } else { 527c07a57fb7436d807ad505fa7319b9de13f91e741Erik mModification = Utils.MODIFY_ALL; 528c07a57fb7436d807ad505fa7319b9de13f91e741Erik updateActionBar(); 529c07a57fb7436d807ad505fa7319b9de13f91e741Erik mView.setModification(mModification); 530c07a57fb7436d807ad505fa7319b9de13f91e741Erik } 531c07a57fb7436d807ad505fa7319b9de13f91e741Erik break; 5325f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5335f62079ab9daefe95ede87631766e99e8b4a2220Erik return true; 5345f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5355f62079ab9daefe95ede87631766e99e8b4a2220Erik 5365f62079ab9daefe95ede87631766e99e8b4a2220Erik private void saveReminders() { 5375f62079ab9daefe95ede87631766e99e8b4a2220Erik ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3); 5385f62079ab9daefe95ede87631766e99e8b4a2220Erik boolean changed = EditEventHelper.saveReminders(ops, mModel.mId, mModel.mReminderMinutes, 5395f62079ab9daefe95ede87631766e99e8b4a2220Erik mOriginalModel.mReminderMinutes, false /* no force save */); 5405f62079ab9daefe95ede87631766e99e8b4a2220Erik 5415f62079ab9daefe95ede87631766e99e8b4a2220Erik if (!changed) { 5425f62079ab9daefe95ede87631766e99e8b4a2220Erik return; 5435f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5445f62079ab9daefe95ede87631766e99e8b4a2220Erik 5455f62079ab9daefe95ede87631766e99e8b4a2220Erik AsyncQueryService service = new AsyncQueryService(getActivity()); 5465f62079ab9daefe95ede87631766e99e8b4a2220Erik service.startBatch(0, null, Calendars.CONTENT_URI.getAuthority(), ops, 0); 5475f62079ab9daefe95ede87631766e99e8b4a2220Erik // Update the "hasAlarm" field for the event 5485f62079ab9daefe95ede87631766e99e8b4a2220Erik Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mModel.mId); 5495f62079ab9daefe95ede87631766e99e8b4a2220Erik int len = mModel.mReminderMinutes.size(); 5505f62079ab9daefe95ede87631766e99e8b4a2220Erik boolean hasAlarm = len > 0; 5515f62079ab9daefe95ede87631766e99e8b4a2220Erik if (hasAlarm != mOriginalModel.mHasAlarm) { 5525f62079ab9daefe95ede87631766e99e8b4a2220Erik ContentValues values = new ContentValues(); 5535f62079ab9daefe95ede87631766e99e8b4a2220Erik values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0); 5545f62079ab9daefe95ede87631766e99e8b4a2220Erik service.startUpdate(0, null, uri, values, null, null, 0); 5555f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5565f62079ab9daefe95ede87631766e99e8b4a2220Erik 5575f62079ab9daefe95ede87631766e99e8b4a2220Erik Toast.makeText(mContext, R.string.saving_event, Toast.LENGTH_SHORT).show(); 5585f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5595f62079ab9daefe95ede87631766e99e8b4a2220Erik 56046cde5cff48d6862f492f60c6a6336bfc047ce25Erik protected void displayEditWhichDialog() { 56179f228124de7d98146ca526d743436f6419e2365Erik if (!TextUtils.isEmpty(mModel.mRrule) && mModification == Utils.MODIFY_UNINITIALIZED) { 5621ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan final boolean notSynced = mModel.mSyncId == null; 56379f228124de7d98146ca526d743436f6419e2365Erik boolean isFirstEventInSeries = mModel.mIsFirstEventInSeries; 56479f228124de7d98146ca526d743436f6419e2365Erik int itemIndex = 0; 56579f228124de7d98146ca526d743436f6419e2365Erik CharSequence[] items; 5661ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan 5671ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan if (notSynced) { 5681ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan // If this event has not been synced, then don't allow deleting 5691ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan // or changing a single instance. 57079f228124de7d98146ca526d743436f6419e2365Erik if (isFirstEventInSeries) { 57179f228124de7d98146ca526d743436f6419e2365Erik // Still display the option so the user knows all events are 57279f228124de7d98146ca526d743436f6419e2365Erik // changing 57379f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[1]; 57479f228124de7d98146ca526d743436f6419e2365Erik } else { 57579f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[2]; 57679f228124de7d98146ca526d743436f6419e2365Erik } 57779f228124de7d98146ca526d743436f6419e2365Erik } else { 57879f228124de7d98146ca526d743436f6419e2365Erik if (isFirstEventInSeries) { 57979f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[2]; 58079f228124de7d98146ca526d743436f6419e2365Erik } else { 58179f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[3]; 58279f228124de7d98146ca526d743436f6419e2365Erik } 58379f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_event); 58479f228124de7d98146ca526d743436f6419e2365Erik } 58579f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_all); 58679f228124de7d98146ca526d743436f6419e2365Erik 58779f228124de7d98146ca526d743436f6419e2365Erik // Do one more check to make sure this remains at the end of the list 58879f228124de7d98146ca526d743436f6419e2365Erik if (!isFirstEventInSeries) { 58979f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_all_following); 59079f228124de7d98146ca526d743436f6419e2365Erik } 59179f228124de7d98146ca526d743436f6419e2365Erik 59279f228124de7d98146ca526d743436f6419e2365Erik // Display the modification dialog. 59379f228124de7d98146ca526d743436f6419e2365Erik if (mModifyDialog != null) { 59479f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog.dismiss(); 59579f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog = null; 59679f228124de7d98146ca526d743436f6419e2365Erik } 597a7694eead7cbb293990bc89c3906e17bad36194cErik mModifyDialog = new AlertDialog.Builder(mContext) 598a7694eead7cbb293990bc89c3906e17bad36194cErik .setTitle(R.string.edit_event_label).setItems(items, new OnClickListener() { 59979f228124de7d98146ca526d743436f6419e2365Erik public void onClick(DialogInterface dialog, int which) { 60079f228124de7d98146ca526d743436f6419e2365Erik if (which == 0) { 6011ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan mModification = notSynced ? Utils.MODIFY_ALL : Utils.MODIFY_SELECTED; 602c07a57fb7436d807ad505fa7319b9de13f91e741Erik mModel.mOriginalEvent = notSynced ? null : mModel.mSyncId; 60379f228124de7d98146ca526d743436f6419e2365Erik } else if (which == 1) { 6041ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan mModification = notSynced ? Utils.MODIFY_ALL_FOLLOWING : Utils.MODIFY_ALL; 60579f228124de7d98146ca526d743436f6419e2365Erik } else if (which == 2) { 60679f228124de7d98146ca526d743436f6419e2365Erik mModification = Utils.MODIFY_ALL_FOLLOWING; 60779f228124de7d98146ca526d743436f6419e2365Erik } 60879f228124de7d98146ca526d743436f6419e2365Erik 60979f228124de7d98146ca526d743436f6419e2365Erik mView.setModification(mModification); 610c07a57fb7436d807ad505fa7319b9de13f91e741Erik updateActionBar(); 61179f228124de7d98146ca526d743436f6419e2365Erik } 61279f228124de7d98146ca526d743436f6419e2365Erik }).show(); 61379f228124de7d98146ca526d743436f6419e2365Erik } 61479f228124de7d98146ca526d743436f6419e2365Erik } 61579f228124de7d98146ca526d743436f6419e2365Erik 61679f228124de7d98146ca526d743436f6419e2365Erik class Done implements EditEventHelper.EditDoneRunnable { 61779f228124de7d98146ca526d743436f6419e2365Erik private int mCode = -1; 61879f228124de7d98146ca526d743436f6419e2365Erik 61979f228124de7d98146ca526d743436f6419e2365Erik public void setDoneCode(int code) { 62079f228124de7d98146ca526d743436f6419e2365Erik mCode = code; 62179f228124de7d98146ca526d743436f6419e2365Erik } 62279f228124de7d98146ca526d743436f6419e2365Erik 62379f228124de7d98146ca526d743436f6419e2365Erik public void run() { 624dd95df57c8c5a58a85c4c0effad5652dec14f621Erik // We only want this to get called once, either because the user 625dd95df57c8c5a58a85c4c0effad5652dec14f621Erik // pressed back/home or one of the buttons on screen 626dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mSaveOnDetach = false; 6277b92da258a480284dcc15a518ea570072329a31dErik 628a7694eead7cbb293990bc89c3906e17bad36194cErik if ((mCode & Utils.DONE_SAVE) != 0 && mModel != null 629a7694eead7cbb293990bc89c3906e17bad36194cErik && (EditEventHelper.canRespond(mModel) 630a7694eead7cbb293990bc89c3906e17bad36194cErik || EditEventHelper.canModifyEvent(mModel)) 631d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan && !isEmptyNewEvent() 632ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden && mModel.normalizeReminders() 633a7694eead7cbb293990bc89c3906e17bad36194cErik && !mModel.isUnchanged(mOriginalModel) 634304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan && mHelper.saveEvent(mModel, mOriginalModel, mModification)) { 635304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan int stringResource; 636ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan if (!mModel.mAttendeesList.isEmpty()) { 637ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan if (mModel.mUri != null) { 638ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan stringResource = R.string.saving_event_with_guest; 639ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan } else { 640ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan stringResource = R.string.creating_event_with_guest; 641ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan } 642304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan } else { 643ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan if (mModel.mUri != null) { 644ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan stringResource = R.string.saving_event; 645ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan } else { 646ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan stringResource = R.string.creating_event; 647ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan } 6487b92da258a480284dcc15a518ea570072329a31dErik } 649304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan Toast.makeText(mContext, stringResource, Toast.LENGTH_SHORT).show(); 6507b92da258a480284dcc15a518ea570072329a31dErik } 6517b92da258a480284dcc15a518ea570072329a31dErik 6522fda24534978f55711526dbde747aa50d68dec40RoboErik if ((mCode & Utils.DONE_DELETE) != 0 && mOriginalModel != null 6532fda24534978f55711526dbde747aa50d68dec40RoboErik && EditEventHelper.canModifyCalendar(mOriginalModel)) { 6547b92da258a480284dcc15a518ea570072329a31dErik long begin = mModel.mStart; 6557b92da258a480284dcc15a518ea570072329a31dErik long end = mModel.mEnd; 6567b92da258a480284dcc15a518ea570072329a31dErik int which = -1; 6577b92da258a480284dcc15a518ea570072329a31dErik switch (mModification) { 6587b92da258a480284dcc15a518ea570072329a31dErik case Utils.MODIFY_SELECTED: 6597b92da258a480284dcc15a518ea570072329a31dErik which = DeleteEventHelper.DELETE_SELECTED; 6607b92da258a480284dcc15a518ea570072329a31dErik break; 6617b92da258a480284dcc15a518ea570072329a31dErik case Utils.MODIFY_ALL_FOLLOWING: 6627b92da258a480284dcc15a518ea570072329a31dErik which = DeleteEventHelper.DELETE_ALL_FOLLOWING; 6637b92da258a480284dcc15a518ea570072329a31dErik break; 6647b92da258a480284dcc15a518ea570072329a31dErik case Utils.MODIFY_ALL: 6657b92da258a480284dcc15a518ea570072329a31dErik which = DeleteEventHelper.DELETE_ALL; 6667b92da258a480284dcc15a518ea570072329a31dErik break; 6677b92da258a480284dcc15a518ea570072329a31dErik } 668a7694eead7cbb293990bc89c3906e17bad36194cErik DeleteEventHelper deleteHelper = new DeleteEventHelper( 669a7694eead7cbb293990bc89c3906e17bad36194cErik mContext, mContext, !mIsReadOnly /* exitWhenDone */); 6706663f36972c0e9df10d4d79568658cec9c8a79ccErik deleteHelper.delete(begin, end, mOriginalModel, which); 67179f228124de7d98146ca526d743436f6419e2365Erik } 6727b92da258a480284dcc15a518ea570072329a31dErik 6737b92da258a480284dcc15a518ea570072329a31dErik if ((mCode & Utils.DONE_EXIT) != 0) { 6747b92da258a480284dcc15a518ea570072329a31dErik // This will exit the edit event screen, should be called 6757b92da258a480284dcc15a518ea570072329a31dErik // when we want to return to the main calendar views 6765f62079ab9daefe95ede87631766e99e8b4a2220Erik EditEventFragment.this.getActivity().finish(); 6777b92da258a480284dcc15a518ea570072329a31dErik } 6787b92da258a480284dcc15a518ea570072329a31dErik 6795c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa // Hide a software keyboard so that user won't see it even after this Fragment's 6805c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa // disappearing. 6815c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa final View focusedView = mContext.getCurrentFocus(); 6825c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa if (focusedView != null) { 6835c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa mInputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0); 6845c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa focusedView.clearFocus(); 6855c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa } 68679f228124de7d98146ca526d743436f6419e2365Erik } 68779f228124de7d98146ca526d743436f6419e2365Erik } 68879f228124de7d98146ca526d743436f6419e2365Erik 689d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan boolean isEmptyNewEvent() { 690d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (mOriginalModel != null) { 691d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan // Not new 692d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return false; 693d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 694d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 695d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return isEmpty(); 696d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 697d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 698d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan private boolean isEmpty() { 699d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (mModel.mTitle != null) { 700d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan String title = mModel.mTitle.trim(); 701d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (title.length() > 0) { 702d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return false; 703d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 704d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 705d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 706d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (mModel.mLocation != null) { 707d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan String location = mModel.mLocation.trim(); 708d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (location.length() > 0) { 709d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return false; 710d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 711d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 712d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 713d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (mModel.mDescription != null) { 714d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan String description = mModel.mDescription.trim(); 715d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (description.length() > 0) { 716d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return false; 717d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 718d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 719d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 720d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return true; 721d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 722d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 72379f228124de7d98146ca526d743436f6419e2365Erik @Override 724a7694eead7cbb293990bc89c3906e17bad36194cErik public void onPause() { 725a7694eead7cbb293990bc89c3906e17bad36194cErik Activity act = getActivity(); 72655d4c8c75b2442aee44cab0a8e52aacd7856a53aErik if (mSaveOnDetach && act != null && !mIsReadOnly && !act.isChangingConfigurations() 72755d4c8c75b2442aee44cab0a8e52aacd7856a53aErik && mView.prepareForSave()) { 728a7694eead7cbb293990bc89c3906e17bad36194cErik mOnDone.setDoneCode(Utils.DONE_SAVE); 729a7694eead7cbb293990bc89c3906e17bad36194cErik mOnDone.run(); 730a7694eead7cbb293990bc89c3906e17bad36194cErik } 731a7694eead7cbb293990bc89c3906e17bad36194cErik super.onPause(); 732a7694eead7cbb293990bc89c3906e17bad36194cErik } 733a7694eead7cbb293990bc89c3906e17bad36194cErik 734a7694eead7cbb293990bc89c3906e17bad36194cErik @Override 73579f228124de7d98146ca526d743436f6419e2365Erik public void onDestroy() { 736ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov if (mView != null) { 737ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov mView.setModel(null); 738ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov } 73979f228124de7d98146ca526d743436f6419e2365Erik if (mModifyDialog != null) { 74079f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog.dismiss(); 74179f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog = null; 74279f228124de7d98146ca526d743436f6419e2365Erik } 7437b92da258a480284dcc15a518ea570072329a31dErik 7447b92da258a480284dcc15a518ea570072329a31dErik super.onDestroy(); 74579f228124de7d98146ca526d743436f6419e2365Erik } 746dd95df57c8c5a58a85c4c0effad5652dec14f621Erik 747dd95df57c8c5a58a85c4c0effad5652dec14f621Erik @Override 748dd95df57c8c5a58a85c4c0effad5652dec14f621Erik public void eventsChanged() { 749dd95df57c8c5a58a85c4c0effad5652dec14f621Erik // TODO Requery to see if event has changed 750dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 751dd95df57c8c5a58a85c4c0effad5652dec14f621Erik 752dd95df57c8c5a58a85c4c0effad5652dec14f621Erik @Override 75359ead671b50514b49749fcd6a1d4186a270239d2Erik public void onSaveInstanceState(Bundle outState) { 75459ead671b50514b49749fcd6a1d4186a270239d2Erik mView.prepareForSave(); 75559ead671b50514b49749fcd6a1d4186a270239d2Erik outState.putSerializable(BUNDLE_KEY_MODEL, mModel); 75659ead671b50514b49749fcd6a1d4186a270239d2Erik outState.putInt(BUNDLE_KEY_EDIT_STATE, mModification); 757c130d9d5e0d178585721428e394df0c8e0a6729fErik if (mEventBundle == null && mEvent != null) { 758c130d9d5e0d178585721428e394df0c8e0a6729fErik mEventBundle = new EventBundle(); 759c130d9d5e0d178585721428e394df0c8e0a6729fErik mEventBundle.id = mEvent.id; 760c130d9d5e0d178585721428e394df0c8e0a6729fErik if (mEvent.startTime != null) { 761c130d9d5e0d178585721428e394df0c8e0a6729fErik mEventBundle.start = mEvent.startTime.toMillis(true); 762c130d9d5e0d178585721428e394df0c8e0a6729fErik } 763c130d9d5e0d178585721428e394df0c8e0a6729fErik if (mEvent.endTime != null) { 764c130d9d5e0d178585721428e394df0c8e0a6729fErik mEventBundle.end = mEvent.startTime.toMillis(true); 765c130d9d5e0d178585721428e394df0c8e0a6729fErik } 766c130d9d5e0d178585721428e394df0c8e0a6729fErik } 767c130d9d5e0d178585721428e394df0c8e0a6729fErik 768c130d9d5e0d178585721428e394df0c8e0a6729fErik outState.putSerializable(BUNDLE_KEY_EVENT, mEventBundle); 769a7694eead7cbb293990bc89c3906e17bad36194cErik outState.putBoolean(BUNDLE_KEY_READ_ONLY, mIsReadOnly); 77059ead671b50514b49749fcd6a1d4186a270239d2Erik } 77159ead671b50514b49749fcd6a1d4186a270239d2Erik 77259ead671b50514b49749fcd6a1d4186a270239d2Erik @Override 773dd95df57c8c5a58a85c4c0effad5652dec14f621Erik public long getSupportedEventTypes() { 7747b92da258a480284dcc15a518ea570072329a31dErik return EventType.USER_HOME; 775dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 776dd95df57c8c5a58a85c4c0effad5652dec14f621Erik 777dd95df57c8c5a58a85c4c0effad5652dec14f621Erik @Override 778dd95df57c8c5a58a85c4c0effad5652dec14f621Erik public void handleEvent(EventInfo event) { 7797b92da258a480284dcc15a518ea570072329a31dErik // It's currently unclear if we want to save the event or not when home 7807b92da258a480284dcc15a518ea570072329a31dErik // is pressed. When creating a new event we shouldn't save since we 7817b92da258a480284dcc15a518ea570072329a31dErik // can't get the id of the new event easily. 7827b92da258a480284dcc15a518ea570072329a31dErik if ((false && event.eventType == EventType.USER_HOME) || (event.eventType == EventType.GO_TO 7837b92da258a480284dcc15a518ea570072329a31dErik && mSaveOnDetach)) { 7847b92da258a480284dcc15a518ea570072329a31dErik if (mView != null && mView.prepareForSave()) { 7857b92da258a480284dcc15a518ea570072329a31dErik mOnDone.setDoneCode(Utils.DONE_SAVE); 7867b92da258a480284dcc15a518ea570072329a31dErik mOnDone.run(); 7877b92da258a480284dcc15a518ea570072329a31dErik } 7887b92da258a480284dcc15a518ea570072329a31dErik } 789dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 790c130d9d5e0d178585721428e394df0c8e0a6729fErik 791a7694eead7cbb293990bc89c3906e17bad36194cErik private static class EventBundle implements Serializable { 792c130d9d5e0d178585721428e394df0c8e0a6729fErik long id = -1; 793c130d9d5e0d178585721428e394df0c8e0a6729fErik long start = -1; 794c130d9d5e0d178585721428e394df0c8e0a6729fErik long end = -1; 795c130d9d5e0d178585721428e394df0c8e0a6729fErik } 79679f228124de7d98146ca526d743436f6419e2365Erik} 797