15442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff/*
25442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff * Copyright (C) 2006 The Android Open Source Project
35442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff *
45442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff * Licensed under the Apache License, Version 2.0 (the "License");
55442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff * you may not use this file except in compliance with the License.
65442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff * You may obtain a copy of the License at
75442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff *
85442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff *      http://www.apache.org/licenses/LICENSE-2.0
95442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff *
105442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff * Unless required by applicable law or agreed to in writing, software
115442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff * distributed under the License is distributed on an "AS IS" BASIS,
125442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff * See the License for the specific language governing permissions and
145442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff * limitations under the License.
155442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff */
165442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff
175442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriffpackage com.android.calendar;
185442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff
198a528adbba5d46fe0d566f474bc3be190511198eMichael Chanimport com.android.calendarcommon2.EventRecurrence;
208ed988fbac3e988f0408490a1d61101c4176686dAndy McFadden
215442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriffimport android.content.res.Resources;
225442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriffimport android.text.format.DateUtils;
235442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff
245442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriffimport java.util.Calendar;
255442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff
265442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriffpublic class EventRecurrenceFormatter
275442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff{
285442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff    public static String getRepeatString(Resources r, EventRecurrence recurrence) {
295442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff        // TODO Implement "Until" portion of string, as well as custom settings
305442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff        switch (recurrence.freq) {
315442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff            case EventRecurrence.DAILY:
325442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                return r.getString(R.string.daily);
335442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff            case EventRecurrence.WEEKLY: {
345442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                if (recurrence.repeatsOnEveryWeekDay()) {
355442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    return r.getString(R.string.every_weekday);
365442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                } else {
375442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    String format = r.getString(R.string.weekly);
385442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    StringBuilder days = new StringBuilder();
395442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff
405442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    // Do one less iteration in the loop so the last element is added out of the
415442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    // loop. This is done so the comma is not placed after the last item.
425442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    int count = recurrence.bydayCount - 1;
435442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    if (count >= 0) {
445442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                        for (int i = 0 ; i < count ; i++) {
455442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                            days.append(dayToString(recurrence.byday[i]));
465442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                            days.append(",");
475442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                        }
485442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                        days.append(dayToString(recurrence.byday[count]));
495442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff
505442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                        return String.format(format, days.toString());
515442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    }
525442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff
535442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    // There is no "BYDAY" specifier, so use the day of the
545442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    // first event.  For this to work, the setStartDate()
555442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    // method must have been used by the caller to set the
565442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    // date of the first event in the recurrence.
575442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    if (recurrence.startDate == null) {
585442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                        return null;
595442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    }
605442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff
61fed57ecf8784c761b61d40e87c88a2628142d1ddErik                    int day = EventRecurrence.timeDay2Day(recurrence.startDate.weekDay);
625442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                    return String.format(format, dayToString(day));
635442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                }
645442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff            }
655442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff            case EventRecurrence.MONTHLY: {
665442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                return r.getString(R.string.monthly);
675442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff            }
685442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff            case EventRecurrence.YEARLY:
695442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff                return r.getString(R.string.yearly_plain);
705442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff        }
715442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff
725442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff        return null;
735442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff    }
745442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff
755442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff    /**
765442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff     * Converts day of week to a String.
775442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff     * @param day a EventRecurrence constant
785442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff     * @return day of week as a string
795442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff     */
805442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff    private static String dayToString(int day) {
815442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff        return DateUtils.getDayOfWeekString(dayToUtilDay(day), DateUtils.LENGTH_LONG);
825442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff    }
835442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff
845442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff    /**
855442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff     * Converts EventRecurrence's day of week to DateUtil's day of week.
865442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff     * @param day of week as an EventRecurrence value
875442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff     * @return day of week as a DateUtil value.
885442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff     */
895442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff    private static int dayToUtilDay(int day) {
905442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff        switch (day) {
91fed57ecf8784c761b61d40e87c88a2628142d1ddErik        case EventRecurrence.SU: return Calendar.SUNDAY;
92fed57ecf8784c761b61d40e87c88a2628142d1ddErik        case EventRecurrence.MO: return Calendar.MONDAY;
93fed57ecf8784c761b61d40e87c88a2628142d1ddErik        case EventRecurrence.TU: return Calendar.TUESDAY;
94fed57ecf8784c761b61d40e87c88a2628142d1ddErik        case EventRecurrence.WE: return Calendar.WEDNESDAY;
95fed57ecf8784c761b61d40e87c88a2628142d1ddErik        case EventRecurrence.TH: return Calendar.THURSDAY;
96fed57ecf8784c761b61d40e87c88a2628142d1ddErik        case EventRecurrence.FR: return Calendar.FRIDAY;
97fed57ecf8784c761b61d40e87c88a2628142d1ddErik        case EventRecurrence.SA: return Calendar.SATURDAY;
985442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff        default: throw new IllegalArgumentException("bad day argument: " + day);
995442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff        }
1005442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff    }
1015442a16f740a9c98d1d53627cf7ed00098b1bd24Ken Shirriff}
102