From 1746869dc35e8252290d8f887278108216f981ea Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Sat, 23 Jan 2021 18:32:56 -0500 Subject: [PATCH] Fix issue with rendering of group update timestamps. TIL SimpleDateFormat is not thread safe. Across instances. God forgive them, for they know not what they did. --- .../securesms/util/DateUtils.java | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java b/app/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java index 4b4f850fa4..5a892bc07c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java @@ -40,9 +40,9 @@ import java.util.concurrent.TimeUnit; public class DateUtils extends android.text.format.DateUtils { @SuppressWarnings("unused") - private static final String TAG = DateUtils.class.getSimpleName(); - private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd"); - private static final SimpleDateFormat BRIEF_EXACT_FORMAT = new SimpleDateFormat(); + private static final String TAG = DateUtils.class.getSimpleName(); + private static final ThreadLocal DATE_FORMAT = new ThreadLocal<>(); + private static final ThreadLocal BRIEF_EXACT_FORMAT = new ThreadLocal<>(); private static boolean isWithin(final long millis, final long span, final TimeUnit unit) { return System.currentTimeMillis() - millis <= unit.toMillis(span); @@ -166,7 +166,10 @@ public class DateUtils extends android.text.format.DateUtils { } public static boolean isSameDay(long t1, long t2) { - return DATE_FORMAT.format(new Date(t1)).equals(DATE_FORMAT.format(new Date(t2))); + String d1 = getDateFormat().format(new Date(t1)); + String d2 = getDateFormat().format(new Date(t2)); + + return d1.equals(d2); } public static boolean isSameExtendedRelativeTimestamp(@NonNull Context context, @NonNull Locale locale, long t1, long t2) { @@ -214,4 +217,28 @@ public class DateUtils extends android.text.format.DateUtils { return -1; } } + + @SuppressLint("SimpleDateFormat") + private static SimpleDateFormat getDateFormat() { + SimpleDateFormat format = DATE_FORMAT.get(); + + if (format == null) { + format = new SimpleDateFormat("yyyyMMdd"); + DATE_FORMAT.set(format); + } + + return format; + } + + @SuppressLint("SimpleDateFormat") + private static SimpleDateFormat getBriefExactFormat() { + SimpleDateFormat format = BRIEF_EXACT_FORMAT.get(); + + if (format == null) { + format = new SimpleDateFormat(); + BRIEF_EXACT_FORMAT.set(format); + } + + return format; + } }