EditEventFragment.java revision ee212201f3b7dd290eb9ca99de5b4d0b9c62acfd
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 static android.provider.Calendar.EVENT_BEGIN_TIME; 2079f228124de7d98146ca526d743436f6419e2365Erikimport static android.provider.Calendar.EVENT_END_TIME; 2179f228124de7d98146ca526d743436f6419e2365Erik 22fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.AbstractCalendarActivity; 23fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.CalendarEventModel; 24d845fbe558d5229102b58cce70a1b29fe6cb6967Erikimport com.android.calendar.CalendarEventModel.Attendee; 25fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.DeleteEventHelper; 26fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.R; 27fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.Utils; 28fbce65e53c7a111955f638db5bf8bee35381e5b7Erik 2979f228124de7d98146ca526d743436f6419e2365Erikimport android.app.Activity; 3079f228124de7d98146ca526d743436f6419e2365Erikimport android.app.AlertDialog; 3179f228124de7d98146ca526d743436f6419e2365Erikimport android.app.Fragment; 3279f228124de7d98146ca526d743436f6419e2365Erikimport android.content.AsyncQueryHandler; 3379f228124de7d98146ca526d743436f6419e2365Erikimport android.content.ContentResolver; 3479f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface; 3579f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface.OnCancelListener; 3679f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface.OnClickListener; 3779f228124de7d98146ca526d743436f6419e2365Erikimport android.content.Intent; 3879f228124de7d98146ca526d743436f6419e2365Erikimport android.database.Cursor; 3979f228124de7d98146ca526d743436f6419e2365Erikimport android.database.MatrixCursor; 4079f228124de7d98146ca526d743436f6419e2365Erikimport android.net.Uri; 4179f228124de7d98146ca526d743436f6419e2365Erikimport android.os.Bundle; 4279f228124de7d98146ca526d743436f6419e2365Erikimport android.provider.Calendar.Attendees; 4379f228124de7d98146ca526d743436f6419e2365Erikimport android.provider.Calendar.Calendars; 4479f228124de7d98146ca526d743436f6419e2365Erikimport android.provider.Calendar.Reminders; 4579f228124de7d98146ca526d743436f6419e2365Erikimport android.text.TextUtils; 4679f228124de7d98146ca526d743436f6419e2365Erikimport android.util.Log; 4779f228124de7d98146ca526d743436f6419e2365Erikimport android.view.LayoutInflater; 4879f228124de7d98146ca526d743436f6419e2365Erikimport android.view.View; 4979f228124de7d98146ca526d743436f6419e2365Erikimport android.view.ViewGroup; 5079f228124de7d98146ca526d743436f6419e2365Erikimport android.widget.LinearLayout; 5179f228124de7d98146ca526d743436f6419e2365Erikimport android.widget.Toast; 5279f228124de7d98146ca526d743436f6419e2365Erik 5379f228124de7d98146ca526d743436f6419e2365Erikpublic class EditEventFragment extends Fragment { 5479f228124de7d98146ca526d743436f6419e2365Erik private static final String TAG = "EditEventActivity"; 5579f228124de7d98146ca526d743436f6419e2365Erik 5679f228124de7d98146ca526d743436f6419e2365Erik private static final boolean DEBUG = false; 5779f228124de7d98146ca526d743436f6419e2365Erik 5879f228124de7d98146ca526d743436f6419e2365Erik private static final int TOKEN_EVENT = 0; 5979f228124de7d98146ca526d743436f6419e2365Erik private static final int TOKEN_ATTENDEES = 1; 6079f228124de7d98146ca526d743436f6419e2365Erik private static final int TOKEN_REMINDERS = 2; 6179f228124de7d98146ca526d743436f6419e2365Erik private static final int TOKEN_CALENDARS = 3; 6279f228124de7d98146ca526d743436f6419e2365Erik 6379f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper mHelper; 6479f228124de7d98146ca526d743436f6419e2365Erik CalendarEventModel mModel; 6579f228124de7d98146ca526d743436f6419e2365Erik CalendarEventModel mOriginalModel; 6679f228124de7d98146ca526d743436f6419e2365Erik EditEventView mView; 6779f228124de7d98146ca526d743436f6419e2365Erik QueryHandler mHandler; 6879f228124de7d98146ca526d743436f6419e2365Erik 6979f228124de7d98146ca526d743436f6419e2365Erik private AlertDialog mModifyDialog; 7079f228124de7d98146ca526d743436f6419e2365Erik int mModification = Utils.MODIFY_UNINITIALIZED; 7179f228124de7d98146ca526d743436f6419e2365Erik 7279f228124de7d98146ca526d743436f6419e2365Erik private Intent mIntent; 7379f228124de7d98146ca526d743436f6419e2365Erik private Uri mUri; 7479f228124de7d98146ca526d743436f6419e2365Erik private long mBegin; 7579f228124de7d98146ca526d743436f6419e2365Erik private long mEnd; 7679f228124de7d98146ca526d743436f6419e2365Erik private boolean mFullscreen; 7779f228124de7d98146ca526d743436f6419e2365Erik 7879f228124de7d98146ca526d743436f6419e2365Erik private Activity mContext; 7979f228124de7d98146ca526d743436f6419e2365Erik 8079f228124de7d98146ca526d743436f6419e2365Erik private class QueryHandler extends AsyncQueryHandler { 8179f228124de7d98146ca526d743436f6419e2365Erik public QueryHandler(ContentResolver cr) { 8279f228124de7d98146ca526d743436f6419e2365Erik super(cr); 8379f228124de7d98146ca526d743436f6419e2365Erik } 8479f228124de7d98146ca526d743436f6419e2365Erik 8579f228124de7d98146ca526d743436f6419e2365Erik @Override 8679f228124de7d98146ca526d743436f6419e2365Erik protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 8779f228124de7d98146ca526d743436f6419e2365Erik // If the query didn't return a cursor for some reason return 8879f228124de7d98146ca526d743436f6419e2365Erik if (cursor == null) { 8979f228124de7d98146ca526d743436f6419e2365Erik return; 9079f228124de7d98146ca526d743436f6419e2365Erik } 9179f228124de7d98146ca526d743436f6419e2365Erik 9279f228124de7d98146ca526d743436f6419e2365Erik // If the Activity is finishing, then close the cursor. 9379f228124de7d98146ca526d743436f6419e2365Erik // Otherwise, use the new cursor in the adapter. 946a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan final Activity activity = EditEventFragment.this.getActivity(); 956a7878f0cfe2f13e4e33fee74ed9f91eaffc227bMichael Chan if (activity == null || activity.isFinishing()) { 9679f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 9779f228124de7d98146ca526d743436f6419e2365Erik return; 9879f228124de7d98146ca526d743436f6419e2365Erik } 9979f228124de7d98146ca526d743436f6419e2365Erik long eventId; 10079f228124de7d98146ca526d743436f6419e2365Erik switch (token) { 10179f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_EVENT: 10279f228124de7d98146ca526d743436f6419e2365Erik if (cursor.getCount() == 0) { 10379f228124de7d98146ca526d743436f6419e2365Erik // The cursor is empty. This can happen if the event 10479f228124de7d98146ca526d743436f6419e2365Erik // was deleted. 10579f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 10679f228124de7d98146ca526d743436f6419e2365Erik mContext.finish(); 10779f228124de7d98146ca526d743436f6419e2365Erik return; 10879f228124de7d98146ca526d743436f6419e2365Erik } 10979f228124de7d98146ca526d743436f6419e2365Erik mOriginalModel = new CalendarEventModel(); 11079f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.setModelFromCursor(mOriginalModel, cursor); 11179f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.setModelFromCursor(mModel, cursor); 11279f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 11379f228124de7d98146ca526d743436f6419e2365Erik 11479f228124de7d98146ca526d743436f6419e2365Erik mOriginalModel.mUri = mUri; 11579f228124de7d98146ca526d743436f6419e2365Erik 11679f228124de7d98146ca526d743436f6419e2365Erik mModel.mUri = mUri; 11779f228124de7d98146ca526d743436f6419e2365Erik mModel.mOriginalStart = mBegin; 11879f228124de7d98146ca526d743436f6419e2365Erik mModel.mOriginalEnd = mEnd; 11979f228124de7d98146ca526d743436f6419e2365Erik mModel.mIsFirstEventInSeries = mBegin == mOriginalModel.mStart; 12079f228124de7d98146ca526d743436f6419e2365Erik mModel.mStart = mBegin; 12179f228124de7d98146ca526d743436f6419e2365Erik mModel.mEnd = mEnd; 12279f228124de7d98146ca526d743436f6419e2365Erik 12379f228124de7d98146ca526d743436f6419e2365Erik displayEditWhichDialogue(); 12479f228124de7d98146ca526d743436f6419e2365Erik 12579f228124de7d98146ca526d743436f6419e2365Erik eventId = mModel.mId; 126d845fbe558d5229102b58cce70a1b29fe6cb6967Erik // If there are attendees or alarms query for them 127d845fbe558d5229102b58cce70a1b29fe6cb6967Erik // We only query one table at a time so that we can easily 128d845fbe558d5229102b58cce70a1b29fe6cb6967Erik // tell if we are finished with all our queries. At a later 129d845fbe558d5229102b58cce70a1b29fe6cb6967Erik // point we might want to parallelize this and keep track of 130d845fbe558d5229102b58cce70a1b29fe6cb6967Erik // which queries are done. 13179f228124de7d98146ca526d743436f6419e2365Erik if (mModel.mHasAttendeeData && eventId != -1) { 13279f228124de7d98146ca526d743436f6419e2365Erik Uri attUri = Attendees.CONTENT_URI; 13379f228124de7d98146ca526d743436f6419e2365Erik String[] whereArgs = { 13479f228124de7d98146ca526d743436f6419e2365Erik Long.toString(eventId) 13579f228124de7d98146ca526d743436f6419e2365Erik }; 13679f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_ATTENDEES, null, attUri, 13779f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.ATTENDEES_PROJECTION, 138d845fbe558d5229102b58cce70a1b29fe6cb6967Erik EditEventHelper.ATTENDEES_WHERE /* selection */, 13979f228124de7d98146ca526d743436f6419e2365Erik whereArgs /* selection args */, null /* sort order */); 140d845fbe558d5229102b58cce70a1b29fe6cb6967Erik } else if (mModel.mHasAlarm) { 141d845fbe558d5229102b58cce70a1b29fe6cb6967Erik Uri rUri = Reminders.CONTENT_URI; 142d845fbe558d5229102b58cce70a1b29fe6cb6967Erik String[] remArgs = { 143d845fbe558d5229102b58cce70a1b29fe6cb6967Erik Long.toString(eventId), Integer.toString(Reminders.METHOD_ALERT), 144d845fbe558d5229102b58cce70a1b29fe6cb6967Erik Integer.toString(Reminders.METHOD_DEFAULT) 145d845fbe558d5229102b58cce70a1b29fe6cb6967Erik }; 146d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mHandler 147d845fbe558d5229102b58cce70a1b29fe6cb6967Erik .startQuery(TOKEN_REMINDERS, null, rUri, 148d845fbe558d5229102b58cce70a1b29fe6cb6967Erik EditEventHelper.REMINDERS_PROJECTION, 149d845fbe558d5229102b58cce70a1b29fe6cb6967Erik EditEventHelper.REMINDERS_WHERE /* selection */, 150d845fbe558d5229102b58cce70a1b29fe6cb6967Erik remArgs /* selection args */, null /* sort order */); 15179f228124de7d98146ca526d743436f6419e2365Erik } else { 15279f228124de7d98146ca526d743436f6419e2365Erik // Set the model if there are no more queries to 15379f228124de7d98146ca526d743436f6419e2365Erik // make 15479f228124de7d98146ca526d743436f6419e2365Erik mView.setModel(mModel); 15579f228124de7d98146ca526d743436f6419e2365Erik } 15679f228124de7d98146ca526d743436f6419e2365Erik break; 15779f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_ATTENDEES: 15879f228124de7d98146ca526d743436f6419e2365Erik try { 15979f228124de7d98146ca526d743436f6419e2365Erik while (cursor.moveToNext()) { 16079f228124de7d98146ca526d743436f6419e2365Erik String name = cursor.getString(EditEventHelper.ATTENDEES_INDEX_NAME); 16179f228124de7d98146ca526d743436f6419e2365Erik String email = cursor.getString(EditEventHelper.ATTENDEES_INDEX_EMAIL); 162d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int status = cursor.getInt(EditEventHelper.ATTENDEES_INDEX_STATUS); 16379f228124de7d98146ca526d743436f6419e2365Erik int relationship = cursor 16479f228124de7d98146ca526d743436f6419e2365Erik .getInt(EditEventHelper.ATTENDEES_INDEX_RELATIONSHIP); 16579f228124de7d98146ca526d743436f6419e2365Erik if (email != null) { 16679f228124de7d98146ca526d743436f6419e2365Erik if (relationship == Attendees.RELATIONSHIP_ORGANIZER) { 16779f228124de7d98146ca526d743436f6419e2365Erik mModel.mOrganizer = email; 16879f228124de7d98146ca526d743436f6419e2365Erik } 169d845fbe558d5229102b58cce70a1b29fe6cb6967Erik if (mModel.mOwnerAccount != null && 170d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mOwnerAccount.equalsIgnoreCase(email)) { 171d845fbe558d5229102b58cce70a1b29fe6cb6967Erik int attendeeId = 172d845fbe558d5229102b58cce70a1b29fe6cb6967Erik cursor.getInt(EditEventHelper.ATTENDEES_INDEX_ID); 173d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mOwnerAttendeeId = attendeeId; 174d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mSelfAttendeeStatus = status; 175d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalModel.mOwnerAttendeeId = attendeeId; 176d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalModel.mSelfAttendeeStatus = status; 177d845fbe558d5229102b58cce70a1b29fe6cb6967Erik continue; 178d845fbe558d5229102b58cce70a1b29fe6cb6967Erik } 17979f228124de7d98146ca526d743436f6419e2365Erik } 180d845fbe558d5229102b58cce70a1b29fe6cb6967Erik Attendee attendee = new Attendee(name, email); 181d845fbe558d5229102b58cce70a1b29fe6cb6967Erik attendee.mStatus = status; 182d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.addAttendee(attendee); 183d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mOriginalModel.addAttendee(attendee); 18479f228124de7d98146ca526d743436f6419e2365Erik } 18579f228124de7d98146ca526d743436f6419e2365Erik } finally { 18679f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 18779f228124de7d98146ca526d743436f6419e2365Erik } 18879f228124de7d98146ca526d743436f6419e2365Erik // This is done after attendees so we know when our 18979f228124de7d98146ca526d743436f6419e2365Erik // model is filled out 19079f228124de7d98146ca526d743436f6419e2365Erik eventId = mModel.mId; 19179f228124de7d98146ca526d743436f6419e2365Erik boolean hasAlarm = mModel.mHasAlarm; 19279f228124de7d98146ca526d743436f6419e2365Erik if (hasAlarm) { 19379f228124de7d98146ca526d743436f6419e2365Erik Uri rUri = Reminders.CONTENT_URI; 19479f228124de7d98146ca526d743436f6419e2365Erik String[] remArgs = { 19579f228124de7d98146ca526d743436f6419e2365Erik Long.toString(eventId), Integer.toString(Reminders.METHOD_ALERT), 19679f228124de7d98146ca526d743436f6419e2365Erik Integer.toString(Reminders.METHOD_DEFAULT) 19779f228124de7d98146ca526d743436f6419e2365Erik }; 19879f228124de7d98146ca526d743436f6419e2365Erik mHandler 19979f228124de7d98146ca526d743436f6419e2365Erik .startQuery(TOKEN_REMINDERS, null, rUri, 20079f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.REMINDERS_PROJECTION, 20179f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.REMINDERS_WHERE /* selection */, 202d845fbe558d5229102b58cce70a1b29fe6cb6967Erik remArgs /* selection args */, null /* sort order */); 20379f228124de7d98146ca526d743436f6419e2365Erik } else { 20479f228124de7d98146ca526d743436f6419e2365Erik // Set the model if there are no more queries to 20579f228124de7d98146ca526d743436f6419e2365Erik // make 20679f228124de7d98146ca526d743436f6419e2365Erik mView.setModel(mModel); 20779f228124de7d98146ca526d743436f6419e2365Erik } 20879f228124de7d98146ca526d743436f6419e2365Erik break; 20979f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_REMINDERS: 21079f228124de7d98146ca526d743436f6419e2365Erik try { 211d290a01420234214d73d31b8bfa61652625bb149Erik // Add all reminders to the models 21279f228124de7d98146ca526d743436f6419e2365Erik while (cursor.moveToNext()) { 21379f228124de7d98146ca526d743436f6419e2365Erik int minutes = cursor.getInt(EditEventHelper.REMINDERS_INDEX_MINUTES); 21479f228124de7d98146ca526d743436f6419e2365Erik mModel.mReminderMinutes.add(minutes); 215d290a01420234214d73d31b8bfa61652625bb149Erik mOriginalModel.mReminderMinutes.add(minutes); 21679f228124de7d98146ca526d743436f6419e2365Erik } 21779f228124de7d98146ca526d743436f6419e2365Erik } finally { 21879f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 21979f228124de7d98146ca526d743436f6419e2365Erik } 22079f228124de7d98146ca526d743436f6419e2365Erik // Set the model after we finish all the necessary 22179f228124de7d98146ca526d743436f6419e2365Erik // queries. 22279f228124de7d98146ca526d743436f6419e2365Erik mView.setModel(mModel); 22379f228124de7d98146ca526d743436f6419e2365Erik break; 22479f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_CALENDARS: 22579f228124de7d98146ca526d743436f6419e2365Erik // startManagingCursor(cursor); 22679f228124de7d98146ca526d743436f6419e2365Erik MatrixCursor matrixCursor = Utils.matrixCursorFromCursor(cursor); 22779f228124de7d98146ca526d743436f6419e2365Erik 22879f228124de7d98146ca526d743436f6419e2365Erik // Stop the spinner 22979f228124de7d98146ca526d743436f6419e2365Erik// mContext.getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS, 23079f228124de7d98146ca526d743436f6419e2365Erik// Window.PROGRESS_VISIBILITY_OFF); 23179f228124de7d98146ca526d743436f6419e2365Erik 23279f228124de7d98146ca526d743436f6419e2365Erik if (DEBUG) { 23379f228124de7d98146ca526d743436f6419e2365Erik Log.d(TAG, "onQueryComplete: setting cursor with " 23479f228124de7d98146ca526d743436f6419e2365Erik + matrixCursor.getCount() + " calendars"); 23579f228124de7d98146ca526d743436f6419e2365Erik } 23679f228124de7d98146ca526d743436f6419e2365Erik mView.setCalendarsCursor(matrixCursor); 23779f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 23879f228124de7d98146ca526d743436f6419e2365Erik break; 23979f228124de7d98146ca526d743436f6419e2365Erik } 24079f228124de7d98146ca526d743436f6419e2365Erik } 24179f228124de7d98146ca526d743436f6419e2365Erik } 24279f228124de7d98146ca526d743436f6419e2365Erik 24379f228124de7d98146ca526d743436f6419e2365Erik public EditEventFragment(boolean fullscreen) { 24479f228124de7d98146ca526d743436f6419e2365Erik mFullscreen = fullscreen; 24579f228124de7d98146ca526d743436f6419e2365Erik } 24679f228124de7d98146ca526d743436f6419e2365Erik 24779f228124de7d98146ca526d743436f6419e2365Erik private void startQuery() { 24879f228124de7d98146ca526d743436f6419e2365Erik Intent intent = mIntent; 24979f228124de7d98146ca526d743436f6419e2365Erik mUri = intent.getData(); 250e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang 251e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mBegin = intent.getLongExtra(EVENT_BEGIN_TIME, -1); 252e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang if (mBegin <= 0) { 253e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang // use a default value instead 254e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mBegin = mHelper.constructDefaultStartTime(System.currentTimeMillis()); 255e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang } 256e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mEnd = intent.getLongExtra(EVENT_END_TIME, -1); 257e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang if (mEnd < mBegin) { 258e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang // use a default value instead 259e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mEnd = mHelper.constructDefaultEndTime(mBegin); 260e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang } 26179f228124de7d98146ca526d743436f6419e2365Erik 26279f228124de7d98146ca526d743436f6419e2365Erik // Kick off the query for the event 26379f228124de7d98146ca526d743436f6419e2365Erik boolean newEvent = mUri == null; 26479f228124de7d98146ca526d743436f6419e2365Erik if (!newEvent) { 26579f228124de7d98146ca526d743436f6419e2365Erik if (DEBUG) { 26679f228124de7d98146ca526d743436f6419e2365Erik Log.d(TAG, "onCreate: uri for event is " + mUri.toString()); 26779f228124de7d98146ca526d743436f6419e2365Erik } 26879f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_EVENT, null, mUri, EditEventHelper.EVENT_PROJECTION, 26979f228124de7d98146ca526d743436f6419e2365Erik null /* selection */, null /* selection args */, null /* sort order */); 27079f228124de7d98146ca526d743436f6419e2365Erik } else { 27179f228124de7d98146ca526d743436f6419e2365Erik if (DEBUG) { 27279f228124de7d98146ca526d743436f6419e2365Erik Log.d(TAG, "onCreate: Editing a new event."); 27379f228124de7d98146ca526d743436f6419e2365Erik } 27479f228124de7d98146ca526d743436f6419e2365Erik mModel.mStart = mBegin; 27579f228124de7d98146ca526d743436f6419e2365Erik mModel.mEnd = mEnd; 276d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModel.mSelfAttendeeStatus = Attendees.ATTENDEE_STATUS_ACCEPTED; 27779f228124de7d98146ca526d743436f6419e2365Erik mView.setModel(mModel); 27879f228124de7d98146ca526d743436f6419e2365Erik 27979f228124de7d98146ca526d743436f6419e2365Erik // Start a query in the background to read the list of calendars 28079f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI, 28179f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.CALENDARS_PROJECTION, 28279f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.CALENDARS_WHERE_WRITEABLE_VISIBLE, null /* selection args */, 28379f228124de7d98146ca526d743436f6419e2365Erik null /* sort order */); 28479f228124de7d98146ca526d743436f6419e2365Erik } 28579f228124de7d98146ca526d743436f6419e2365Erik } 28679f228124de7d98146ca526d743436f6419e2365Erik 28779f228124de7d98146ca526d743436f6419e2365Erik @Override 28879f228124de7d98146ca526d743436f6419e2365Erik public void onAttach(Activity activity) { 28979f228124de7d98146ca526d743436f6419e2365Erik super.onAttach(activity); 29079f228124de7d98146ca526d743436f6419e2365Erik mContext = activity; 29179f228124de7d98146ca526d743436f6419e2365Erik mIntent = activity.getIntent(); 29279f228124de7d98146ca526d743436f6419e2365Erik 29379f228124de7d98146ca526d743436f6419e2365Erik mHelper = new EditEventHelper((AbstractCalendarActivity) activity, null); 29479f228124de7d98146ca526d743436f6419e2365Erik mHandler = new QueryHandler(activity.getContentResolver()); 29579f228124de7d98146ca526d743436f6419e2365Erik if (mIntent != null) { 29679f228124de7d98146ca526d743436f6419e2365Erik mModel = new CalendarEventModel(activity, mIntent); 29779f228124de7d98146ca526d743436f6419e2365Erik } else { 29879f228124de7d98146ca526d743436f6419e2365Erik mModel = new CalendarEventModel(activity); 29979f228124de7d98146ca526d743436f6419e2365Erik } 30079f228124de7d98146ca526d743436f6419e2365Erik } 30179f228124de7d98146ca526d743436f6419e2365Erik 30279f228124de7d98146ca526d743436f6419e2365Erik @Override 30379f228124de7d98146ca526d743436f6419e2365Erik public View onCreateView(LayoutInflater inflater, ViewGroup container, 30479f228124de7d98146ca526d743436f6419e2365Erik Bundle savedInstanceState) { 30579f228124de7d98146ca526d743436f6419e2365Erik// mContext.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 30679f228124de7d98146ca526d743436f6419e2365Erik View view = inflater.inflate(R.layout.edit_event, null); 30779f228124de7d98146ca526d743436f6419e2365Erik if (!mFullscreen) { 30879f228124de7d98146ca526d743436f6419e2365Erik LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(280, 250); 30979f228124de7d98146ca526d743436f6419e2365Erik params.leftMargin = 100; 31079f228124de7d98146ca526d743436f6419e2365Erik params.topMargin = 150; 31179f228124de7d98146ca526d743436f6419e2365Erik params.setMargins(50, 100, 50, 50); 31279f228124de7d98146ca526d743436f6419e2365Erik view.setLayoutParams(params); 31379f228124de7d98146ca526d743436f6419e2365Erik } 31479f228124de7d98146ca526d743436f6419e2365Erik mView = new EditEventView(mContext, view, new Done()); 31579f228124de7d98146ca526d743436f6419e2365Erik startQuery(); 31679f228124de7d98146ca526d743436f6419e2365Erik return view; 31779f228124de7d98146ca526d743436f6419e2365Erik } 31879f228124de7d98146ca526d743436f6419e2365Erik 31979f228124de7d98146ca526d743436f6419e2365Erik @Override 32079f228124de7d98146ca526d743436f6419e2365Erik public void onCreate(Bundle savedInstanceState) { 32179f228124de7d98146ca526d743436f6419e2365Erik super.onCreate(savedInstanceState); 32279f228124de7d98146ca526d743436f6419e2365Erik 32379f228124de7d98146ca526d743436f6419e2365Erik } 32479f228124de7d98146ca526d743436f6419e2365Erik// 32579f228124de7d98146ca526d743436f6419e2365Erik// @Override 32679f228124de7d98146ca526d743436f6419e2365Erik// public boolean onCreateOptionsMenu(Menu menu) { 32779f228124de7d98146ca526d743436f6419e2365Erik// MenuItem item; 32879f228124de7d98146ca526d743436f6419e2365Erik// item = menu.add(MENU_GROUP_ADD_REMINDER, MENU_ADD_REMINDER, 0, R.string.add_new_reminder); 32979f228124de7d98146ca526d743436f6419e2365Erik// item.setIcon(R.drawable.ic_menu_reminder); 33079f228124de7d98146ca526d743436f6419e2365Erik// item.setAlphabeticShortcut('r'); 33179f228124de7d98146ca526d743436f6419e2365Erik// 33279f228124de7d98146ca526d743436f6419e2365Erik// return super.onCreateOptionsMenu(menu); 33379f228124de7d98146ca526d743436f6419e2365Erik// } 33479f228124de7d98146ca526d743436f6419e2365Erik// 33579f228124de7d98146ca526d743436f6419e2365Erik// @Override 33679f228124de7d98146ca526d743436f6419e2365Erik// public boolean onPrepareOptionsMenu(Menu menu) { 33779f228124de7d98146ca526d743436f6419e2365Erik// int numReminders = mView.getReminderCount(); 33879f228124de7d98146ca526d743436f6419e2365Erik// if (numReminders < EditEventHelper.MAX_REMINDERS) { 33979f228124de7d98146ca526d743436f6419e2365Erik// menu.setGroupEnabled(MENU_GROUP_ADD_REMINDER, true); 34079f228124de7d98146ca526d743436f6419e2365Erik// menu.setGroupVisible(MENU_GROUP_ADD_REMINDER, true); 34179f228124de7d98146ca526d743436f6419e2365Erik// } else { 34279f228124de7d98146ca526d743436f6419e2365Erik// menu.setGroupEnabled(MENU_GROUP_ADD_REMINDER, false); 34379f228124de7d98146ca526d743436f6419e2365Erik// menu.setGroupVisible(MENU_GROUP_ADD_REMINDER, false); 34479f228124de7d98146ca526d743436f6419e2365Erik// } 34579f228124de7d98146ca526d743436f6419e2365Erik// 34679f228124de7d98146ca526d743436f6419e2365Erik// return super.onPrepareOptionsMenu(menu); 34779f228124de7d98146ca526d743436f6419e2365Erik// } 34879f228124de7d98146ca526d743436f6419e2365Erik// 34979f228124de7d98146ca526d743436f6419e2365Erik// @Override 35079f228124de7d98146ca526d743436f6419e2365Erik// public boolean onOptionsItemSelected(MenuItem item) { 35179f228124de7d98146ca526d743436f6419e2365Erik// switch (item.getItemId()) { 35279f228124de7d98146ca526d743436f6419e2365Erik// case MENU_ADD_REMINDER: 35379f228124de7d98146ca526d743436f6419e2365Erik// mView.addReminder(); 35479f228124de7d98146ca526d743436f6419e2365Erik// return true; 35579f228124de7d98146ca526d743436f6419e2365Erik// } 35679f228124de7d98146ca526d743436f6419e2365Erik// return super.onOptionsItemSelected(item); 35779f228124de7d98146ca526d743436f6419e2365Erik// } 35879f228124de7d98146ca526d743436f6419e2365Erik// 35979f228124de7d98146ca526d743436f6419e2365Erik protected void displayEditWhichDialogue() { 36079f228124de7d98146ca526d743436f6419e2365Erik if (!TextUtils.isEmpty(mModel.mRrule) && mModification == Utils.MODIFY_UNINITIALIZED) { 36179f228124de7d98146ca526d743436f6419e2365Erik // If this event has not been synced, then don't allow deleting 36279f228124de7d98146ca526d743436f6419e2365Erik // or changing a single instance. 36379f228124de7d98146ca526d743436f6419e2365Erik String mSyncId = mModel.mSyncId; 36479f228124de7d98146ca526d743436f6419e2365Erik boolean isFirstEventInSeries = mModel.mIsFirstEventInSeries; 36579f228124de7d98146ca526d743436f6419e2365Erik 36679f228124de7d98146ca526d743436f6419e2365Erik // If we haven't synced this repeating event yet, then don't 36779f228124de7d98146ca526d743436f6419e2365Erik // allow the user to change just one instance. 36879f228124de7d98146ca526d743436f6419e2365Erik int itemIndex = 0; 36979f228124de7d98146ca526d743436f6419e2365Erik CharSequence[] items; 37079f228124de7d98146ca526d743436f6419e2365Erik if (mSyncId == null) { 37179f228124de7d98146ca526d743436f6419e2365Erik if (isFirstEventInSeries) { 37279f228124de7d98146ca526d743436f6419e2365Erik // Still display the option so the user knows all events are 37379f228124de7d98146ca526d743436f6419e2365Erik // changing 37479f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[1]; 37579f228124de7d98146ca526d743436f6419e2365Erik } else { 37679f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[2]; 37779f228124de7d98146ca526d743436f6419e2365Erik } 37879f228124de7d98146ca526d743436f6419e2365Erik } else { 37979f228124de7d98146ca526d743436f6419e2365Erik if (isFirstEventInSeries) { 38079f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[2]; 38179f228124de7d98146ca526d743436f6419e2365Erik } else { 38279f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[3]; 38379f228124de7d98146ca526d743436f6419e2365Erik } 38479f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_event); 38579f228124de7d98146ca526d743436f6419e2365Erik } 38679f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_all); 38779f228124de7d98146ca526d743436f6419e2365Erik 38879f228124de7d98146ca526d743436f6419e2365Erik // Do one more check to make sure this remains at the end of the list 38979f228124de7d98146ca526d743436f6419e2365Erik if (!isFirstEventInSeries) { 39079f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_all_following); 39179f228124de7d98146ca526d743436f6419e2365Erik } 39279f228124de7d98146ca526d743436f6419e2365Erik 39379f228124de7d98146ca526d743436f6419e2365Erik // Display the modification dialog. 39479f228124de7d98146ca526d743436f6419e2365Erik if (mModifyDialog != null) { 39579f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog.dismiss(); 39679f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog = null; 39779f228124de7d98146ca526d743436f6419e2365Erik } 39879f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog = new AlertDialog.Builder(mContext).setOnCancelListener( 39979f228124de7d98146ca526d743436f6419e2365Erik new OnCancelListener() { 40079f228124de7d98146ca526d743436f6419e2365Erik public void onCancel(DialogInterface dialog) { 40179f228124de7d98146ca526d743436f6419e2365Erik mContext.finish(); 40279f228124de7d98146ca526d743436f6419e2365Erik } 40379f228124de7d98146ca526d743436f6419e2365Erik }).setTitle(R.string.edit_event_label).setItems(items, new OnClickListener() { 40479f228124de7d98146ca526d743436f6419e2365Erik public void onClick(DialogInterface dialog, int which) { 40579f228124de7d98146ca526d743436f6419e2365Erik if (which == 0) { 406d845fbe558d5229102b58cce70a1b29fe6cb6967Erik mModification = (mModel.mSyncId == null) ? Utils.MODIFY_ALL 407d845fbe558d5229102b58cce70a1b29fe6cb6967Erik : Utils.MODIFY_SELECTED; 40879f228124de7d98146ca526d743436f6419e2365Erik } else if (which == 1) { 40979f228124de7d98146ca526d743436f6419e2365Erik mModification = (mModel.mSyncId == null) ? Utils.MODIFY_ALL_FOLLOWING 41079f228124de7d98146ca526d743436f6419e2365Erik : Utils.MODIFY_ALL; 41179f228124de7d98146ca526d743436f6419e2365Erik } else if (which == 2) { 41279f228124de7d98146ca526d743436f6419e2365Erik mModification = Utils.MODIFY_ALL_FOLLOWING; 41379f228124de7d98146ca526d743436f6419e2365Erik } 41479f228124de7d98146ca526d743436f6419e2365Erik 41579f228124de7d98146ca526d743436f6419e2365Erik mView.setModification(mModification); 41679f228124de7d98146ca526d743436f6419e2365Erik } 41779f228124de7d98146ca526d743436f6419e2365Erik }).show(); 41879f228124de7d98146ca526d743436f6419e2365Erik } 41979f228124de7d98146ca526d743436f6419e2365Erik } 42079f228124de7d98146ca526d743436f6419e2365Erik 42179f228124de7d98146ca526d743436f6419e2365Erik class Done implements EditEventHelper.EditDoneRunnable { 42279f228124de7d98146ca526d743436f6419e2365Erik private int mCode = -1; 42379f228124de7d98146ca526d743436f6419e2365Erik 42479f228124de7d98146ca526d743436f6419e2365Erik public void setDoneCode(int code) { 42579f228124de7d98146ca526d743436f6419e2365Erik mCode = code; 42679f228124de7d98146ca526d743436f6419e2365Erik } 42779f228124de7d98146ca526d743436f6419e2365Erik 42879f228124de7d98146ca526d743436f6419e2365Erik public void run() { 42979f228124de7d98146ca526d743436f6419e2365Erik switch (mCode) { 43079f228124de7d98146ca526d743436f6419e2365Erik case Utils.DONE_REVERT: 43179f228124de7d98146ca526d743436f6419e2365Erik mContext.finish(); 43279f228124de7d98146ca526d743436f6419e2365Erik break; 43379f228124de7d98146ca526d743436f6419e2365Erik case Utils.DONE_SAVE: 43479f228124de7d98146ca526d743436f6419e2365Erik if (mModel != null && !mModel.equals(mOriginalModel)) { 43579f228124de7d98146ca526d743436f6419e2365Erik if (mHelper.saveEvent(mModel, mOriginalModel, mModification)) { 43679f228124de7d98146ca526d743436f6419e2365Erik if (mModel.mUri != null) { 43779f228124de7d98146ca526d743436f6419e2365Erik Toast.makeText(mContext, R.string.saving_event, Toast.LENGTH_SHORT) 43879f228124de7d98146ca526d743436f6419e2365Erik .show(); 43979f228124de7d98146ca526d743436f6419e2365Erik } else { 44079f228124de7d98146ca526d743436f6419e2365Erik Toast.makeText(mContext, R.string.creating_event, 44179f228124de7d98146ca526d743436f6419e2365Erik Toast.LENGTH_SHORT).show(); 44279f228124de7d98146ca526d743436f6419e2365Erik } 44379f228124de7d98146ca526d743436f6419e2365Erik } 44479f228124de7d98146ca526d743436f6419e2365Erik } 44579f228124de7d98146ca526d743436f6419e2365Erik mContext.finish(); 44679f228124de7d98146ca526d743436f6419e2365Erik break; 44779f228124de7d98146ca526d743436f6419e2365Erik case Utils.DONE_DELETE: 44879f228124de7d98146ca526d743436f6419e2365Erik long begin = mModel.mStart; 44979f228124de7d98146ca526d743436f6419e2365Erik long end = mModel.mEnd; 45079f228124de7d98146ca526d743436f6419e2365Erik int which = -1; 45179f228124de7d98146ca526d743436f6419e2365Erik switch (mModification) { 45279f228124de7d98146ca526d743436f6419e2365Erik case Utils.MODIFY_SELECTED: 45379f228124de7d98146ca526d743436f6419e2365Erik which = DeleteEventHelper.DELETE_SELECTED; 45479f228124de7d98146ca526d743436f6419e2365Erik break; 45579f228124de7d98146ca526d743436f6419e2365Erik case Utils.MODIFY_ALL_FOLLOWING: 45679f228124de7d98146ca526d743436f6419e2365Erik which = DeleteEventHelper.DELETE_ALL_FOLLOWING; 45779f228124de7d98146ca526d743436f6419e2365Erik break; 45879f228124de7d98146ca526d743436f6419e2365Erik case Utils.MODIFY_ALL: 45979f228124de7d98146ca526d743436f6419e2365Erik which = DeleteEventHelper.DELETE_ALL; 46079f228124de7d98146ca526d743436f6419e2365Erik break; 46179f228124de7d98146ca526d743436f6419e2365Erik } 4621251cb05edd5283545bc27652f5c0aaa3d1095a1Michael Chan DeleteEventHelper deleteHelper = new DeleteEventHelper(mContext, mContext, 46379f228124de7d98146ca526d743436f6419e2365Erik true /* exitWhenDone */); 46479f228124de7d98146ca526d743436f6419e2365Erik // TODO update delete helper to use the model instead of the cursor 46579f228124de7d98146ca526d743436f6419e2365Erik deleteHelper.delete(begin, end, mModel, which); 46679f228124de7d98146ca526d743436f6419e2365Erik break; 46779f228124de7d98146ca526d743436f6419e2365Erik default: 46879f228124de7d98146ca526d743436f6419e2365Erik Log.e(TAG, "done: Unrecognized exit code."); 46979f228124de7d98146ca526d743436f6419e2365Erik mContext.finish(); 47079f228124de7d98146ca526d743436f6419e2365Erik break; 47179f228124de7d98146ca526d743436f6419e2365Erik } 47279f228124de7d98146ca526d743436f6419e2365Erik } 47379f228124de7d98146ca526d743436f6419e2365Erik } 47479f228124de7d98146ca526d743436f6419e2365Erik 47579f228124de7d98146ca526d743436f6419e2365Erik @Override 47679f228124de7d98146ca526d743436f6419e2365Erik public void onDestroy() { 47779f228124de7d98146ca526d743436f6419e2365Erik super.onDestroy(); 47879f228124de7d98146ca526d743436f6419e2365Erik 479ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov if (mView != null) { 480ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov mView.setModel(null); 481ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov } 482ee212201f3b7dd290eb9ca99de5b4d0b9c62acfdDmitri Plotnikov 48379f228124de7d98146ca526d743436f6419e2365Erik if (mModifyDialog != null) { 48479f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog.dismiss(); 48579f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog = null; 48679f228124de7d98146ca526d743436f6419e2365Erik } 48779f228124de7d98146ca526d743436f6419e2365Erik } 48879f228124de7d98146ca526d743436f6419e2365Erik} 489