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