Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a3a8ada authored by Victor Chang's avatar Victor Chang
Browse files

Make a copy of DateIntervalFormat from libcore - part 2

Bug: 160606356
Test: atest FrameworksCoreTests:android.text.format
Change-Id: I4c4253c707211f2a5ee0a11da107ab1dd6c4fab8
parent 8ee3807a
Loading
Loading
Loading
Loading
+85 −77
Original line number Diff line number Diff line
@@ -16,47 +16,54 @@

package android.text.format;

import android.compat.annotation.UnsupportedAppUsage;
import static android.text.format.DateUtilsBridge.FORMAT_UTC;

import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;

import android.icu.util.Calendar;
import android.icu.util.ULocale;
import android.util.LruCache;

import com.android.internal.annotations.VisibleForTesting;

import java.text.FieldPosition;
import java.util.TimeZone;
import libcore.util.BasicLruCache;

import static libcore.icu.DateUtilsBridge.FORMAT_UTC;

/**
 * Exposes icu4j's DateIntervalFormat.
 * A wrapper of {@link android.icu.text.DateIntervalFormat} used by {@link DateUtilsBridge}.
 *
 * @hide
 */
@libcore.api.CorePlatformApi
@VisibleForTesting(visibility = PACKAGE)
public final class DateIntervalFormat {

  private static final BasicLruCache<String, android.icu.text.DateIntervalFormat> CACHED_FORMATTERS
      = new BasicLruCache<>(8);
    private static final LruCache<String, android.icu.text.DateIntervalFormat> CACHED_FORMATTERS =
            new LruCache<>(8);

    private DateIntervalFormat() {
    }

  // This is public DateUtils API in frameworks/base.
  @UnsupportedAppUsage
  @libcore.api.CorePlatformApi
    /**
     * Format a date range.
     */
    @VisibleForTesting(visibility = PACKAGE)
    public static String formatDateRange(long startMs, long endMs, int flags, String olsonId) {
        if ((flags & FORMAT_UTC) != 0) {
            olsonId = "UTC";
        }
    // We create a java.util.TimeZone here to use libcore's data and libcore's olson ID / pseudo-tz
    // logic.
        // We create a java.util.TimeZone here to use libcore's data and libcore's olson ID /
        // pseudo-tz logic.
        TimeZone tz = (olsonId != null) ? TimeZone.getTimeZone(olsonId) : TimeZone.getDefault();
        android.icu.util.TimeZone icuTimeZone = DateUtilsBridge.icuTimeZone(tz);
        ULocale icuLocale = ULocale.getDefault();
        return formatDateRange(icuLocale, icuTimeZone, startMs, endMs, flags);
    }

  // This is our slightly more sensible internal API. (A truly sane replacement would take a
  // skeleton instead of int flags.)
    /**
     * Format a date range. This is our slightly more sensible internal API.
     * A truly sane replacement would take a skeleton instead of int flags.
     */
    @VisibleForTesting(visibility = PACKAGE)
    public static String formatDateRange(ULocale icuLocale, android.icu.util.TimeZone icuTimeZone,
            long startMs, long endMs, int flags) {
        Calendar startCalendar = DateUtilsBridge.createIcuCalendar(icuTimeZone, icuLocale, startMs);
@@ -68,18 +75,19 @@ public final class DateIntervalFormat {
        }

        // Special handling when the range ends at midnight:
    // - If we're not showing times, and the range is non-empty, we fudge the end date so we don't
    //   count the day that's about to start.
    // - If we are showing times, and the range ends at exactly 00:00 of the day following its start
    //   (which can be thought of as 24:00 the same day), we fudge the end date so we don't show the
    //    dates --- unless the start is anything displayed as 00:00, in which case we include both
    //    dates to disambiguate.
        // - If we're not showing times, and the range is non-empty, we fudge the end date so we
        // don't count the day that's about to start.
        // - If we are showing times, and the range ends at exactly 00:00 of the day following
        // its start (which can be thought of as 24:00 the same day), we fudge the end date so we
        // don't show the dates --- unless the start is anything displayed as 00:00, in which case
        // we include both dates to disambiguate.
        // This is not the behavior of icu4j's DateIntervalFormat, but it's the required behavior
        // of Android's DateUtils.formatDateRange.
        if (isExactlyMidnight(endCalendar)) {
            boolean showTime =
                    (flags & DateUtilsBridge.FORMAT_SHOW_TIME) == DateUtilsBridge.FORMAT_SHOW_TIME;
      boolean endsDayAfterStart = DateUtilsBridge.dayDistance(startCalendar, endCalendar) == 1;
            boolean endsDayAfterStart = DateUtilsBridge.dayDistance(startCalendar, endCalendar)
                    == 1;
            if ((!showTime && startMs != endMs)
                    || (endsDayAfterStart
                    && !DateUtilsBridge.isDisplayMidnightUsingSkeleton(startCalendar))) {
@@ -110,9 +118,9 @@ public final class DateIntervalFormat {
    }

    private static boolean isExactlyMidnight(Calendar c) {
    return c.get(Calendar.HOUR_OF_DAY) == 0 &&
        c.get(Calendar.MINUTE) == 0 &&
        c.get(Calendar.SECOND) == 0 &&
        c.get(Calendar.MILLISECOND) == 0;
        return c.get(Calendar.HOUR_OF_DAY) == 0
                && c.get(Calendar.MINUTE) == 0
                && c.get(Calendar.SECOND) == 0
                && c.get(Calendar.MILLISECOND) == 0;
    }
}
+0 −1
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import android.icu.util.MeasureUnit;

import com.android.internal.R;

import libcore.icu.DateIntervalFormat;
import libcore.icu.LocaleData;

import java.io.IOException;
+646 −456

File changed.

Preview size limit exceeded, changes collapsed.