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

Commit eca37a88 authored by vichang's avatar vichang Committed by Automerger Merge Worker
Browse files

Merge "Replace @CorePlatformApi APIs usages in...

Merge "Replace @CorePlatformApi APIs usages in TimeZoneInfoPreferenceControllerTest" am: 3166166b am: e6bf1a83 am: b9bebd5b

Original change: https://android-review.googlesource.com/c/platform/packages/apps/Settings/+/1831314

Change-Id: Ie407f4d20b32fce153c2af8d17b65fda7725a6c8
parents a82b6cd0 b9bebd5b
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -151,7 +151,7 @@ public class TimeZoneInfo {
        public TimeZoneInfo format(TimeZone timeZone) {
            String canonicalZoneId = getCanonicalZoneId(timeZone);
            final TimeZoneNames timeZoneNames = mTimeZoneFormat.getTimeZoneNames();
            final java.util.TimeZone javaTimeZone = java.util.TimeZone.getTimeZone(canonicalZoneId);
            final java.util.TimeZone javaTimeZone = toJavaTimeZone(canonicalZoneId);
            final CharSequence gmtOffset = ZoneGetter.getGmtOffsetText(mTimeZoneFormat, mLocale,
                javaTimeZone, mNow);
            return new TimeZoneInfo.Builder(timeZone)
@@ -165,6 +165,16 @@ public class TimeZoneInfo {
                    .setGmtOffset(gmtOffset)
                    .build();
        }
    }

    /* package-private */ java.util.TimeZone getJavaTimeZone() {
        String canonicalZoneId = getCanonicalZoneId(mTimeZone);
        return toJavaTimeZone(canonicalZoneId);
    }

    private static java.util.TimeZone toJavaTimeZone(String canonicalZoneId) {
        return java.util.TimeZone.getTimeZone(canonicalZoneId);
    }

    private static String getCanonicalZoneId(TimeZone timeZone) {
        final String id = timeZone.getID();
@@ -174,6 +184,5 @@ public class TimeZoneInfo {
        }
        return id;
    }
    }

}
+31 −20
Original line number Diff line number Diff line
@@ -20,17 +20,17 @@ import android.content.Context;
import android.icu.text.DateFormat;
import android.icu.text.DisplayContext;
import android.icu.text.SimpleDateFormat;
import android.icu.util.BasicTimeZone;
import android.icu.util.Calendar;
import android.icu.util.TimeZone;
import android.icu.util.TimeZoneTransition;

import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;

import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;

import java.time.Instant;
import java.time.zone.ZoneOffsetTransition;
import java.time.zone.ZoneRules;
import java.util.Date;

public class TimeZoneInfoPreferenceController extends BasePreferenceController {
@@ -86,11 +86,11 @@ public class TimeZoneInfoPreferenceController extends BasePreferenceController {
            return mContext.getString(R.string.zone_info_footer_no_dst, offsetAndName);
        }

        final TimeZoneTransition nextDstTransition = findNextDstTransition(timeZone);
        if (nextDstTransition == null) {
            return null;
        final ZoneOffsetTransition nextDstTransition = findNextDstTransition(item);
        if (nextDstTransition == null) { // No future transition
            return mContext.getString(R.string.zone_info_footer_no_dst, offsetAndName);
        }
        final boolean toDst = nextDstTransition.getTo().getDSTSavings() != 0;
        final boolean toDst = getDSTSavings(timeZone, nextDstTransition.getInstant()) != 0;
        String timeType = toDst ? item.getDaylightName() : item.getStandardName();
        if (timeType == null) {
            // Fall back to generic "summer time" and "standard time" if the time zone has no
@@ -101,26 +101,37 @@ public class TimeZoneInfoPreferenceController extends BasePreferenceController {

        }
        final Calendar transitionTime = Calendar.getInstance(timeZone);
        transitionTime.setTimeInMillis(nextDstTransition.getTime());
        transitionTime.setTimeInMillis(nextDstTransition.getInstant().toEpochMilli());
        final String date = mDateFormat.format(transitionTime);
        return SpannableUtil.getResourcesText(mContext.getResources(),
                R.string.zone_info_footer, offsetAndName, timeType, date);
    }

    private TimeZoneTransition findNextDstTransition(TimeZone timeZone) {
        if (!(timeZone instanceof BasicTimeZone)) {
            return null;
    private ZoneOffsetTransition findNextDstTransition(TimeZoneInfo timeZoneInfo) {
        TimeZone timeZone = timeZoneInfo.getTimeZone();
        ZoneRules zoneRules = timeZoneInfo.getJavaTimeZone().toZoneId().getRules();

        Instant from = mDate.toInstant();

        ZoneOffsetTransition transition;
        while (true) { // Find next transition with different DST offsets
            transition = zoneRules.nextTransition(from);
            if (transition == null) {
                break;
            }
        final BasicTimeZone basicTimeZone = (BasicTimeZone) timeZone;
        TimeZoneTransition transition = basicTimeZone.getNextTransition(
                mDate.getTime(), /* inclusive */ false);
        do {
            if (transition.getTo().getDSTSavings() != transition.getFrom().getDSTSavings()) {
            Instant to = transition.getInstant();
            if (getDSTSavings(timeZone, from) != getDSTSavings(timeZone, to)) {
                break;
            }
            transition = basicTimeZone.getNextTransition(
                    transition.getTime(), /*inclusive */ false);
        } while (transition != null);
            from = to;
        }

        return transition;
    }

    private static int getDSTSavings(TimeZone timeZone, Instant instant) {
        int[] offsets = new int[2];
        timeZone.getOffset(instant.toEpochMilli(), false /* local time */, offsets);
        return offsets[1];
    }
}