blob: b9e33fdd6d108116fb023a84ebe6f51b4c408494 [file] [log] [blame]
/*
* 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
{
private static int[] mMonthRepeatByDayOfWeekIds;
private static String[][] mMonthRepeatByDayOfWeekStrs;
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) {
int weekday = recurrence.startDate.weekDay;
// Cache this stuff so we won't have to redo work again later.
cacheMonthRepeatStrings(r, weekday);
int dayNumber = (recurrence.startDate.monthDay - 1) / 7;
StringBuilder sb = new StringBuilder();
sb.append(r.getString(R.string.monthly));
sb.append(" (");
sb.append(mMonthRepeatByDayOfWeekStrs[weekday][dayNumber]);
sb.append(")");
sb.append(endString);
return sb.toString();
}
return r.getString(R.string.monthly) + endString;
}
case EventRecurrence.YEARLY:
return r.getString(R.string.yearly_plain) + endString;
}
return null;
}
private static void cacheMonthRepeatStrings(Resources r, int weekday) {
if (mMonthRepeatByDayOfWeekIds == null) {
mMonthRepeatByDayOfWeekIds = new int[7];
mMonthRepeatByDayOfWeekIds[0] = R.array.repeat_by_nth_sun;
mMonthRepeatByDayOfWeekIds[1] = R.array.repeat_by_nth_mon;
mMonthRepeatByDayOfWeekIds[2] = R.array.repeat_by_nth_tues;
mMonthRepeatByDayOfWeekIds[3] = R.array.repeat_by_nth_wed;
mMonthRepeatByDayOfWeekIds[4] = R.array.repeat_by_nth_thurs;
mMonthRepeatByDayOfWeekIds[5] = R.array.repeat_by_nth_fri;
mMonthRepeatByDayOfWeekIds[6] = R.array.repeat_by_nth_sat;
}
if (mMonthRepeatByDayOfWeekStrs == null) {
mMonthRepeatByDayOfWeekStrs = new String[7][];
}
if (mMonthRepeatByDayOfWeekStrs[weekday] == null) {
mMonthRepeatByDayOfWeekStrs[weekday] =
r.getStringArray(mMonthRepeatByDayOfWeekIds[weekday]);
}
}
/**
* 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);
}
}
}