OSDN Git Service

Unbundling: pull the recurrence string formatting out of EventRecurrence
authorKen Shirriff <kens@google.com>
Sat, 27 Feb 2010 00:06:04 +0000 (16:06 -0800)
committerKen Shirriff <kens@google.com>
Sat, 27 Feb 2010 00:30:42 +0000 (16:30 -0800)
and move to the calendar app.

The motivation is to make EventRecurrence not depend on string resources,
and to move UI stuff into the app.  This will make it easer to move
EventRecurrence into a library.

res/values/strings.xml
src/com/android/calendar/EventInfoActivity.java
src/com/android/calendar/EventRecurrenceFormatter.java [new file with mode: 0644]

index d5333ca..6589dde 100644 (file)
     <!--   1st parameter is an ordinal number, like 'first' -->
     <!--   2nd parameter is a day of the week, like 'Sunday' -->
     <string name="monthly_on_day_count">"Monthly (every <xliff:g id="ordinal_number">%1$s</xliff:g> <xliff:g id="day_of_week">%2$s</xliff:g>)"</string>
-
+    <string name="monthly">Monthly</string>
+    <!-- Calendar spinner item, to select that an event recurs every year. -->
+    <string name="yearly_plain">Yearly</string>
     <!-- Example: "Monthly (on day 15)" -->
     <string name="monthly_on_day">"Monthly (on day <xliff:g id="day_of_month">%s</xliff:g>)"</string>
     <!-- Example: "Yearly (on April 15)" -->
index 29f1732..c1882b6 100644 (file)
@@ -840,7 +840,8 @@ public class EventInfoActivity extends Activity implements View.OnClickListener,
             }
             date.set(mStartMillis);
             eventRecurrence.setStartDate(date);
-            String repeatString = eventRecurrence.getRepeatString();
+            String repeatString = EventRecurrenceFormatter.getRepeatString(getResources(),
+                    eventRecurrence);
             setTextCommon(R.id.repeat, repeatString);
         } else {
             setVisibilityCommon(R.id.repeat_container, View.GONE);
diff --git a/src/com/android/calendar/EventRecurrenceFormatter.java b/src/com/android/calendar/EventRecurrenceFormatter.java
new file mode 100644 (file)
index 0000000..ce62132
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * 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.res.Resources;
+import android.text.TextUtils;
+import android.text.format.DateUtils;
+import android.pim.EventRecurrence;
+
+import java.util.Calendar;
+
+public class EventRecurrenceFormatter
+{
+    public static String getRepeatString(Resources r, EventRecurrence recurrence) {
+        // TODO Implement "Until" portion of string, as well as custom settings
+        switch (recurrence.freq) {
+            case EventRecurrence.DAILY:
+                return r.getString(R.string.daily);
+            case EventRecurrence.WEEKLY: {
+                if (recurrence.repeatsOnEveryWeekDay()) {
+                    return r.getString(R.string.every_weekday);
+                } else {
+                    String format = r.getString(R.string.weekly);
+                    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.
+                    int count = recurrence.bydayCount - 1;
+                    if (count >= 0) {
+                        for (int i = 0 ; i < count ; i++) {
+                            days.append(dayToString(recurrence.byday[i]));
+                            days.append(",");
+                        }
+                        days.append(dayToString(recurrence.byday[count]));
+
+                        return String.format(format, days.toString());
+                    }
+
+                    // 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 = recurrence.timeDay2Day(recurrence.startDate.weekDay);
+                    return String.format(format, dayToString(day));
+                }
+            }
+            case EventRecurrence.MONTHLY: {
+                return r.getString(R.string.monthly);
+            }
+            case EventRecurrence.YEARLY:
+                return r.getString(R.string.yearly_plain);
+        }
+
+        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) {
+        return DateUtils.getDayOfWeekString(dayToUtilDay(day), DateUtils.LENGTH_LONG);
+    }
+
+    // Day of week used by DateUtils
+    private static final int UTILS_SU = 0;
+    private static final int UTILS_MO = 1;
+    private static final int UTILS_TU = 2;
+    private static final int UTILS_WE = 3;
+    private static final int UTILS_TH = 4;
+    private static final int UTILS_FR = 5;
+    private static final int UTILS_SA = 6;
+
+    /**
+     * 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 UTILS_SU;
+        case EventRecurrence.MO: return UTILS_MO;
+        case EventRecurrence.TU: return UTILS_TU;
+        case EventRecurrence.WE: return UTILS_WE;
+        case EventRecurrence.TH: return UTILS_TH;
+        case EventRecurrence.FR: return UTILS_FR;
+        case EventRecurrence.SA: return UTILS_SA;
+        default: throw new IllegalArgumentException("bad day argument: " + day);
+        }
+    }
+}