| /* |
| * Copyright (C) 2006 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.calendar; |
| |
| import android.content.Context; |
| import android.content.res.Resources; |
| import android.text.format.DateUtils; |
| import android.text.format.Time; |
| import android.util.TimeFormatException; |
| |
| import com.android.calendarcommon2.EventRecurrence; |
| |
| import java.util.Calendar; |
| |
| public class EventRecurrenceFormatter |
| { |
| public static String getRepeatString(Context context, Resources r, EventRecurrence recurrence, |
| boolean includeEndString) { |
| String endString = ""; |
| if (includeEndString) { |
| StringBuilder sb = new StringBuilder(); |
| if (recurrence.until != null) { |
| try { |
| Time t = new Time(); |
| t.parse(recurrence.until); |
| final String dateStr = DateUtils.formatDateTime(context, |
| t.toMillis(false), DateUtils.FORMAT_NUMERIC_DATE); |
| sb.append(r.getString(R.string.endByDate, dateStr)); |
| } catch (TimeFormatException e) { |
| } |
| } |
| |
| if (recurrence.count > 0) { |
| sb.append(r.getQuantityString(R.plurals.endByCount, recurrence.count, |
| recurrence.count)); |
| } |
| endString = sb.toString(); |
| } |
| |
| // TODO Implement "Until" portion of string, as well as custom settings |
| int interval = recurrence.interval <= 1 ? 1 : recurrence.interval; |
| switch (recurrence.freq) { |
| case EventRecurrence.DAILY: |
| return r.getQuantityString(R.plurals.daily, interval, interval) + endString; |
| case EventRecurrence.WEEKLY: { |
| if (recurrence.repeatsOnEveryWeekDay()) { |
| return r.getString(R.string.every_weekday) + endString; |
| } else { |
| String string; |
| |
| int dayOfWeekLength = DateUtils.LENGTH_MEDIUM; |
| if (recurrence.bydayCount == 1) { |
| dayOfWeekLength = DateUtils.LENGTH_LONG; |
| } |
| |
| StringBuilder days = new StringBuilder(); |
| |
| // Do one less iteration in the loop so the last element is added out of the |
| // loop. This is done so the comma is not placed after the last item. |
| |
| if (recurrence.bydayCount > 0) { |
| int count = recurrence.bydayCount - 1; |
| for (int i = 0 ; i < count ; i++) { |
| days.append(dayToString(recurrence.byday[i], dayOfWeekLength)); |
| days.append(", "); |
| } |
| days.append(dayToString(recurrence.byday[count], dayOfWeekLength)); |
| |
| string = days.toString(); |
| } else { |
| // There is no "BYDAY" specifier, so use the day of the |
| // first event. For this to work, the setStartDate() |
| // method must have been used by the caller to set the |
| // date of the first event in the recurrence. |
| if (recurrence.startDate == null) { |
| return null; |
| } |
| |
| int day = EventRecurrence.timeDay2Day(recurrence.startDate.weekDay); |
| string = dayToString(day, DateUtils.LENGTH_LONG); |
| } |
| return r.getQuantityString(R.plurals.weekly, interval, interval, string) |
| + endString; |
| } |
| } |
| case EventRecurrence.MONTHLY: { |
| if (recurrence.bydayCount == 1) { |
| String[] ordinals = r.getStringArray(R.array.ordinal_labels); |
| int dayNumber = (recurrence.startDate.monthDay - 1) / 7; |
| int day = EventRecurrence.timeDay2Day(recurrence.startDate.weekDay); |
| return r.getString(R.string.monthly_on_day_count, ordinals[dayNumber], |
| dayToString(day, DateUtils.LENGTH_LONG)) + endString; |
| } |
| return r.getString(R.string.monthly) + endString; |
| } |
| case EventRecurrence.YEARLY: |
| return r.getString(R.string.yearly_plain) + endString; |
| } |
| |
| return null; |
| } |
| |
| /** |
| * Converts day of week to a String. |
| * @param day a EventRecurrence constant |
| * @return day of week as a string |
| */ |
| private static String dayToString(int day, int dayOfWeekLength) { |
| return DateUtils.getDayOfWeekString(dayToUtilDay(day), dayOfWeekLength); |
| } |
| |
| /** |
| * Converts EventRecurrence's day of week to DateUtil's day of week. |
| * @param day of week as an EventRecurrence value |
| * @return day of week as a DateUtil value. |
| */ |
| private static int dayToUtilDay(int day) { |
| switch (day) { |
| case EventRecurrence.SU: return Calendar.SUNDAY; |
| case EventRecurrence.MO: return Calendar.MONDAY; |
| case EventRecurrence.TU: return Calendar.TUESDAY; |
| case EventRecurrence.WE: return Calendar.WEDNESDAY; |
| case EventRecurrence.TH: return Calendar.THURSDAY; |
| case EventRecurrence.FR: return Calendar.FRIDAY; |
| case EventRecurrence.SA: return Calendar.SATURDAY; |
| default: throw new IllegalArgumentException("bad day argument: " + day); |
| } |
| } |
| } |