EditEventFragment.java revision fbce65e53c7a111955f638db5bf8bee35381e5b7
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; 24fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.DeleteEventHelper; 25fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.R; 26fbce65e53c7a111955f638db5bf8bee35381e5b7Erikimport com.android.calendar.Utils; 27fbce65e53c7a111955f638db5bf8bee35381e5b7Erik 2879f228124de7d98146ca526d743436f6419e2365Erikimport android.app.Activity; 2979f228124de7d98146ca526d743436f6419e2365Erikimport android.app.AlertDialog; 3079f228124de7d98146ca526d743436f6419e2365Erikimport android.app.Fragment; 3179f228124de7d98146ca526d743436f6419e2365Erikimport android.content.AsyncQueryHandler; 3279f228124de7d98146ca526d743436f6419e2365Erikimport android.content.ContentResolver; 3379f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface; 3479f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface.OnCancelListener; 3579f228124de7d98146ca526d743436f6419e2365Erikimport android.content.DialogInterface.OnClickListener; 3679f228124de7d98146ca526d743436f6419e2365Erikimport android.content.Intent; 3779f228124de7d98146ca526d743436f6419e2365Erikimport android.database.Cursor; 3879f228124de7d98146ca526d743436f6419e2365Erikimport android.database.MatrixCursor; 3979f228124de7d98146ca526d743436f6419e2365Erikimport android.net.Uri; 4079f228124de7d98146ca526d743436f6419e2365Erikimport android.os.Bundle; 4179f228124de7d98146ca526d743436f6419e2365Erikimport android.provider.Calendar.Attendees; 4279f228124de7d98146ca526d743436f6419e2365Erikimport android.provider.Calendar.Calendars; 4379f228124de7d98146ca526d743436f6419e2365Erikimport android.provider.Calendar.Reminders; 4479f228124de7d98146ca526d743436f6419e2365Erikimport android.text.TextUtils; 4579f228124de7d98146ca526d743436f6419e2365Erikimport android.util.Log; 4679f228124de7d98146ca526d743436f6419e2365Erikimport android.view.LayoutInflater; 4779f228124de7d98146ca526d743436f6419e2365Erikimport android.view.View; 4879f228124de7d98146ca526d743436f6419e2365Erikimport android.view.ViewGroup; 4979f228124de7d98146ca526d743436f6419e2365Erikimport android.widget.LinearLayout; 5079f228124de7d98146ca526d743436f6419e2365Erikimport android.widget.Toast; 5179f228124de7d98146ca526d743436f6419e2365Erik 5279f228124de7d98146ca526d743436f6419e2365Erikpublic class EditEventFragment extends Fragment { 5379f228124de7d98146ca526d743436f6419e2365Erik private static final String TAG = "EditEventActivity"; 5479f228124de7d98146ca526d743436f6419e2365Erik 5579f228124de7d98146ca526d743436f6419e2365Erik private static final boolean DEBUG = false; 5679f228124de7d98146ca526d743436f6419e2365Erik 5779f228124de7d98146ca526d743436f6419e2365Erik private static final int TOKEN_EVENT = 0; 5879f228124de7d98146ca526d743436f6419e2365Erik private static final int TOKEN_ATTENDEES = 1; 5979f228124de7d98146ca526d743436f6419e2365Erik private static final int TOKEN_REMINDERS = 2; 6079f228124de7d98146ca526d743436f6419e2365Erik private static final int TOKEN_CALENDARS = 3; 6179f228124de7d98146ca526d743436f6419e2365Erik 6279f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper mHelper; 6379f228124de7d98146ca526d743436f6419e2365Erik CalendarEventModel mModel; 6479f228124de7d98146ca526d743436f6419e2365Erik CalendarEventModel mOriginalModel; 6579f228124de7d98146ca526d743436f6419e2365Erik EditEventView mView; 6679f228124de7d98146ca526d743436f6419e2365Erik QueryHandler mHandler; 6779f228124de7d98146ca526d743436f6419e2365Erik 6879f228124de7d98146ca526d743436f6419e2365Erik private AlertDialog mModifyDialog; 6979f228124de7d98146ca526d743436f6419e2365Erik int mModification = Utils.MODIFY_UNINITIALIZED; 7079f228124de7d98146ca526d743436f6419e2365Erik 7179f228124de7d98146ca526d743436f6419e2365Erik private Intent mIntent; 7279f228124de7d98146ca526d743436f6419e2365Erik private Uri mUri; 7379f228124de7d98146ca526d743436f6419e2365Erik private long mBegin; 7479f228124de7d98146ca526d743436f6419e2365Erik private long mEnd; 7579f228124de7d98146ca526d743436f6419e2365Erik private boolean mFullscreen; 7679f228124de7d98146ca526d743436f6419e2365Erik 7779f228124de7d98146ca526d743436f6419e2365Erik private Activity mContext; 7879f228124de7d98146ca526d743436f6419e2365Erik 7979f228124de7d98146ca526d743436f6419e2365Erik private class QueryHandler extends AsyncQueryHandler { 8079f228124de7d98146ca526d743436f6419e2365Erik public QueryHandler(ContentResolver cr) { 8179f228124de7d98146ca526d743436f6419e2365Erik super(cr); 8279f228124de7d98146ca526d743436f6419e2365Erik } 8379f228124de7d98146ca526d743436f6419e2365Erik 8479f228124de7d98146ca526d743436f6419e2365Erik @Override 8579f228124de7d98146ca526d743436f6419e2365Erik protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 8679f228124de7d98146ca526d743436f6419e2365Erik // If the query didn't return a cursor for some reason return 8779f228124de7d98146ca526d743436f6419e2365Erik if (cursor == null) { 8879f228124de7d98146ca526d743436f6419e2365Erik return; 8979f228124de7d98146ca526d743436f6419e2365Erik } 9079f228124de7d98146ca526d743436f6419e2365Erik 9179f228124de7d98146ca526d743436f6419e2365Erik // If the Activity is finishing, then close the cursor. 9279f228124de7d98146ca526d743436f6419e2365Erik // Otherwise, use the new cursor in the adapter. 9379f228124de7d98146ca526d743436f6419e2365Erik if (EditEventFragment.this.getActivity().isFinishing()) { 9479f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 9579f228124de7d98146ca526d743436f6419e2365Erik return; 9679f228124de7d98146ca526d743436f6419e2365Erik } 9779f228124de7d98146ca526d743436f6419e2365Erik long eventId; 9879f228124de7d98146ca526d743436f6419e2365Erik switch (token) { 9979f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_EVENT: 10079f228124de7d98146ca526d743436f6419e2365Erik if (cursor.getCount() == 0) { 10179f228124de7d98146ca526d743436f6419e2365Erik // The cursor is empty. This can happen if the event 10279f228124de7d98146ca526d743436f6419e2365Erik // was deleted. 10379f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 10479f228124de7d98146ca526d743436f6419e2365Erik mContext.finish(); 10579f228124de7d98146ca526d743436f6419e2365Erik return; 10679f228124de7d98146ca526d743436f6419e2365Erik } 10779f228124de7d98146ca526d743436f6419e2365Erik mOriginalModel = new CalendarEventModel(); 10879f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.setModelFromCursor(mOriginalModel, cursor); 10979f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.setModelFromCursor(mModel, cursor); 11079f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 11179f228124de7d98146ca526d743436f6419e2365Erik 11279f228124de7d98146ca526d743436f6419e2365Erik mOriginalModel.mUri = mUri; 11379f228124de7d98146ca526d743436f6419e2365Erik 11479f228124de7d98146ca526d743436f6419e2365Erik mModel.mUri = mUri; 11579f228124de7d98146ca526d743436f6419e2365Erik mModel.mOriginalStart = mBegin; 11679f228124de7d98146ca526d743436f6419e2365Erik mModel.mOriginalEnd = mEnd; 11779f228124de7d98146ca526d743436f6419e2365Erik mModel.mIsFirstEventInSeries = mBegin == mOriginalModel.mStart; 11879f228124de7d98146ca526d743436f6419e2365Erik mModel.mStart = mBegin; 11979f228124de7d98146ca526d743436f6419e2365Erik mModel.mEnd = mEnd; 12079f228124de7d98146ca526d743436f6419e2365Erik 12179f228124de7d98146ca526d743436f6419e2365Erik displayEditWhichDialogue(); 12279f228124de7d98146ca526d743436f6419e2365Erik 12379f228124de7d98146ca526d743436f6419e2365Erik // Reminders cursor 12479f228124de7d98146ca526d743436f6419e2365Erik eventId = mModel.mId; 12579f228124de7d98146ca526d743436f6419e2365Erik if (mModel.mHasAttendeeData && eventId != -1) { 12679f228124de7d98146ca526d743436f6419e2365Erik Uri attUri = Attendees.CONTENT_URI; 12779f228124de7d98146ca526d743436f6419e2365Erik String[] whereArgs = { 12879f228124de7d98146ca526d743436f6419e2365Erik Long.toString(eventId) 12979f228124de7d98146ca526d743436f6419e2365Erik }; 13079f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_ATTENDEES, null, attUri, 13179f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.ATTENDEES_PROJECTION, 13279f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.ATTENDEES_WHERE_NOT_ORGANIZER /* selection */, 13379f228124de7d98146ca526d743436f6419e2365Erik whereArgs /* selection args */, null /* sort order */); 13479f228124de7d98146ca526d743436f6419e2365Erik } else { 13579f228124de7d98146ca526d743436f6419e2365Erik // Set the model if there are no more queries to 13679f228124de7d98146ca526d743436f6419e2365Erik // make 13779f228124de7d98146ca526d743436f6419e2365Erik mView.setModel(mModel); 13879f228124de7d98146ca526d743436f6419e2365Erik } 13979f228124de7d98146ca526d743436f6419e2365Erik break; 14079f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_ATTENDEES: 14179f228124de7d98146ca526d743436f6419e2365Erik try { 14279f228124de7d98146ca526d743436f6419e2365Erik StringBuilder b = new StringBuilder(); 14379f228124de7d98146ca526d743436f6419e2365Erik while (cursor.moveToNext()) { 14479f228124de7d98146ca526d743436f6419e2365Erik String name = cursor.getString(EditEventHelper.ATTENDEES_INDEX_NAME); 14579f228124de7d98146ca526d743436f6419e2365Erik String email = cursor.getString(EditEventHelper.ATTENDEES_INDEX_EMAIL); 14679f228124de7d98146ca526d743436f6419e2365Erik int relationship = cursor 14779f228124de7d98146ca526d743436f6419e2365Erik .getInt(EditEventHelper.ATTENDEES_INDEX_RELATIONSHIP); 14879f228124de7d98146ca526d743436f6419e2365Erik if (email != null) { 14979f228124de7d98146ca526d743436f6419e2365Erik if (name != null && name.length() > 0 && !name.equals(email)) { 15079f228124de7d98146ca526d743436f6419e2365Erik b.append('"').append(name).append("\" "); 15179f228124de7d98146ca526d743436f6419e2365Erik } 15279f228124de7d98146ca526d743436f6419e2365Erik b.append('<').append(email).append(">, "); 15379f228124de7d98146ca526d743436f6419e2365Erik if (relationship == Attendees.RELATIONSHIP_ORGANIZER) { 15479f228124de7d98146ca526d743436f6419e2365Erik mModel.mOrganizer = email; 15579f228124de7d98146ca526d743436f6419e2365Erik } 15679f228124de7d98146ca526d743436f6419e2365Erik } 15779f228124de7d98146ca526d743436f6419e2365Erik } 15879f228124de7d98146ca526d743436f6419e2365Erik if (b.length() > 0) { 15979f228124de7d98146ca526d743436f6419e2365Erik mModel.mAttendees = b.toString(); 160d290a01420234214d73d31b8bfa61652625bb149Erik mOriginalModel.mAttendees = new String(mModel.mAttendees); 16179f228124de7d98146ca526d743436f6419e2365Erik } 16279f228124de7d98146ca526d743436f6419e2365Erik } finally { 16379f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 16479f228124de7d98146ca526d743436f6419e2365Erik } 16579f228124de7d98146ca526d743436f6419e2365Erik // This is done after attendees so we know when our 16679f228124de7d98146ca526d743436f6419e2365Erik // model is filled out 16779f228124de7d98146ca526d743436f6419e2365Erik eventId = mModel.mId; 16879f228124de7d98146ca526d743436f6419e2365Erik boolean hasAlarm = mModel.mHasAlarm; 16979f228124de7d98146ca526d743436f6419e2365Erik if (hasAlarm) { 17079f228124de7d98146ca526d743436f6419e2365Erik Uri rUri = Reminders.CONTENT_URI; 17179f228124de7d98146ca526d743436f6419e2365Erik String[] remArgs = { 17279f228124de7d98146ca526d743436f6419e2365Erik Long.toString(eventId), Integer.toString(Reminders.METHOD_ALERT), 17379f228124de7d98146ca526d743436f6419e2365Erik Integer.toString(Reminders.METHOD_DEFAULT) 17479f228124de7d98146ca526d743436f6419e2365Erik }; 17579f228124de7d98146ca526d743436f6419e2365Erik mHandler 17679f228124de7d98146ca526d743436f6419e2365Erik .startQuery(TOKEN_REMINDERS, null, rUri, 17779f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.REMINDERS_PROJECTION, 17879f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.REMINDERS_WHERE /* selection */, 17979f228124de7d98146ca526d743436f6419e2365Erik remArgs /* selection args */, null /* 18079f228124de7d98146ca526d743436f6419e2365Erik * sort 18179f228124de7d98146ca526d743436f6419e2365Erik * order 18279f228124de7d98146ca526d743436f6419e2365Erik */); 18379f228124de7d98146ca526d743436f6419e2365Erik } else { 18479f228124de7d98146ca526d743436f6419e2365Erik // Set the model if there are no more queries to 18579f228124de7d98146ca526d743436f6419e2365Erik // make 18679f228124de7d98146ca526d743436f6419e2365Erik mView.setModel(mModel); 18779f228124de7d98146ca526d743436f6419e2365Erik } 18879f228124de7d98146ca526d743436f6419e2365Erik break; 18979f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_REMINDERS: 19079f228124de7d98146ca526d743436f6419e2365Erik try { 191d290a01420234214d73d31b8bfa61652625bb149Erik // Add all reminders to the models 19279f228124de7d98146ca526d743436f6419e2365Erik while (cursor.moveToNext()) { 19379f228124de7d98146ca526d743436f6419e2365Erik int minutes = cursor.getInt(EditEventHelper.REMINDERS_INDEX_MINUTES); 19479f228124de7d98146ca526d743436f6419e2365Erik mModel.mReminderMinutes.add(minutes); 195d290a01420234214d73d31b8bfa61652625bb149Erik mOriginalModel.mReminderMinutes.add(minutes); 19679f228124de7d98146ca526d743436f6419e2365Erik } 19779f228124de7d98146ca526d743436f6419e2365Erik } finally { 19879f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 19979f228124de7d98146ca526d743436f6419e2365Erik } 20079f228124de7d98146ca526d743436f6419e2365Erik // Set the model after we finish all the necessary 20179f228124de7d98146ca526d743436f6419e2365Erik // queries. 20279f228124de7d98146ca526d743436f6419e2365Erik mView.setModel(mModel); 20379f228124de7d98146ca526d743436f6419e2365Erik break; 20479f228124de7d98146ca526d743436f6419e2365Erik case TOKEN_CALENDARS: 20579f228124de7d98146ca526d743436f6419e2365Erik // startManagingCursor(cursor); 20679f228124de7d98146ca526d743436f6419e2365Erik MatrixCursor matrixCursor = Utils.matrixCursorFromCursor(cursor); 20779f228124de7d98146ca526d743436f6419e2365Erik 20879f228124de7d98146ca526d743436f6419e2365Erik // Stop the spinner 20979f228124de7d98146ca526d743436f6419e2365Erik// mContext.getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS, 21079f228124de7d98146ca526d743436f6419e2365Erik// Window.PROGRESS_VISIBILITY_OFF); 21179f228124de7d98146ca526d743436f6419e2365Erik 21279f228124de7d98146ca526d743436f6419e2365Erik if (DEBUG) { 21379f228124de7d98146ca526d743436f6419e2365Erik Log.d(TAG, "onQueryComplete: setting cursor with " 21479f228124de7d98146ca526d743436f6419e2365Erik + matrixCursor.getCount() + " calendars"); 21579f228124de7d98146ca526d743436f6419e2365Erik } 21679f228124de7d98146ca526d743436f6419e2365Erik mView.setCalendarsCursor(matrixCursor); 21779f228124de7d98146ca526d743436f6419e2365Erik cursor.close(); 21879f228124de7d98146ca526d743436f6419e2365Erik break; 21979f228124de7d98146ca526d743436f6419e2365Erik } 22079f228124de7d98146ca526d743436f6419e2365Erik } 22179f228124de7d98146ca526d743436f6419e2365Erik } 22279f228124de7d98146ca526d743436f6419e2365Erik 22379f228124de7d98146ca526d743436f6419e2365Erik public EditEventFragment(boolean fullscreen) { 22479f228124de7d98146ca526d743436f6419e2365Erik mFullscreen = fullscreen; 22579f228124de7d98146ca526d743436f6419e2365Erik } 22679f228124de7d98146ca526d743436f6419e2365Erik 22779f228124de7d98146ca526d743436f6419e2365Erik private void startQuery() { 22879f228124de7d98146ca526d743436f6419e2365Erik Intent intent = mIntent; 22979f228124de7d98146ca526d743436f6419e2365Erik mUri = intent.getData(); 230e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang 231e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mBegin = intent.getLongExtra(EVENT_BEGIN_TIME, -1); 232e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang if (mBegin <= 0) { 233e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang // use a default value instead 234e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mBegin = mHelper.constructDefaultStartTime(System.currentTimeMillis()); 235e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang } 236e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mEnd = intent.getLongExtra(EVENT_END_TIME, -1); 237e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang if (mEnd < mBegin) { 238e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang // use a default value instead 239e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang mEnd = mHelper.constructDefaultEndTime(mBegin); 240e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang } 24179f228124de7d98146ca526d743436f6419e2365Erik 24279f228124de7d98146ca526d743436f6419e2365Erik // Kick off the query for the event 24379f228124de7d98146ca526d743436f6419e2365Erik boolean newEvent = mUri == null; 24479f228124de7d98146ca526d743436f6419e2365Erik if (!newEvent) { 24579f228124de7d98146ca526d743436f6419e2365Erik if (DEBUG) { 24679f228124de7d98146ca526d743436f6419e2365Erik Log.d(TAG, "onCreate: uri for event is " + mUri.toString()); 24779f228124de7d98146ca526d743436f6419e2365Erik } 24879f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_EVENT, null, mUri, EditEventHelper.EVENT_PROJECTION, 24979f228124de7d98146ca526d743436f6419e2365Erik null /* selection */, null /* selection args */, null /* sort order */); 25079f228124de7d98146ca526d743436f6419e2365Erik } else { 25179f228124de7d98146ca526d743436f6419e2365Erik if (DEBUG) { 25279f228124de7d98146ca526d743436f6419e2365Erik Log.d(TAG, "onCreate: Editing a new event."); 25379f228124de7d98146ca526d743436f6419e2365Erik } 25479f228124de7d98146ca526d743436f6419e2365Erik mModel.mStart = mBegin; 25579f228124de7d98146ca526d743436f6419e2365Erik mModel.mEnd = mEnd; 25679f228124de7d98146ca526d743436f6419e2365Erik mView.setModel(mModel); 25779f228124de7d98146ca526d743436f6419e2365Erik 25879f228124de7d98146ca526d743436f6419e2365Erik // Start a query in the background to read the list of calendars 25979f228124de7d98146ca526d743436f6419e2365Erik mHandler.startQuery(TOKEN_CALENDARS, null, Calendars.CONTENT_URI, 26079f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.CALENDARS_PROJECTION, 26179f228124de7d98146ca526d743436f6419e2365Erik EditEventHelper.CALENDARS_WHERE_WRITEABLE_VISIBLE, null /* selection args */, 26279f228124de7d98146ca526d743436f6419e2365Erik null /* sort order */); 26379f228124de7d98146ca526d743436f6419e2365Erik } 26479f228124de7d98146ca526d743436f6419e2365Erik } 26579f228124de7d98146ca526d743436f6419e2365Erik 26679f228124de7d98146ca526d743436f6419e2365Erik @Override 26779f228124de7d98146ca526d743436f6419e2365Erik public void onAttach(Activity activity) { 26879f228124de7d98146ca526d743436f6419e2365Erik super.onAttach(activity); 26979f228124de7d98146ca526d743436f6419e2365Erik mContext = activity; 27079f228124de7d98146ca526d743436f6419e2365Erik mIntent = activity.getIntent(); 27179f228124de7d98146ca526d743436f6419e2365Erik 27279f228124de7d98146ca526d743436f6419e2365Erik mHelper = new EditEventHelper((AbstractCalendarActivity) activity, null); 27379f228124de7d98146ca526d743436f6419e2365Erik mHandler = new QueryHandler(activity.getContentResolver()); 27479f228124de7d98146ca526d743436f6419e2365Erik if (mIntent != null) { 27579f228124de7d98146ca526d743436f6419e2365Erik mModel = new CalendarEventModel(activity, mIntent); 27679f228124de7d98146ca526d743436f6419e2365Erik } else { 27779f228124de7d98146ca526d743436f6419e2365Erik mModel = new CalendarEventModel(activity); 27879f228124de7d98146ca526d743436f6419e2365Erik } 27979f228124de7d98146ca526d743436f6419e2365Erik } 28079f228124de7d98146ca526d743436f6419e2365Erik 28179f228124de7d98146ca526d743436f6419e2365Erik @Override 28279f228124de7d98146ca526d743436f6419e2365Erik public View onCreateView(LayoutInflater inflater, ViewGroup container, 28379f228124de7d98146ca526d743436f6419e2365Erik Bundle savedInstanceState) { 28479f228124de7d98146ca526d743436f6419e2365Erik// mContext.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 28579f228124de7d98146ca526d743436f6419e2365Erik View view = inflater.inflate(R.layout.edit_event, null); 28679f228124de7d98146ca526d743436f6419e2365Erik if (!mFullscreen) { 28779f228124de7d98146ca526d743436f6419e2365Erik LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(280, 250); 28879f228124de7d98146ca526d743436f6419e2365Erik params.leftMargin = 100; 28979f228124de7d98146ca526d743436f6419e2365Erik params.topMargin = 150; 29079f228124de7d98146ca526d743436f6419e2365Erik params.setMargins(50, 100, 50, 50); 29179f228124de7d98146ca526d743436f6419e2365Erik view.setLayoutParams(params); 29279f228124de7d98146ca526d743436f6419e2365Erik } 29379f228124de7d98146ca526d743436f6419e2365Erik mView = new EditEventView(mContext, view, new Done()); 29479f228124de7d98146ca526d743436f6419e2365Erik startQuery(); 29579f228124de7d98146ca526d743436f6419e2365Erik return view; 29679f228124de7d98146ca526d743436f6419e2365Erik } 29779f228124de7d98146ca526d743436f6419e2365Erik 29879f228124de7d98146ca526d743436f6419e2365Erik @Override 29979f228124de7d98146ca526d743436f6419e2365Erik public void onCreate(Bundle savedInstanceState) { 30079f228124de7d98146ca526d743436f6419e2365Erik super.onCreate(savedInstanceState); 30179f228124de7d98146ca526d743436f6419e2365Erik 30279f228124de7d98146ca526d743436f6419e2365Erik } 30379f228124de7d98146ca526d743436f6419e2365Erik// 30479f228124de7d98146ca526d743436f6419e2365Erik// @Override 30579f228124de7d98146ca526d743436f6419e2365Erik// public boolean onCreateOptionsMenu(Menu menu) { 30679f228124de7d98146ca526d743436f6419e2365Erik// MenuItem item; 30779f228124de7d98146ca526d743436f6419e2365Erik// item = menu.add(MENU_GROUP_ADD_REMINDER, MENU_ADD_REMINDER, 0, R.string.add_new_reminder); 30879f228124de7d98146ca526d743436f6419e2365Erik// item.setIcon(R.drawable.ic_menu_reminder); 30979f228124de7d98146ca526d743436f6419e2365Erik// item.setAlphabeticShortcut('r'); 31079f228124de7d98146ca526d743436f6419e2365Erik// 31179f228124de7d98146ca526d743436f6419e2365Erik// return super.onCreateOptionsMenu(menu); 31279f228124de7d98146ca526d743436f6419e2365Erik// } 31379f228124de7d98146ca526d743436f6419e2365Erik// 31479f228124de7d98146ca526d743436f6419e2365Erik// @Override 31579f228124de7d98146ca526d743436f6419e2365Erik// public boolean onPrepareOptionsMenu(Menu menu) { 31679f228124de7d98146ca526d743436f6419e2365Erik// int numReminders = mView.getReminderCount(); 31779f228124de7d98146ca526d743436f6419e2365Erik// if (numReminders < EditEventHelper.MAX_REMINDERS) { 31879f228124de7d98146ca526d743436f6419e2365Erik// menu.setGroupEnabled(MENU_GROUP_ADD_REMINDER, true); 31979f228124de7d98146ca526d743436f6419e2365Erik// menu.setGroupVisible(MENU_GROUP_ADD_REMINDER, true); 32079f228124de7d98146ca526d743436f6419e2365Erik// } else { 32179f228124de7d98146ca526d743436f6419e2365Erik// menu.setGroupEnabled(MENU_GROUP_ADD_REMINDER, false); 32279f228124de7d98146ca526d743436f6419e2365Erik// menu.setGroupVisible(MENU_GROUP_ADD_REMINDER, false); 32379f228124de7d98146ca526d743436f6419e2365Erik// } 32479f228124de7d98146ca526d743436f6419e2365Erik// 32579f228124de7d98146ca526d743436f6419e2365Erik// return super.onPrepareOptionsMenu(menu); 32679f228124de7d98146ca526d743436f6419e2365Erik// } 32779f228124de7d98146ca526d743436f6419e2365Erik// 32879f228124de7d98146ca526d743436f6419e2365Erik// @Override 32979f228124de7d98146ca526d743436f6419e2365Erik// public boolean onOptionsItemSelected(MenuItem item) { 33079f228124de7d98146ca526d743436f6419e2365Erik// switch (item.getItemId()) { 33179f228124de7d98146ca526d743436f6419e2365Erik// case MENU_ADD_REMINDER: 33279f228124de7d98146ca526d743436f6419e2365Erik// mView.addReminder(); 33379f228124de7d98146ca526d743436f6419e2365Erik// return true; 33479f228124de7d98146ca526d743436f6419e2365Erik// } 33579f228124de7d98146ca526d743436f6419e2365Erik// return super.onOptionsItemSelected(item); 33679f228124de7d98146ca526d743436f6419e2365Erik// } 33779f228124de7d98146ca526d743436f6419e2365Erik// 33879f228124de7d98146ca526d743436f6419e2365Erik protected void displayEditWhichDialogue() { 33979f228124de7d98146ca526d743436f6419e2365Erik if (!TextUtils.isEmpty(mModel.mRrule) && mModification == Utils.MODIFY_UNINITIALIZED) { 34079f228124de7d98146ca526d743436f6419e2365Erik // If this event has not been synced, then don't allow deleting 34179f228124de7d98146ca526d743436f6419e2365Erik // or changing a single instance. 34279f228124de7d98146ca526d743436f6419e2365Erik String mSyncId = mModel.mSyncId; 34379f228124de7d98146ca526d743436f6419e2365Erik boolean isFirstEventInSeries = mModel.mIsFirstEventInSeries; 34479f228124de7d98146ca526d743436f6419e2365Erik 34579f228124de7d98146ca526d743436f6419e2365Erik // If we haven't synced this repeating event yet, then don't 34679f228124de7d98146ca526d743436f6419e2365Erik // allow the user to change just one instance. 34779f228124de7d98146ca526d743436f6419e2365Erik int itemIndex = 0; 34879f228124de7d98146ca526d743436f6419e2365Erik CharSequence[] items; 34979f228124de7d98146ca526d743436f6419e2365Erik if (mSyncId == null) { 35079f228124de7d98146ca526d743436f6419e2365Erik if (isFirstEventInSeries) { 35179f228124de7d98146ca526d743436f6419e2365Erik // Still display the option so the user knows all events are 35279f228124de7d98146ca526d743436f6419e2365Erik // changing 35379f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[1]; 35479f228124de7d98146ca526d743436f6419e2365Erik } else { 35579f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[2]; 35679f228124de7d98146ca526d743436f6419e2365Erik } 35779f228124de7d98146ca526d743436f6419e2365Erik } else { 35879f228124de7d98146ca526d743436f6419e2365Erik if (isFirstEventInSeries) { 35979f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[2]; 36079f228124de7d98146ca526d743436f6419e2365Erik } else { 36179f228124de7d98146ca526d743436f6419e2365Erik items = new CharSequence[3]; 36279f228124de7d98146ca526d743436f6419e2365Erik } 36379f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_event); 36479f228124de7d98146ca526d743436f6419e2365Erik } 36579f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_all); 36679f228124de7d98146ca526d743436f6419e2365Erik 36779f228124de7d98146ca526d743436f6419e2365Erik // Do one more check to make sure this remains at the end of the list 36879f228124de7d98146ca526d743436f6419e2365Erik if (!isFirstEventInSeries) { 36979f228124de7d98146ca526d743436f6419e2365Erik items[itemIndex++] = mContext.getText(R.string.modify_all_following); 37079f228124de7d98146ca526d743436f6419e2365Erik } 37179f228124de7d98146ca526d743436f6419e2365Erik 37279f228124de7d98146ca526d743436f6419e2365Erik // Display the modification dialog. 37379f228124de7d98146ca526d743436f6419e2365Erik if (mModifyDialog != null) { 37479f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog.dismiss(); 37579f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog = null; 37679f228124de7d98146ca526d743436f6419e2365Erik } 37779f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog = new AlertDialog.Builder(mContext).setOnCancelListener( 37879f228124de7d98146ca526d743436f6419e2365Erik new OnCancelListener() { 37979f228124de7d98146ca526d743436f6419e2365Erik public void onCancel(DialogInterface dialog) { 38079f228124de7d98146ca526d743436f6419e2365Erik mContext.finish(); 38179f228124de7d98146ca526d743436f6419e2365Erik } 38279f228124de7d98146ca526d743436f6419e2365Erik }).setTitle(R.string.edit_event_label).setItems(items, new OnClickListener() { 38379f228124de7d98146ca526d743436f6419e2365Erik public void onClick(DialogInterface dialog, int which) { 38479f228124de7d98146ca526d743436f6419e2365Erik if (which == 0) { 38579f228124de7d98146ca526d743436f6419e2365Erik mModification = (mModel.mSyncId == null) ? Utils.MODIFY_ALL : Utils.MODIFY_SELECTED; 38679f228124de7d98146ca526d743436f6419e2365Erik } else if (which == 1) { 38779f228124de7d98146ca526d743436f6419e2365Erik mModification = (mModel.mSyncId == null) ? Utils.MODIFY_ALL_FOLLOWING 38879f228124de7d98146ca526d743436f6419e2365Erik : Utils.MODIFY_ALL; 38979f228124de7d98146ca526d743436f6419e2365Erik } else if (which == 2) { 39079f228124de7d98146ca526d743436f6419e2365Erik mModification = Utils.MODIFY_ALL_FOLLOWING; 39179f228124de7d98146ca526d743436f6419e2365Erik } 39279f228124de7d98146ca526d743436f6419e2365Erik 39379f228124de7d98146ca526d743436f6419e2365Erik mView.setModification(mModification); 39479f228124de7d98146ca526d743436f6419e2365Erik } 39579f228124de7d98146ca526d743436f6419e2365Erik }).show(); 39679f228124de7d98146ca526d743436f6419e2365Erik } 39779f228124de7d98146ca526d743436f6419e2365Erik } 39879f228124de7d98146ca526d743436f6419e2365Erik 39979f228124de7d98146ca526d743436f6419e2365Erik class Done implements EditEventHelper.EditDoneRunnable { 40079f228124de7d98146ca526d743436f6419e2365Erik private int mCode = -1; 40179f228124de7d98146ca526d743436f6419e2365Erik 40279f228124de7d98146ca526d743436f6419e2365Erik public void setDoneCode(int code) { 40379f228124de7d98146ca526d743436f6419e2365Erik mCode = code; 40479f228124de7d98146ca526d743436f6419e2365Erik } 40579f228124de7d98146ca526d743436f6419e2365Erik 40679f228124de7d98146ca526d743436f6419e2365Erik public void run() { 40779f228124de7d98146ca526d743436f6419e2365Erik switch (mCode) { 40879f228124de7d98146ca526d743436f6419e2365Erik case Utils.DONE_REVERT: 40979f228124de7d98146ca526d743436f6419e2365Erik mContext.finish(); 41079f228124de7d98146ca526d743436f6419e2365Erik break; 41179f228124de7d98146ca526d743436f6419e2365Erik case Utils.DONE_SAVE: 41279f228124de7d98146ca526d743436f6419e2365Erik if (mModel != null && !mModel.equals(mOriginalModel)) { 41379f228124de7d98146ca526d743436f6419e2365Erik if (mHelper.saveEvent(mModel, mOriginalModel, mModification)) { 41479f228124de7d98146ca526d743436f6419e2365Erik if (mModel.mUri != null) { 41579f228124de7d98146ca526d743436f6419e2365Erik Toast.makeText(mContext, R.string.saving_event, Toast.LENGTH_SHORT) 41679f228124de7d98146ca526d743436f6419e2365Erik .show(); 41779f228124de7d98146ca526d743436f6419e2365Erik } else { 41879f228124de7d98146ca526d743436f6419e2365Erik Toast.makeText(mContext, R.string.creating_event, 41979f228124de7d98146ca526d743436f6419e2365Erik Toast.LENGTH_SHORT).show(); 42079f228124de7d98146ca526d743436f6419e2365Erik } 42179f228124de7d98146ca526d743436f6419e2365Erik } 42279f228124de7d98146ca526d743436f6419e2365Erik } 42379f228124de7d98146ca526d743436f6419e2365Erik mContext.finish(); 42479f228124de7d98146ca526d743436f6419e2365Erik break; 42579f228124de7d98146ca526d743436f6419e2365Erik case Utils.DONE_DELETE: 42679f228124de7d98146ca526d743436f6419e2365Erik long begin = mModel.mStart; 42779f228124de7d98146ca526d743436f6419e2365Erik long end = mModel.mEnd; 42879f228124de7d98146ca526d743436f6419e2365Erik int which = -1; 42979f228124de7d98146ca526d743436f6419e2365Erik switch (mModification) { 43079f228124de7d98146ca526d743436f6419e2365Erik case Utils.MODIFY_SELECTED: 43179f228124de7d98146ca526d743436f6419e2365Erik which = DeleteEventHelper.DELETE_SELECTED; 43279f228124de7d98146ca526d743436f6419e2365Erik break; 43379f228124de7d98146ca526d743436f6419e2365Erik case Utils.MODIFY_ALL_FOLLOWING: 43479f228124de7d98146ca526d743436f6419e2365Erik which = DeleteEventHelper.DELETE_ALL_FOLLOWING; 43579f228124de7d98146ca526d743436f6419e2365Erik break; 43679f228124de7d98146ca526d743436f6419e2365Erik case Utils.MODIFY_ALL: 43779f228124de7d98146ca526d743436f6419e2365Erik which = DeleteEventHelper.DELETE_ALL; 43879f228124de7d98146ca526d743436f6419e2365Erik break; 43979f228124de7d98146ca526d743436f6419e2365Erik } 4401251cb05edd5283545bc27652f5c0aaa3d1095a1Michael Chan DeleteEventHelper deleteHelper = new DeleteEventHelper(mContext, mContext, 44179f228124de7d98146ca526d743436f6419e2365Erik true /* exitWhenDone */); 44279f228124de7d98146ca526d743436f6419e2365Erik // TODO update delete helper to use the model instead of the cursor 44379f228124de7d98146ca526d743436f6419e2365Erik deleteHelper.delete(begin, end, mModel, which); 44479f228124de7d98146ca526d743436f6419e2365Erik break; 44579f228124de7d98146ca526d743436f6419e2365Erik default: 44679f228124de7d98146ca526d743436f6419e2365Erik Log.e(TAG, "done: Unrecognized exit code."); 44779f228124de7d98146ca526d743436f6419e2365Erik mContext.finish(); 44879f228124de7d98146ca526d743436f6419e2365Erik break; 44979f228124de7d98146ca526d743436f6419e2365Erik } 45079f228124de7d98146ca526d743436f6419e2365Erik } 45179f228124de7d98146ca526d743436f6419e2365Erik } 45279f228124de7d98146ca526d743436f6419e2365Erik 45379f228124de7d98146ca526d743436f6419e2365Erik @Override 45479f228124de7d98146ca526d743436f6419e2365Erik public void onDestroy() { 45579f228124de7d98146ca526d743436f6419e2365Erik super.onDestroy(); 45679f228124de7d98146ca526d743436f6419e2365Erik 45779f228124de7d98146ca526d743436f6419e2365Erik if (mModifyDialog != null) { 45879f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog.dismiss(); 45979f228124de7d98146ca526d743436f6419e2365Erik mModifyDialog = null; 46079f228124de7d98146ca526d743436f6419e2365Erik } 46179f228124de7d98146ca526d743436f6419e2365Erik } 46279f228124de7d98146ca526d743436f6419e2365Erik} 463