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

Commit ddbbcbab authored by Neil Fuller's avatar Neil Fuller Committed by Android (Google) Code Review
Browse files

Merge changes Ifd96c543,I1a0faa44

* changes:
  Further status logic tweaks
  Tweak status display logic and tests
parents e47ba046 37996acd
Loading
Loading
Loading
Loading
+42 −29
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
 */
package com.android.settings.datetime;

import static android.service.timezone.TimeZoneProviderStatus.DEPENDENCY_STATUS_OK;

import android.app.time.DetectorStatusTypes;
import android.app.time.LocationTimeZoneAlgorithmStatus;
import android.app.time.TelephonyTimeZoneAlgorithmStatus;
@@ -89,28 +91,36 @@ public class LocationProviderStatusPreferenceController
    // only one LTZP on a device, the primary. The UI here only reports status for one
    // LTZP. This UI logic prioritizes the primary if there is a "bad" status for both.
    @Nullable
    private TimeZoneProviderStatus getLtzpStatus() {
    private TimeZoneProviderStatus getLtzpStatusToReport() {
        LocationTimeZoneAlgorithmStatus status =
                mTimeManager.getTimeZoneCapabilitiesAndConfig().getDetectorStatus()
                        .getLocationTimeZoneAlgorithmStatus();
        TimeZoneProviderStatus primary = status.getPrimaryProviderReportedStatus();
        TimeZoneProviderStatus secondary = status.getSecondaryProviderReportedStatus();
        if (primary == null && secondary == null) {
            return null;
        }

        if (primary == null) {
            return secondary;
        } else if (secondary == null) {
        @Nullable TimeZoneProviderStatus primary = status.getPrimaryProviderReportedStatus();
        @Nullable TimeZoneProviderStatus secondary = status.getSecondaryProviderReportedStatus();
        if (primary != null && secondary != null) {
            return pickWorstLtzpStatus(primary, secondary);
        } else if (primary != null) {
            return primary;
        } else {
            return secondary;
        }
    }

        if (status.getPrimaryProviderStatus()
                != LocationTimeZoneAlgorithmStatus.PROVIDER_STATUS_IS_CERTAIN) {
            return secondary;
    private static TimeZoneProviderStatus pickWorstLtzpStatus(
            TimeZoneProviderStatus primary, TimeZoneProviderStatus secondary) {
        int primaryScore = scoreLtzpStatus(primary);
        int secondaryScore = scoreLtzpStatus(secondary);
        return primaryScore >= secondaryScore ? primary : secondary;
    }

        return primary;
    private static int scoreLtzpStatus(TimeZoneProviderStatus providerStatus) {
        @DependencyStatus int locationStatus =
                providerStatus.getLocationDetectionDependencyStatus();
        if (locationStatus <= DEPENDENCY_STATUS_OK) {
            return 0;
        }
        // The enum values currently correspond well to severity.
        return providerStatus.getLocationDetectionDependencyStatus();
    }

    @Override
@@ -132,34 +142,37 @@ public class LocationProviderStatusPreferenceController

        if (!timeZoneCapabilities.isUseLocationEnabled()
                && hasLocationTimeZoneNoTelephonyFallback(detectorStatus)) {
            return mContext.getResources().getString(
            return mContext.getString(
                    R.string.location_time_zone_detection_status_summary_blocked_by_settings);
        }

        TimeZoneProviderStatus ltzpStatus = getLtzpStatus();
        TimeZoneProviderStatus ltzpStatus = getLtzpStatusToReport();
        if (ltzpStatus == null) {
            return "";
        }

        @DependencyStatus int status = ltzpStatus.getLocationDetectionDependencyStatus();
        @DependencyStatus int locationStatus = ltzpStatus.getLocationDetectionDependencyStatus();

        if (status == TimeZoneProviderStatus.DEPENDENCY_STATUS_BLOCKED_BY_ENVIRONMENT) {
            return mContext.getResources().getString(
                    R.string.location_time_zone_detection_status_summary_blocked_by_environment);
        if (locationStatus == TimeZoneProviderStatus.DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS) {
            return mContext.getString(
                    R.string.location_time_zone_detection_status_summary_blocked_by_settings);
        }
        if (status == TimeZoneProviderStatus.DEPENDENCY_STATUS_DEGRADED_BY_SETTINGS) {
            return mContext.getResources().getString(
        if (locationStatus == TimeZoneProviderStatus.DEPENDENCY_STATUS_DEGRADED_BY_SETTINGS) {
            return mContext.getString(
                    R.string.location_time_zone_detection_status_summary_degraded_by_settings);
        }
        if (status == TimeZoneProviderStatus.DEPENDENCY_STATUS_TEMPORARILY_UNAVAILABLE) {
            return mContext.getResources().getString(
                    R.string.location_time_zone_detection_status_summary_temporarily_unavailable);
        if (locationStatus == TimeZoneProviderStatus.DEPENDENCY_STATUS_BLOCKED_BY_ENVIRONMENT) {
            return mContext.getString(
                    R.string.location_time_zone_detection_status_summary_blocked_by_environment);
        }
        if (status == TimeZoneProviderStatus.DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS) {
            return mContext.getResources().getString(
                    R.string.location_time_zone_detection_status_summary_blocked_by_settings);
        if (locationStatus == TimeZoneProviderStatus.DEPENDENCY_STATUS_TEMPORARILY_UNAVAILABLE) {
            return mContext.getString(
                    R.string.location_time_zone_detection_status_summary_temporarily_unavailable);
        }

        // LTZP-reported network connectivity and time zone resolution statuses are currently
        // ignored. Partners can tweak this logic if they also want to report these to users.

        return "";
    }

+54 −50
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.app.time.DetectorStatusTypes.DETECTOR_STATUS_RUNNING;
import static android.app.time.LocationTimeZoneAlgorithmStatus.PROVIDER_STATUS_IS_CERTAIN;
import static android.app.time.LocationTimeZoneAlgorithmStatus.PROVIDER_STATUS_IS_UNCERTAIN;
import static android.service.timezone.TimeZoneProviderStatus.DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS;
import static android.service.timezone.TimeZoneProviderStatus.DEPENDENCY_STATUS_DEGRADED_BY_SETTINGS;
import static android.service.timezone.TimeZoneProviderStatus.DEPENDENCY_STATUS_OK;

import static com.google.common.truth.Truth.assertThat;
@@ -72,80 +73,74 @@ public class LocationProviderStatusPreferenceControllerTest {
        when(mContext.getString(
                R.string.location_time_zone_detection_status_summary_blocked_by_settings))
                .thenReturn("BBS");
        when(mContext.getString(
                R.string.location_time_zone_detection_status_summary_degraded_by_settings))
                .thenReturn("DBS");
    }

    @Test
    public void testCapabilityStatus() {
    public void testProviderStatus_primaryCertain() {
        LocationProviderStatusPreferenceController controller =
                new LocationProviderStatusPreferenceController(mContext, "LPSPC");

        TimeZoneCapabilitiesAndConfig capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                DEPENDENCY_STATUS_OK, DEPENDENCY_STATUS_OK);
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(true, DEPENDENCY_STATUS_OK,
                DEPENDENCY_STATUS_OK);
        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_OK);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(true,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK);
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);
    }

    @Test
    public void testProviderStatus_primaryCertain() {
        LocationProviderStatusPreferenceController controller =
                new LocationProviderStatusPreferenceController(mContext, "LPSPC");
        // Test whether reportable statuses that can still result in the LTZP being "certain" are
        // reported.

        TimeZoneCapabilitiesAndConfig capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK,
        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_DEGRADED_BY_SETTINGS,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK);
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_DEGRADED_BY_SETTINGS,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_DEGRADED_BY_SETTINGS);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS);
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_DEGRADED_BY_SETTINGS,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS);
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_DEGRADED_BY_SETTINGS);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);
    }

    @Test
