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

Commit c641f4e8 authored by Neil Fuller's avatar Neil Fuller
Browse files

Add a cache of the last CountryTimeZones looked up

There should be strong consistency of the country being
looked up so it makes sense to have a cache near to the point
of use. The TimeZoneFinder object currently caches the
last one retrieved, but that's general purpose and may
be invalidated more regularly (and it may be removed).

Test: atest FrameworksTelephonyTests
Bug: 63743683
Change-Id: If0b2aa851c78141bfdb85fd78129d70e94ed8c06
parent 7cecf024
Loading
Loading
Loading
Loading
+26 −6
Original line number Diff line number Diff line
@@ -141,6 +141,9 @@ public class TimeZoneLookupHelper {

    private static final int MS_PER_HOUR = 60 * 60 * 1000;

    /** The last CountryTimeZones object retrieved. */
    private CountryTimeZones mLastCountryTimeZones;

    public TimeZoneLookupHelper() {}

    /**
@@ -152,8 +155,7 @@ public class TimeZoneLookupHelper {
     * matching time zones are found.
     */
    public OffsetResult lookupByNitzCountry(NitzData nitzData, String isoCountryCode) {
        CountryTimeZones countryTimeZones =
                TimeZoneFinder.getInstance().lookupCountryTimeZones(isoCountryCode);
        CountryTimeZones countryTimeZones = getCountryTimeZones(isoCountryCode);
        if (countryTimeZones == null) {
            return null;
        }
@@ -190,8 +192,7 @@ public class TimeZoneLookupHelper {
     * {@code null} can be returned.
     */
    public CountryResult lookupByCountry(String isoCountryCode, long whenMillis) {
        CountryTimeZones countryTimeZones =
                TimeZoneFinder.getInstance().lookupCountryTimeZones(isoCountryCode);
        CountryTimeZones countryTimeZones = getCountryTimeZones(isoCountryCode);
        if (countryTimeZones == null) {
            // Unknown country code.
            return null;
@@ -271,8 +272,27 @@ public class TimeZoneLookupHelper {
            return false;
        }

        CountryTimeZones countryTimeZones = getCountryTimeZones(isoCountryCode);
        return countryTimeZones != null && countryTimeZones.hasUtcZone(whenMillis);
    }

    private CountryTimeZones getCountryTimeZones(String isoCountryCode) {
        // A single entry cache of the last CountryTimeZones object retrieved since there should
        // be strong consistency across calls.
        synchronized (this) {
            if (mLastCountryTimeZones != null) {
                if (mLastCountryTimeZones.isForCountryCode(isoCountryCode)) {
                    return mLastCountryTimeZones;
                }
            }

            // Perform the lookup. It's very unlikely to return null, but we won't cache null.
            CountryTimeZones countryTimeZones =
                    TimeZoneFinder.getInstance().lookupCountryTimeZones(isoCountryCode);
        return countryTimeZones != null && countryTimeZones.hasUtcZone(whenMillis);
            if (countryTimeZones != null) {
                mLastCountryTimeZones = countryTimeZones;
            }
            return countryTimeZones;
        }
    }
}