179f228124de7d98146ca526d743436f6419e2365Erik/* 279f228124de7d98146ca526d743436f6419e2365Erik * Copyright (C) 2010 The Android Open Source Project 379f228124de7d98146ca526d743436f6419e2365Erik * 479f228124de7d98146ca526d743436f6419e2365Erik * Licensed under the Apache License, Version 2.0 (the "License"); 579f228124de7d98146ca526d743436f6419e2365Erik * you may not use this file except in compliance with the License. 679f228124de7d98146ca526d743436f6419e2365Erik * You may obtain a copy of the License at 779f228124de7d98146ca526d743436f6419e2365Erik * 879f228124de7d98146ca526d743436f6419e2365Erik * http://www.apache.org/licenses/LICENSE-2.0 979f228124de7d98146ca526d743436f6419e2365Erik * 1079f228124de7d98146ca526d743436f6419e2365Erik * Unless required by applicable law or agreed to in writing, software 1179f228124de7d98146ca526d743436f6419e2365Erik * distributed under the License is distributed on an "AS IS" BASIS, 1279f228124de7d98146ca526d743436f6419e2365Erik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1379f228124de7d98146ca526d743436f6419e2365Erik * See the License for the specific language governing permissions and 1479f228124de7d98146ca526d743436f6419e2365Erik * limitations under the License. 1579f228124de7d98146ca526d743436f6419e2365Erik */ 1679f228124de7d98146ca526d743436f6419e2365Erik 17fbce65e53c7a111955f638db5bf8bee35381e5b7Erikpackage com.android.calendar.event; 1879f228124de7d98146ca526d743436f6419e2365Erik 1979f228124de7d98146ca526d743436f6419e2365Erikimport android.app.Activity; 2079f228124de7d98146ca526d743436f6419e2365Erikimport android.app.AlertDialog; 2179f228124de7d98146ca526d743436f6419e2365Erikimport android.app.Fragment; 2279f228124de7d98146ca526d743436f6419e2365Erikimport android.content.AsyncQueryHandler; 235f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.content.ContentProviderOperation; 2479f228124de7d98146ca526d743436f6419e2365Erikimport android.content.ContentResolver; 25dd95df57c8c5a58a85c4c0effad5652dec14f621Erikimport android.content.ContentUris; 265f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.content.ContentValues; 275c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawaimport android.content.Context; 2879f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface; 29d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chanimport android.content.DialogInterface.OnCancelListener; 3079f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface.OnClickListener; 31c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport android.content.Intent; 3279f228124de7d98146ca526d743436f6419e2365Erikimport android.database.Cursor; 3379f228124de7d98146ca526d743436f6419e2365Erikimport android.database.MatrixCursor; 3479f228124de7d98146ca526d743436f6419e2365Erikimport android.net.Uri; 3579f228124de7d98146ca526d743436f6419e2365Erikimport android.os.Bundle; 36a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Attendees; 37a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Calendars; 38a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Events; 39a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Reminders; 4079f228124de7d98146ca526d743436f6419e2365Erikimport android.text.TextUtils; 41c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErikimport android.text.format.Time; 4279f228124de7d98146ca526d743436f6419e2365Erikimport android.util.Log; 4379f228124de7d98146ca526d743436f6419e2365Erikimport android.view.LayoutInflater; 445f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.Menu; 455f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.MenuInflater; 465f62079ab9daefe95ede87631766e99e8b4a2220Erikimport android.view.MenuItem; 4779f228124de7d98146ca526d743436f6419e2365Erikimport android.view.View; 4879f228124de7d98146ca526d743436f6419e2365Erikimport android.view.ViewGroup; 495c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawaimport android.view.inputmethod.InputMethodManager; 50135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huangimport android.widget.LinearLayout; 5179f228124de7d98146ca526d743436f6419e2365Erikimport android.widget.Toast; 5279f228124de7d98146ca526d743436f6419e2365Erik 53c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.AsyncQueryService; 54c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController; 55c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventHandler; 56c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventInfo; 57c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventType; 58c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel; 59c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel.Attendee; 60c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarEventModel.ReminderEntry; 61c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.DeleteEventHelper; 62c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.R; 63c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.Utils; 64c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan 65c130d9d5e0d178585721428e394df0c8e0a6729fErikimport java.io.Serializable; 665f62079ab9daefe95ede87631766e99e8b4a2220Erikimport java.util.ArrayList; 679645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFaddenimport java.util.Collections; 685f62079ab9daefe95ede87631766e99e8b4a2220Erik 69dd95df57c8c5a58a85c4c0effad5652dec14f621Erikpublic class EditEventFragment extends Fragment implements EventHandler { 7079f228124de7d98146ca526d743436f6419e2365Erik private static final String TAG = "EditEventActivity"; 7179f228124de7d98146ca526d743436f6419e2365Erik 7259ead671b50514b49749fcd6a1d4186a270239d2Erik private static final String BUNDLE_KEY_MODEL = "key_model"; 7359ead671b50514b49749fcd6a1d4186a270239d2Erik private static final String BUNDLE_KEY_EDIT_STATE = "key_edit_state"; 74c130d9d5e0d178585721428e394df0c8e0a6729fErik private static final String BUNDLE_KEY_EVENT = "key_event"; 75a7694eead7cbb293990bc89c3906e17bad36194cErik private static final String BUNDLE_KEY_READ_ONLY = "key_read_only"; 762d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira private static final String BUNDLE_KEY_EDIT_ON_LAUNCH = "key_edit_on_launch"; 7759ead671b50514b49749fcd6a1d4186a270239d2Erik 7879f228124de7d98146ca526d743436f6419e2365Erik private static final boolean DEBUG = false; 7979f228124de7d98146ca526d743436f6419e2365Erik 80352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private static final int TOKEN_EVENT = 1; 81352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private static final int TOKEN_ATTENDEES = 1 << 1; 82352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private static final int TOKEN_REMINDERS = 1 << 2; 83352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private static final int TOKEN_CALENDARS = 1 << 3; 84352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan private static final int TOKEN_ALL = TOKEN_EVENT | TOKEN_ATTENDEES | TOKEN_REMINDERS 85352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan | TOKEN_CALENDARS; 865f62079ab9daefe95ede87631766e99e8b4a2220Erik private static final int TOKEN_UNITIALIZED = 1 << 31; 87352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 88352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan /** 89352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan * A bitfield of TOKEN_* to keep track which query hasn't been completed 90352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan * yet. Once all queries have returned, the model can be applied to the 91352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan * view. 92352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan */ 935f62079ab9daefe95ede87631766e99e8b4a2220Erik private int mOutstandingQueries = TOKEN_UNITIALIZED; 9479f228124de7d98146ca526d743436f6419e2365Erik 9579f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper mHelper; 9679f228124de7d98146ca526d743436f6419e2365Erik CalendarEventModel mModel; 9779f228124de7d98146ca526d743436f6419e2365Erik CalendarEventModel mOriginalModel; 9859ead671b50514b49749fcd6a1d4186a270239d2Erik CalendarEventModel mRestoreModel; 9979f228124de7d98146ca526d743436f6419e2365Erik EditEventView mView; 10079f228124de7d98146ca526d743436f6419e2365Erik QueryHandler mHandler; 10179f228124de7d98146ca526d743436f6419e2365Erik 10279f228124de7d98146ca526d743436f6419e2365Erik private AlertDialog mModifyDialog; 10379f228124de7d98146ca526d743436f6419e2365Erik int mModification = Utils.MODIFY_UNINITIALIZED; 10479f228124de7d98146ca526d743436f6419e2365Erik 105dd95df57c8c5a58a85c4c0effad5652dec14f621Erik private EventInfo mEvent; 106c130d9d5e0d178585721428e394df0c8e0a6729fErik private EventBundle mEventBundle; 10779f228124de7d98146ca526d743436f6419e2365Erik private Uri mUri; 10879f228124de7d98146ca526d743436f6419e2365Erik private long mBegin; 10979f228124de7d98146ca526d743436f6419e2365Erik private long mEnd; 11079f228124de7d98146ca526d743436f6419e2365Erik 11179f228124de7d98146ca526d743436f6419e2365Erik private Activity mContext; 112dd95df57c8c5a58a85c4c0effad5652dec14f621Erik private Done mOnDone = new Done(); 113dd95df57c8c5a58a85c4c0effad5652dec14f621Erik 114dd95df57c8c5a58a85c4c0effad5652dec14f621Erik private boolean mSaveOnDetach = true; 115a7694eead7cbb293990bc89c3906e17bad36194cErik private boolean mIsReadOnly = false; 116a7694eead7cbb293990bc89c3906e17bad36194cErik public boolean mShowModifyDialogOnLaunch = false; 11779f228124de7d98146ca526d743436f6419e2365Erik 1185c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa private InputMethodManager mInputMethodManager; 1195c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa 120c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan private Intent mIntent; 121c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan 122135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang private boolean mUseCustomActionBar; 123135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang 124135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang private View.OnClickListener mActionBarListener = new View.OnClickListener() { 125135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang @Override 126135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang public void onClick(View v) { 127135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang onActionBarItemSelected(v.getId()); 128135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang } 129135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang }; 130135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang 131364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik // TODO turn this into a helper function in EditEventHelper for building the 132364309f0bb9c3aeee8efd0c24faf478f7c62c6d7Erik // model 13379f228124de7d98146ca526d743436f6419e2365Erik private class QueryHandler extends AsyncQueryHandler { 13479f228124de7d98146ca526d743436f6419e2365Erik public QueryHandler(ContentResolver cr) { 13579f228124de7d98146ca526d743436f6419e2365Erik super(cr); 13679f228124de7d98146ca526d743436f6419e2365Erik } 13779f228124de7d98146ca526d743436f6419e2365Erik 13879f228124de7d98146ca526d743436f6419e2365Erik @Override 13979f228124de7d98146ca526d743436f6419e2365Erik protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 14079f228124de7d98146ca526d743436f6419e2365Erik // If the query didn't return a cursor for some reason return 14179f228124de7d98146ca526d743436f6419e2365Erik if (cursor == null) { 14279f228124de7d98146ca526d743436f6419e2365Erik return; 14379f228124de7d98146ca526d743436f6419e2365Erik } 14479f228124de7d98146ca526d743436f6419e2365Erik 14579f228124de7d98146ca526d743436f6419e2365Erik // If the Activity is finishing, then close the cursor. 14679f228124de7d98146ca526d743436f6419e2365Erik // Otherwise, use the new cursor in the adapter. 1476a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan final Activity activity = EditEventFragment.this.getActivity(); 1486a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan if (activity == null || activity.isFinishing()) { 14979f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 15079f228124de7d98146ca526d743436f6419e2365Erik return; 15179f228124de7d98146ca526d743436f6419e2365Erik } 15279f228124de7d98146ca526d743436f6419e2365Erik long eventId; 15379f228124de7d98146ca526d743436f6419e2365Erik switch (token) { 15479f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_EVENT: 15579f228124de7d98146ca526d743436f6419e2365Erik if (cursor.getCount() == 0) { 15679f228124de7d98146ca526d743436f6419e2365Erik // The cursor is empty. This can happen if the event 15779f228124de7d98146ca526d743436f6419e2365Erik // was deleted. 15879f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 159352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOnDone.setDoneCode(Utils.DONE_EXIT); 16016bfd177ebb7e14703cc4b198cc86c2778ed7fe6RoboErik mSaveOnDetach = false; 161352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOnDone.run(); 16279f228124de7d98146ca526d743436f6419e2365Erik return; 16379f228124de7d98146ca526d743436f6419e2365Erik } 16479f228124de7d98146ca526d743436f6419e2365Erik mOriginalModel = new CalendarEventModel(); 16579f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.setModelFromCursor(mOriginalModel, cursor); 16679f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.setModelFromCursor(mModel, cursor); 16779f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 16879f228124de7d98146ca526d743436f6419e2365Erik 16959ead671b50514b49749fcd6a1d4186a270239d2Erik mOriginalModel.mUri = mUri.toString(); 17079f228124de7d98146ca526d743436f6419e2365Erik 17159ead671b50514b49749fcd6a1d4186a270239d2Erik mModel.mUri = mUri.toString(); 17279f228124de7d98146ca526d743436f6419e2365Erik mModel.mOriginalStart = mBegin; 17379f228124de7d98146ca526d743436f6419e2365Erik mModel.mOriginalEnd = mEnd; 17479f228124de7d98146ca526d743436f6419e2365Erik mModel.mIsFirstEventInSeries = mBegin == mOriginalModel.mStart; 17579f228124de7d98146ca526d743436f6419e2365Erik mModel.mStart = mBegin; 17679f228124de7d98146ca526d743436f6419e2365Erik mModel.mEnd = mEnd; 17779f228124de7d98146ca526d743436f6419e2365Erik 17879f228124de7d98146ca526d743436f6419e2365Erik eventId = mModel.mId; 179352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 180352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // TOKEN_ATTENDEES 18179f228124de7d98146ca526d743436f6419e2365Erik if (mModel.mHasAttendeeData && eventId != -1) { 18279f228124de7d98146ca526d743436f6419e2365Erik Uri attUri = Attendees.CONTENT_URI; 18379f228124de7d98146ca526d743436f6419e2365Erik String[] whereArgs = { 18479f228124de7d98146ca526d743436f6419e2365Erik Long.toString(eventId) 18579f228124de7d98146ca526d743436f6419e2365Erik }; 18679f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_ATTENDEES, null, attUri, 18779f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.ATTENDEES_PROJECTION, 188d845fbe558d5229102b58cce70a1b29fe6cb6967Erik EditEventHelper.ATTENDEES_WHERE /* selection */, 18979f228124de7d98146ca526d743436f6419e2365Erik whereArgs /* selection args */, null /* sort order */); 190352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } else { 191352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_ATTENDEES); 192352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 193352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 194352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // TOKEN_REMINDERS 195352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (mModel.mHasAlarm) { 196d845fbe558d5229102b58cce70a1b29fe6cb6967Erik Uri rUri = Reminders.CONTENT_URI; 197d845fbe558d5229102b58cce70a1b29fe6cb6967Erik String[] remArgs = { 1989645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden Long.toString(eventId) 199d845fbe558d5229102b58cce70a1b29fe6cb6967Erik }; 2009645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden mHandler.startQuery(TOKEN_REMINDERS, null, rUri, 2019645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden EditEventHelper.REMINDERS_PROJECTION, 2029645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden EditEventHelper.REMINDERS_WHERE /* selection */, 2039645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden remArgs /* selection args */, null /* sort order */); 20479f228124de7d98146ca526d743436f6419e2365Erik } else { 205352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_REMINDERS); 20679f228124de7d98146ca526d743436f6419e2365Erik } 207352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 208352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // TOKEN_CALENDARS 209352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan String[] selArgs = { 210352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan Long.toString(mModel.mCalendarId) 211352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan }; 212352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI, 213352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan EditEventHelper.CALENDARS_PROJECTION, EditEventHelper.CALENDARS_WHERE, 214352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan selArgs /* selection args */, null /* sort order */); 215352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 216352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_EVENT); 21779f228124de7d98146ca526d743436f6419e2365Erik break; 21879f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_ATTENDEES: 21979f228124de7d98146ca526d743436f6419e2365Erik try { 22079f228124de7d98146ca526d743436f6419e2365Erik while (cursor.moveToNext()) { 22179f228124de7d98146ca526d743436f6419e2365Erik String name = cursor.getString(EditEventHelper.ATTENDEES_INDEX_NAME); 22279f228124de7d98146ca526d743436f6419e2365Erik String email = cursor.getString(EditEventHelper.ATTENDEES_INDEX_EMAIL); 223d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int status = cursor.getInt(EditEventHelper.ATTENDEES_INDEX_STATUS); 22479f228124de7d98146ca526d743436f6419e2365Erik int relationship = cursor 22579f228124de7d98146ca526d743436f6419e2365Erik .getInt(EditEventHelper.ATTENDEES_INDEX_RELATIONSHIP); 226352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (relationship == Attendees.RELATIONSHIP_ORGANIZER) { 227352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (email != null) { 22879f228124de7d98146ca526d743436f6419e2365Erik mModel.mOrganizer = email; 229352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mModel.mIsOrganizer = mModel.mOwnerAccount 230352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan .equalsIgnoreCase(email); 231a7694eead7cbb293990bc89c3906e17bad36194cErik mOriginalModel.mOrganizer = email; 232a7694eead7cbb293990bc89c3906e17bad36194cErik mOriginalModel.mIsOrganizer = mOriginalModel.mOwnerAccount 233a7694eead7cbb293990bc89c3906e17bad36194cErik .equalsIgnoreCase(email); 234352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 235352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 236352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (TextUtils.isEmpty(name)) { 237352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mModel.mOrganizerDisplayName = mModel.mOrganizer; 238a7694eead7cbb293990bc89c3906e17bad36194cErik mOriginalModel.mOrganizerDisplayName = 239a7694eead7cbb293990bc89c3906e17bad36194cErik mOriginalModel.mOrganizer; 240352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } else { 241352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mModel.mOrganizerDisplayName = name; 242a7694eead7cbb293990bc89c3906e17bad36194cErik mOriginalModel.mOrganizerDisplayName = name; 24379f228124de7d98146ca526d743436f6419e2365Erik } 244352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 245352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 246352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (email != null) { 247d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mModel.mOwnerAccount != null && 248d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mOwnerAccount.equalsIgnoreCase(email)) { 249d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int attendeeId = 250d845fbe558d5229102b58cce70a1b29fe6cb6967Erik cursor.getInt(EditEventHelper.ATTENDEES_INDEX_ID); 251d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mOwnerAttendeeId = attendeeId; 252d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mSelfAttendeeStatus = status; 253d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalModel.mOwnerAttendeeId = attendeeId; 254d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalModel.mSelfAttendeeStatus = status; 255d845fbe558d5229102b58cce70a1b29fe6cb6967Erik continue; 256d845fbe558d5229102b58cce70a1b29fe6cb6967Erik } 25779f228124de7d98146ca526d743436f6419e2365Erik } 258d845fbe558d5229102b58cce70a1b29fe6cb6967Erik Attendee attendee = new Attendee(name, email); 259d845fbe558d5229102b58cce70a1b29fe6cb6967Erik attendee.mStatus = status; 260d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.addAttendee(attendee); 261d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalModel.addAttendee(attendee); 26279f228124de7d98146ca526d743436f6419e2365Erik } 26379f228124de7d98146ca526d743436f6419e2365Erik } finally { 26479f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 26579f228124de7d98146ca526d743436f6419e2365Erik } 266352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 267352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_ATTENDEES); 26879f228124de7d98146ca526d743436f6419e2365Erik break; 26979f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_REMINDERS: 27079f228124de7d98146ca526d743436f6419e2365Erik try { 271d290a01420234214d73d31b8bfa61652625bb149Erik // Add all reminders to the models 27279f228124de7d98146ca526d743436f6419e2365Erik while (cursor.moveToNext()) { 27379f228124de7d98146ca526d743436f6419e2365Erik int minutes = cursor.getInt(EditEventHelper.REMINDERS_INDEX_MINUTES); 274fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden int method = cursor.getInt(EditEventHelper.REMINDERS_INDEX_METHOD); 275fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden ReminderEntry re = ReminderEntry.valueOf(minutes, method); 276fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden mModel.mReminders.add(re); 277fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden mOriginalModel.mReminders.add(re); 27879f228124de7d98146ca526d743436f6419e2365Erik } 2799645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden 2809645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden // Sort appropriately for display 2819645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden Collections.sort(mModel.mReminders); 2829645d9c3e9b2cfd35c5fc89f41caf6e99153ba10Andy McFadden Collections.sort(mOriginalModel.mReminders); 28379f228124de7d98146ca526d743436f6419e2365Erik } finally { 28479f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 28579f228124de7d98146ca526d743436f6419e2365Erik } 286352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 287352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_REMINDERS); 28879f228124de7d98146ca526d743436f6419e2365Erik break; 28979f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_CALENDARS: 290352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan try { 291352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (mModel.mCalendarId == -1) { 292352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // Populate Calendar spinner only if no calendar is set e.g. new event 293352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan MatrixCursor matrixCursor = Utils.matrixCursorFromCursor(cursor); 294352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (DEBUG) { 295352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan Log.d(TAG, "onQueryComplete: setting cursor with " 296352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan + matrixCursor.getCount() + " calendars"); 297352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 298352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mView.setCalendarsCursor(matrixCursor, isAdded() && isResumed()); 299352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } else { 300352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan // Populate model for an existing event 301352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan EditEventHelper.setModelFromCalendarCursor(mModel, cursor); 302a7694eead7cbb293990bc89c3906e17bad36194cErik EditEventHelper.setModelFromCalendarCursor(mOriginalModel, cursor); 303352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } 304352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan } finally { 305352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan cursor.close(); 30679f228124de7d98146ca526d743436f6419e2365Erik } 307352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan 308352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan setModelIfDone(TOKEN_CALENDARS); 30979f228124de7d98146ca526d743436f6419e2365Erik break; 310fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson default: 311fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson cursor.close(); 312fae6d5c17df988e957af421498124cf600ded523Isaac Katzenelson break; 31379f228124de7d98146ca526d743436f6419e2365Erik } 31479f228124de7d98146ca526d743436f6419e2365Erik } 31579f228124de7d98146ca526d743436f6419e2365Erik } 31679f228124de7d98146ca526d743436f6419e2365Erik 317bdcb9fcc732d52708fafb068f535a2c93ff2356fDaisuke Miyakawa private void setModelIfDone(int queryType) { 318352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan synchronized (this) { 319352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOutstandingQueries &= ~queryType; 320352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan if (mOutstandingQueries == 0) { 32159ead671b50514b49749fcd6a1d4186a270239d2Erik if (mRestoreModel != null) { 32259ead671b50514b49749fcd6a1d4186a270239d2Erik mModel = mRestoreModel; 32359ead671b50514b49749fcd6a1d4186a270239d2Erik } 3241bd94537b630fbc5556307ea92f37d4a5facecb4Erik if (mShowModifyDialogOnLaunch && mModification == Utils.MODIFY_UNINITIALIZED) { 3251bd94537b630fbc5556307ea92f37d4a5facecb4Erik if (!TextUtils.isEmpty(mModel.mRrule)) { 3261bd94537b630fbc5556307ea92f37d4a5facecb4Erik displayEditWhichDialog(); 3271bd94537b630fbc5556307ea92f37d4a5facecb4Erik } else { 3281bd94537b630fbc5556307ea92f37d4a5facecb4Erik mModification = Utils.MODIFY_ALL; 3291bd94537b630fbc5556307ea92f37d4a5facecb4Erik } 3301bd94537b630fbc5556307ea92f37d4a5facecb4Erik 3311bd94537b630fbc5556307ea92f37d4a5facecb4Erik } 332352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mView.setModel(mModel); 3333400a2bfc1e6be435ea2bb0f436a6ef338446504Erik mView.setModification(mModification); 334c07a57fb7436d807ad505fa7319b9de13f91e741Erik } 3355f62079ab9daefe95ede87631766e99e8b4a2220Erik } 3365f62079ab9daefe95ede87631766e99e8b4a2220Erik } 3375f62079ab9daefe95ede87631766e99e8b4a2220Erik 338dd95df57c8c5a58a85c4c0effad5652dec14f621Erik public EditEventFragment() { 339c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan this(null, false, null); 340a7694eead7cbb293990bc89c3906e17bad36194cErik } 341a7694eead7cbb293990bc89c3906e17bad36194cErik 342c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan public EditEventFragment(EventInfo event, boolean readOnly, Intent intent) { 343dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mEvent = event; 344a7694eead7cbb293990bc89c3906e17bad36194cErik mIsReadOnly = readOnly; 345c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan mIntent = intent; 3465f62079ab9daefe95ede87631766e99e8b4a2220Erik setHasOptionsMenu(true); 34779f228124de7d98146ca526d743436f6419e2365Erik } 34879f228124de7d98146ca526d743436f6419e2365Erik 34979f228124de7d98146ca526d743436f6419e2365Erik private void startQuery() { 350dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mUri = null; 351dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mBegin = -1; 352dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mEnd = -1; 353dd95df57c8c5a58a85c4c0effad5652dec14f621Erik if (mEvent != null) { 354dd95df57c8c5a58a85c4c0effad5652dec14f621Erik if (mEvent.id != -1) { 355352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mModel.mId = mEvent.id; 356dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEvent.id); 357edecd9a97e02ff14bd5abeec3414e1bf3cc631dfMichael Chan } else { 358edecd9a97e02ff14bd5abeec3414e1bf3cc631dfMichael Chan // New event. All day? 359edecd9a97e02ff14bd5abeec3414e1bf3cc631dfMichael Chan mModel.mAllDay = mEvent.extraLong == CalendarController.EXTRA_CREATE_ALL_DAY; 360dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 361dd95df57c8c5a58a85c4c0effad5652dec14f621Erik if (mEvent.startTime != null) { 362dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mBegin = mEvent.startTime.toMillis(true); 363dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 364dd95df57c8c5a58a85c4c0effad5652dec14f621Erik if (mEvent.endTime != null) { 365dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mEnd = mEvent.endTime.toMillis(true); 366dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 367c130d9d5e0d178585721428e394df0c8e0a6729fErik } else if (mEventBundle != null) { 3683400a2bfc1e6be435ea2bb0f436a6ef338446504Erik if (mEventBundle.id != -1) { 3693400a2bfc1e6be435ea2bb0f436a6ef338446504Erik mModel.mId = mEventBundle.id; 3703400a2bfc1e6be435ea2bb0f436a6ef338446504Erik mUri = ContentUris.withAppendedId(Events.CONTENT_URI, mEventBundle.id); 3713400a2bfc1e6be435ea2bb0f436a6ef338446504Erik } 372c130d9d5e0d178585721428e394df0c8e0a6729fErik mBegin = mEventBundle.start; 373c130d9d5e0d178585721428e394df0c8e0a6729fErik mEnd = mEventBundle.end; 374dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 375e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang 376e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang if (mBegin <= 0) { 377e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang // use a default value instead 378e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mBegin = mHelper.constructDefaultStartTime(System.currentTimeMillis()); 379e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang } 380e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang if (mEnd < mBegin) { 381e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang // use a default value instead 382e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mEnd = mHelper.constructDefaultEndTime(mBegin); 383e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang } 38479f228124de7d98146ca526d743436f6419e2365Erik 38579f228124de7d98146ca526d743436f6419e2365Erik // Kick off the query for the event 38679f228124de7d98146ca526d743436f6419e2365Erik boolean newEvent = mUri == null; 38779f228124de7d98146ca526d743436f6419e2365Erik if (!newEvent) { 388ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik mModel.mCalendarAccessLevel = Calendars.CAL_ACCESS_NONE; 389352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOutstandingQueries = TOKEN_ALL; 39079f228124de7d98146ca526d743436f6419e2365Erik if (DEBUG) { 391352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan Log.d(TAG, "startQuery: uri for event is " + mUri.toString()); 39279f228124de7d98146ca526d743436f6419e2365Erik } 39379f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_EVENT, null, mUri, EditEventHelper.EVENT_PROJECTION, 39479f228124de7d98146ca526d743436f6419e2365Erik null /* selection */, null /* selection args */, null /* sort order */); 39579f228124de7d98146ca526d743436f6419e2365Erik } else { 396352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan mOutstandingQueries = TOKEN_CALENDARS; 39779f228124de7d98146ca526d743436f6419e2365Erik if (DEBUG) { 398352e1a2f834460bd54e03ce94cadd36a46debacbMichael Chan Log.d(TAG, "startQuery: Editing a new event."); 39979f228124de7d98146ca526d743436f6419e2365Erik } 40079f228124de7d98146ca526d743436f6419e2365Erik mModel.mStart = mBegin; 40179f228124de7d98146ca526d743436f6419e2365Erik mModel.mEnd = mEnd; 402d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mSelfAttendeeStatus = Attendees.ATTENDEE_STATUS_ACCEPTED; 40379f228124de7d98146ca526d743436f6419e2365Erik 40479f228124de7d98146ca526d743436f6419e2365Erik // Start a query in the background to read the list of calendars 40579f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI, 40679f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.CALENDARS_PROJECTION, 40779f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.CALENDARS_WHERE_WRITEABLE_VISIBLE, null /* selection args */, 40879f228124de7d98146ca526d743436f6419e2365Erik null /* sort order */); 409c07a57fb7436d807ad505fa7319b9de13f91e741Erik 410c07a57fb7436d807ad505fa7319b9de13f91e741Erik mModification = Utils.MODIFY_ALL; 411c07a57fb7436d807ad505fa7319b9de13f91e741Erik mView.setModification(mModification); 41279f228124de7d98146ca526d743436f6419e2365Erik } 41379f228124de7d98146ca526d743436f6419e2365Erik } 41479f228124de7d98146ca526d743436f6419e2365Erik 41579f228124de7d98146ca526d743436f6419e2365Erik @Override 41679f228124de7d98146ca526d743436f6419e2365Erik public void onAttach(Activity activity) { 41779f228124de7d98146ca526d743436f6419e2365Erik super.onAttach(activity); 41879f228124de7d98146ca526d743436f6419e2365Erik mContext = activity; 41979f228124de7d98146ca526d743436f6419e2365Erik 420dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mHelper = new EditEventHelper(activity, null); 42179f228124de7d98146ca526d743436f6419e2365Erik mHandler = new QueryHandler(activity.getContentResolver()); 422c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan mModel = new CalendarEventModel(activity, mIntent); 4235c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa mInputMethodManager = (InputMethodManager) 4245c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa activity.getSystemService(Context.INPUT_METHOD_SERVICE); 425135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang 4267ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson mUseCustomActionBar = !Utils.getConfigBool(mContext, R.bool.multiple_pane_config); 42779f228124de7d98146ca526d743436f6419e2365Erik } 42879f228124de7d98146ca526d743436f6419e2365Erik 42979f228124de7d98146ca526d743436f6419e2365Erik @Override 43079f228124de7d98146ca526d743436f6419e2365Erik public View onCreateView(LayoutInflater inflater, ViewGroup container, 43179f228124de7d98146ca526d743436f6419e2365Erik Bundle savedInstanceState) { 43279f228124de7d98146ca526d743436f6419e2365Erik// mContext.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 433a7694eead7cbb293990bc89c3906e17bad36194cErik View view; 434a7694eead7cbb293990bc89c3906e17bad36194cErik if (mIsReadOnly) { 435a7694eead7cbb293990bc89c3906e17bad36194cErik view = inflater.inflate(R.layout.edit_event_single_column, null); 436a7694eead7cbb293990bc89c3906e17bad36194cErik } else { 437a7694eead7cbb293990bc89c3906e17bad36194cErik view = inflater.inflate(R.layout.edit_event, null); 438a7694eead7cbb293990bc89c3906e17bad36194cErik } 439dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mView = new EditEventView(mContext, view, mOnDone); 44079f228124de7d98146ca526d743436f6419e2365Erik startQuery(); 441135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang 442135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang if (mUseCustomActionBar) { 443135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang View actionBarButtons = inflater.inflate(R.layout.edit_event_custom_actionbar, 444135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang new LinearLayout(mContext), false); 445135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang View cancelActionView = actionBarButtons.findViewById(R.id.action_cancel); 446135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang cancelActionView.setOnClickListener(mActionBarListener); 447135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang View doneActionView = actionBarButtons.findViewById(R.id.action_done); 448135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang doneActionView.setOnClickListener(mActionBarListener); 449135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang 450135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang mContext.getActionBar().setCustomView(actionBarButtons); 451135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang } 452135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang 45379f228124de7d98146ca526d743436f6419e2365Erik return view; 45479f228124de7d98146ca526d743436f6419e2365Erik } 45579f228124de7d98146ca526d743436f6419e2365Erik 45679f228124de7d98146ca526d743436f6419e2365Erik @Override 457135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang public void onDestroyView() { 458135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang super.onDestroyView(); 459135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang 460135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang if (mUseCustomActionBar) { 461135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang mContext.getActionBar().setCustomView(null); 462135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang } 463135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang } 464135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang 465135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang @Override 46679f228124de7d98146ca526d743436f6419e2365Erik public void onCreate(Bundle savedInstanceState) { 46779f228124de7d98146ca526d743436f6419e2365Erik super.onCreate(savedInstanceState); 46859ead671b50514b49749fcd6a1d4186a270239d2Erik if (savedInstanceState != null) { 46959ead671b50514b49749fcd6a1d4186a270239d2Erik if (savedInstanceState.containsKey(BUNDLE_KEY_MODEL)) { 47059ead671b50514b49749fcd6a1d4186a270239d2Erik mRestoreModel = (CalendarEventModel) savedInstanceState.getSerializable( 47159ead671b50514b49749fcd6a1d4186a270239d2Erik BUNDLE_KEY_MODEL); 47259ead671b50514b49749fcd6a1d4186a270239d2Erik } 47359ead671b50514b49749fcd6a1d4186a270239d2Erik if (savedInstanceState.containsKey(BUNDLE_KEY_EDIT_STATE)) { 47459ead671b50514b49749fcd6a1d4186a270239d2Erik mModification = savedInstanceState.getInt(BUNDLE_KEY_EDIT_STATE); 47559ead671b50514b49749fcd6a1d4186a270239d2Erik } 4762d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira if (savedInstanceState.containsKey(BUNDLE_KEY_EDIT_ON_LAUNCH)) { 4772d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira mShowModifyDialogOnLaunch = savedInstanceState 4782d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira .getBoolean(BUNDLE_KEY_EDIT_ON_LAUNCH); 4792d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira } 480c130d9d5e0d178585721428e394df0c8e0a6729fErik if (savedInstanceState.containsKey(BUNDLE_KEY_EVENT)) { 481c130d9d5e0d178585721428e394df0c8e0a6729fErik mEventBundle = (EventBundle) savedInstanceState.getSerializable(BUNDLE_KEY_EVENT); 482c130d9d5e0d178585721428e394df0c8e0a6729fErik } 483a7694eead7cbb293990bc89c3906e17bad36194cErik if (savedInstanceState.containsKey(BUNDLE_KEY_READ_ONLY)) { 484a7694eead7cbb293990bc89c3906e17bad36194cErik mIsReadOnly = savedInstanceState.getBoolean(BUNDLE_KEY_READ_ONLY); 485a7694eead7cbb293990bc89c3906e17bad36194cErik } 48659ead671b50514b49749fcd6a1d4186a270239d2Erik } 48779f228124de7d98146ca526d743436f6419e2365Erik } 4885f62079ab9daefe95ede87631766e99e8b4a2220Erik 4895f62079ab9daefe95ede87631766e99e8b4a2220Erik 4905f62079ab9daefe95ede87631766e99e8b4a2220Erik @Override 4915f62079ab9daefe95ede87631766e99e8b4a2220Erik public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 4925f62079ab9daefe95ede87631766e99e8b4a2220Erik super.onCreateOptionsMenu(menu, inflater); 493135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang 494135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang if (!mUseCustomActionBar) { 495135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang inflater.inflate(R.menu.edit_event_title_bar, menu); 4965f62079ab9daefe95ede87631766e99e8b4a2220Erik } 4975f62079ab9daefe95ede87631766e99e8b4a2220Erik } 4985f62079ab9daefe95ede87631766e99e8b4a2220Erik 4995f62079ab9daefe95ede87631766e99e8b4a2220Erik @Override 5005f62079ab9daefe95ede87631766e99e8b4a2220Erik public boolean onOptionsItemSelected(MenuItem item) { 501135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang return onActionBarItemSelected(item.getItemId()); 502135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang } 503135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang 504135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang /** 505135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang * Handles menu item selections, whether they come from our custom action bar buttons or from 506135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang * the standard menu items. Depends on the menu item ids matching the custom action bar button 507135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang * ids. 508135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang * 509135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang * @param itemId the button or menu item id 510135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang * @return whether the event was handled here 511135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang */ 512135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang private boolean onActionBarItemSelected(int itemId) { 513135b2d4f40a3ed618e900960fc32344e72adab3cAndy Huang switch (itemId) { 5145f62079ab9daefe95ede87631766e99e8b4a2220Erik case R.id.action_done: 5155f62079ab9daefe95ede87631766e99e8b4a2220Erik if (EditEventHelper.canModifyEvent(mModel) || EditEventHelper.canRespond(mModel)) { 5165f62079ab9daefe95ede87631766e99e8b4a2220Erik if (mView != null && mView.prepareForSave()) { 51746cde5cff48d6862f492f60c6a6336bfc047ce25Erik if (mModification == Utils.MODIFY_UNINITIALIZED) { 51846cde5cff48d6862f492f60c6a6336bfc047ce25Erik mModification = Utils.MODIFY_ALL; 51946cde5cff48d6862f492f60c6a6336bfc047ce25Erik } 5205f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.setDoneCode(Utils.DONE_SAVE | Utils.DONE_EXIT); 5215f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.run(); 5225f62079ab9daefe95ede87631766e99e8b4a2220Erik } else { 5235f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.setDoneCode(Utils.DONE_REVERT); 5245f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.run(); 5255f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5265f62079ab9daefe95ede87631766e99e8b4a2220Erik } else if (EditEventHelper.canAddReminders(mModel) && mModel.mId != -1 5275f62079ab9daefe95ede87631766e99e8b4a2220Erik && mOriginalModel != null && mView.prepareForSave()) { 5285f62079ab9daefe95ede87631766e99e8b4a2220Erik saveReminders(); 5295f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.setDoneCode(Utils.DONE_EXIT); 5305f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.run(); 5315f62079ab9daefe95ede87631766e99e8b4a2220Erik } else { 5325f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.setDoneCode(Utils.DONE_REVERT); 5335f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.run(); 5345f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5355f62079ab9daefe95ede87631766e99e8b4a2220Erik break; 5365f62079ab9daefe95ede87631766e99e8b4a2220Erik case R.id.action_cancel: 5375f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.setDoneCode(Utils.DONE_REVERT); 5385f62079ab9daefe95ede87631766e99e8b4a2220Erik mOnDone.run(); 5395f62079ab9daefe95ede87631766e99e8b4a2220Erik break; 5405f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5415f62079ab9daefe95ede87631766e99e8b4a2220Erik return true; 5425f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5435f62079ab9daefe95ede87631766e99e8b4a2220Erik 5445f62079ab9daefe95ede87631766e99e8b4a2220Erik private void saveReminders() { 5455f62079ab9daefe95ede87631766e99e8b4a2220Erik ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(3); 546fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden boolean changed = EditEventHelper.saveReminders(ops, mModel.mId, mModel.mReminders, 547fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden mOriginalModel.mReminders, false /* no force save */); 5485f62079ab9daefe95ede87631766e99e8b4a2220Erik 5495f62079ab9daefe95ede87631766e99e8b4a2220Erik if (!changed) { 5505f62079ab9daefe95ede87631766e99e8b4a2220Erik return; 5515f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5525f62079ab9daefe95ede87631766e99e8b4a2220Erik 5535f62079ab9daefe95ede87631766e99e8b4a2220Erik AsyncQueryService service = new AsyncQueryService(getActivity()); 5545f62079ab9daefe95ede87631766e99e8b4a2220Erik service.startBatch(0, null, Calendars.CONTENT_URI.getAuthority(), ops, 0); 5555f62079ab9daefe95ede87631766e99e8b4a2220Erik // Update the "hasAlarm" field for the event 5565f62079ab9daefe95ede87631766e99e8b4a2220Erik Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, mModel.mId); 557fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden int len = mModel.mReminders.size(); 5585f62079ab9daefe95ede87631766e99e8b4a2220Erik boolean hasAlarm = len > 0; 5595f62079ab9daefe95ede87631766e99e8b4a2220Erik if (hasAlarm != mOriginalModel.mHasAlarm) { 5605f62079ab9daefe95ede87631766e99e8b4a2220Erik ContentValues values = new ContentValues(); 5615f62079ab9daefe95ede87631766e99e8b4a2220Erik values.put(Events.HAS_ALARM, hasAlarm ? 1 : 0); 5625f62079ab9daefe95ede87631766e99e8b4a2220Erik service.startUpdate(0, null, uri, values, null, null, 0); 5635f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5645f62079ab9daefe95ede87631766e99e8b4a2220Erik 5655f62079ab9daefe95ede87631766e99e8b4a2220Erik Toast.makeText(mContext, R.string.saving_event, Toast.LENGTH_SHORT).show(); 5665f62079ab9daefe95ede87631766e99e8b4a2220Erik } 5675f62079ab9daefe95ede87631766e99e8b4a2220Erik 56846cde5cff48d6862f492f60c6a6336bfc047ce25Erik protected void displayEditWhichDialog() { 5692d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira if (mModification == Utils.MODIFY_UNINITIALIZED) { 570e0dbac67413c2ca910f357ddf51a6d43162d7843RoboErik final boolean notSynced = TextUtils.isEmpty(mModel.mSyncId); 57179f228124de7d98146ca526d743436f6419e2365Erik boolean isFirstEventInSeries = mModel.mIsFirstEventInSeries; 57279f228124de7d98146ca526d743436f6419e2365Erik int itemIndex = 0; 57379f228124de7d98146ca526d743436f6419e2365Erik CharSequence[] items; 5741ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan 5751ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan if (notSynced) { 5761ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan // If this event has not been synced, then don't allow deleting 5771ec87639bd05857bcb2c4a0acc189c0ff413a287Michael Chan // or changing a single instance. 57879f228124de7d98146ca526d743436f6419e2365Erik if (isFirstEventInSeries) { 57979f228124de7d98146ca526d743436f6419e2365Erik // Still display the option so the user knows all events are 58079f228124de7d98146ca526d743436f6419e2365Erik // changing 58179f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[1]; 58279f228124de7d98146ca526d743436f6419e2365Erik } else { 58379f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[2]; 58479f228124de7d98146ca526d743436f6419e2365Erik } 58579f228124de7d98146ca526d743436f6419e2365Erik } else { 58679f228124de7d98146ca526d743436f6419e2365Erik if (isFirstEventInSeries) { 58779f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[2]; 58879f228124de7d98146ca526d743436f6419e2365Erik } else { 58979f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[3]; 59079f228124de7d98146ca526d743436f6419e2365Erik } 59179f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_event); 59279f228124de7d98146ca526d743436f6419e2365Erik } 59379f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_all); 59479f228124de7d98146ca526d743436f6419e2365Erik 59579f228124de7d98146ca526d743436f6419e2365Erik // Do one more check to make sure this remains at the end of the list 59679f228124de7d98146ca526d743436f6419e2365Erik if (!isFirstEventInSeries) { 59779f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_all_following); 59879f228124de7d98146ca526d743436f6419e2365Erik } 59979f228124de7d98146ca526d743436f6419e2365Erik 60079f228124de7d98146ca526d743436f6419e2365Erik // Display the modification dialog. 60179f228124de7d98146ca526d743436f6419e2365Erik if (mModifyDialog != null) { 60279f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog.dismiss(); 60379f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog = null; 60479f228124de7d98146ca526d743436f6419e2365Erik } 60528dab653f55caccbed32f700274f5274abaee089RoboErik mModifyDialog = new AlertDialog.Builder(mContext).setTitle(R.string.edit_event_label) 60628dab653f55caccbed32f700274f5274abaee089RoboErik .setItems(items, new OnClickListener() { 60728dab653f55caccbed32f700274f5274abaee089RoboErik public void onClick(DialogInterface dialog, int which) { 60828dab653f55caccbed32f700274f5274abaee089RoboErik if (which == 0) { 60928dab653f55caccbed32f700274f5274abaee089RoboErik // Update this if we start allowing exceptions 61028dab653f55caccbed32f700274f5274abaee089RoboErik // to unsynced events in the app 61128dab653f55caccbed32f700274f5274abaee089RoboErik mModification = notSynced ? Utils.MODIFY_ALL 61228dab653f55caccbed32f700274f5274abaee089RoboErik : Utils.MODIFY_SELECTED; 61328dab653f55caccbed32f700274f5274abaee089RoboErik if (mModification == Utils.MODIFY_SELECTED) { 61428dab653f55caccbed32f700274f5274abaee089RoboErik mModel.mOriginalSyncId = notSynced ? null : mModel.mSyncId; 61528dab653f55caccbed32f700274f5274abaee089RoboErik mModel.mOriginalId = mModel.mId; 61628dab653f55caccbed32f700274f5274abaee089RoboErik } 61728dab653f55caccbed32f700274f5274abaee089RoboErik } else if (which == 1) { 61828dab653f55caccbed32f700274f5274abaee089RoboErik mModification = notSynced ? Utils.MODIFY_ALL_FOLLOWING 61928dab653f55caccbed32f700274f5274abaee089RoboErik : Utils.MODIFY_ALL; 62028dab653f55caccbed32f700274f5274abaee089RoboErik } else if (which == 2) { 62128dab653f55caccbed32f700274f5274abaee089RoboErik mModification = Utils.MODIFY_ALL_FOLLOWING; 62228dab653f55caccbed32f700274f5274abaee089RoboErik } 62379f228124de7d98146ca526d743436f6419e2365Erik 62428dab653f55caccbed32f700274f5274abaee089RoboErik mView.setModification(mModification); 62528dab653f55caccbed32f700274f5274abaee089RoboErik } 62628dab653f55caccbed32f700274f5274abaee089RoboErik }).show(); 627d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan 628d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan mModifyDialog.setOnCancelListener(new OnCancelListener() { 629d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan @Override 630d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan public void onCancel(DialogInterface dialog) { 631d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan Activity a = EditEventFragment.this.getActivity(); 632d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan if (a != null) { 633d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan a.finish(); 634d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan } 635d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan } 636d17d348952d10ab9deac68eebb2c9e5e94bdfde2Michael Chan }); 63779f228124de7d98146ca526d743436f6419e2365Erik } 63879f228124de7d98146ca526d743436f6419e2365Erik } 63979f228124de7d98146ca526d743436f6419e2365Erik 64079f228124de7d98146ca526d743436f6419e2365Erik class Done implements EditEventHelper.EditDoneRunnable { 64179f228124de7d98146ca526d743436f6419e2365Erik private int mCode = -1; 64279f228124de7d98146ca526d743436f6419e2365Erik 64379f228124de7d98146ca526d743436f6419e2365Erik public void setDoneCode(int code) { 64479f228124de7d98146ca526d743436f6419e2365Erik mCode = code; 64579f228124de7d98146ca526d743436f6419e2365Erik } 64679f228124de7d98146ca526d743436f6419e2365Erik 64779f228124de7d98146ca526d743436f6419e2365Erik public void run() { 648dd95df57c8c5a58a85c4c0effad5652dec14f621Erik // We only want this to get called once, either because the user 649dd95df57c8c5a58a85c4c0effad5652dec14f621Erik // pressed back/home or one of the buttons on screen 650dd95df57c8c5a58a85c4c0effad5652dec14f621Erik mSaveOnDetach = false; 651aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik if (mModification == Utils.MODIFY_UNINITIALIZED) { 652aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik // If this is uninitialized the user hit back, the only 653aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik // changeable item is response to default to all events. 654aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik mModification = Utils.MODIFY_ALL; 655aca9e032001f7361200f7dafb713e6f63bf9b094RoboErik } 6567b92da258a480284dcc15a518ea570072329a31dErik 657a7694eead7cbb293990bc89c3906e17bad36194cErik if ((mCode & Utils.DONE_SAVE) != 0 && mModel != null 658a7694eead7cbb293990bc89c3906e17bad36194cErik && (EditEventHelper.canRespond(mModel) 659a7694eead7cbb293990bc89c3906e17bad36194cErik || EditEventHelper.canModifyEvent(mModel)) 6606a7003d1b9bf20f4c6e001d054b1ab556ddec4a4RoboErik && mView.prepareForSave() 661d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan && !isEmptyNewEvent() 662ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden && mModel.normalizeReminders() 663304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan && mHelper.saveEvent(mModel, mOriginalModel, mModification)) { 664304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan int stringResource; 665ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan if (!mModel.mAttendeesList.isEmpty()) { 666ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan if (mModel.mUri != null) { 667ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan stringResource = R.string.saving_event_with_guest; 668ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan } else { 669ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan stringResource = R.string.creating_event_with_guest; 670ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan } 671304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan } else { 672ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan if (mModel.mUri != null) { 673ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan stringResource = R.string.saving_event; 674ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan } else { 675ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan stringResource = R.string.creating_event; 676ea8ebdbb40b0b2d746a2d15293ffba7b60158007Michael Chan } 6777b92da258a480284dcc15a518ea570072329a31dErik } 678304bf0d244d54c2c8c1799e3d43c54d197a891d8Michael Chan Toast.makeText(mContext, stringResource, Toast.LENGTH_SHORT).show(); 6792bd5cc06a7a89a848688416456f1b8f915542d57RoboErik } else if ((mCode & Utils.DONE_SAVE) != 0 && mModel != null && isEmptyNewEvent()) { 6802bd5cc06a7a89a848688416456f1b8f915542d57RoboErik Toast.makeText(mContext, R.string.empty_event, Toast.LENGTH_SHORT).show(); 6817b92da258a480284dcc15a518ea570072329a31dErik } 6827b92da258a480284dcc15a518ea570072329a31dErik 6832fda24534978f55711526dbde747aa50d68dec40RoboErik if ((mCode & Utils.DONE_DELETE) != 0 && mOriginalModel != null 6842fda24534978f55711526dbde747aa50d68dec40RoboErik && EditEventHelper.canModifyCalendar(mOriginalModel)) { 6857b92da258a480284dcc15a518ea570072329a31dErik long begin = mModel.mStart; 6867b92da258a480284dcc15a518ea570072329a31dErik long end = mModel.mEnd; 6877b92da258a480284dcc15a518ea570072329a31dErik int which = -1; 6887b92da258a480284dcc15a518ea570072329a31dErik switch (mModification) { 6897b92da258a480284dcc15a518ea570072329a31dErik case Utils.MODIFY_SELECTED: 6907b92da258a480284dcc15a518ea570072329a31dErik which = DeleteEventHelper.DELETE_SELECTED; 6917b92da258a480284dcc15a518ea570072329a31dErik break; 6927b92da258a480284dcc15a518ea570072329a31dErik case Utils.MODIFY_ALL_FOLLOWING: 6937b92da258a480284dcc15a518ea570072329a31dErik which = DeleteEventHelper.DELETE_ALL_FOLLOWING; 6947b92da258a480284dcc15a518ea570072329a31dErik break; 6957b92da258a480284dcc15a518ea570072329a31dErik case Utils.MODIFY_ALL: 6967b92da258a480284dcc15a518ea570072329a31dErik which = DeleteEventHelper.DELETE_ALL; 6977b92da258a480284dcc15a518ea570072329a31dErik break; 6987b92da258a480284dcc15a518ea570072329a31dErik } 699a7694eead7cbb293990bc89c3906e17bad36194cErik DeleteEventHelper deleteHelper = new DeleteEventHelper( 700a7694eead7cbb293990bc89c3906e17bad36194cErik mContext, mContext, !mIsReadOnly /* exitWhenDone */); 7016663f36972c0e9df10d4d79568658cec9c8a79ccErik deleteHelper.delete(begin, end, mOriginalModel, which); 70279f228124de7d98146ca526d743436f6419e2365Erik } 7037b92da258a480284dcc15a518ea570072329a31dErik 7047b92da258a480284dcc15a518ea570072329a31dErik if ((mCode & Utils.DONE_EXIT) != 0) { 7057b92da258a480284dcc15a518ea570072329a31dErik // This will exit the edit event screen, should be called 7067b92da258a480284dcc15a518ea570072329a31dErik // when we want to return to the main calendar views 7074024dee06fbe7c4bbd5b56e7d58917e86b66802eIsaac Katzenelson if ((mCode & Utils.DONE_SAVE) != 0) { 7084024dee06fbe7c4bbd5b56e7d58917e86b66802eIsaac Katzenelson if (mContext != null) { 709c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik long start = mModel.mStart; 710c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik long end = mModel.mEnd; 711c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik if (mModel.mAllDay) { 712c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik // For allday events we want to go to the day in the 713c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik // user's current tz 714c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik String tz = Utils.getTimeZone(mContext, null); 715c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik Time t = new Time(Time.TIMEZONE_UTC); 716c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik t.set(start); 717c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik t.timezone = tz; 718c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik start = t.toMillis(true); 719c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik 720c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik t.timezone = Time.TIMEZONE_UTC; 721c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik t.set(end); 722c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik t.timezone = tz; 723c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik end = t.toMillis(true); 724c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik } 725c8e0f21af5e2508d6e53a59e0f997dffd6a5321cRoboErik CalendarController.getInstance(mContext).launchViewEvent(-1, start, end); 7264024dee06fbe7c4bbd5b56e7d58917e86b66802eIsaac Katzenelson } 7274024dee06fbe7c4bbd5b56e7d58917e86b66802eIsaac Katzenelson } 7280d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan Activity a = EditEventFragment.this.getActivity(); 7290d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan if (a != null) { 7300d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan a.finish(); 7310d4a304ed6cd1a365c152ad0f38b5de53a8580b2Michael Chan } 7327b92da258a480284dcc15a518ea570072329a31dErik } 7337b92da258a480284dcc15a518ea570072329a31dErik 7345c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa // Hide a software keyboard so that user won't see it even after this Fragment's 7355c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa // disappearing. 7365c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa final View focusedView = mContext.getCurrentFocus(); 7375c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa if (focusedView != null) { 7385c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa mInputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0); 7395c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa focusedView.clearFocus(); 7405c0dec1dbf64687e36e1a26dbd9526eefa963848Daisuke Miyakawa } 74179f228124de7d98146ca526d743436f6419e2365Erik } 74279f228124de7d98146ca526d743436f6419e2365Erik } 74379f228124de7d98146ca526d743436f6419e2365Erik 744d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan boolean isEmptyNewEvent() { 745d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (mOriginalModel != null) { 746d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan // Not new 747d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return false; 748d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 749d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 750d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return isEmpty(); 751d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 752d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 753d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan private boolean isEmpty() { 754d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (mModel.mTitle != null) { 755d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan String title = mModel.mTitle.trim(); 756d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (title.length() > 0) { 757d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return false; 758d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 759d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 760d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 761d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (mModel.mLocation != null) { 762d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan String location = mModel.mLocation.trim(); 763d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (location.length() > 0) { 764d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return false; 765d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 766d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 767d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 768d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (mModel.mDescription != null) { 769d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan String description = mModel.mDescription.trim(); 770d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan if (description.length() > 0) { 771d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return false; 772d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 773d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 774d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 775d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan return true; 776d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan } 777d0fb2dd416a59e29f85435255ace75045a72886cMichael Chan 77879f228124de7d98146ca526d743436f6419e2365Erik @Override 779a7694eead7cbb293990bc89c3906e17bad36194cErik public void onPause() { 780a7694eead7cbb293990bc89c3906e17bad36194cErik Activity act = getActivity(); 78155d4c8c75b2442aee44cab0a8e52aacd7856a53aErik if (mSaveOnDetach && act != null && !mIsReadOnly && !act.isChangingConfigurations() 78255d4c8c75b2442aee44cab0a8e52aacd7856a53aErik && mView.prepareForSave()) { 783a7694eead7cbb293990bc89c3906e17bad36194cErik mOnDone.setDoneCode(Utils.DONE_SAVE); 784a7694eead7cbb293990bc89c3906e17bad36194cErik mOnDone.run(); 785a7694eead7cbb293990bc89c3906e17bad36194cErik } 786a7694eead7cbb293990bc89c3906e17bad36194cErik super.onPause(); 787a7694eead7cbb293990bc89c3906e17bad36194cErik } 788a7694eead7cbb293990bc89c3906e17bad36194cErik 789a7694eead7cbb293990bc89c3906e17bad36194cErik @Override 79079f228124de7d98146ca526d743436f6419e2365Erik public void onDestroy() { 791ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov if (mView != null) { 792ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov mView.setModel(null); 793ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov } 79479f228124de7d98146ca526d743436f6419e2365Erik if (mModifyDialog != null) { 79579f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog.dismiss(); 79679f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog = null; 79779f228124de7d98146ca526d743436f6419e2365Erik } 7987b92da258a480284dcc15a518ea570072329a31dErik super.onDestroy(); 79979f228124de7d98146ca526d743436f6419e2365Erik } 800dd95df57c8c5a58a85c4c0effad5652dec14f621Erik 801dd95df57c8c5a58a85c4c0effad5652dec14f621Erik @Override 802dd95df57c8c5a58a85c4c0effad5652dec14f621Erik public void eventsChanged() { 803dd95df57c8c5a58a85c4c0effad5652dec14f621Erik // TODO Requery to see if event has changed 804dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 805dd95df57c8c5a58a85c4c0effad5652dec14f621Erik 806dd95df57c8c5a58a85c4c0effad5652dec14f621Erik @Override 80759ead671b50514b49749fcd6a1d4186a270239d2Erik public void onSaveInstanceState(Bundle outState) { 80859ead671b50514b49749fcd6a1d4186a270239d2Erik mView.prepareForSave(); 80959ead671b50514b49749fcd6a1d4186a270239d2Erik outState.putSerializable(BUNDLE_KEY_MODEL, mModel); 81059ead671b50514b49749fcd6a1d4186a270239d2Erik outState.putInt(BUNDLE_KEY_EDIT_STATE, mModification); 811c130d9d5e0d178585721428e394df0c8e0a6729fErik if (mEventBundle == null && mEvent != null) { 812c130d9d5e0d178585721428e394df0c8e0a6729fErik mEventBundle = new EventBundle(); 813c130d9d5e0d178585721428e394df0c8e0a6729fErik mEventBundle.id = mEvent.id; 814c130d9d5e0d178585721428e394df0c8e0a6729fErik if (mEvent.startTime != null) { 815c130d9d5e0d178585721428e394df0c8e0a6729fErik mEventBundle.start = mEvent.startTime.toMillis(true); 816c130d9d5e0d178585721428e394df0c8e0a6729fErik } 817c130d9d5e0d178585721428e394df0c8e0a6729fErik if (mEvent.endTime != null) { 818c130d9d5e0d178585721428e394df0c8e0a6729fErik mEventBundle.end = mEvent.startTime.toMillis(true); 819c130d9d5e0d178585721428e394df0c8e0a6729fErik } 820c130d9d5e0d178585721428e394df0c8e0a6729fErik } 8212d63dff4a71e932cce90f7823f78b5cfedcc6d32Mindy Pereira outState.putBoolean(BUNDLE_KEY_EDIT_ON_LAUNCH, mShowModifyDialogOnLaunch); 822c130d9d5e0d178585721428e394df0c8e0a6729fErik outState.putSerializable(BUNDLE_KEY_EVENT, mEventBundle); 823a7694eead7cbb293990bc89c3906e17bad36194cErik outState.putBoolean(BUNDLE_KEY_READ_ONLY, mIsReadOnly); 82459ead671b50514b49749fcd6a1d4186a270239d2Erik } 82559ead671b50514b49749fcd6a1d4186a270239d2Erik 82659ead671b50514b49749fcd6a1d4186a270239d2Erik @Override 827dd95df57c8c5a58a85c4c0effad5652dec14f621Erik public long getSupportedEventTypes() { 8287b92da258a480284dcc15a518ea570072329a31dErik return EventType.USER_HOME; 829dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 830dd95df57c8c5a58a85c4c0effad5652dec14f621Erik 831dd95df57c8c5a58a85c4c0effad5652dec14f621Erik @Override 832dd95df57c8c5a58a85c4c0effad5652dec14f621Erik public void handleEvent(EventInfo event) { 8337b92da258a480284dcc15a518ea570072329a31dErik // It's currently unclear if we want to save the event or not when home 8347b92da258a480284dcc15a518ea570072329a31dErik // is pressed. When creating a new event we shouldn't save since we 8357b92da258a480284dcc15a518ea570072329a31dErik // can't get the id of the new event easily. 8367b92da258a480284dcc15a518ea570072329a31dErik if ((false && event.eventType == EventType.USER_HOME) || (event.eventType == EventType.GO_TO 8377b92da258a480284dcc15a518ea570072329a31dErik && mSaveOnDetach)) { 8387b92da258a480284dcc15a518ea570072329a31dErik if (mView != null && mView.prepareForSave()) { 8397b92da258a480284dcc15a518ea570072329a31dErik mOnDone.setDoneCode(Utils.DONE_SAVE); 8407b92da258a480284dcc15a518ea570072329a31dErik mOnDone.run(); 8417b92da258a480284dcc15a518ea570072329a31dErik } 8427b92da258a480284dcc15a518ea570072329a31dErik } 843dd95df57c8c5a58a85c4c0effad5652dec14f621Erik } 844c130d9d5e0d178585721428e394df0c8e0a6729fErik 845a7694eead7cbb293990bc89c3906e17bad36194cErik private static class EventBundle implements Serializable { 84617c0cea5c4e5eee7b6c1676038e9223dd971007bMichael Chan private static final long serialVersionUID = 1L; 847c130d9d5e0d178585721428e394df0c8e0a6729fErik long id = -1; 848c130d9d5e0d178585721428e394df0c8e0a6729fErik long start = -1; 849c130d9d5e0d178585721428e394df0c8e0a6729fErik long end = -1; 850c130d9d5e0d178585721428e394df0c8e0a6729fErik } 85179f228124de7d98146ca526d743436f6419e2365Erik} 852