From 5b26a47a9606ea5be08a1b88dc992cde6c059fe2 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 12 Dec 2017 14:30:53 -0600 Subject: [PATCH] Fix ja, ko, zh date formatting --- .../andlib/utility/DateUtilitiesTest.java | 76 ++++++++++++++++++- .../androidTest/java/org/tasks/Freeze.java | 8 ++ .../todoroo/andlib/utility/DateUtilities.java | 59 +++++++------- .../main/java/org/tasks/locale/Locale.java | 12 ++- 4 files changed, 124 insertions(+), 31 deletions(-) diff --git a/app/src/androidTest/java/com/todoroo/andlib/utility/DateUtilitiesTest.java b/app/src/androidTest/java/com/todoroo/andlib/utility/DateUtilitiesTest.java index f299d76c8..2aeb1d1e1 100644 --- a/app/src/androidTest/java/com/todoroo/andlib/utility/DateUtilitiesTest.java +++ b/app/src/androidTest/java/com/todoroo/andlib/utility/DateUtilitiesTest.java @@ -39,17 +39,17 @@ public class DateUtilitiesTest { @Before public void setUp() { defaultLocale = Locale.getDefault(); - Locale.setDefault(Locale.US); + setLocale(Locale.US); } @After public void tearDown() { DateUtilities.is24HourOverride = null; - Locale.setDefault(defaultLocale); + setLocale(defaultLocale); } private void setLocale(Locale locale) { - Locale.setDefault(locale); + org.tasks.locale.Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; DisplayMetrics metrics = getTargetContext().getResources().getDisplayMetrics(); @@ -230,4 +230,74 @@ public class DateUtilitiesTest { public void testAddMonthsWithMoreDays() { assertEquals(newDate(2014, 1, 30).getMillis(), addCalendarMonthsToUnixtime(newDate(2013, 11, 30).getMillis(), 2)); } + + @Test + public void usDateNoYear() { + setLocale(Locale.US); + freezeAt(new DateTime(2018, 1, 1)).thawAfter(() -> + assertEquals("Jan 14", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis()))); + } + + @Test + public void usDateWithYear() { + setLocale(Locale.US); + freezeAt(new DateTime(2017, 12, 12)).thawAfter(() -> + assertEquals("Jan 14 '18", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis()))); + } + + @Test + public void germanDateNoYear() { + setLocale(Locale.GERMAN); + freezeAt(new DateTime(2018, 1, 1)).thawAfter(() -> + assertEquals("14 Jan.", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis()))); + } + + @Test + public void germanDateWithYear() { + setLocale(Locale.GERMAN); + freezeAt(new DateTime(2017, 12, 12)).thawAfter(() -> + assertEquals("14 Jan. '18", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis()))); + } + + @Test + public void koreanDateNoYear() { + setLocale(Locale.KOREAN); + freezeAt(new DateTime(2018, 1, 1)).thawAfter(() -> + assertEquals("1월 14일", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis()))); + } + + @Test + public void koreanDateWithYear() { + setLocale(Locale.KOREAN); + freezeAt(new DateTime(2017, 12, 12)).thawAfter(() -> + assertEquals("18년 1월 14일", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis()))); + } + + @Test + public void japaneseDateNoYear() { + setLocale(Locale.JAPANESE); + freezeAt(new DateTime(2018, 1, 1)).thawAfter(() -> + assertEquals("1月 14日", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis()))); + } + + @Test + public void japaneseDateWithYear() { + setLocale(Locale.JAPANESE); + freezeAt(new DateTime(2017, 12, 12)).thawAfter(() -> + assertEquals("18年 1月 14日", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis()))); + } + + @Test + public void chineseDateNoYear() { + setLocale(Locale.CHINESE); + freezeAt(new DateTime(2018, 1, 1)).thawAfter(() -> + assertEquals("1月 14日", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis()))); + } + + @Test + public void chineseDateWithYear() { + setLocale(Locale.CHINESE); + freezeAt(new DateTime(2017, 12, 12)).thawAfter(() -> + assertEquals("18年 1月 14日", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis()))); + } } diff --git a/app/src/androidTest/java/org/tasks/Freeze.java b/app/src/androidTest/java/org/tasks/Freeze.java index 7b26e775d..bf9c72805 100644 --- a/app/src/androidTest/java/org/tasks/Freeze.java +++ b/app/src/androidTest/java/org/tasks/Freeze.java @@ -28,4 +28,12 @@ public class Freeze { public void thawAfter(Snippet snippet) { thaw(); } + + public void thawAfter(Runnable run) { + try { + run.run(); + } finally { + thaw(); + } + } } diff --git a/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java b/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java index 64b413a90..0984d5da1 100644 --- a/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java +++ b/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java @@ -13,7 +13,6 @@ import com.todoroo.astrid.data.Task; import org.tasks.R; import org.tasks.time.DateTime; -import java.util.Arrays; import java.util.Locale; import static org.tasks.date.DateTimeUtils.newDateTime; @@ -65,6 +64,13 @@ public class DateUtilities { /** Represents a single minute */ public static final long ONE_MINUTE = 60000L; + private static final String JA = "MMM d\u65E5"; + private static final String JA_YEAR = "yy\u5E74 " + JA; + private static final String KO = "MMM d\uC77C"; + private static final String KO_YEAR = "yy\uB144 " + KO; + private static final String ZH = "MMM d\u65E5"; + private static final String ZH_YEAR = "yy\u5E74 " + ZH; + /* ====================================================================== * =========================================================== formatters * ====================================================================== */ @@ -95,12 +101,6 @@ public class DateUtilities { return date.toString(value); } - /* Returns true if search string is in sortedValues */ - - private static boolean arrayBinaryContains(String search, String... sortedValues) { - return Arrays.binarySearch(sortedValues, search) >= 0; - } - public static String getLongDateString(DateTime date) { return getDateString("MMMM", date); } @@ -114,26 +114,33 @@ public class DateUtilities { } private static String getDateString(String simpleDateFormat, DateTime date) { - String month = date.toString(simpleDateFormat); - String value; - Locale locale = Locale.getDefault(); - if (arrayBinaryContains(locale.getLanguage(), "ja", "ko", "zh") - || arrayBinaryContains(locale.getCountry(), "BZ", "CA", "KE", "MN" ,"US")) { - value = "'#' d"; - } else { - value = "d '#'"; - } - - if (date.getYear() != newDateTime().getYear()) { - value = value + " ''yy"; + boolean includeYear = date.getYear() != newDateTime().getYear(); + String format = getFormat(Locale.getDefault(), simpleDateFormat, includeYear); + return date.toString(format); + } + + private static String getFormat(Locale locale, String monthFormat, boolean includeYear) { + switch(locale.getLanguage()) { + case "ja": + return includeYear ? JA_YEAR : JA; + case "ko": + return includeYear ? KO_YEAR : KO; + case "zh": + return includeYear ? ZH_YEAR : ZH; } - - if (arrayBinaryContains(locale.getLanguage(), "ja", "zh")) { - return date.toString(value).replace("#", month) + "\u65E5"; - } else if ("ko".equals(Locale.getDefault().getLanguage())) { - return date.toString(value).replace("#", month) + "\uC77C"; - } else { - return date.toString(value).replace("#", month); + switch (locale.getCountry()) { + case "BZ": + case "CA": + case "KE": + case "MN": + case "US": + return includeYear + ? monthFormat + " d ''yy" + : monthFormat + " d"; + default: + return includeYear + ? "d " + monthFormat + " ''yy" + : "d " + monthFormat; } } diff --git a/app/src/main/java/org/tasks/locale/Locale.java b/app/src/main/java/org/tasks/locale/Locale.java index 41a76c8a9..5e41c235f 100644 --- a/app/src/main/java/org/tasks/locale/Locale.java +++ b/app/src/main/java/org/tasks/locale/Locale.java @@ -37,8 +37,7 @@ public class Locale { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext); String language = prefs.getString(applicationContext.getString(R.string.p_language), null); int directionOverride = Integer.parseInt(prefs.getString(applicationContext.getString(R.string.p_layout_direction), "-1")); - INSTANCE = new Locale(DEFAULT.getLocale(), language, directionOverride); - java.util.Locale.setDefault(INSTANCE.getLocale()); + setDefault(DEFAULT.getLocale(), language, directionOverride); } } } @@ -46,6 +45,15 @@ public class Locale { return getInstance(); } + public static void setDefault(java.util.Locale locale) { + setDefault(locale, null, -1); + } + + private static void setDefault(java.util.Locale locale, String languageOverride, int directionOverride) { + INSTANCE = new Locale(locale, languageOverride, directionOverride); + java.util.Locale.setDefault(locale); + } + public static Locale getInstance() { return INSTANCE == null ? DEFAULT : INSTANCE; }