@@ -154,7 +149,7 @@ public class LocationProviderStatusPreferenceControllerTest {
                new LocationProviderStatusPreferenceController(mContext, "LPSPC");

        TimeZoneCapabilitiesAndConfig capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

@@ -162,7 +157,15 @@ public class LocationProviderStatusPreferenceControllerTest {
                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

@@ -170,20 +173,20 @@ public class LocationProviderStatusPreferenceControllerTest {
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS);
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_OK);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK);
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);
    }

    @Test
@@ -200,35 +203,36 @@ public class LocationProviderStatusPreferenceControllerTest {
                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS,
                PROVIDER_STATUS_IS_CERTAIN, null);
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_UNCERTAIN, null);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);
                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(false, DEPENDENCY_STATUS_OK, null);
        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK,
                PROVIDER_STATUS_IS_CERTAIN, null);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);

        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, null,
                PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS);
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS,
                PROVIDER_STATUS_IS_CERTAIN, null);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);
    }

    private static TimeZoneCapabilitiesAndConfig createCapabilitiesAndConfig(
            boolean userCanConfigureGeoDetection,
            @Nullable @DependencyStatus Integer primaryProviderLocationStatus,
            @Nullable @DependencyStatus Integer secondaryProviderLocationStatus) {
        return createCapabilitiesAndConfig(userCanConfigureGeoDetection,
                PROVIDER_STATUS_IS_CERTAIN, primaryProviderLocationStatus,
                PROVIDER_STATUS_IS_CERTAIN, secondaryProviderLocationStatus);
        capabilitiesAndConfig = createCapabilitiesAndConfig(false,
                PROVIDER_STATUS_IS_CERTAIN, null,
                PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS);
        when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig);

        assertThat(controller.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.AVAILABLE_UNSEARCHABLE);
    }

    private static TimeZoneCapabilitiesAndConfig createCapabilitiesAndConfig(