1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.calendar;
18
19import com.android.calendarcommon2.EventRecurrence;
20
21import android.content.res.Resources;
22import android.text.format.DateUtils;
23
24import java.util.Calendar;
25
26public class EventRecurrenceFormatter
27{
28    public static String getRepeatString(Resources r, EventRecurrence recurrence) {
29        // TODO Implement "Until" portion of string, as well as custom settings
30        switch (recurrence.freq) {
31            case EventRecurrence.DAILY:
32                return r.getString(R.string.daily);
33            case EventRecurrence.WEEKLY: {
34                if (recurrence.repeatsOnEveryWeekDay()) {
35                    return r.getString(R.string.every_weekday);
36                } else {
37                    String format = r.getString(R.string.weekly);
38                    StringBuilder days = new StringBuilder();
39
40                    // Do one less iteration in the loop so the last element is added out of the
41                    // loop. This is done so the comma is not placed after the last item.
42                    int count = recurrence.bydayCount - 1;
43                    if (count >= 0) {
44                        for (int i = 0 ; i < count ; i++) {
45                            days.append(dayToString(recurrence.byday[i]));
46                            days.append(",");
47                        }
48                        days.append(dayToString(recurrence.byday[count]));
49
50                        return String.format(format, days.toString());
51                    }
52
53                    // There is no "BYDAY" specifier, so use the day of the
54                    // first event.  For this to work, the setStartDate()
55                    // method must have been used by the caller to set the
56                    // date of the first event in the recurrence.
57                    if (recurrence.startDate == null) {
58                        return null;
59                    }
60
61                    int day = EventRecurrence.timeDay2Day(recurrence.startDate.weekDay);
62                    return String.format(format, dayToString(day));
63                }
64            }
65            case EventRecurrence.MONTHLY: {
66                return r.getString(R.string.monthly);
67            }
68            case EventRecurrence.YEARLY:
69                return r.getString(R.string.yearly_plain);
70        }
71
72        return null;
73    }
74
75    /**
76     * Converts day of week to a String.
77     * @param day a EventRecurrence constant
78     * @return day of week as a string
79     */
80    private static String dayToString(int day) {
81        return DateUtils.getDayOfWeekString(dayToUtilDay(day), DateUtils.LENGTH_LONG);
82    }
83
84    /**
85     * Converts EventRecurrence's day of week to DateUtil's day of week.
86     * @param day of week as an EventRecurrence value
87     * @return day of week as a DateUtil value.
88     */
89    private static int dayToUtilDay(int day) {
90        switch (day) {
91        case EventRecurrence.SU: return Calendar.SUNDAY;
92        case EventRecurrence.MO: return Calendar.MONDAY;
93        case EventRecurrence.TU: return Calendar.TUESDAY;
94        case EventRecurrence.WE: return Calendar.WEDNESDAY;
95        case EventRecurrence.TH: return Calendar.THURSDAY;
96        case EventRecurrence.FR: return Calendar.FRIDAY;
97        case EventRecurrence.SA: return Calendar.SATURDAY;
98        default: throw new IllegalArgumentException("bad day argument: " + day);
99        }
100    }
101}
102