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

Commit 4532d361 authored by hupeng3's avatar hupeng3 Committed by Hu Peng
Browse files

Add TimeZoneProviderStatus' nullness check.

The mTimeZoneProviderStatus of TimeZoneProviderEvent will be null if it came from [1], and it will cause 'system_server' NPE in the method of 'preProcess'.

[1] https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/core/java/android/service/timezone/TimeZoneProviderService.java;l=205;drc=e13dc3f47bb058cda591ff7c4db38100f3a8276f



Bug:353886493

Test: atest core/tests/timetests/src/android/service/timezone/
Test: atest services/tests/timetests/src/com/android/server/timezonedetector/location/

Change-Id: Id3d467f72da0ad17388d7f6f3af649fce45e9af6
Signed-off-by: default avatarhupeng3 <hp121520@gmail.com>
parent fc72787d
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -56,12 +56,17 @@ public class ZoneInfoDbTimeZoneProviderEventPreProcessor
        // enables immediate failover to a secondary provider, one that might provide valid IDs for
        // the same location, which should provide better behavior than just ignoring the event.
        if (hasInvalidZones(event)) {
            TimeZoneProviderStatus providerStatus = new TimeZoneProviderStatus.Builder(
                    event.getTimeZoneProviderStatus())
            TimeZoneProviderStatus providerStatus = event.getTimeZoneProviderStatus();
            TimeZoneProviderStatus.Builder providerStatusBuilder;
            if (providerStatus != null) {
                providerStatusBuilder = new TimeZoneProviderStatus.Builder(providerStatus);
            } else {
                providerStatusBuilder = new TimeZoneProviderStatus.Builder();
            }
            return TimeZoneProviderEvent.createUncertainEvent(event.getCreationElapsedMillis(),
                    providerStatusBuilder
                            .setTimeZoneResolutionOperationStatus(OPERATION_STATUS_FAILED)
                    .build();
            return TimeZoneProviderEvent.createUncertainEvent(
                    event.getCreationElapsedMillis(), providerStatus);
                            .build());
        }

        return event;
+38 −13
Original line number Diff line number Diff line
@@ -39,13 +39,23 @@ public class ZoneInfoDbTimeZoneProviderEventPreProcessorTest {

    private static final long ARBITRARY_TIME_MILLIS = 11223344;

    private final List<String> mNonExistingTimeZones = Arrays.asList(
            "SystemV/HST10", "Atlantic/Atlantis", "EUROPE/LONDON", "Etc/GMT-5:30");
    private final ZoneInfoDbTimeZoneProviderEventPreProcessor mPreProcessor =
            new ZoneInfoDbTimeZoneProviderEventPreProcessor();

    private static final TimeZoneProviderStatus ARBITRARY_TIME_ZONE_PROVIDER_STATUS =
            new TimeZoneProviderStatus.Builder()
                    .setConnectivityDependencyStatus(DEPENDENCY_STATUS_OK)
                    .setLocationDetectionDependencyStatus(DEPENDENCY_STATUS_OK)
                    .setTimeZoneResolutionOperationStatus(OPERATION_STATUS_OK)
                    .build();

    @Test
    public void timeZoneIdsFromZoneInfoDbAreValid() {
        for (String timeZone : TimeZone.getAvailableIDs()) {
            TimeZoneProviderEvent event = timeZoneProviderEvent(timeZone);
            TimeZoneProviderEvent event = timeZoneProviderEvent(timeZone,
                    ARBITRARY_TIME_ZONE_PROVIDER_STATUS);
            assertWithMessage("Time zone %s should be supported", timeZone)
                    .that(mPreProcessor.preProcess(event)).isEqualTo(event);
        }
@@ -53,11 +63,9 @@ public class ZoneInfoDbTimeZoneProviderEventPreProcessorTest {

    @Test
    public void eventWithNonExistingZones_areMappedToUncertainEvent() {
        List<String> nonExistingTimeZones = Arrays.asList(
                "SystemV/HST10", "Atlantic/Atlantis", "EUROPE/LONDON", "Etc/GMT-5:30");

        for (String timeZone : nonExistingTimeZones) {
            TimeZoneProviderEvent event = timeZoneProviderEvent(timeZone);
        for (String timeZone : mNonExistingTimeZones) {
            TimeZoneProviderEvent event = timeZoneProviderEvent(timeZone,
                    ARBITRARY_TIME_ZONE_PROVIDER_STATUS);

            TimeZoneProviderStatus expectedProviderStatus =
                    new TimeZoneProviderStatus.Builder(event.getTimeZoneProviderStatus())
@@ -73,14 +81,31 @@ public class ZoneInfoDbTimeZoneProviderEventPreProcessorTest {
        }
    }

    private static TimeZoneProviderEvent timeZoneProviderEvent(String... timeZoneIds) {
        TimeZoneProviderStatus providerStatus = new TimeZoneProviderStatus.Builder()
                .setLocationDetectionDependencyStatus(DEPENDENCY_STATUS_OK)
                .setConnectivityDependencyStatus(DEPENDENCY_STATUS_OK)
                .setTimeZoneResolutionOperationStatus(OPERATION_STATUS_OK)
    @Test
    public void eventWithNullProviderStatus_areMappedToUncertainEvent() {
        for (String timeZone : mNonExistingTimeZones) {
            TimeZoneProviderEvent eventWithNullStatus = timeZoneProviderEvent(timeZone,
                    /* providerStatus= */ null);

            TimeZoneProviderStatus expectedProviderStatus =
                    new TimeZoneProviderStatus.Builder()
                            .setTimeZoneResolutionOperationStatus(OPERATION_STATUS_FAILED)
                            .build();

            TimeZoneProviderEvent expectedResultEvent =
                    TimeZoneProviderEvent.createUncertainEvent(
                            eventWithNullStatus.getCreationElapsedMillis(),
                            expectedProviderStatus);
            assertWithMessage(timeZone + " with null time zone provider status")
                    .that(mPreProcessor.preProcess(eventWithNullStatus))
                    .isEqualTo(expectedResultEvent);
        }
    }

    private static TimeZoneProviderEvent timeZoneProviderEvent(String timeZoneId,
            TimeZoneProviderStatus providerStatus) {
        TimeZoneProviderSuggestion suggestion = new TimeZoneProviderSuggestion.Builder()
                .setTimeZoneIds(Arrays.asList(timeZoneIds))
                .setTimeZoneIds(Arrays.asList(timeZoneId))
                .setElapsedRealtimeMillis(ARBITRARY_TIME_MILLIS)
                .build();
        return TimeZoneProviderEvent.createSuggestionEvent(