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