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