diff --git a/src/com/android/settings/datetime/LocationProviderStatusPreferenceController.java b/src/com/android/settings/datetime/LocationProviderStatusPreferenceController.java index a64273bc9f1..f45fe880dc9 100644 --- a/src/com/android/settings/datetime/LocationProviderStatusPreferenceController.java +++ b/src/com/android/settings/datetime/LocationProviderStatusPreferenceController.java @@ -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; - } - - if (status.getPrimaryProviderStatus() - != LocationTimeZoneAlgorithmStatus.PROVIDER_STATUS_IS_CERTAIN) { + } else { return secondary; } + } - return primary; + private static TimeZoneProviderStatus pickWorstLtzpStatus( + TimeZoneProviderStatus primary, TimeZoneProviderStatus secondary) { + int primaryScore = scoreLtzpStatus(primary); + int secondaryScore = scoreLtzpStatus(secondary); + return primaryScore >= secondaryScore ? primary : secondary; + } + + 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,33 +142,36 @@ 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 (status == TimeZoneProviderStatus.DEPENDENCY_STATUS_DEGRADED_BY_SETTINGS) { - return mContext.getResources().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 (status == TimeZoneProviderStatus.DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS) { - return mContext.getResources().getString( + if (locationStatus == TimeZoneProviderStatus.DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS) { + return mContext.getString( R.string.location_time_zone_detection_status_summary_blocked_by_settings); } + if (locationStatus == TimeZoneProviderStatus.DEPENDENCY_STATUS_DEGRADED_BY_SETTINGS) { + return mContext.getString( + R.string.location_time_zone_detection_status_summary_degraded_by_settings); + } + if (locationStatus == TimeZoneProviderStatus.DEPENDENCY_STATUS_BLOCKED_BY_ENVIRONMENT) { + return mContext.getString( + R.string.location_time_zone_detection_status_summary_blocked_by_environment); + } + 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 ""; } diff --git a/tests/robotests/src/com/android/settings/datetime/LocationProviderStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/LocationProviderStatusPreferenceControllerTest.java index b838355d2fd..9ace56387b8 100644 --- a/tests/robotests/src/com/android/settings/datetime/LocationProviderStatusPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/datetime/LocationProviderStatusPreferenceControllerTest.java @@ -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,42 +73,9 @@ public class LocationProviderStatusPreferenceControllerTest { when(mContext.getString( R.string.location_time_zone_detection_status_summary_blocked_by_settings)) .thenReturn("BBS"); - } - - @Test - public void testCapabilityStatus() { - LocationProviderStatusPreferenceController controller = - new LocationProviderStatusPreferenceController(mContext, "LPSPC"); - - TimeZoneCapabilitiesAndConfig capabilitiesAndConfig = createCapabilitiesAndConfig(false, - DEPENDENCY_STATUS_OK, DEPENDENCY_STATUS_OK); - when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig); - - assertThat(controller.getAvailabilityStatus()).isEqualTo( - BasePreferenceController.CONDITIONALLY_UNAVAILABLE); - - capabilitiesAndConfig = createCapabilitiesAndConfig(true, DEPENDENCY_STATUS_OK, - 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); - when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig); - - assertThat(controller.getAvailabilityStatus()).isEqualTo( - BasePreferenceController.AVAILABLE_UNSEARCHABLE); + when(mContext.getString( + R.string.location_time_zone_detection_status_summary_degraded_by_settings)) + .thenReturn("DBS"); } @Test @@ -124,7 +92,26 @@ public class LocationProviderStatusPreferenceControllerTest { BasePreferenceController.CONDITIONALLY_UNAVAILABLE); capabilitiesAndConfig = createCapabilitiesAndConfig(false, - PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS, + 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_OK, + PROVIDER_STATUS_IS_UNCERTAIN, DEPENDENCY_STATUS_BLOCKED_BY_SETTINGS); + when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig); + + assertThat(controller.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.AVAILABLE_UNSEARCHABLE); + + // Test whether reportable statuses that can still result in the LTZP being "certain" are + // reported. + + capabilitiesAndConfig = createCapabilitiesAndConfig(false, + PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_DEGRADED_BY_SETTINGS, PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK); when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig); @@ -132,20 +119,28 @@ public class LocationProviderStatusPreferenceControllerTest { 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_CERTAIN, DEPENDENCY_STATUS_DEGRADED_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_DEGRADED_BY_SETTINGS, + 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_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); - when(mTimeManager.getTimeZoneCapabilitiesAndConfig()).thenReturn(capabilitiesAndConfig); - - assertThat(controller.getAvailabilityStatus()).isEqualTo( - BasePreferenceController.AVAILABLE_UNSEARCHABLE); - - capabilitiesAndConfig = createCapabilitiesAndConfig(false, DEPENDENCY_STATUS_OK, null); + PROVIDER_STATUS_IS_CERTAIN, DEPENDENCY_STATUS_OK, + PROVIDER_STATUS_IS_UNCERTAIN, 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_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_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(