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;
37b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport android.view.ViewGroup;
38d1db03631de67104f7d3b3da73eaeec28a80aef2James Kungimport android.view.ViewGroup.LayoutParams;
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;
59b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport com.android.calendarcommon2.EventRecurrence;
6056f42bfb36d710726051e8268a115697477add61James Kungimport com.android.datetimepicker.date.DatePickerDialog;
61b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
62b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport java.text.DateFormatSymbols;
63b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport java.util.ArrayList;
64b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport java.util.Arrays;
65b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanimport java.util.Calendar;
66b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
67b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chanpublic class RecurrencePickerDialog extends DialogFragment implements OnItemSelectedListener,
68b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        OnCheckedChangeListener, OnClickListener,
69b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        android.widget.RadioGroup.OnCheckedChangeListener, DatePickerDialog.OnDateSetListener {
70b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
71b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final String TAG = "RecurrencePickerDialog";
72b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
73b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    // in dp's
74b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    private static final int MIN_SCREEN_WIDTH_FOR_SINGLE_ROW_WEEK = 450;
75b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
76b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Update android:maxLength in EditText as needed
77b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final int INTERVAL_MAX = 99;
78b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final int INTERVAL_DEFAULT = 1;
79b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Update android:maxLength in EditText as needed
80b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final int COUNT_MAX = 730;
81b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final int COUNT_DEFAULT = 5;
82b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
8356f42bfb36d710726051e8268a115697477add61James Kung    private DatePickerDialog mDatePickerDialog;
8456f42bfb36d710726051e8268a115697477add61James Kung
85564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private class RecurrenceModel implements Parcelable {
86b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
87b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Should match EventRecurrence.DAILY, etc
88b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int FREQ_DAILY = 0;
89b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int FREQ_WEEKLY = 1;
90b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int FREQ_MONTHLY = 2;
91b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int FREQ_YEARLY = 3;
92b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
93b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int END_NEVER = 0;
94b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int END_BY_DATE = 1;
95b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int END_BY_COUNT = 2;
96b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
97b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int MONTHLY_BY_DATE = 0;
98b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        static final int MONTHLY_BY_NTH_DAY_OF_WEEK = 1;
99b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
100564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        static final int STATE_NO_RECURRENCE = 0;
101564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        static final int STATE_RECURRENCE = 1;
102564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
103564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        int recurrenceState;
104564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
105b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
106b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * FREQ: Repeat pattern
107b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         *
108b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see FREQ_DAILY
109b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see FREQ_WEEKLY
110b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see FREQ_MONTHLY
111b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see FREQ_YEARLY
112b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
113564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        int freq = FREQ_WEEKLY;
114b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
115b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
116b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * INTERVAL: Every n days/weeks/months/years. n >= 1
117b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
118b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int interval = INTERVAL_DEFAULT;
119b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
120b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
121b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * UNTIL and COUNT: How does the the event end?
122b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         *
123b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see END_NEVER
124b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see END_BY_DATE
125b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see END_BY_COUNT
126b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see untilDate
127b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see untilCount
128b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
129b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int end;
130b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
131b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
132b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * UNTIL: Date of the last recurrence. Used when until == END_BY_DATE
133b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
134b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        Time endDate;
135b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
136b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
137b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * COUNT: Times to repeat. Use when until == END_BY_COUNT
138b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
139b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int endCount = COUNT_DEFAULT;
140b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
141b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
142b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * BYDAY: Days of the week to be repeated. Sun = 0, Mon = 1, etc
143b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
144b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        boolean[] weeklyByDayOfWeek = new boolean[7];
145b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
146b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
147b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * BYDAY AND BYMONTHDAY: How to repeat monthly events? Same date of the
148b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * month or Same nth day of week.
149b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         *
150b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see MONTHLY_BY_DATE
151b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * @see MONTHLY_BY_NTH_DAY_OF_WEEK
152b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
153b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int monthlyRepeat;
154b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
155b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
156b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * Day of the month to repeat. Used when monthlyRepeat ==
157b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * MONTHLY_BY_DATE
158b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
159b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int monthlyByMonthDay;
160b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
161b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
162b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * Day of the week to repeat. Used when monthlyRepeat ==
163b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * MONTHLY_BY_NTH_DAY_OF_WEEK
164b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
165b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int monthlyByDayOfWeek;
166b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
167b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /**
168b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * Nth day of the week to repeat. Used when monthlyRepeat ==
169b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * MONTHLY_BY_NTH_DAY_OF_WEEK 0=undefined, 1=1st, 2=2nd, etc
170b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
171b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int monthlyByNthDayOfWeek;
172b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
173b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /*
174b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * (generated method)
175b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
176b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
177b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public String toString() {
178b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return "Model [freq=" + freq + ", interval=" + interval + ", end=" + end + ", endDate="
179b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    + endDate + ", endCount=" + endCount + ", weeklyByDayOfWeek="
180b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    + Arrays.toString(weeklyByDayOfWeek) + ", monthlyRepeat=" + monthlyRepeat
181b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    + ", monthlyByMonthDay=" + monthlyByMonthDay + ", monthlyByDayOfWeek="
182b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    + monthlyByDayOfWeek + ", monthlyByNthDayOfWeek=" + monthlyByNthDayOfWeek + "]";
183b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
184b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
185b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
186b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public int describeContents() {
187b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return 0;
188b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
189b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
190564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        public RecurrenceModel() {
191b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
192b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
193b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
194b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public void writeToParcel(Parcel dest, int flags) {
195b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(freq);
196b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(interval);
197b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(end);
198b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(endDate.year);
199b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(endDate.month);
200b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(endDate.monthDay);
201b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(endCount);
202b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeBooleanArray(weeklyByDayOfWeek);
203b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(monthlyRepeat);
204b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(monthlyByMonthDay);
205b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(monthlyByDayOfWeek);
206b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dest.writeInt(monthlyByNthDayOfWeek);
207564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            dest.writeInt(recurrenceState);
208b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
209b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
210b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
211b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    class minMaxTextWatcher implements TextWatcher {
212b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        private int mMin;
213b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        private int mMax;
214b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        private int mDefault;
215b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
216b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public minMaxTextWatcher(int min, int defaultInt, int max) {
217b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mMin = min;
218b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mMax = max;
219b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mDefault = defaultInt;
220b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
221b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
222b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
223b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public void afterTextChanged(Editable s) {
224b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
225b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            boolean updated = false;
226b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            int value;
227b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            try {
228b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                value = Integer.parseInt(s.toString());
229b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } catch (NumberFormatException e) {
230b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                value = mDefault;
231b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
232b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
233b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (value < mMin) {
234b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                value = mMin;
235b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                updated = true;
236b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } else if (value > mMax) {
237b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                updated = true;
238b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                value = mMax;
239b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
240b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
241b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            // Update UI
242b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (updated) {
243b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                s.clear();
244b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                s.append(Integer.toString(value));
245b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
246b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
247564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            updateDoneButtonState();
248b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            onChange(value);
249b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
250b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
251b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /** Override to be called after each key stroke */
252b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        void onChange(int value) {
253b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
254b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
255b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
256b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
257b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
258b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
259b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        @Override
260b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        public void onTextChanged(CharSequence s, int start, int before, int count) {
261b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
262b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
263b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
264b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Resources mResources;
265b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private EventRecurrence mRecurrence = new EventRecurrence();
266b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Time mTime = new Time(); // TODO timezone?
267564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private RecurrenceModel mModel = new RecurrenceModel();
268b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Toast mToast;
269b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
270b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private final int[] TIME_DAY_TO_CALENDAR_DAY = new int[] {
271b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.SUNDAY,
272b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.MONDAY,
273b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.TUESDAY,
274b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.WEDNESDAY,
275b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.THURSDAY,
276b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.FRIDAY,
277b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Calendar.SATURDAY,
278b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    };
279b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
280b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Call mStringBuilder.setLength(0) before formatting any string or else the
281b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // formatted text will accumulate.
282b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // private final StringBuilder mStringBuilder = new StringBuilder();
283b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // private Formatter mFormatter = new Formatter(mStringBuilder);
284b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
285b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private View mView;
286b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
287b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Spinner mFreqSpinner;
288b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final int[] mFreqModelToEventRecurrence = {
289b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            EventRecurrence.DAILY,
290b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            EventRecurrence.WEEKLY,
291b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            EventRecurrence.MONTHLY,
292b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            EventRecurrence.YEARLY
293b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    };
294b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
295b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public static final String BUNDLE_START_TIME_MILLIS = "bundle_event_start_time";
296b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public static final String BUNDLE_TIME_ZONE = "bundle_event_time_zone";
297b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public static final String BUNDLE_RRULE = "bundle_event_rrule";
298b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
299b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final String BUNDLE_MODEL = "bundle_model";
300b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    private static final String BUNDLE_END_COUNT_HAS_FOCUS = "bundle_end_count_has_focus";
301b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
302b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private static final String FRAG_TAG_DATE_PICKER = "tag_date_picker_frag";
303b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
304564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private Switch mRepeatSwitch;
305564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
306b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private EditText mInterval;
307b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private TextView mIntervalPreText;
308b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private TextView mIntervalPostText;
309b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
310aafaa5f3d4d94d193186df868a76aed484a14255James Kung    private int mIntervalResId = -1;
311aafaa5f3d4d94d193186df868a76aed484a14255James Kung
312b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Spinner mEndSpinner;
313564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private TextView mEndDateTextView;
314b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private EditText mEndCount;
315564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private TextView mPostEndCount;
316564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private boolean mHidePostEndCount;
317b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
318b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private ArrayList<CharSequence> mEndSpinnerArray = new ArrayList<CharSequence>(3);
319564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private EndSpinnerAdapter mEndSpinnerAdapter;
320b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private String mEndNeverStr;
321b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    private String mEndDateLabel;
322564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private String mEndCountLabel;
323b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
324b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    /** Hold toggle buttons in the order per user's first day of week preference */
325b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private LinearLayout mWeekGroup;
326b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    private LinearLayout mWeekGroup2;
327b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Sun = 0
328b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private ToggleButton[] mWeekByDayButtons = new ToggleButton[7];
32986693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein    /** A double array of Strings to hold the 7x5 list of possible strings of the form:
33086693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein     *  "on every [Nth] [DAY_OF_WEEK]", e.g. "on every second Monday",
33186693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein     *  where [Nth] can be [first, second, third, fourth, last] */
33286693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein    private String[][] mMonthRepeatByDayOfWeekStrs;
333b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
334b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private LinearLayout mMonthGroup;
335b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private RadioGroup mMonthRepeatByRadioGroup;
336564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private RadioButton mRepeatMonthlyByNthDayOfWeek;
337564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private RadioButton mRepeatMonthlyByNthDayOfMonth;
338b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private String mMonthRepeatByDayOfWeekStr;
339b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
340b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private Button mDone;
341b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
342b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private OnRecurrenceSetListener mRecurrenceSetListener;
343b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
344b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public RecurrencePickerDialog() {
345b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
346b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
347b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    static public boolean canHandleRecurrenceRule(EventRecurrence er) {
348b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        switch (er.freq) {
349b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.DAILY:
350b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.MONTHLY:
351b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.YEARLY:
352b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.WEEKLY:
353b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
354b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            default:
355b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                return false;
356b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
357b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
358b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (er.count > 0 && !TextUtils.isEmpty(er.until)) {
359b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return false;
360b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
361b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
362b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Weekly: For "repeat by day of week", the day of week to repeat is in
363b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // er.byday[]
364b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
365b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        /*
366b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * Monthly: For "repeat by nth day of week" the day of week to repeat is
367b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * in er.byday[] and the "nth" is stored in er.bydayNum[]. Currently we
368b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         * can handle only one and only in monthly
369b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan         */
370b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int numOfByDayNum = 0;
371b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        for (int i = 0; i < er.bydayCount; i++) {
372b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (er.bydayNum[i] > 0) {
373b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                ++numOfByDayNum;
374b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
375b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
376b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
377b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (numOfByDayNum > 1) {
378b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return false;
379b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
380b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
381b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (numOfByDayNum > 0 && er.freq != EventRecurrence.MONTHLY) {
382b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return false;
383b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
384b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
385b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // The UI only handle repeat by one day of month i.e. not 9th and 10th
386b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // of every month
387b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (er.bymonthdayCount > 1) {
388b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            return false;
389b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
390b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
391b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (er.freq == EventRecurrence.MONTHLY) {
392b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (er.bydayCount > 1) {
393b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                return false;
394b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
395b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (er.bydayCount > 0 && er.bymonthdayCount > 0) {
396b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                return false;
397b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
398b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
399b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
400b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        return true;
401b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
402b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
403b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // TODO don't lose data when getting data that our UI can't handle
404564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    static private void copyEventRecurrenceToModel(final EventRecurrence er,
405564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            RecurrenceModel model) {
406b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Freq:
407b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        switch (er.freq) {
408b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.DAILY:
409564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                model.freq = RecurrenceModel.FREQ_DAILY;
410b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
411b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.MONTHLY:
412564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                model.freq = RecurrenceModel.FREQ_MONTHLY;
413b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
414b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.YEARLY:
415564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                model.freq = RecurrenceModel.FREQ_YEARLY;
416b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
417b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            case EventRecurrence.WEEKLY:
418564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                model.freq = RecurrenceModel.FREQ_WEEKLY;
419b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
420b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            default:
421b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                throw new IllegalStateException("freq=" + er.freq);
422b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
423b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
424b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Interval:
425b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (er.interval > 0) {
426b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            model.interval = er.interval;
427b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
428b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
429b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // End:
430b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // End by count:
431b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        model.endCount = er.count;
432b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (model.endCount > 0) {
433564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            model.end = RecurrenceModel.END_BY_COUNT;
434b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
435b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
436b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // End by date:
437b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (!TextUtils.isEmpty(er.until)) {
438b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (model.endDate == null) {
439b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                model.endDate = new Time();
440b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
441b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
442b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            try {
443b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                model.endDate.parse(er.until);
444b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } catch (TimeFormatException e) {
445b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                model.endDate = null;
446b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
447b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
448b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            // LIMITATION: The UI can only handle END_BY_DATE or END_BY_COUNT
449564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (model.end == RecurrenceModel.END_BY_COUNT && model.endDate != null) {
450b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                throw new IllegalStateException("freq=" + er.freq);
451b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
452b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
453564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            model.end = RecurrenceModel.END_BY_DATE;
454b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
455b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
456b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Weekly: repeat by day of week or Monthly: repeat by nth day of week
457b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // in the month
458b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        Arrays.fill(model.weeklyByDayOfWeek, false);
459b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (er.bydayCount > 0) {
460b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            int count = 0;
461b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            for (int i = 0; i < er.bydayCount; i++) {
462b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                int dayOfWeek = EventRecurrence.day2TimeDay(er.byday[i]);
463b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                model.weeklyByDayOfWeek[dayOfWeek] = true;
464b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
465564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (model.freq == RecurrenceModel.FREQ_MONTHLY && er.bydayNum[i] > 0) {
466b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    // LIMITATION: Can handle only (one) weekDayNum and only
467b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    // when
468b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    // monthly
469b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    model.monthlyByDayOfWeek = dayOfWeek;
470b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    model.monthlyByNthDayOfWeek = er.bydayNum[i];
471564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    model.monthlyRepeat = RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK;
472b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    count++;
473b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
474b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
475b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
476564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (model.freq == RecurrenceModel.FREQ_MONTHLY) {
477b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (er.bydayCount != 1) {
478b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    // Can't handle 1st Monday and 2nd Wed
479b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    throw new IllegalStateException("Can handle only 1 byDayOfWeek in monthly");
480b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
481b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (count != 1) {
482b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    throw new IllegalStateException(
483b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                            "Didn't specify which nth day of week to repeat for a monthly");
484b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
485b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
486b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
487b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
488b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Monthly by day of month
489564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (model.freq == RecurrenceModel.FREQ_MONTHLY) {
490b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (er.bymonthdayCount == 1) {
491564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (model.monthlyRepeat == RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK) {
492b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    throw new IllegalStateException(
493b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                            "Can handle only by monthday or by nth day of week, not both");
494b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
495b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                model.monthlyByMonthDay = er.bymonthday[0];
496564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                model.monthlyRepeat = RecurrenceModel.MONTHLY_BY_DATE;
497b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } else if (er.bymonthCount > 1) {
498b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                // LIMITATION: Can handle only one month day
499b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                throw new IllegalStateException("Can handle only one bymonthday");
500b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
501b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
502b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
503b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
504564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    static private void copyModelToEventRecurrence(final RecurrenceModel model,
505564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            EventRecurrence er) {
506564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (model.recurrenceState == RecurrenceModel.STATE_NO_RECURRENCE) {
507b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            throw new IllegalStateException("There's no recurrence");
508b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
509b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
510b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Freq
511b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        er.freq = mFreqModelToEventRecurrence[model.freq];
512b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
513b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Interval
514b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (model.interval <= 1) {
515b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            er.interval = 0;
516b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else {
517b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            er.interval = model.interval;
518b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
519b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
520b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // End
521b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        switch (model.end) {
522564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.END_BY_DATE:
523b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (model.endDate != null) {
524b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    model.endDate.switchTimezone(Time.TIMEZONE_UTC);
525b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    model.endDate.normalize(false);
526b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.until = model.endDate.format2445();
527b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.count = 0;
528b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                } else {
529b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    throw new IllegalStateException("end = END_BY_DATE but endDate is null");
530b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
531b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
532564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.END_BY_COUNT:
533b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                er.count = model.endCount;
534b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                er.until = null;
535b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (er.count <= 0) {
536b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    throw new IllegalStateException("count is " + er.count);
537b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
538b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
539b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            default:
540b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                er.count = 0;
541b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                er.until = null;
542b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
543b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
544b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
545b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Weekly && monthly repeat patterns
546b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        er.bydayCount = 0;
547b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        er.bymonthdayCount = 0;
548b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
549b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        switch (model.freq) {
550564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_MONTHLY:
551564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (model.monthlyRepeat == RecurrenceModel.MONTHLY_BY_DATE) {
552b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (model.monthlyByMonthDay > 0) {
553b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        if (er.bymonthday == null || er.bymonthdayCount < 1) {
554b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                            er.bymonthday = new int[1];
555b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        }
556b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.bymonthday[0] = model.monthlyByMonthDay;
557b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.bymonthdayCount = 1;
558b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
559564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                } else if (model.monthlyRepeat == RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK) {
560b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (model.monthlyByNthDayOfWeek <= 0) {
561b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        throw new IllegalStateException("month repeat by nth week but n is "
562b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                                + model.monthlyByNthDayOfWeek);
563b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
564b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    int count = 1;
565b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (er.bydayCount < count || er.byday == null || er.bydayNum == null) {
566b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.byday = new int[count];
567b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.bydayNum = new int[count];
568b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
569b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.bydayCount = count;
570b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.byday[0] = EventRecurrence.timeDay2Day(model.monthlyByDayOfWeek);
571b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.bydayNum[0] = model.monthlyByNthDayOfWeek;
572b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
573b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
574564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_WEEKLY:
575b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                int count = 0;
576b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                for (int i = 0; i < 7; i++) {
577b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (model.weeklyByDayOfWeek[i]) {
578b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        count++;
579b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
580b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
581b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
582b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (er.bydayCount < count || er.byday == null || er.bydayNum == null) {
583b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.byday = new int[count];
584b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    er.bydayNum = new int[count];
585b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
586b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                er.bydayCount = count;
587b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
588b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                for (int i = 6; i >= 0; i--) {
589b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (model.weeklyByDayOfWeek[i]) {
590b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.bydayNum[--count] = 0;
591b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        er.byday[count] = EventRecurrence.timeDay2Day(i);
592b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
593b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
594b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                break;
595b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
596b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
597b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (!canHandleRecurrenceRule(er)) {
598b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            throw new IllegalStateException("UI generated recurrence that it can't handle. ER:"
599b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    + er.toString() + " Model: " + model.toString());
600b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
601b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
602b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
603b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
604b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public View onCreateView(LayoutInflater inflater, ViewGroup container,
605b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Bundle savedInstanceState) {
606b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mRecurrence.wkst = EventRecurrence.timeDay2Day(Utils.getFirstDayOfWeek(getActivity()));
607b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
608fb2631a67560abd54d3ad66f154bc30728262b54James Kung        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
609fb2631a67560abd54d3ad66f154bc30728262b54James Kung
610b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        boolean endCountHasFocus = false;
611b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (savedInstanceState != null) {
612564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            RecurrenceModel m = (RecurrenceModel) savedInstanceState.get(BUNDLE_MODEL);
613b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (m != null) {
614b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mModel = m;
615b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
616b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            endCountHasFocus = savedInstanceState.getBoolean(BUNDLE_END_COUNT_HAS_FOCUS);
617b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else {
618b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            Bundle b = getArguments();
619b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (b != null) {
620b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mTime.set(b.getLong(BUNDLE_START_TIME_MILLIS));
621b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
622b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                String tz = b.getString(BUNDLE_TIME_ZONE);
623b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (!TextUtils.isEmpty(tz)) {
624b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    mTime.timezone = tz;
625b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
626b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mTime.normalize(false);
627b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
628b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                // Time days of week: Sun=0, Mon=1, etc
629b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mModel.weeklyByDayOfWeek[mTime.weekDay] = true;
630b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                String rrule = b.getString(BUNDLE_RRULE);
631b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                if (!TextUtils.isEmpty(rrule)) {
632564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.recurrenceState = RecurrenceModel.STATE_RECURRENCE;
633b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    mRecurrence.parse(rrule);
634b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    copyEventRecurrenceToModel(mRecurrence, mModel);
635564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    // Leave today's day of week as checked by default in weekly view.
636564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    if (mRecurrence.bydayCount == 0) {
637564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        mModel.weeklyByDayOfWeek[mTime.weekDay] = true;
638564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    }
639b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
640564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
641b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } else {
642b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mTime.setToNow();
643b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
644b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
645b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
646b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mResources = getResources();
647fb2631a67560abd54d3ad66f154bc30728262b54James Kung        mView = inflater.inflate(R.layout.recurrencepicker, container, true);
648fb2631a67560abd54d3ad66f154bc30728262b54James Kung
649fb2631a67560abd54d3ad66f154bc30728262b54James Kung        final Activity activity = getActivity();
650fb2631a67560abd54d3ad66f154bc30728262b54James Kung        final Configuration config = activity.getResources().getConfiguration();
651564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
652564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mRepeatSwitch = (Switch) mView.findViewById(R.id.repeat_switch);
653564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mRepeatSwitch.setChecked(mModel.recurrenceState == RecurrenceModel.STATE_RECURRENCE);
654564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mRepeatSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
655564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
656564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            @Override
657564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
658564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mModel.recurrenceState = isChecked ? RecurrenceModel.STATE_RECURRENCE
659564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        : RecurrenceModel.STATE_NO_RECURRENCE;
660564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                togglePickerOptions();
661564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
662564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        });
663b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
664b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mFreqSpinner = (Spinner) mView.findViewById(R.id.freqSpinner);
665b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mFreqSpinner.setOnItemSelectedListener(this);
666b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        ArrayAdapter<CharSequence> freqAdapter = ArrayAdapter.createFromResource(getActivity(),
667b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                R.array.recurrence_freq, R.layout.recurrencepicker_freq_item);
668b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        freqAdapter.setDropDownViewResource(R.layout.recurrencepicker_freq_item);
669b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mFreqSpinner.setAdapter(freqAdapter);
670b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
671b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mInterval = (EditText) mView.findViewById(R.id.interval);
672b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mInterval.addTextChangedListener(new minMaxTextWatcher(1, INTERVAL_DEFAULT, INTERVAL_MAX) {
673b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            @Override
674b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            void onChange(int v) {
675aafaa5f3d4d94d193186df868a76aed484a14255James Kung                if (mIntervalResId != -1 && mInterval.getText().toString().length() > 0) {
676564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.interval = v;
677aafaa5f3d4d94d193186df868a76aed484a14255James Kung                    updateIntervalText();
678aafaa5f3d4d94d193186df868a76aed484a14255James Kung                    mInterval.requestLayout();
679aafaa5f3d4d94d193186df868a76aed484a14255James Kung                }
680b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
681b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        });
682b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mIntervalPreText = (TextView) mView.findViewById(R.id.intervalPreText);
683b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mIntervalPostText = (TextView) mView.findViewById(R.id.intervalPostText);
684b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
685b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndNeverStr = mResources.getString(R.string.recurrence_end_continously);
686b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        mEndDateLabel = mResources.getString(R.string.recurrence_end_date_label);
687564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mEndCountLabel = mResources.getString(R.string.recurrence_end_count_label);
688564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
689b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndSpinnerArray.add(mEndNeverStr);
690b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        mEndSpinnerArray.add(mEndDateLabel);
691564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mEndSpinnerArray.add(mEndCountLabel);
692b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndSpinner = (Spinner) mView.findViewById(R.id.endSpinner);
693b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndSpinner.setOnItemSelectedListener(this);
694564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mEndSpinnerAdapter = new EndSpinnerAdapter(getActivity(), mEndSpinnerArray,
695564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                R.layout.recurrencepicker_freq_item, R.layout.recurrencepicker_end_text);
696b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndSpinnerAdapter.setDropDownViewResource(R.layout.recurrencepicker_freq_item);
697b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndSpinner.setAdapter(mEndSpinnerAdapter);
698b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
699b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndCount = (EditText) mView.findViewById(R.id.endCount);
700b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndCount.addTextChangedListener(new minMaxTextWatcher(1, COUNT_DEFAULT, COUNT_MAX) {
701b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            @Override
702b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            void onChange(int v) {
703564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (mModel.endCount != v) {
704564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.endCount = v;
705564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    updateEndCountText();
706564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mEndCount.requestLayout();
707564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
708b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
709b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        });
710564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mPostEndCount = (TextView) mView.findViewById(R.id.postEndCount);
711564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
712564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mEndDateTextView = (TextView) mView.findViewById(R.id.endDate);
713b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mEndDateTextView.setOnClickListener(this);
714b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (mModel.endDate == null) {
715b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mModel.endDate = new Time(mTime);
716b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            switch (mModel.freq) {
717564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.FREQ_DAILY:
718564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.FREQ_WEEKLY:
719b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    mModel.endDate.month += 1;
720b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
721564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.FREQ_MONTHLY:
722b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    mModel.endDate.month += 3;
723b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
724564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.FREQ_YEARLY:
725b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    mModel.endDate.year += 3;
726b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
727b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
728b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mModel.endDate.normalize(false);
729b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
730b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
731b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mWeekGroup = (LinearLayout) mView.findViewById(R.id.weekGroup);
732b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        mWeekGroup2 = (LinearLayout) mView.findViewById(R.id.weekGroup2);
733b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
734b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // In Calendar.java day of week order e.g Sun = 1 ... Sat = 7
735b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        String[] dayOfWeekString = new DateFormatSymbols().getWeekdays();
73686693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein
73786693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein        mMonthRepeatByDayOfWeekStrs = new String[7][];
73886693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein        // from Time.SUNDAY as 0 through Time.SATURDAY as 6
73986693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein        mMonthRepeatByDayOfWeekStrs[0] = mResources.getStringArray(R.array.repeat_by_nth_sun);
74086693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein        mMonthRepeatByDayOfWeekStrs[1] = mResources.getStringArray(R.array.repeat_by_nth_mon);
74186693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein        mMonthRepeatByDayOfWeekStrs[2] = mResources.getStringArray(R.array.repeat_by_nth_tues);
74286693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein        mMonthRepeatByDayOfWeekStrs[3] = mResources.getStringArray(R.array.repeat_by_nth_wed);
74386693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein        mMonthRepeatByDayOfWeekStrs[4] = mResources.getStringArray(R.array.repeat_by_nth_thurs);
74486693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein        mMonthRepeatByDayOfWeekStrs[5] = mResources.getStringArray(R.array.repeat_by_nth_fri);
74586693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein        mMonthRepeatByDayOfWeekStrs[6] = mResources.getStringArray(R.array.repeat_by_nth_sat);
746b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
747b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // In Time.java day of week order e.g. Sun = 0
748b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int idx = Utils.getFirstDayOfWeek(getActivity());
749b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
750b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // In Calendar.java day of week order e.g Sun = 1 ... Sat = 7
751b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        dayOfWeekString = new DateFormatSymbols().getShortWeekdays();
752b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
753b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        int numOfButtonsInRow1;
754b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        int numOfButtonsInRow2;
755b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
756b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        if (mResources.getConfiguration().screenWidthDp > MIN_SCREEN_WIDTH_FOR_SINGLE_ROW_WEEK) {
757b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            numOfButtonsInRow1 = 7;
758b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            numOfButtonsInRow2 = 0;
759b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekGroup2.setVisibility(View.GONE);
760b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekGroup2.getChildAt(3).setVisibility(View.GONE);
761b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        } else {
762b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            numOfButtonsInRow1 = 4;
763b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            numOfButtonsInRow2 = 3;
764b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
765b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekGroup2.setVisibility(View.VISIBLE);
766b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            // Set rightmost button on the second row invisible so it takes up
767b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            // space and everything centers properly
768b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekGroup2.getChildAt(3).setVisibility(View.INVISIBLE);
769b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        }
770b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
771b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        /* First row */
772b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        for (int i = 0; i < 7; i++) {
773b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            if (i >= numOfButtonsInRow1) {
774b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan                mWeekGroup.getChildAt(i).setVisibility(View.GONE);
775b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan                continue;
776b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            }
777b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
778b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mWeekByDayButtons[idx] = (ToggleButton) mWeekGroup.getChildAt(i);
779b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mWeekByDayButtons[idx].setTextOff(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
780b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mWeekByDayButtons[idx].setTextOn(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
781b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mWeekByDayButtons[idx].setOnCheckedChangeListener(this);
782b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
783b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (++idx >= 7) {
784b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                idx = 0;
785b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
786b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
787b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
788b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        /* 2nd Row */
789b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        for (int i = 0; i < 3; i++) {
790b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            if (i >= numOfButtonsInRow2) {
791b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan                mWeekGroup2.getChildAt(i).setVisibility(View.GONE);
792b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan                continue;
793b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            }
794b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekByDayButtons[idx] = (ToggleButton) mWeekGroup2.getChildAt(i);
795b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekByDayButtons[idx].setTextOff(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
796b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekByDayButtons[idx].setTextOn(dayOfWeekString[TIME_DAY_TO_CALENDAR_DAY[idx]]);
797b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mWeekByDayButtons[idx].setOnCheckedChangeListener(this);
798b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
799b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            if (++idx >= 7) {
800b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan                idx = 0;
801b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            }
802b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        }
803b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
804b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mMonthGroup = (LinearLayout) mView.findViewById(R.id.monthGroup);
805b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mMonthRepeatByRadioGroup = (RadioGroup) mView.findViewById(R.id.monthGroup);
806b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mMonthRepeatByRadioGroup.setOnCheckedChangeListener(this);
807564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mRepeatMonthlyByNthDayOfWeek = (RadioButton) mView
808b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                .findViewById(R.id.repeatMonthlyByNthDayOfTheWeek);
809564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mRepeatMonthlyByNthDayOfMonth = (RadioButton) mView
810564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                .findViewById(R.id.repeatMonthlyByNthDayOfMonth);
811b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
812b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mDone = (Button) mView.findViewById(R.id.done);
813b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mDone.setOnClickListener(this);
814b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
815564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        togglePickerOptions();
816b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        updateDialog();
817b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        if (endCountHasFocus) {
818b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            mEndCount.requestFocus();
819b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        }
820b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        return mView;
821b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
822b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
823564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private void togglePickerOptions() {
824564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mModel.recurrenceState == RecurrenceModel.STATE_NO_RECURRENCE) {
825564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mFreqSpinner.setEnabled(false);
826564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndSpinner.setEnabled(false);
827564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mIntervalPreText.setEnabled(false);
828564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mInterval.setEnabled(false);
829564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mIntervalPostText.setEnabled(false);
830564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mMonthRepeatByRadioGroup.setEnabled(false);
831564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndCount.setEnabled(false);
832564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mPostEndCount.setEnabled(false);
833564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndDateTextView.setEnabled(false);
834564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mRepeatMonthlyByNthDayOfWeek.setEnabled(false);
835564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mRepeatMonthlyByNthDayOfMonth.setEnabled(false);
836564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            for (Button button : mWeekByDayButtons) {
837564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                button.setEnabled(false);
838564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
839564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        } else {
840564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mView.findViewById(R.id.options).setEnabled(true);
841564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mFreqSpinner.setEnabled(true);
842564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndSpinner.setEnabled(true);
843564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mIntervalPreText.setEnabled(true);
844564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mInterval.setEnabled(true);
845564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mIntervalPostText.setEnabled(true);
846564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mMonthRepeatByRadioGroup.setEnabled(true);
847564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndCount.setEnabled(true);
848564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mPostEndCount.setEnabled(true);
849564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndDateTextView.setEnabled(true);
850564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mRepeatMonthlyByNthDayOfWeek.setEnabled(true);
851564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mRepeatMonthlyByNthDayOfMonth.setEnabled(true);
852564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            for (Button button : mWeekByDayButtons) {
853564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                button.setEnabled(true);
854564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
855564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
856564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        updateDoneButtonState();
857564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    }
858564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
859564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private void updateDoneButtonState() {
860564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mModel.recurrenceState == RecurrenceModel.STATE_NO_RECURRENCE) {
861564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mDone.setEnabled(true);
862564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return;
863564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
864564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
865564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mInterval.getText().toString().length() == 0) {
866564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mDone.setEnabled(false);
867564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return;
868564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
869564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
870564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mEndCount.getVisibility() == View.VISIBLE &&
871564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mEndCount.getText().toString().length() == 0) {
872564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mDone.setEnabled(false);
873564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return;
874564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
875564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
876564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mModel.freq == RecurrenceModel.FREQ_WEEKLY) {
877564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            for (CompoundButton b : mWeekByDayButtons) {
878564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (b.isChecked()) {
879564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mDone.setEnabled(true);
880564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    return;
881564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
882564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
883564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mDone.setEnabled(false);
884564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return;
885564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
886564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
887564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mDone.setEnabled(true);
888564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    }
889564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
890b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
891b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onSaveInstanceState(Bundle outState) {
892b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        super.onSaveInstanceState(outState);
893b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        outState.putParcelable(BUNDLE_MODEL, mModel);
894b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        if (mEndCount.hasFocus()) {
895b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan            outState.putBoolean(BUNDLE_END_COUNT_HAS_FOCUS, true);
896b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        }
897b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
898b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
899b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void updateDialog() {
900b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Interval
901b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // Checking before setting because this causes infinite recursion
902b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        // in afterTextWatcher
903b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        final String intervalStr = Integer.toString(mModel.interval);
904b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (!intervalStr.equals(mInterval.getText().toString())) {
905b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mInterval.setText(intervalStr);
906b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
907b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
908564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mFreqSpinner.setSelection(mModel.freq);
909564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mWeekGroup.setVisibility(mModel.freq == RecurrenceModel.FREQ_WEEKLY ? View.VISIBLE : View.GONE);
910564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mWeekGroup2.setVisibility(mModel.freq == RecurrenceModel.FREQ_WEEKLY ? View.VISIBLE : View.GONE);
911564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mMonthGroup.setVisibility(mModel.freq == RecurrenceModel.FREQ_MONTHLY ? View.VISIBLE : View.GONE);
912b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
913564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        switch (mModel.freq) {
914564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_DAILY:
915564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mIntervalResId = R.plurals.recurrence_interval_daily;
916564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                break;
917b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
918564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_WEEKLY:
919564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mIntervalResId = R.plurals.recurrence_interval_weekly;
920564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                for (int i = 0; i < 7; i++) {
921564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mWeekByDayButtons[i].setChecked(mModel.weeklyByDayOfWeek[i]);
922564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
923564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                break;
924b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
925564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_MONTHLY:
926564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mIntervalResId = R.plurals.recurrence_interval_monthly;
927b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
928564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (mModel.monthlyRepeat == RecurrenceModel.MONTHLY_BY_DATE) {
929564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mMonthRepeatByRadioGroup.check(R.id.repeatMonthlyByNthDayOfMonth);
930564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                } else if (mModel.monthlyRepeat == RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK) {
931564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mMonthRepeatByRadioGroup.check(R.id.repeatMonthlyByNthDayOfTheWeek);
932564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
933b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
934564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (mMonthRepeatByDayOfWeekStr == null) {
935564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    if (mModel.monthlyByNthDayOfWeek == 0) {
936a044b42e8da182e4cbc5ba07c5aaa246ca6dc773Sam Blitzstein                        mModel.monthlyByNthDayOfWeek = (mTime.monthDay + 6) / 7;
937a044b42e8da182e4cbc5ba07c5aaa246ca6dc773Sam Blitzstein                        mModel.monthlyByDayOfWeek = mTime.weekDay;
938b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
939b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
94086693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein                    String[] monthlyByNthDayOfWeekStrs =
94186693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein                            mMonthRepeatByDayOfWeekStrs[mModel.monthlyByDayOfWeek];
94286693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein                    mMonthRepeatByDayOfWeekStr =
94386693b2f19243b64f5bb7a363bd756453f2b7d6cSam Blitzstein                            monthlyByNthDayOfWeekStrs[mModel.monthlyByNthDayOfWeek - 1];
944564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mRepeatMonthlyByNthDayOfWeek.setText(mMonthRepeatByDayOfWeekStr);
945564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
946564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                break;
947564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
948564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            case RecurrenceModel.FREQ_YEARLY:
949564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mIntervalResId = R.plurals.recurrence_interval_yearly;
950564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                break;
951564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
952564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        updateIntervalText();
953564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        updateDoneButtonState();
954564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
955564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        mEndSpinner.setSelection(mModel.end);
956564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mModel.end == RecurrenceModel.END_BY_DATE) {
957564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            final String dateStr = DateUtils.formatDateTime(getActivity(),
958564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.endDate.toMillis(false), DateUtils.FORMAT_NUMERIC_DATE);
959564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndDateTextView.setText(dateStr);
960564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        } else {
961564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (mModel.end == RecurrenceModel.END_BY_COUNT) {
962564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // Checking before setting because this causes infinite
963564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // recursion
964564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // in afterTextWatcher
965564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                final String countStr = Integer.toString(mModel.endCount);
966564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (!countStr.equals(mEndCount.getText().toString())) {
967564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mEndCount.setText(countStr);
968b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                }
969b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
970b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
971b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
972b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
973b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    /**
974b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan     * @param endDateString
975b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan     */
976b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    private void setEndSpinnerEndDateStr(final String endDateString) {
977b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        mEndSpinnerArray.set(1, endDateString);
978b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan        mEndSpinnerAdapter.notifyDataSetChanged();
979b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan    }
980b39a2e929a98ab329ce0f4e40b7b0fc617dc6575Michael Chan
981b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    private void doToast() {
982b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        Log.e(TAG, "Model = " + mModel.toString());
983b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        String rrule;
984564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (mModel.recurrenceState == RecurrenceModel.STATE_NO_RECURRENCE) {
985b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            rrule = "Not repeating";
986b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else {
987b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            copyModelToEventRecurrence(mModel, mRecurrence);
988b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            rrule = mRecurrence.toString();
989b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
990b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
991b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (mToast != null) {
992b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mToast.cancel();
993b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
994b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mToast = Toast.makeText(getActivity(), rrule,
995b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                Toast.LENGTH_LONG);
996b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mToast.show();
997b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
998b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
999b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // TODO Test and update for Right-to-Left
1000aafaa5f3d4d94d193186df868a76aed484a14255James Kung    private void updateIntervalText() {
1001aafaa5f3d4d94d193186df868a76aed484a14255James Kung        if (mIntervalResId == -1) {
1002aafaa5f3d4d94d193186df868a76aed484a14255James Kung            return;
1003aafaa5f3d4d94d193186df868a76aed484a14255James Kung        }
1004aafaa5f3d4d94d193186df868a76aed484a14255James Kung
1005b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        final String INTERVAL_COUNT_MARKER = "%d";
1006aafaa5f3d4d94d193186df868a76aed484a14255James Kung        String intervalString = mResources.getQuantityString(mIntervalResId, mModel.interval);
1007b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int markerStart = intervalString.indexOf(INTERVAL_COUNT_MARKER);
1008b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1009b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (markerStart != -1) {
1010340d8c427437e98c6ea55dbf0d95bd08ef7e1c5fJames Kung          int postTextStart = markerStart + INTERVAL_COUNT_MARKER.length();
1011340d8c427437e98c6ea55dbf0d95bd08ef7e1c5fJames Kung          mIntervalPostText.setText(intervalString.substring(postTextStart,
1012340d8c427437e98c6ea55dbf0d95bd08ef7e1c5fJames Kung                  intervalString.length()).trim());
1013340d8c427437e98c6ea55dbf0d95bd08ef7e1c5fJames Kung          mIntervalPreText.setText(intervalString.substring(0, markerStart).trim());
1014b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1015b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1016b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1017564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    /**
1018564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung     * Update the "Repeat for N events" end option with the proper string values
1019564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung     * based on the value that has been entered for N.
1020564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung     */
1021564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private void updateEndCountText() {
1022564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        final String END_COUNT_MARKER = "%d";
1023564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        String endString = mResources.getQuantityString(R.plurals.recurrence_end_count,
1024564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mModel.endCount);
1025564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        int markerStart = endString.indexOf(END_COUNT_MARKER);
1026564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1027564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        if (markerStart != -1) {
1028564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (markerStart == 0) {
1029564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                Log.e(TAG, "No text to put in to recurrence's end spinner.");
1030564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            } else {
1031564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                int postTextStart = markerStart + END_COUNT_MARKER.length();
1032d1db03631de67104f7d3b3da73eaeec28a80aef2James Kung                mPostEndCount.setText(endString.substring(postTextStart,
1033d1db03631de67104f7d3b3da73eaeec28a80aef2James Kung                        endString.length()).trim());
1034564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1035564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
1036564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    }
1037564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1038b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Implements OnItemSelectedListener interface
1039b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Freq spinner
1040b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // End spinner
1041b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1042b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
1043b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (parent == mFreqSpinner) {
1044564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mModel.freq = position;
1045b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else if (parent == mEndSpinner) {
1046b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            switch (position) {
1047564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_NEVER:
1048564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.end = RecurrenceModel.END_NEVER;
1049b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
1050564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_BY_DATE:
1051564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.end = RecurrenceModel.END_BY_DATE;
1052b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
1053564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_BY_COUNT:
1054564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.end = RecurrenceModel.END_BY_COUNT;
1055b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1056b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    if (mModel.endCount <= 1) {
1057b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        mModel.endCount = 1;
1058b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    } else if (mModel.endCount > COUNT_MAX) {
1059b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                        mModel.endCount = COUNT_MAX;
1060b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    }
1061564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    updateEndCountText();
1062b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    break;
1063b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
1064564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndCount.setVisibility(mModel.end == RecurrenceModel.END_BY_COUNT ? View.VISIBLE
1065b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    : View.GONE);
1066564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndDateTextView.setVisibility(mModel.end == RecurrenceModel.END_BY_DATE ? View.VISIBLE
1067b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                    : View.GONE);
1068564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mPostEndCount.setVisibility(
1069564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mModel.end == RecurrenceModel.END_BY_COUNT  && !mHidePostEndCount?
1070564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            View.VISIBLE : View.GONE);
1071564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1072b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1073b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        updateDialog();
1074b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1075b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1076b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Implements OnItemSelectedListener interface
1077b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1078b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onNothingSelected(AdapterView<?> arg0) {
1079b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1080b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1081b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
108256f42bfb36d710726051e8268a115697477add61James Kung    public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
1083b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (mModel.endDate == null) {
1084b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mModel.endDate = new Time(mTime.timezone);
1085b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mModel.endDate.hour = mModel.endDate.minute = mModel.endDate.second = 0;
1086b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1087b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mModel.endDate.year = year;
1088b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mModel.endDate.month = monthOfYear;
1089b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mModel.endDate.monthDay = dayOfMonth;
1090b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mModel.endDate.normalize(false);
1091b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        updateDialog();
1092b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1093b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1094b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Implements OnCheckedChangeListener interface
1095b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Week repeat by day of week
1096b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1097b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1098b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        int itemIdx = -1;
1099b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        for (int i = 0; i < 7; i++) {
1100b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            if (itemIdx == -1 && buttonView == mWeekByDayButtons[i]) {
1101b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                itemIdx = i;
1102b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                mModel.weeklyByDayOfWeek[i] = isChecked;
1103b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
1104b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1105b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        updateDialog();
1106b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1107b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1108b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Implements android.widget.RadioGroup.OnCheckedChangeListener interface
1109b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Month repeat by radio buttons
1110b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1111b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onCheckedChanged(RadioGroup group, int checkedId) {
1112b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (checkedId == R.id.repeatMonthlyByNthDayOfMonth) {
1113564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mModel.monthlyRepeat = RecurrenceModel.MONTHLY_BY_DATE;
1114b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else if (checkedId == R.id.repeatMonthlyByNthDayOfTheWeek) {
1115564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mModel.monthlyRepeat = RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK;
1116b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1117b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        updateDialog();
1118b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1119b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1120b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Implements OnClickListener interface
1121b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // EndDate button
1122b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    // Done button
1123b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1124b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onClick(View v) {
1125b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        if (mEndDateTextView == v) {
112656f42bfb36d710726051e8268a115697477add61James Kung            if (mDatePickerDialog != null) {
112756f42bfb36d710726051e8268a115697477add61James Kung                mDatePickerDialog.dismiss();
1128b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
112956f42bfb36d710726051e8268a115697477add61James Kung            mDatePickerDialog = DatePickerDialog.newInstance(this, mModel.endDate.year,
113056f42bfb36d710726051e8268a115697477add61James Kung                    mModel.endDate.month, mModel.endDate.monthDay);
113156f42bfb36d710726051e8268a115697477add61James Kung            mDatePickerDialog.setFirstDayOfWeek(Utils.getFirstDayOfWeekAsCalendar(getActivity()));
113256f42bfb36d710726051e8268a115697477add61James Kung            mDatePickerDialog.setYearRange(Utils.YEAR_MIN, Utils.YEAR_MAX);
113356f42bfb36d710726051e8268a115697477add61James Kung            mDatePickerDialog.show(getFragmentManager(), FRAG_TAG_DATE_PICKER);
1134b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        } else if (mDone == v) {
1135b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            String rrule;
1136564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (mModel.recurrenceState == RecurrenceModel.STATE_NO_RECURRENCE) {
1137b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                rrule = null;
1138b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            } else {
1139b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                copyModelToEventRecurrence(mModel, mRecurrence);
1140b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                rrule = mRecurrence.toString();
1141b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            }
1142b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            mRecurrenceSetListener.onRecurrenceSet(rrule);
1143b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan            dismiss();
1144b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1145b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1146b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1147b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    @Override
1148b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void onActivityCreated(Bundle savedInstanceState) {
1149b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        super.onActivityCreated(savedInstanceState);
115056f42bfb36d710726051e8268a115697477add61James Kung        mDatePickerDialog = (DatePickerDialog) getFragmentManager()
1151b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan                .findFragmentByTag(FRAG_TAG_DATE_PICKER);
115256f42bfb36d710726051e8268a115697477add61James Kung        if (mDatePickerDialog != null) {
115356f42bfb36d710726051e8268a115697477add61James Kung            mDatePickerDialog.setOnDateSetListener(this);
1154b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        }
1155b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1156b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1157b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public interface OnRecurrenceSetListener {
1158b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        void onRecurrenceSet(String rrule);
1159b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1160b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan
1161b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    public void setOnRecurrenceSetListener(OnRecurrenceSetListener l) {
1162b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan        mRecurrenceSetListener = l;
1163b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan    }
1164564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1165564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    private class EndSpinnerAdapter extends ArrayAdapter<CharSequence> {
1166564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        final String END_DATE_MARKER = "%s";
1167564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        final String END_COUNT_MARKER = "%d";
1168564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1169564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private LayoutInflater mInflater;
1170564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private int mItemResourceId;
1171564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private int mTextResourceId;
1172564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private ArrayList<CharSequence> mStrings;
1173564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private String mEndDateString;
1174564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        private boolean mUseFormStrings;
1175564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1176564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        /**
1177564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung         * @param context
1178564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung         * @param textViewResourceId
1179564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung         * @param objects
1180564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung         */
1181564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        public EndSpinnerAdapter(Context context, ArrayList<CharSequence> strings,
1182564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                int itemResourceId, int textResourceId) {
1183564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            super(context, itemResourceId, strings);
1184564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
1185564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mItemResourceId = itemResourceId;
1186564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mTextResourceId = textResourceId;
1187564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mStrings = strings;
1188564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            mEndDateString = getResources().getString(R.string.recurrence_end_date);
1189564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1190564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            // If either date or count strings don't translate well, such that we aren't assured
1191564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            // to have some text available to be placed in the spinner, then we'll have to use
1192564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            // the more form-like versions of both strings instead.
1193564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            int markerStart = mEndDateString.indexOf(END_DATE_MARKER);
1194564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (markerStart <= 0) {
1195564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // The date string does not have any text before the "%s" so we'll have to use the
1196564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // more form-like strings instead.
1197564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mUseFormStrings = true;
1198564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            } else {
1199564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                String countEndStr = getResources().getQuantityString(
1200564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        R.plurals.recurrence_end_count, 1);
1201564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                markerStart = countEndStr.indexOf(END_COUNT_MARKER);
1202564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                if (markerStart <= 0) {
1203564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    // The count string does not have any text before the "%d" so we'll have to use
1204564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    // the more form-like strings instead.
1205564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    mUseFormStrings = true;
1206564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                }
1207564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1208564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1209564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (mUseFormStrings) {
1210564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // We'll have to set the layout for the spinner to be weight=0 so it doesn't
1211564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                // take up too much space.
1212564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                mEndSpinner.setLayoutParams(
1213564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        new TableLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f));
1214564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1215564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
1216564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1217564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        @Override
1218564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        public View getView(int position, View convertView, ViewGroup parent) {
1219564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            View v;
1220564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            // Check if we can recycle the view
1221564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (convertView == null) {
1222564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                v = mInflater.inflate(mTextResourceId, parent, false);
1223564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            } else {
1224564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                v = convertView;
1225564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1226564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1227564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            TextView item = (TextView) v.findViewById(R.id.spinner_item);
1228564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            int markerStart;
1229564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            switch (position) {
1230564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_NEVER:
1231564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    item.setText(mStrings.get(RecurrenceModel.END_NEVER));
1232564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    break;
1233564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_BY_DATE:
1234564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    markerStart = mEndDateString.indexOf(END_DATE_MARKER);
1235564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1236564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    if (markerStart != -1) {
1237564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        if (mUseFormStrings || markerStart == 0) {
1238564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // If we get here, the translation of "Until" doesn't work correctly,
1239564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // so we'll just set the whole "Until a date" string.
1240564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            item.setText(mEndDateLabel);
1241564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        } else {
1242d1db03631de67104f7d3b3da73eaeec28a80aef2James Kung                            item.setText(mEndDateString.substring(0, markerStart).trim());
1243564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        }
1244564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    }
1245564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    break;
1246564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                case RecurrenceModel.END_BY_COUNT:
1247564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    String endString = mResources.getQuantityString(R.plurals.recurrence_end_count,
1248564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            mModel.endCount);
1249564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    markerStart = endString.indexOf(END_COUNT_MARKER);
1250564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1251564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    if (markerStart != -1) {
1252564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        if (mUseFormStrings || markerStart == 0) {
1253564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // If we get here, the translation of "For" doesn't work correctly,
1254564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // so we'll just set the whole "For a number of events" string.
1255564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            item.setText(mEndCountLabel);
1256564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // Also, we'll hide the " events" that would have been at the end.
1257564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            mPostEndCount.setVisibility(View.GONE);
1258564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // Use this flag so the onItemSelected knows whether to show it later.
1259564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            mHidePostEndCount = true;
1260564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        } else {
1261564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            int postTextStart = markerStart + END_COUNT_MARKER.length();
1262d1db03631de67104f7d3b3da73eaeec28a80aef2James Kung                            mPostEndCount.setText(endString.substring(postTextStart,
1263d1db03631de67104f7d3b3da73eaeec28a80aef2James Kung                                    endString.length()).trim());
1264564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            // In case it's a recycled view that wasn't visible.
1265018f539c218940e0fad05c10552759e4fa2e77e4Sam Blitzstein                            if (mModel.end == RecurrenceModel.END_BY_COUNT) {
1266018f539c218940e0fad05c10552759e4fa2e77e4Sam Blitzstein                                mPostEndCount.setVisibility(View.VISIBLE);
1267018f539c218940e0fad05c10552759e4fa2e77e4Sam Blitzstein                            }
1268564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            if (endString.charAt(markerStart - 1) == ' ') {
1269564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                                markerStart--;
1270564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                            }
1271d1db03631de67104f7d3b3da73eaeec28a80aef2James Kung                            item.setText(endString.substring(0, markerStart).trim());
1272564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                        }
1273564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    }
1274564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    break;
1275564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                default:
1276564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    v = null;
1277564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                    break;
1278564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1279564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1280564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return v;
1281564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
1282564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1283564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        @Override
1284564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        public View getDropDownView(int position, View convertView, ViewGroup parent) {
1285564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            View v;
1286564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            // Check if we can recycle the view
1287564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            if (convertView == null) {
1288564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                v = mInflater.inflate(mItemResourceId, parent, false);
1289564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            } else {
1290564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung                v = convertView;
1291564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            }
1292564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1293564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            TextView item = (TextView) v.findViewById(R.id.spinner_item);
1294564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            item.setText(mStrings.get(position));
1295564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung
1296564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung            return v;
1297564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung        }
1298564f618e3fa48a8e4836fec0f216449b0ae809f9James Kung    }
1299b21c638ca11d9be3a3d9e7d28223bb4a3dab5f15Michael Chan}
1300