RecurrencePickerDialog.java revision 564f618e3fa48a8e4836fec0f216449b0ae809f9
1b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan/*
2b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan * Copyright (C) 2013 The Android Open Source Project
3b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan *
4b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan * Licensed under the Apache License, Version 2.0 (the "License");
5b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan * you may not use this file except in compliance with the License.
6b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan * You may obtain a copy of the License at
7b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan *
8b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan *      http://www.apache.org/licenses/LICENSE-2.0
9b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan *
10b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan * Unless required by applicable law or agreed to in writing, software
11b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan * distributed under the License is distributed on an "AS IS" BASIS,
12b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan * See the License for the specific language governing permissions and
14b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan * limitations under the License.
15b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan */
16b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
17b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanpackage com.android.calendar.recurrencepicker;
18b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
19fb2631a67560abd54d3ad66f154bc30728262b54James Kungimport android.app.Activity;
20b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.app.DialogFragment;
21564f618e3fa48a8e4836fec0f216449b0ae809f9James Kungimport android.content.Context;
22fb2631a67560abd54d3ad66f154bc30728262b54James Kungimport android.content.res.Configuration;
23b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.content.res.Resources;
24b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.os.Bundle;
25b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.os.Parcel;
26b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.os.Parcelable;
27b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.text.Editable;
28b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.text.TextUtils;
29b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.text.TextWatcher;
30b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.text.format.DateUtils;
31b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.text.format.Time;
32b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.util.Log;
33b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.util.TimeFormatException;
34b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.view.LayoutInflater;
35b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.view.View;
36b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.view.View.OnClickListener;
37564f618e3fa48a8e4836fec0f216449b0ae809f9James Kungimport android.view.ViewGroup.LayoutParams;
38b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.view.ViewGroup;
39fb2631a67560abd54d3ad66f154bc30728262b54James Kungimport android.view.Window;
40b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.AdapterView;
41b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.AdapterView.OnItemSelectedListener;
42b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.ArrayAdapter;
43b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.Button;
44b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.CompoundButton;
45b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.CompoundButton.OnCheckedChangeListener;
46b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.EditText;
47b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.LinearLayout;
48b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.RadioButton;
49b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.RadioGroup;
50b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.Spinner;
51564f618e3fa48a8e4836fec0f216449b0ae809f9James Kungimport android.widget.Switch;
52564f618e3fa48a8e4836fec0f216449b0ae809f9James Kungimport android.widget.TableLayout;
53b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.TextView;
54b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.Toast;
55b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.widget.ToggleButton;
56b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
57b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport com.android.calendar.R;
58b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport com.android.calendar.Utils;
59564f618e3fa48a8e4836fec0f216449b0ae809f9James Kungimport com.android.calendar.CalendarController.ViewType;
60b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport com.android.calendarcommon2.EventRecurrence;
6156f42bfb36d710726051e8268a115697477add61James Kungimport com.android.datetimepicker.date.DatePickerDialog;
62b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
63b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport java.text.DateFormatSymbols;
64b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport java.util.ArrayList;
65b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport java.util.Arrays;
66b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport java.util.Calendar;
67b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
68b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanpublic class RecurrencePickerDialog extends DialogFragment implements OnItemSelectedListener,
69b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        OnCheckedChangeListener, OnClickListener,
70b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        android.widget.RadioGroup.OnCheckedChangeListener, DatePickerDialog.OnDateSetListener {
71b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
72b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final String TAG = "RecurrencePickerDialog";
73b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
74b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    // in dp's
75b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    private static final int MIN_SCREEN_WIDTH_FOR_SINGLE_ROW_WEEK = 450;
76b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
77b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Update android:maxLength in EditText as needed
78b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final int INTERVAL_MAX = 99;
79b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final int INTERVAL_DEFAULT = 1;
80b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Update android:maxLength in EditText as needed
81b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final int COUNT_MAX = 730;
82b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final int COUNT_DEFAULT = 5;
83b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
8456f42bfb36d710726051e8268a115697477add61James Kung    private DatePickerDialog mDatePickerDialog;
8556f42bfb36d710726051e8268a115697477add61James Kung
86564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private class RecurrenceModel implements Parcelable {
87b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
88b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Should match EventRecurrence.DAILY, etc
89b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int FREQ_DAILY = 0;
90b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int FREQ_WEEKLY = 1;
91b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int FREQ_MONTHLY = 2;
92b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int FREQ_YEARLY = 3;
93b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
94b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int END_NEVER = 0;
95b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int END_BY_DATE = 1;
96b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int END_BY_COUNT = 2;
97b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
98b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int MONTHLY_BY_DATE = 0;
99b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int MONTHLY_BY_NTH_DAY_OF_WEEK = 1;
100b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
101564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        static final int STATE_NO_RECURRENCE = 0;
102564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        static final int STATE_RECURRENCE = 1;
103564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
104564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        int recurrenceState;
105564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
106b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
107b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * FREQ: Repeat pattern
108b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         *
109b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see FREQ_DAILY
110b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see FREQ_WEEKLY
111b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see FREQ_MONTHLY
112b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see FREQ_YEARLY
113b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
114564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        int freq = FREQ_WEEKLY;
115b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
116b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
117b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * INTERVAL: Every n days/weeks/months/years. n >= 1
118b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
119b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int interval = INTERVAL_DEFAULT;
120b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
121b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
122b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * UNTIL and COUNT: How does the the event end?
123b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         *
124b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see END_NEVER
125b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see END_BY_DATE
126b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see END_BY_COUNT
127b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see untilDate
128b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see untilCount
129b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
130b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int end;
131b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
132b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
133b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * UNTIL: Date of the last recurrence. Used when until == END_BY_DATE
134b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
135b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        Time endDate;
136b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
137b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
138b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * COUNT: Times to repeat. Use when until == END_BY_COUNT
139b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
140b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int endCount = COUNT_DEFAULT;
141b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
142b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
143b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * BYDAY: Days of the week to be repeated. Sun = 0, Mon = 1, etc
144b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
145b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        boolean[] weeklyByDayOfWeek = new boolean[7];
146b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
147b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
148b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * BYDAY AND BYMONTHDAY: How to repeat monthly events? Same date of the
149b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * month or Same nth day of week.
150b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         *
151b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see MONTHLY_BY_DATE
152b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see MONTHLY_BY_NTH_DAY_OF_WEEK
153b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
154b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int monthlyRepeat;
155b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
156b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
157b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * Day of the month to repeat. Used when monthlyRepeat ==
158b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * MONTHLY_BY_DATE
159b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
160b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int monthlyByMonthDay;
161b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
162b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
163b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * Day of the week to repeat. Used when monthlyRepeat ==
164b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * MONTHLY_BY_NTH_DAY_OF_WEEK
165b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
166b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int monthlyByDayOfWeek;
167b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
168b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
169b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * Nth day of the week to repeat. Used when monthlyRepeat ==
170b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * MONTHLY_BY_NTH_DAY_OF_WEEK 0=undefined, 1=1st, 2=2nd, etc
171b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
172b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int monthlyByNthDayOfWeek;
173b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
174b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /*
175b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * (generated method)
176b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
177b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
178b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public String toString() {
179b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return "Model [freq=" + freq + ", interval=" + interval + ", end=" + end + ", endDate="
180b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    + endDate + ", endCount=" + endCount + ", weeklyByDayOfWeek="
181b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    + Arrays.toString(weeklyByDayOfWeek) + ", monthlyRepeat=" + monthlyRepeat
182b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    + ", monthlyByMonthDay=" + monthlyByMonthDay + ", monthlyByDayOfWeek="
183b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    + monthlyByDayOfWeek + ", monthlyByNthDayOfWeek=" + monthlyByNthDayOfWeek + "]";
184b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
185b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
186b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
187b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public int describeContents() {
188b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return 0;
189b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
190b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
191564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        public RecurrenceModel() {
192b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
193b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
194b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
195b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public void writeToParcel(Parcel dest, int flags) {
196b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(freq);
197b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(interval);
198b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(end);
199b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(endDate.year);
200b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(endDate.month);
201b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(endDate.monthDay);
202b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(endCount);
203b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeBooleanArray(weeklyByDayOfWeek);
204b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(monthlyRepeat);
205b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(monthlyByMonthDay);
206b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(monthlyByDayOfWeek);
207b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(monthlyByNthDayOfWeek);
208564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            dest.writeInt(recurrenceState);
209b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
210b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
211b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
212b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    class minMaxTextWatcher implements TextWatcher {
213b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        private int mMin;
214b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        private int mMax;
215b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        private int mDefault;
216b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
217b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public minMaxTextWatcher(int min, int defaultInt, int max) {
218b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mMin = min;
219b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mMax = max;
220b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mDefault = defaultInt;
221b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
222b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
223b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
224b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public void afterTextChanged(Editable s) {
225b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
226b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            boolean updated = false;
227b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            int value;
228b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            try {
229b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                value = Integer.parseInt(s.toString());
230b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } catch (NumberFormatException e) {
231b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                value = mDefault;
232b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
233b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
234b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (value < mMin) {
235b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                value = mMin;
236b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                updated = true;
237b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } else if (value > mMax) {
238b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                updated = true;
239b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                value = mMax;
240b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
241b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
242b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            // Update UI
243b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (updated) {
244b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                s.clear();
245b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                s.append(Integer.toString(value));
246b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
247b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
248564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            updateDoneButtonState();
249b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            onChange(value);
250b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
251b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
252b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /** Override to be called after each key stroke */
253b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        void onChange(int value) {
254b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
255b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
256b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
257b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
258b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
259b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
260b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
261b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public void onTextChanged(CharSequence s, int start, int before, int count) {
262b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
263b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
264b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
265b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Resources mResources;
266b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private EventRecurrence mRecurrence = new EventRecurrence();
267b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Time mTime = new Time(); // TODO timezone?
268564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private RecurrenceModel mModel = new RecurrenceModel();
269b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Toast mToast;
270b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
271b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private final int[] TIME_DAY_TO_CALENDAR_DAY = new int[] {
272b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.SUNDAY,
273b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.MONDAY,
274b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.TUESDAY,
275b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.WEDNESDAY,
276b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.THURSDAY,
277b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.FRIDAY,
278b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.SATURDAY,
279b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    };
280b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
281b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Call mStringBuilder.setLength(0) before formatting any string or else the
282b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // formatted text will accumulate.
283b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // private final StringBuilder mStringBuilder = new StringBuilder();
284b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // private Formatter mFormatter = new Formatter(mStringBuilder);
285b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
286b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private View mView;
287b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
288b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Spinner mFreqSpinner;
289b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final int[] mFreqModelToEventRecurrence = {
290b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            EventRecurrence.DAILY,
291b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            EventRecurrence.WEEKLY,
292b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            EventRecurrence.MONTHLY,
293b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            EventRecurrence.YEARLY
294b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    };
295b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
296b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public static final String BUNDLE_START_TIME_MILLIS = "bundle_event_start_time";
297b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public static final String BUNDLE_TIME_ZONE = "bundle_event_time_zone";
298b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public static final String BUNDLE_RRULE = "bundle_event_rrule";
299b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
300b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final String BUNDLE_MODEL = "bundle_model";
301b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    private static final String BUNDLE_END_COUNT_HAS_FOCUS = "bundle_end_count_has_focus";
302b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
303b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final String FRAG_TAG_DATE_PICKER = "tag_date_picker_frag";
304b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
305564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private Switch mRepeatSwitch;
306564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
307b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private EditText mInterval;
308b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private TextView mIntervalPreText;
309b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private TextView mIntervalPostText;
310b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
311aafaa5f3d4d94d193186df868a76aed484a14255James Kung    private int mIntervalResId = -1;
312aafaa5f3d4d94d193186df868a76aed484a14255James Kung
313b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Spinner mEndSpinner;
314564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private TextView mEndDateTextView;
315b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private EditText mEndCount;
316564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private TextView mPostEndCount;
317564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private boolean mHidePostEndCount;
318b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
319b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private ArrayList<CharSequence> mEndSpinnerArray = new ArrayList<CharSequence>(3);
320564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private EndSpinnerAdapter mEndSpinnerAdapter;
321b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private String mEndNeverStr;
322b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    private String mEndDateLabel;
323564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private String mEndCountLabel;
324b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
325b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    /** Hold toggle buttons in the order per user's first day of week preference */
326b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private LinearLayout mWeekGroup;
327b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    private LinearLayout mWeekGroup2;
328b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Sun = 0
329b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private ToggleButton[] mWeekByDayButtons = new ToggleButton[7];
330b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private String[] mDayOfWeekString;
331b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private String[] mOrdinalArray;
332b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
333b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private LinearLayout mMonthGroup;
334b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private RadioGroup mMonthRepeatByRadioGroup;
335564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private RadioButton mRepeatMonthlyByNthDayOfWeek;
336564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private RadioButton mRepeatMonthlyByNthDayOfMonth;
337b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private String mMonthRepeatByDayOfWeekStr;
338b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
339b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Button mDone;
340b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
341b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private OnRecurrenceSetListener mRecurrenceSetListener;
342b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
343b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public RecurrencePickerDialog() {
344b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
345b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
346b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    static public boolean canHandleRecurrenceRule(EventRecurrence er) {
347b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        switch (er.freq) {
348b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.DAILY:
349b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.MONTHLY:
350b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.YEARLY:
351b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.WEEKLY:
352b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
353b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            default:
354b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                return false;
355b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
356b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
357b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (er.count > 0 && !TextUtils.isEmpty(er.until)) {
358b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return false;
359b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
360b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
361b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Weekly: For "repeat by day of week", the day of week to repeat is in
362b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // er.byday[]
363b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
364b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /*
365b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * Monthly: For "repeat by nth day of week" the day of week to repeat is
366b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * in er.byday[] and the "nth" is stored in er.bydayNum[]. Currently we
367b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * can handle only one and only in monthly
368b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
369b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int numOfByDayNum = 0;
370b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        for (int i = 0; i < er.bydayCount; i++) {
371b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (er.bydayNum[i] > 0) {
372b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                ++numOfByDayNum;
373b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
374b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
375b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
376b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (numOfByDayNum > 1) {
377b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return false;
378b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
379b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
380b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (numOfByDayNum > 0 && er.freq != EventRecurrence.MONTHLY) {
381b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return false;
382b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
383b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
384b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // The UI only handle repeat by one day of month i.e. not 9th and 10th
385b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // of every month
386b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (er.bymonthdayCount > 1) {
387b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return false;
388b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
389b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
390b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (er.freq == EventRecurrence.MONTHLY) {
391b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (er.bydayCount > 1) {
392b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                return false;
393b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
394b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (er.bydayCount > 0 && er.bymonthdayCount > 0) {
395b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                return false;
396b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
397b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
398b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
399b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        return true;
400b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
401b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
402b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // TODO don't lose data when getting data that our UI can't handle
403564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    static private void copyEventRecurrenceToModel(final EventRecurrence er,
404564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            RecurrenceModel model) {
405b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Freq:
406b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        switch (er.freq) {
407b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.DAILY:
408564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                model.freq = RecurrenceModel.FREQ_DAILY;
409b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
410b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.MONTHLY:
411564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                model.freq = RecurrenceModel.FREQ_MONTHLY;
412b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
413b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.YEARLY:
414564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                model.freq = RecurrenceModel.FREQ_YEARLY;
415b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
416b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.WEEKLY:
417564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                model.freq = RecurrenceModel.FREQ_WEEKLY;
418b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
419b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            default:
420b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                throw new IllegalStateException("freq=" + er.freq);
421b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
422b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
423b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Interval:
424b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (er.interval > 0) {
425b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            model.interval = er.interval;
426b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
427b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
428b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // End:
429b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // End by count:
430b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        model.endCount = er.count;
431b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (model.endCount > 0) {
432564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            model.end = RecurrenceModel.END_BY_COUNT;
433b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
434b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
435b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // End by date:
436b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (!TextUtils.isEmpty(er.until)) {
437b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (model.endDate == null) {
438b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                model.endDate = new Time();
439b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
440b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
441b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            try {
442b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                model.endDate.parse(er.until);
443b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } catch (TimeFormatException e) {
444b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                model.endDate = null;
445b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
446b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
447b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            // LIMITATION: The UI can only handle END_BY_DATE or END_BY_COUNT
448564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (model.end == RecurrenceModel.END_BY_COUNT && model.endDate != null) {
449b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                throw new IllegalStateException("freq=" + er.freq);
450b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
451b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
452564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            model.end = RecurrenceModel.END_BY_DATE;
453b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
454b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
455b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Weekly: repeat by day of week or Monthly: repeat by nth day of week
456b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // in the month
457b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        Arrays.fill(model.weeklyByDayOfWeek, false);
458b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (er.bydayCount > 0) {
459b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            int count = 0;
460b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            for (int i = 0; i < er.bydayCount; i++) {
461b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                int dayOfWeek = EventRecurrence.day2TimeDay(er.byday[i]);
462b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                model.weeklyByDayOfWeek[dayOfWeek] = true;
463b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
464564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (model.freq == RecurrenceModel.FREQ_MONTHLY && er.bydayNum[i] > 0) {
465b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    // LIMITATION: Can handle only (one) weekDayNum and only
466b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    // when
467b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    // monthly
468b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    model.monthlyByDayOfWeek = dayOfWeek;
469b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    model.monthlyByNthDayOfWeek = er.bydayNum[i];
470564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    model.monthlyRepeat = RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK;
471b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    count++;
472b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
473b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
474b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
475564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (model.freq == RecurrenceModel.FREQ_MONTHLY) {
476b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (er.bydayCount != 1) {
477b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    // Can't handle 1st Monday and 2nd Wed
478b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    throw new IllegalStateException("Can handle only 1 byDayOfWeek in monthly");
479b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
480b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (count != 1) {
481b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    throw new IllegalStateException(
482b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                            "Didn't specify which nth day of week to repeat for a monthly");
483b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
484b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
485b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
486b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
487b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Monthly by day of month
488564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (model.freq == RecurrenceModel.FREQ_MONTHLY) {
489b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (er.bymonthdayCount == 1) {
490564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (model.monthlyRepeat == RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK) {
491b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    throw new IllegalStateException(
492b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                            "Can handle only by monthday or by nth day of week, not both");
493b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
494b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                model.monthlyByMonthDay = er.bymonthday[0];
495564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                model.monthlyRepeat = RecurrenceModel.MONTHLY_BY_DATE;
496b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } else if (er.bymonthCount > 1) {
497b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                // LIMITATION: Can handle only one month day
498b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                throw new IllegalStateException("Can handle only one bymonthday");
499b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
500b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
501b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
502b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
503564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    static private void copyModelToEventRecurrence(final RecurrenceModel model,
504564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            EventRecurrence er) {
505564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (model.recurrenceState == RecurrenceModel.STATE_NO_RECURRENCE) {
506b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            throw new IllegalStateException("There's no recurrence");
507b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
508b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
509b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Freq
510b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        er.freq = mFreqModelToEventRecurrence[model.freq];
511b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
512b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Interval
513b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (model.interval <= 1) {
514b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            er.interval = 0;
515b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else {
516b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            er.interval = model.interval;
517b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
518b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
519b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // End
520b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        switch (model.end) {
521564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.END_BY_DATE:
522b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (model.endDate != null) {
523b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    model.endDate.switchTimezone(Time.TIMEZONE_UTC);
524b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    model.endDate.normalize(false);
525b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.until = model.endDate.format2445();
526b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.count = 0;
527b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                } else {
528b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    throw new IllegalStateException("end = END_BY_DATE but endDate is null");
529b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
530b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
531564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.END_BY_COUNT:
532b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                er.count = model.endCount;
533b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                er.until = null;
534b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (er.count <= 0) {
535b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    throw new IllegalStateException("count is " + er.count);
536b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
537b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
538b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            default:
539b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                er.count = 0;
540b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                er.until = null;
541b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
542b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
543b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
544b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Weekly && monthly repeat patterns
545b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        er.bydayCount = 0;
546b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        er.bymonthdayCount = 0;
547b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
548b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        switch (model.freq) {
549564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_MONTHLY:
550564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (model.monthlyRepeat == RecurrenceModel.MONTHLY_BY_DATE) {
551b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (model.monthlyByMonthDay > 0) {
552b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        if (er.bymonthday == null || er.bymonthdayCount < 1) {
553b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                            er.bymonthday = new int[1];
554b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        }
555b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.bymonthday[0] = model.monthlyByMonthDay;
556b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.bymonthdayCount = 1;
557b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
558564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                } else if (model.monthlyRepeat == RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK) {
559b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (model.monthlyByNthDayOfWeek <= 0) {
560b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        throw new IllegalStateException("month repeat by nth week but n is "
561b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                                + model.monthlyByNthDayOfWeek);
562b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
563b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    int count = 1;
564b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (er.bydayCount < count || er.byday == null || er.bydayNum == null) {
565b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.byday = new int[count];
566b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.bydayNum = new int[count];
567b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
568b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.bydayCount = count;
569b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.byday[0] = EventRecurrence.timeDay2Day(model.monthlyByDayOfWeek);
570b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.bydayNum[0] = model.monthlyByNthDayOfWeek;
571b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
572b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
573564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_WEEKLY:
574b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                int count = 0;
575b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                for (int i = 0; i < 7; i++) {
576b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (model.weeklyByDayOfWeek[i]) {
577b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        count++;
578b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
579b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
580b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
581b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (er.bydayCount < count || er.byday == null || er.bydayNum == null) {
582b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.byday = new int[count];
583b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.bydayNum = new int[count];
584b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
585b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                er.bydayCount = count;
586b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
587b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                for (int i = 6; i >= 0; i--) {
588b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (model.weeklyByDayOfWeek[i]) {
589b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.bydayNum[--count] = 0;
590b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.byday[count] = EventRecurrence.timeDay2Day(i);
591b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
592b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
593b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
594b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
595b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
596b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (!canHandleRecurrenceRule(er)) {
597b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            throw new IllegalStateException("UI generated recurrence that it can't handle. ER:"
598b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    + er.toString() + " Model: " + model.toString());
599b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
600b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
601b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
602b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
603b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public View onCreateView(LayoutInflater inflater, ViewGroup container,
604b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Bundle savedInstanceState) {
605b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mRecurrence.wkst = EventRecurrence.timeDay2Day(Utils.getFirstDayOfWeek(getActivity()));
606b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
607fb2631a67560abd54d3ad66f154bc30728262b54James Kung        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
608fb2631a67560abd54d3ad66f154bc30728262b54James Kung
609b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        boolean endCountHasFocus = false;
610b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (savedInstanceState != null) {
611564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            RecurrenceModel m = (RecurrenceModel) savedInstanceState.get(BUNDLE_MODEL);
612b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (m != null) {
613b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mModel = m;
614b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
615b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            endCountHasFocus = savedInstanceState.getBoolean(BUNDLE_END_COUNT_HAS_FOCUS);
616b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else {
617b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Bundle b = getArguments();
618b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (b != null) {
619b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mTime.set(b.getLong(BUNDLE_START_TIME_MILLIS));
620b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
621b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                String tz = b.getString(BUNDLE_TIME_ZONE);
622b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (!TextUtils.isEmpty(tz)) {
623b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    mTime.timezone = tz;
624b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
625b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mTime.normalize(false);
626b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
627b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                // Time days of week: Sun=0, Mon=1, etc
628b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mModel.weeklyByDayOfWeek[mTime.weekDay] = true;
629b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                String rrule = b.getString(BUNDLE_RRULE);
630b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (!TextUtils.isEmpty(rrule)) {
631564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.recurrenceState = RecurrenceModel.STATE_RECURRENCE;
632b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    mRecurrence.parse(rrule);
633b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    copyEventRecurrenceToModel(mRecurrence, mModel);
634564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    // Leave today's day of week as checked by default in weekly view.
635564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    if (mRecurrence.bydayCount == 0) {
636564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        mModel.weeklyByDayOfWeek[mTime.weekDay] = true;
637564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    }
638b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
639564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
640b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } else {
641b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mTime.setToNow();
642b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
643b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
644b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
645b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mResources = getResources();
646fb2631a67560abd54d3ad66f154bc30728262b54James Kung        mView = inflater.inflate(R.layout.recurrencepicker, container, true);
647fb2631a67560abd54d3ad66f154bc30728262b54James Kung
648fb2631a67560abd54d3ad66f154bc30728262b54James Kung        final Activity activity = getActivity();
649fb2631a67560abd54d3ad66f154bc30728262b54James Kung        final Configuration config = activity.getResources().getConfiguration();
650564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
651564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mRepeatSwitch = (Switch) mView.findViewById(R.id.repeat_switch);
652564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mRepeatSwitch.setChecked(mModel.recurrenceState == RecurrenceModel.STATE_RECURRENCE);
653564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mRepeatSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
654564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
655564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            @Override
656564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
657564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mModel.recurrenceState = isChecked ? RecurrenceModel.STATE_RECURRENCE
658564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        : RecurrenceModel.STATE_NO_RECURRENCE;
659564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                togglePickerOptions();
660564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
661564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        });
662b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
663b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mFreqSpinner = (Spinner) mView.findViewById(R.id.freqSpinner);
664b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mFreqSpinner.setOnItemSelectedListener(this);
665b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        ArrayAdapter<CharSequence> freqAdapter = ArrayAdapter.createFromResource(getActivity(),
666b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                R.array.recurrence_freq, R.layout.recurrencepicker_freq_item);
667b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        freqAdapter.setDropDownViewResource(R.layout.recurrencepicker_freq_item);
668b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mFreqSpinner.setAdapter(freqAdapter);
669b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
670b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mInterval = (EditText) mView.findViewById(R.id.interval);
671b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mInterval.addTextChangedListener(new minMaxTextWatcher(1, INTERVAL_DEFAULT, INTERVAL_MAX) {
672b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            @Override
673b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            void onChange(int v) {
674aafaa5f3d4d94d193186df868a76aed484a14255James Kung                if (mIntervalResId != -1 && mInterval.getText().toString().length() > 0) {
675564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.interval = v;
676aafaa5f3d4d94d193186df868a76aed484a14255James Kung                    updateIntervalText();
677aafaa5f3d4d94d193186df868a76aed484a14255James Kung                    mInterval.requestLayout();
678aafaa5f3d4d94d193186df868a76aed484a14255James Kung                }
679b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
680b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        });
681b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mIntervalPreText = (TextView) mView.findViewById(R.id.intervalPreText);
682b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mIntervalPostText = (TextView) mView.findViewById(R.id.intervalPostText);
683b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
684b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndNeverStr = mResources.getString(R.string.recurrence_end_continously);
685b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        mEndDateLabel = mResources.getString(R.string.recurrence_end_date_label);
686564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mEndCountLabel = mResources.getString(R.string.recurrence_end_count_label);
687564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
688b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndSpinnerArray.add(mEndNeverStr);
689b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        mEndSpinnerArray.add(mEndDateLabel);
690564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mEndSpinnerArray.add(mEndCountLabel);
691b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndSpinner = (Spinner) mView.findViewById(R.id.endSpinner);
692b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndSpinner.setOnItemSelectedListener(this);
693564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mEndSpinnerAdapter = new EndSpinnerAdapter(getActivity(), mEndSpinnerArray,
694564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                R.layout.recurrencepicker_freq_item, R.layout.recurrencepicker_end_text);
695b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndSpinnerAdapter.setDropDownViewResource(R.layout.recurrencepicker_freq_item);
696b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndSpinner.setAdapter(mEndSpinnerAdapter);
697b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
698b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndCount = (EditText) mView.findViewById(R.id.endCount);
699b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndCount.addTextChangedListener(new minMaxTextWatcher(1, COUNT_DEFAULT, COUNT_MAX) {
700b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            @Override
701b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            void onChange(int v) {
702564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (mModel.endCount != v) {
703564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.endCount = v;
704564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    updateEndCountText();
705564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mEndCount.requestLayout();
706564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
707b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
708b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        });
709564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mPostEndCount = (TextView) mView.findViewById(R.id.postEndCount);
710564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
711564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mEndDateTextView = (TextView) mView.findViewById(R.id.endDate);
712b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndDateTextView.setOnClickListener(this);
713b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (mModel.endDate == null) {
714b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mModel.endDate = new Time(mTime);
715b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            switch (mModel.freq) {
716564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.FREQ_DAILY:
717564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.FREQ_WEEKLY:
718b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    mModel.endDate.month += 1;
719b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
720564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.FREQ_MONTHLY:
721b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    mModel.endDate.month += 3;
722b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
723564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.FREQ_YEARLY:
724b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    mModel.endDate.year += 3;
725b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
726b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
727b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mModel.endDate.normalize(false);
728b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
729b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
730b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mWeekGroup = (LinearLayout) mView.findViewById(R.id.weekGroup);
731b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        mWeekGroup2 = (LinearLayout) mView.findViewById(R.id.weekGroup2);
732b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
733b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mOrdinalArray = mResources.getStringArray(R.array.ordinal_labels);
734b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
735b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // In Calendar.java day of week order e.g Sun = 1 ... Sat = 7
736b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        String[] dayOfWeekString = new DateFormatSymbols().getWeekdays();
737b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mDayOfWeekString = new String[7];
738b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        for (int i = 0; i < 7; i++) {
739b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mDayOfWeekString[i] = dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[i]];
740b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
741b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
742b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // In Time.java day of week order e.g. Sun = 0
743b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int idx = Utils.getFirstDayOfWeek(getActivity());
744b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
745b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // In Calendar.java day of week order e.g Sun = 1 ... Sat = 7
746b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        dayOfWeekString = new DateFormatSymbols().getShortWeekdays();
747b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
748b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        int numOfButtonsInRow1;
749b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        int numOfButtonsInRow2;
750b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
751b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        if (mResources.getConfiguration().screenWidthDp > MIN_SCREEN_WIDTH_FOR_SINGLE_ROW_WEEK) {
752b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            numOfButtonsInRow1 = 7;
753b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            numOfButtonsInRow2 = 0;
754b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekGroup2.setVisibility(View.GONE);
755b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekGroup2.getChildAt(3).setVisibility(View.GONE);
756b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        } else {
757b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            numOfButtonsInRow1 = 4;
758b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            numOfButtonsInRow2 = 3;
759b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
760b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekGroup2.setVisibility(View.VISIBLE);
761b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            // Set rightmost button on the second row invisible so it takes up
762b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            // space and everything centers properly
763b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekGroup2.getChildAt(3).setVisibility(View.INVISIBLE);
764b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        }
765b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
766b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        /* First row */
767b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        for (int i = 0; i < 7; i++) {
768b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            if (i >= numOfButtonsInRow1) {
769b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan                mWeekGroup.getChildAt(i).setVisibility(View.GONE);
770b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan                continue;
771b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            }
772b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
773b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mWeekByDayButtons[idx] = (ToggleButton) mWeekGroup.getChildAt(i);
774b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mWeekByDayButtons[idx].setTextOff(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
775b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mWeekByDayButtons[idx].setTextOn(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
776b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mWeekByDayButtons[idx].setOnCheckedChangeListener(this);
777b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
778b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (++idx >= 7) {
779b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                idx = 0;
780b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
781b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
782b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
783b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        /* 2nd Row */
784b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        for (int i = 0; i < 3; i++) {
785b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            if (i >= numOfButtonsInRow2) {
786b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan                mWeekGroup2.getChildAt(i).setVisibility(View.GONE);
787b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan                continue;
788b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            }
789b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekByDayButtons[idx] = (ToggleButton) mWeekGroup2.getChildAt(i);
790b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekByDayButtons[idx].setTextOff(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
791b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekByDayButtons[idx].setTextOn(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
792b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekByDayButtons[idx].setOnCheckedChangeListener(this);
793b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
794b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            if (++idx >= 7) {
795b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan                idx = 0;
796b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            }
797b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        }
798b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
799b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mMonthGroup = (LinearLayout) mView.findViewById(R.id.monthGroup);
800b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mMonthRepeatByRadioGroup = (RadioGroup) mView.findViewById(R.id.monthGroup);
801b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mMonthRepeatByRadioGroup.setOnCheckedChangeListener(this);
802564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mRepeatMonthlyByNthDayOfWeek = (RadioButton) mView
803b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                .findViewById(R.id.repeatMonthlyByNthDayOfTheWeek);
804564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mRepeatMonthlyByNthDayOfMonth = (RadioButton) mView
805564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                .findViewById(R.id.repeatMonthlyByNthDayOfMonth);
806b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
807b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mDone = (Button) mView.findViewById(R.id.done);
808b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mDone.setOnClickListener(this);
809b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
810564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        togglePickerOptions();
811b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        updateDialog();
812b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        if (endCountHasFocus) {
813b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mEndCount.requestFocus();
814b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        }
815b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        return mView;
816b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
817b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
818564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private void togglePickerOptions() {
819564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mModel.recurrenceState == RecurrenceModel.STATE_NO_RECURRENCE) {
820564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mFreqSpinner.setEnabled(false);
821564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndSpinner.setEnabled(false);
822564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mIntervalPreText.setEnabled(false);
823564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mInterval.setEnabled(false);
824564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mIntervalPostText.setEnabled(false);
825564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mMonthRepeatByRadioGroup.setEnabled(false);
826564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndCount.setEnabled(false);
827564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mPostEndCount.setEnabled(false);
828564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndDateTextView.setEnabled(false);
829564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mRepeatMonthlyByNthDayOfWeek.setEnabled(false);
830564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mRepeatMonthlyByNthDayOfMonth.setEnabled(false);
831564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            for (Button button : mWeekByDayButtons) {
832564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                button.setEnabled(false);
833564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
834564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        } else {
835564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mView.findViewById(R.id.options).setEnabled(true);
836564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mFreqSpinner.setEnabled(true);
837564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndSpinner.setEnabled(true);
838564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mIntervalPreText.setEnabled(true);
839564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mInterval.setEnabled(true);
840564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mIntervalPostText.setEnabled(true);
841564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mMonthRepeatByRadioGroup.setEnabled(true);
842564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndCount.setEnabled(true);
843564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mPostEndCount.setEnabled(true);
844564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndDateTextView.setEnabled(true);
845564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mRepeatMonthlyByNthDayOfWeek.setEnabled(true);
846564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mRepeatMonthlyByNthDayOfMonth.setEnabled(true);
847564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            for (Button button : mWeekByDayButtons) {
848564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                button.setEnabled(true);
849564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
850564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
851564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        updateDoneButtonState();
852564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    }
853564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
854564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private void updateDoneButtonState() {
855564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mModel.recurrenceState == RecurrenceModel.STATE_NO_RECURRENCE) {
856564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mDone.setEnabled(true);
857564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return;
858564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
859564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
860564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mInterval.getText().toString().length() == 0) {
861564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mDone.setEnabled(false);
862564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return;
863564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
864564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
865564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mEndCount.getVisibility() == View.VISIBLE &&
866564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mEndCount.getText().toString().length() == 0) {
867564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mDone.setEnabled(false);
868564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return;
869564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
870564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
871564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mModel.freq == RecurrenceModel.FREQ_WEEKLY) {
872564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            for (CompoundButton b : mWeekByDayButtons) {
873564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (b.isChecked()) {
874564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mDone.setEnabled(true);
875564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    return;
876564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
877564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
878564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mDone.setEnabled(false);
879564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return;
880564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
881564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
882564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mDone.setEnabled(true);
883564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    }
884564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
885b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
886b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onSaveInstanceState(Bundle outState) {
887b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        super.onSaveInstanceState(outState);
888b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        outState.putParcelable(BUNDLE_MODEL, mModel);
889b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        if (mEndCount.hasFocus()) {
890b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            outState.putBoolean(BUNDLE_END_COUNT_HAS_FOCUS, true);
891b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        }
892b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
893b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
894b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void updateDialog() {
895b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Interval
896b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Checking before setting because this causes infinite recursion
897b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // in afterTextWatcher
898b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        final String intervalStr = Integer.toString(mModel.interval);
899b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (!intervalStr.equals(mInterval.getText().toString())) {
900b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mInterval.setText(intervalStr);
901b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
902b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
903564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mFreqSpinner.setSelection(mModel.freq);
904564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mWeekGroup.setVisibility(mModel.freq == RecurrenceModel.FREQ_WEEKLY ? View.VISIBLE : View.GONE);
905564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mWeekGroup2.setVisibility(mModel.freq == RecurrenceModel.FREQ_WEEKLY ? View.VISIBLE : View.GONE);
906564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mMonthGroup.setVisibility(mModel.freq == RecurrenceModel.FREQ_MONTHLY ? View.VISIBLE : View.GONE);
907b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
908564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        switch (mModel.freq) {
909564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_DAILY:
910564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mIntervalResId = R.plurals.recurrence_interval_daily;
911564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                break;
912b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
913564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_WEEKLY:
914564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mIntervalResId = R.plurals.recurrence_interval_weekly;
915564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                for (int i = 0; i < 7; i++) {
916564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mWeekByDayButtons[i].setChecked(mModel.weeklyByDayOfWeek[i]);
917564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
918564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                break;
919b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
920564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_MONTHLY:
921564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mIntervalResId = R.plurals.recurrence_interval_monthly;
922b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
923564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (mModel.monthlyRepeat == RecurrenceModel.MONTHLY_BY_DATE) {
924564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mMonthRepeatByRadioGroup.check(R.id.repeatMonthlyByNthDayOfMonth);
925564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                } else if (mModel.monthlyRepeat == RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK) {
926564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mMonthRepeatByRadioGroup.check(R.id.repeatMonthlyByNthDayOfTheWeek);
927564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
928b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
929564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (mMonthRepeatByDayOfWeekStr == null) {
930564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    if (mModel.monthlyByNthDayOfWeek == 0) {
931a044b42e8da182e4cbc5ba07c5aaa246ca6dc773Sam Blitzstein                        mModel.monthlyByNthDayOfWeek = (mTime.monthDay + 6) / 7;
932a044b42e8da182e4cbc5ba07c5aaa246ca6dc773Sam Blitzstein                        mModel.monthlyByDayOfWeek = mTime.weekDay;
933b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
934b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
935564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mMonthRepeatByDayOfWeekStr = mResources.getString(
936564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            R.string.recurrence_month_pattern_by_day_of_week,
937564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            mOrdinalArray[mModel.monthlyByNthDayOfWeek - 1],
938564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            mDayOfWeekString[mModel.monthlyByDayOfWeek]);
939564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mRepeatMonthlyByNthDayOfWeek.setText(mMonthRepeatByDayOfWeekStr);
940564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
941564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                break;
942564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
943564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_YEARLY:
944564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mIntervalResId = R.plurals.recurrence_interval_yearly;
945564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                break;
946564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
947564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        updateIntervalText();
948564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        updateDoneButtonState();
949564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
950564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mEndSpinner.setSelection(mModel.end);
951564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mModel.end == RecurrenceModel.END_BY_DATE) {
952564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            final String dateStr = DateUtils.formatDateTime(getActivity(),
953564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.endDate.toMillis(false), DateUtils.FORMAT_NUMERIC_DATE);
954564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndDateTextView.setText(dateStr);
955564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        } else {
956564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (mModel.end == RecurrenceModel.END_BY_COUNT) {
957564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // Checking before setting because this causes infinite
958564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // recursion
959564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // in afterTextWatcher
960564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                final String countStr = Integer.toString(mModel.endCount);
961564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (!countStr.equals(mEndCount.getText().toString())) {
962564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mEndCount.setText(countStr);
963b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
964b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
965b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
966b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
967b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
968b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    /**
969b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan     * @param endDateString
970b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan     */
971b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    private void setEndSpinnerEndDateStr(final String endDateString) {
972b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        mEndSpinnerArray.set(1, endDateString);
973b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        mEndSpinnerAdapter.notifyDataSetChanged();
974b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    }
975b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
976b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private void doToast() {
977b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        Log.e(TAG, "Model = " + mModel.toString());
978b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        String rrule;
979564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mModel.recurrenceState == RecurrenceModel.STATE_NO_RECURRENCE) {
980b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            rrule = "Not repeating";
981b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else {
982b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            copyModelToEventRecurrence(mModel, mRecurrence);
983b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            rrule = mRecurrence.toString();
984b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
985b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
986b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (mToast != null) {
987b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mToast.cancel();
988b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
989b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mToast = Toast.makeText(getActivity(), rrule,
990b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                Toast.LENGTH_LONG);
991b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mToast.show();
992b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
993b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
994b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // TODO Test and update for Right-to-Left
995aafaa5f3d4d94d193186df868a76aed484a14255James Kung    private void updateIntervalText() {
996aafaa5f3d4d94d193186df868a76aed484a14255James Kung        if (mIntervalResId == -1) {
997aafaa5f3d4d94d193186df868a76aed484a14255James Kung            return;
998aafaa5f3d4d94d193186df868a76aed484a14255James Kung        }
999aafaa5f3d4d94d193186df868a76aed484a14255James Kung
1000b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        final String INTERVAL_COUNT_MARKER = "%d";
1001aafaa5f3d4d94d193186df868a76aed484a14255James Kung        String intervalString = mResources.getQuantityString(mIntervalResId, mModel.interval);
1002b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int markerStart = intervalString.indexOf(INTERVAL_COUNT_MARKER);
1003b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1004b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (markerStart != -1) {
1005b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (markerStart == 0) {
1006b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mIntervalPreText.setText("");
1007b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } else {
1008b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                int postTextStart = markerStart + INTERVAL_COUNT_MARKER.length();
1009564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (postTextStart < intervalString.length() &&
1010564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        intervalString.charAt(postTextStart) == ' ') {
1011b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    postTextStart++;
1012b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
1013b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mIntervalPostText.setText(intervalString.subSequence(postTextStart,
1014b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        intervalString.length()));
1015b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1016b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (intervalString.charAt(markerStart - 1) == ' ') {
1017b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    markerStart--;
1018b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
1019b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mIntervalPreText.setText(intervalString.subSequence(0, markerStart));
1020b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
1021b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1022b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1023b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1024564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    /**
1025564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung     * Update the "Repeat for N events" end option with the proper string values
1026564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung     * based on the value that has been entered for N.
1027564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung     */
1028564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private void updateEndCountText() {
1029564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        final String END_COUNT_MARKER = "%d";
1030564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        String endString = mResources.getQuantityString(R.plurals.recurrence_end_count,
1031564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mModel.endCount);
1032564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        int markerStart = endString.indexOf(END_COUNT_MARKER);
1033564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1034564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (markerStart != -1) {
1035564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (markerStart == 0) {
1036564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                Log.e(TAG, "No text to put in to recurrence's end spinner.");
1037564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            } else {
1038564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                int postTextStart = markerStart + END_COUNT_MARKER.length();
1039564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (postTextStart < endString.length() &&
1040564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        endString.charAt(postTextStart) == ' ') {
1041564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    postTextStart++;
1042564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
1043564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mPostEndCount.setText(endString.subSequence(postTextStart,
1044564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        endString.length()));
1045564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1046564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
1047564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    }
1048564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1049b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Implements OnItemSelectedListener interface
1050b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Freq spinner
1051b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // End spinner
1052b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1053b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
1054b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (parent == mFreqSpinner) {
1055564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mModel.freq = position;
1056b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else if (parent == mEndSpinner) {
1057b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            switch (position) {
1058564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_NEVER:
1059564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.end = RecurrenceModel.END_NEVER;
1060b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
1061564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_BY_DATE:
1062564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.end = RecurrenceModel.END_BY_DATE;
1063b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
1064564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_BY_COUNT:
1065564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.end = RecurrenceModel.END_BY_COUNT;
1066b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1067b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (mModel.endCount <= 1) {
1068b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        mModel.endCount = 1;
1069b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    } else if (mModel.endCount > COUNT_MAX) {
1070b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        mModel.endCount = COUNT_MAX;
1071b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
1072564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    updateEndCountText();
1073b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
1074b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
1075564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndCount.setVisibility(mModel.end == RecurrenceModel.END_BY_COUNT ? View.VISIBLE
1076b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    : View.GONE);
1077564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndDateTextView.setVisibility(mModel.end == RecurrenceModel.END_BY_DATE ? View.VISIBLE
1078b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    : View.GONE);
1079564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mPostEndCount.setVisibility(
1080564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.end == RecurrenceModel.END_BY_COUNT  && !mHidePostEndCount?
1081564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            View.VISIBLE : View.GONE);
1082564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1083b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1084b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        updateDialog();
1085b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1086b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1087b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Implements OnItemSelectedListener interface
1088b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1089b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onNothingSelected(AdapterView<?> arg0) {
1090b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1091b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1092b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
109356f42bfb36d710726051e8268a115697477add61James Kung    public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
1094b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (mModel.endDate == null) {
1095b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mModel.endDate = new Time(mTime.timezone);
1096b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mModel.endDate.hour = mModel.endDate.minute = mModel.endDate.second = 0;
1097b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1098b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mModel.endDate.year = year;
1099b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mModel.endDate.month = monthOfYear;
1100b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mModel.endDate.monthDay = dayOfMonth;
1101b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mModel.endDate.normalize(false);
1102b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        updateDialog();
1103b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1104b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1105b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Implements OnCheckedChangeListener interface
1106b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Week repeat by day of week
1107b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1108b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1109b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int itemIdx = -1;
1110b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        for (int i = 0; i < 7; i++) {
1111b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (itemIdx == -1 && buttonView == mWeekByDayButtons[i]) {
1112b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                itemIdx = i;
1113b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mModel.weeklyByDayOfWeek[i] = isChecked;
1114b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
1115b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1116b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        updateDialog();
1117b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1118b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1119b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Implements android.widget.RadioGroup.OnCheckedChangeListener interface
1120b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Month repeat by radio buttons
1121b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1122b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onCheckedChanged(RadioGroup group, int checkedId) {
1123b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (checkedId == R.id.repeatMonthlyByNthDayOfMonth) {
1124564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mModel.monthlyRepeat = RecurrenceModel.MONTHLY_BY_DATE;
1125b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else if (checkedId == R.id.repeatMonthlyByNthDayOfTheWeek) {
1126564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mModel.monthlyRepeat = RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK;
1127b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1128b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        updateDialog();
1129b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1130b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1131b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Implements OnClickListener interface
1132b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // EndDate button
1133b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Done button
1134b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1135b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onClick(View v) {
1136b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (mEndDateTextView == v) {
113756f42bfb36d710726051e8268a115697477add61James Kung            if (mDatePickerDialog != null) {
113856f42bfb36d710726051e8268a115697477add61James Kung                mDatePickerDialog.dismiss();
1139b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
114056f42bfb36d710726051e8268a115697477add61James Kung            mDatePickerDialog = DatePickerDialog.newInstance(this, mModel.endDate.year,
114156f42bfb36d710726051e8268a115697477add61James Kung                    mModel.endDate.month, mModel.endDate.monthDay);
114256f42bfb36d710726051e8268a115697477add61James Kung            mDatePickerDialog.setFirstDayOfWeek(Utils.getFirstDayOfWeekAsCalendar(getActivity()));
114356f42bfb36d710726051e8268a115697477add61James Kung            mDatePickerDialog.setYearRange(Utils.YEAR_MIN, Utils.YEAR_MAX);
114456f42bfb36d710726051e8268a115697477add61James Kung            mDatePickerDialog.show(getFragmentManager(), FRAG_TAG_DATE_PICKER);
1145b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else if (mDone == v) {
1146b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            String rrule;
1147564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (mModel.recurrenceState == RecurrenceModel.STATE_NO_RECURRENCE) {
1148b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                rrule = null;
1149b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } else {
1150b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                copyModelToEventRecurrence(mModel, mRecurrence);
1151b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                rrule = mRecurrence.toString();
1152b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
1153b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mRecurrenceSetListener.onRecurrenceSet(rrule);
1154b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dismiss();
1155b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1156b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1157b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1158b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1159b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onActivityCreated(Bundle savedInstanceState) {
1160b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        super.onActivityCreated(savedInstanceState);
116156f42bfb36d710726051e8268a115697477add61James Kung        mDatePickerDialog = (DatePickerDialog) getFragmentManager()
1162b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                .findFragmentByTag(FRAG_TAG_DATE_PICKER);
116356f42bfb36d710726051e8268a115697477add61James Kung        if (mDatePickerDialog != null) {
116456f42bfb36d710726051e8268a115697477add61James Kung            mDatePickerDialog.setOnDateSetListener(this);
1165b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1166b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1167b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1168b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public interface OnRecurrenceSetListener {
1169b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        void onRecurrenceSet(String rrule);
1170b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1171b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1172b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void setOnRecurrenceSetListener(OnRecurrenceSetListener l) {
1173b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mRecurrenceSetListener = l;
1174b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1175564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1176564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private class EndSpinnerAdapter extends ArrayAdapter<CharSequence> {
1177564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        final String END_DATE_MARKER = "%s";
1178564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        final String END_COUNT_MARKER = "%d";
1179564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1180564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private LayoutInflater mInflater;
1181564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private int mItemResourceId;
1182564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private int mTextResourceId;
1183564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private ArrayList<CharSequence> mStrings;
1184564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private String mEndDateString;
1185564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private boolean mUseFormStrings;
1186564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1187564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        /**
1188564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung         * @param context
1189564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung         * @param textViewResourceId
1190564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung         * @param objects
1191564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung         */
1192564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        public EndSpinnerAdapter(Context context, ArrayList<CharSequence> strings,
1193564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                int itemResourceId, int textResourceId) {
1194564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            super(context, itemResourceId, strings);
1195564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
1196564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mItemResourceId = itemResourceId;
1197564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mTextResourceId = textResourceId;
1198564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mStrings = strings;
1199564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndDateString = getResources().getString(R.string.recurrence_end_date);
1200564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1201564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            // If either date or count strings don't translate well, such that we aren't assured
1202564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            // to have some text available to be placed in the spinner, then we'll have to use
1203564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            // the more form-like versions of both strings instead.
1204564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            int markerStart = mEndDateString.indexOf(END_DATE_MARKER);
1205564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (markerStart <= 0) {
1206564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // The date string does not have any text before the "%s" so we'll have to use the
1207564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // more form-like strings instead.
1208564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mUseFormStrings = true;
1209564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            } else {
1210564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                String countEndStr = getResources().getQuantityString(
1211564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        R.plurals.recurrence_end_count, 1);
1212564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                markerStart = countEndStr.indexOf(END_COUNT_MARKER);
1213564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (markerStart <= 0) {
1214564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    // The count string does not have any text before the "%d" so we'll have to use
1215564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    // the more form-like strings instead.
1216564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mUseFormStrings = true;
1217564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
1218564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1219564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1220564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (mUseFormStrings) {
1221564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // We'll have to set the layout for the spinner to be weight=0 so it doesn't
1222564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // take up too much space.
1223564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mEndSpinner.setLayoutParams(
1224564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        new TableLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f));
1225564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1226564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
1227564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1228564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        @Override
1229564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        public View getView(int position, View convertView, ViewGroup parent) {
1230564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            View v;
1231564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            // Check if we can recycle the view
1232564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (convertView == null) {
1233564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                v = mInflater.inflate(mTextResourceId, parent, false);
1234564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            } else {
1235564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                v = convertView;
1236564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1237564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1238564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            TextView item = (TextView) v.findViewById(R.id.spinner_item);
1239564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            int markerStart;
1240564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            switch (position) {
1241564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_NEVER:
1242564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    item.setText(mStrings.get(RecurrenceModel.END_NEVER));
1243564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    break;
1244564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_BY_DATE:
1245564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    markerStart = mEndDateString.indexOf(END_DATE_MARKER);
1246564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1247564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    if (markerStart != -1) {
1248564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        if (mUseFormStrings || markerStart == 0) {
1249564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // If we get here, the translation of "Until" doesn't work correctly,
1250564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // so we'll just set the whole "Until a date" string.
1251564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            item.setText(mEndDateLabel);
1252564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        } else {
1253564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            if (mEndDateString.charAt(markerStart - 1) == ' ') {
1254564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                                markerStart--;
1255564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            }
1256564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            item.setText(mEndDateString.subSequence(0, markerStart));
1257564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        }
1258564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    }
1259564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    break;
1260564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_BY_COUNT:
1261564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    String endString = mResources.getQuantityString(R.plurals.recurrence_end_count,
1262564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            mModel.endCount);
1263564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    markerStart = endString.indexOf(END_COUNT_MARKER);
1264564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1265564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    if (markerStart != -1) {
1266564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        if (mUseFormStrings || markerStart == 0) {
1267564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // If we get here, the translation of "For" doesn't work correctly,
1268564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // so we'll just set the whole "For a number of events" string.
1269564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            item.setText(mEndCountLabel);
1270564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // Also, we'll hide the " events" that would have been at the end.
1271564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            mPostEndCount.setVisibility(View.GONE);
1272564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // Use this flag so the onItemSelected knows whether to show it later.
1273564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            mHidePostEndCount = true;
1274564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        } else {
1275564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            int postTextStart = markerStart + END_COUNT_MARKER.length();
1276564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            if (endString.charAt(postTextStart) == ' ') {
1277564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                                postTextStart++;
1278564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            }
1279564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            mPostEndCount.setText(endString.subSequence(postTextStart,
1280564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                                    endString.length()));
1281564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // In case it's a recycled view that wasn't visible.
1282564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            mPostEndCount.setVisibility(View.VISIBLE);
1283564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            if (endString.charAt(markerStart - 1) == ' ') {
1284564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                                markerStart--;
1285564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            }
1286564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            item.setText(endString.subSequence(0, markerStart));
1287564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        }
1288564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    }
1289564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    break;
1290564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                default:
1291564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    v = null;
1292564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    break;
1293564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1294564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1295564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return v;
1296564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
1297564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1298564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        @Override
1299564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        public View getDropDownView(int position, View convertView, ViewGroup parent) {
1300564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            View v;
1301564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            // Check if we can recycle the view
1302564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (convertView == null) {
1303564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                v = mInflater.inflate(mItemResourceId, parent, false);
1304564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            } else {
1305564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                v = convertView;
1306564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1307564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1308564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            TextView item = (TextView) v.findViewById(R.id.spinner_item);
1309564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            item.setText(mStrings.get(position));
1310564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1311564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return v;
1312564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
1313564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    }
1314b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan}
1315