Skip to content

Commit 9222fc7

Browse files
committed
#7 Add another predefined Date format: "Default with Yesterday, Today and Tomorrow". No additional numbers for farther days are being added in this format.
Add "BBB" and "BBBB" custom patterns. "BBB" stands for adding "Yesterday, Today and Tomorrow" only. "BBBB", in addition to it, adds "N days ago" and "in N days" for farther days.
1 parent ae51488 commit 9222fc7

File tree

4 files changed

+57
-20
lines changed

4 files changed

+57
-20
lines changed

app/src/androidTest/java/org/andstatus/todoagenda/prefs/DateFormatterTest.java

+9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.andstatus.todoagenda.prefs;
22

33
import org.andstatus.todoagenda.BaseWidgetTest;
4+
import org.andstatus.todoagenda.R;
45
import org.andstatus.todoagenda.prefs.dateformat.DateFormatType;
56
import org.andstatus.todoagenda.prefs.dateformat.DateFormatValue;
67
import org.andstatus.todoagenda.prefs.dateformat.DateFormatter;
@@ -64,6 +65,14 @@ public void customPatterns() {
6465
assertPattern(now.plusDays(1), "", "");
6566
assertPattern(now.plusDays(1), "b", "1");
6667
assertPattern(now.plusDays(1), "bbb", "001");
68+
CharSequence tomorrowText = provider.getContext().getText(R.string.tomorrow);
69+
assertPattern(now.plusDays(1), "bbbb", tomorrowText.toString());
70+
assertPattern(now.plusDays(1), "BBB", tomorrowText.toString());
71+
assertPattern(now.plusDays(1), "BBBB", tomorrowText.toString());
72+
assertPattern(now.plusDays(-2), "BBB", "");
73+
assertPattern(now.plusDays(-2), "BBBB", String.format(provider.getContext().getText(R.string.N_days_ago).toString(), 2));
74+
assertPattern(now.plusDays(2), "BBB", "");
75+
assertPattern(now.plusDays(2), "BBBB", String.format(provider.getContext().getText(R.string.in_N_days).toString(), 2));
6776
assertPattern(now.plusDays(5), "b", "5");
6877
assertPattern(now.plusDays(5), "bbb", "005");
6978
assertPattern(now.plusDays(5), "bbbb", "5");

app/src/main/java/org/andstatus/todoagenda/prefs/dateformat/DateFormatType.java

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public enum DateFormatType {
3232
HIDDEN("hidden", R.string.hidden, ""),
3333
DEVICE_DEFAULT("deviceDefault", R.string.device_default, ""),
3434
DEFAULT_WEEKDAY("defaultWeekday", R.string.date_format_default_weekday, ""),
35+
DEFAULT_YTT("defaultYtt", R.string.date_format_default_ytt, ""),
3536
DEFAULT_DAYS("defaultDays", R.string.date_format_default_days, ""),
3637
ABBREVIATED("abbrev", R.string.appearance_abbreviate_dates_title, ""),
3738
NUMBER_OF_DAYS("days", R.string.date_format_number_of_days_to_event, "bbbb"),

app/src/main/java/org/andstatus/todoagenda/prefs/dateformat/DateFormatter.java

+44-20
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
import java.util.Locale;
3131

3232
public class DateFormatter {
33-
private static final char NUMBER_OF_DAYS_LETTER = 'b';
33+
private static final char NUMBER_OF_DAYS_LOWER_LETTER = 'b';
34+
private static final char NUMBER_OF_DAYS_UPPER_LETTER = 'B';
35+
3436
private final Context context;
3537
private final DateFormatValue dateFormatValue;
3638
private final DateTime now;
@@ -59,10 +61,13 @@ public CharSequence formatDate(DateTime date) {
5961
return formatDateTime(date, DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_SHOW_DATE |
6062
DateUtils.FORMAT_SHOW_WEEKDAY);
6163
case DEFAULT_DAYS:
62-
return getNumberOfDaysToEventString(context, 5, getNumberOfDaysToEvent(date)) + ", " +
64+
return formatNumberOfDaysToEvent(context, 5, getNumberOfDaysToEvent(date)) + ", " +
6365
formatDateTime(date, DateUtils.FORMAT_SHOW_DATE);
66+
case DEFAULT_YTT:
67+
CharSequence str1 = formatNumberOfDaysToEventText(context, 3, getNumberOfDaysToEvent(date));
68+
return (str1.length() == 0 ? "" : str1 + ", ") + formatDateTime(date, DateUtils.FORMAT_SHOW_DATE);
6469
case NUMBER_OF_DAYS:
65-
return getNumberOfDaysToEventString(context, 5, getNumberOfDaysToEvent(date));
70+
return formatNumberOfDaysToEvent(context, 5, getNumberOfDaysToEvent(date));
6671
default:
6772
return "(not implemented)";
6873
}
@@ -86,18 +91,10 @@ public static Date toJavaDate(DateTime date) {
8691
return new Date(date.getYearOfEra() - 1900, date.getMonthOfYear() - 1, date.getDayOfMonth());
8792
}
8893

89-
public static CharSequence getNumberOfDaysToEventString(Context context, int formatLength, int daysToEvent) {
94+
public static CharSequence formatNumberOfDaysToEvent(Context context, int formatLength, int daysToEvent) {
9095
if (formatLength >= 4) {
91-
switch (daysToEvent) {
92-
case -1:
93-
return context.getText(R.string.yesterday);
94-
case 0:
95-
return context.getText(R.string.today);
96-
case 1:
97-
return context.getText(R.string.tomorrow);
98-
default:
99-
break;
100-
}
96+
CharSequence ytt = getYtt(context, daysToEvent);
97+
if (ytt.length() > 0) return ytt;
10198
}
10299
if (Math.abs(daysToEvent) > 9999) return "...";
103100

@@ -107,7 +104,30 @@ public static CharSequence getNumberOfDaysToEventString(Context context, int for
107104
return String.format("%0" + formatLength + "d", daysToEvent);
108105
}
109106

110-
public int getNumberOfDaysToEvent(DateTime date) {
107+
public static CharSequence formatNumberOfDaysToEventText(Context context, int formatLength, int daysToEvent) {
108+
CharSequence ytt = getYtt(context, daysToEvent);
109+
if (ytt.length() > 0) return ytt;
110+
111+
if (formatLength < 4) return "";
112+
113+
return String.format(context.getText(daysToEvent < 0 ? R.string.N_days_ago : R.string.in_N_days).toString(),
114+
Math.abs(daysToEvent));
115+
}
116+
117+
public static CharSequence getYtt(Context context, int daysToEvent) {
118+
switch (daysToEvent) {
119+
case -1:
120+
return context.getText(R.string.yesterday);
121+
case 0:
122+
return context.getText(R.string.today);
123+
case 1:
124+
return context.getText(R.string.tomorrow);
125+
default:
126+
return "";
127+
}
128+
}
129+
130+
private int getNumberOfDaysToEvent(DateTime date) {
111131
return Days.daysBetween(
112132
now.withZone(date.getZone()).withTimeAtStartOfDay(),
113133
date.withTimeAtStartOfDay())
@@ -130,20 +150,24 @@ private String preProcessNumberOfDaysToEvent(DateTime date, String pattern) {
130150
int ind1 = getIndexOfNumberOfDaysLetter(pattern);
131151
if (ind1 < 0) return pattern;
132152

153+
char patternLetter = pattern.charAt(ind1);
133154
int ind2 = ind1;
134-
while (ind2 < pattern.length() && pattern.charAt(ind2) == NUMBER_OF_DAYS_LETTER) {
155+
while (ind2 < pattern.length() && pattern.charAt(ind2) == patternLetter) {
135156
ind2++;
136157
}
137-
CharSequence result = getNumberOfDaysToEventString(context, ind2 - ind1, getNumberOfDaysToEvent(date));
158+
CharSequence result = patternLetter == NUMBER_OF_DAYS_LOWER_LETTER
159+
? formatNumberOfDaysToEvent(context, ind2 - ind1, getNumberOfDaysToEvent(date))
160+
: formatNumberOfDaysToEventText(context, ind2 - ind1, getNumberOfDaysToEvent(date));
138161
return (ind1 > 0 ? pattern.substring(0, ind1) : "") +
139-
"'" + result + "'" +
140-
(ind2 < pattern.length() ? pattern.substring(ind2) : "");
162+
(result.length() == 0 ? "" : "'" + result + "'") +
163+
(ind2 < pattern.length() ? pattern.substring(ind2) : "");
141164
}
142165

143166
private int getIndexOfNumberOfDaysLetter(String pattern) {
144167
boolean inQuotes = false;
145168
for (int ind = 0; ind < pattern.length(); ind++) {
146-
if ((pattern.charAt(ind) == NUMBER_OF_DAYS_LETTER) && !inQuotes) return ind;
169+
if ((pattern.charAt(ind) == NUMBER_OF_DAYS_LOWER_LETTER || pattern.charAt(ind) == NUMBER_OF_DAYS_UPPER_LETTER)
170+
&& !inQuotes) return ind;
147171

148172
if (pattern.charAt(ind) == '\'') inQuotes = !inQuotes;
149173
}

app/src/main/res/values/strings.xml

+3
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
<!-- Date format preference -->
102102
<string name="simple_options">Simple options</string>
103103
<string name="date_format_default_weekday">Default with Weekday</string>
104+
<string name="date_format_default_ytt">Default with Yesterday, Today and Tomorrow</string>
104105
<string name="date_format_default_days">Default with Number of days to event</string>
105106
<string name="appearance_abbreviate_dates_title">Abbreviate dates with Weekday</string>
106107
<string name="appearance_abbreviate_dates_desc">Use three-letter format for dates</string>
@@ -112,6 +113,8 @@
112113
<string name="custom_pattern">Custom pattern</string>
113114
<string name="sample_date">Sample date (in yyyy-MM-dd format)</string>
114115
<string name="result_formatted_date">Result, formatted date</string>
116+
<string name="N_days_ago">%d days ago</string>
117+
<string name="in_N_days">in %d days</string>
115118

116119
<!-- Preference frame: Colors -->
117120
<string name="colors_prefs_desc">Colors and opacity of texts and backgrounds</string>

0 commit comments

Comments
 (0)