1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.calendar;
18
19import android.app.Activity;
20import android.app.AlertDialog;
21import android.content.DialogInterface;
22import android.content.DialogInterface.OnDismissListener;
23import android.widget.Button;
24
25/**
26 * A helper class for editing the response to an invitation when the invitation
27 * is a repeating event.
28 */
29public class EditResponseHelper implements DialogInterface.OnClickListener, OnDismissListener {
30    private final Activity mParent;
31    private int mWhichEvents = -1;
32    private AlertDialog mAlertDialog;
33    private boolean mClickedOk = false;
34
35    /**
36     * This callback is passed in to this object when this object is created
37     * and is invoked when the "Ok" button is selected.
38     */
39    private DialogInterface.OnClickListener mDialogListener;
40
41    public EditResponseHelper(Activity parent) {
42        mParent = parent;
43    }
44
45    public void setOnClickListener(DialogInterface.OnClickListener listener) {
46        mDialogListener = listener;
47    }
48
49    /**
50     * @return whichEvents, representing which events were selected on which to
51     * apply the response:
52     * -1 means no choice selected, or the dialog was
53     * canceled.
54     * 0 means just the single event.
55     * 1 means all events.
56     */
57    public int getWhichEvents() {
58        return mWhichEvents;
59    }
60
61    public void setWhichEvents(int which) {
62        mWhichEvents = which;
63    }
64
65    @Override
66    public void onClick(DialogInterface dialog, int which) {
67        setClickedOk(true);
68    }
69
70    @Override
71    public void onDismiss(DialogInterface dialog) {
72        // If the click was not "OK", clear out whichEvents to represent
73        // that the dialog was canceled.
74        if (!getClickedOk()) {
75            setWhichEvents(-1);
76        }
77        setClickedOk(false);
78
79        // Call the pre-set dismiss listener too.
80        if (mDismissListener != null) {
81            mDismissListener.onDismiss(dialog);
82        }
83
84    }
85
86    private boolean getClickedOk() {
87        return mClickedOk;
88    }
89
90    private void setClickedOk(boolean clickedOk) {
91        mClickedOk = clickedOk;
92    }
93
94    /**
95     * This callback is used when a list item is selected
96     */
97    private DialogInterface.OnClickListener mListListener =
98            new DialogInterface.OnClickListener() {
99        public void onClick(DialogInterface dialog, int which) {
100            mWhichEvents = which;
101
102            // Enable the "ok" button now that the user has selected which
103            // events in the series to delete.
104            Button ok = mAlertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
105            ok.setEnabled(true);
106        }
107    };
108
109    private DialogInterface.OnDismissListener mDismissListener;
110
111
112    /**
113     * Set the dismiss listener to be called when the dialog is ended. There,
114     * use getWhichEvents() to see how the dialog was dismissed; if it returns
115     * -1, the dialog was canceled out. If it is not -1, it's the index of
116     * which events the user wants to respond to.
117     * @param onDismissListener
118     */
119    public void setDismissListener(OnDismissListener onDismissListener) {
120        mDismissListener = onDismissListener;
121    }
122
123    public void showDialog(int whichEvents) {
124        // We need to have a non-null listener, otherwise we get null when
125        // we try to fetch the "Ok" button.
126        if (mDialogListener == null) {
127            mDialogListener = this;
128        }
129        AlertDialog dialog = new AlertDialog.Builder(mParent).setTitle(
130                R.string.change_response_title).setIconAttribute(android.R.attr.alertDialogIcon)
131                .setSingleChoiceItems(R.array.change_response_labels, whichEvents, mListListener)
132                .setPositiveButton(android.R.string.ok, mDialogListener)
133                .setNegativeButton(android.R.string.cancel, null).show();
134        // The caller may set a dismiss listener to hear back when the dialog is
135        // finished. Use getWhichEvents() to see how the dialog was dismissed.
136        dialog.setOnDismissListener(this);
137        mAlertDialog = dialog;
138
139        if (whichEvents == -1) {
140            // Disable the "Ok" button until the user selects which events to
141            // delete.
142            Button ok = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
143            ok.setEnabled(false);
144        }
145    }
146
147    public void dismissAlertDialog() {
148        if (mAlertDialog != null) {
149            mAlertDialog.dismiss();
150        }
151    }
152
153}
154