Merge changes Ifd96c543,I1a0faa44

* changes:
  Further status logic tweaks
  Tweak status display logic and tests
This commit is contained in:
Neil Fuller
2023-02-15 15:15:21 +00:00
committed by Android (Google) Code Review
2 changed files with 116 additions and 99 deletions

View File

@@ -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 "";
}

View File

@@ -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(