Merge "Support geo-tz detection on non-telephony devices"

This commit is contained in:
Neil Fuller
2022-11-25 15:44:50 +00:00
committed by Android (Google) Code Review
6 changed files with 317 additions and 76 deletions

View File

@@ -109,7 +109,7 @@ public final class ConfigurationInternal {
* testing only. See {@link #isGeoDetectionExecutionEnabled()} and {@link #getDetectionMode()}
* for details.
*/
boolean getGeoDetectionRunInBackgroundEnabled() {
boolean getGeoDetectionRunInBackgroundEnabledSetting() {
return mGeoDetectionRunInBackgroundEnabled;
}
@@ -132,7 +132,7 @@ public final class ConfigurationInternal {
* from the raw setting value.
*/
public boolean getAutoDetectionEnabledBehavior() {
return isAutoDetectionSupported() && mAutoDetectionEnabledSetting;
return isAutoDetectionSupported() && getAutoDetectionEnabledSetting();
}
/** Returns the ID of the user this configuration is associated with. */
@@ -171,27 +171,55 @@ public final class ConfigurationInternal {
* time zone.
*/
public @DetectionMode int getDetectionMode() {
if (!getAutoDetectionEnabledBehavior()) {
if (!isAutoDetectionSupported()) {
// Handle the easy case first: No auto detection algorithms supported must mean manual.
return DETECTION_MODE_MANUAL;
} else if (isGeoDetectionSupported() && getLocationEnabledSetting()
&& getGeoDetectionEnabledSetting()) {
} else if (!getAutoDetectionEnabledSetting()) {
// Auto detection algorithms are supported, but disabled by the user.
return DETECTION_MODE_MANUAL;
} else if (getGeoDetectionEnabledBehavior()) {
return DETECTION_MODE_GEO;
} else {
} else if (isTelephonyDetectionSupported()) {
return DETECTION_MODE_TELEPHONY;
} else {
// On devices with telephony detection support, telephony is used instead of geo when
// geo cannot be used. This "unknown" case can occur on devices with only the location
// detection algorithm supported when the user's master location setting prevents its
// use.
return DETECTION_MODE_UNKNOWN;
}
}
private boolean getGeoDetectionEnabledBehavior() {
// isAutoDetectionSupported() should already have been checked before calling this method.
if (isGeoDetectionSupported() && getLocationEnabledSetting()) {
if (isTelephonyDetectionSupported()) {
// This is the "normal" case for smartphones that have both telephony and geo
// detection: the user chooses which type of detection to use.
return getGeoDetectionEnabledSetting();
} else {
// When only geo detection is supported then there is no choice for the user to
// make between detection modes, so no user setting is consulted.
return true;
}
}
return false;
}
/**
* Returns true if geolocation time zone detection behavior can execute. Typically, this will
* agree with {@link #getDetectionMode()}, but under rare circumstances the geolocation detector
* may be run in the background if the user's settings allow. See also {@link
* #getGeoDetectionRunInBackgroundEnabled()}.
* may be run in the background if the user's settings allow.
*/
public boolean isGeoDetectionExecutionEnabled() {
return getDetectionMode() == DETECTION_MODE_GEO
|| getGeoDetectionRunInBackgroundEnabledBehavior();
}
private boolean getGeoDetectionRunInBackgroundEnabledBehavior() {
return isGeoDetectionSupported()
&& getLocationEnabledSetting()
&& ((mAutoDetectionEnabledSetting && getGeoDetectionEnabledSetting())
|| getGeoDetectionRunInBackgroundEnabled());
&& getGeoDetectionRunInBackgroundEnabledSetting();
}
@NonNull
@@ -216,11 +244,19 @@ public final class ConfigurationInternal {
builder.setConfigureAutoDetectionEnabledCapability(configureAutoDetectionEnabledCapability);
boolean deviceHasLocationTimeZoneDetection = isGeoDetectionSupported();
boolean deviceHasTelephonyDetection = isTelephonyDetectionSupported();
// Note: allowConfigDateTime does not restrict the ability to change location time zone
// detection enabled. This is intentional as it has user privacy implications and so it
// makes sense to leave this under a user's control.
// makes sense to leave this under a user's control. The only time this is not true is
// on devices that only support location-based detection and the main auto detection setting
// is used to influence whether location can be used.
final @CapabilityState int configureGeolocationDetectionEnabledCapability;
if (!deviceHasLocationTimeZoneDetection) {
if (!deviceHasLocationTimeZoneDetection || !deviceHasTelephonyDetection) {
// If the device doesn't have geolocation detection support OR it ONLY has geolocation
// detection support (no telephony) then the user doesn't need the ability to toggle the
// location-based detection on and off (the auto detection toggle is considered
// sufficient).
configureGeolocationDetectionEnabledCapability = CAPABILITY_NOT_SUPPORTED;
} else if (!mAutoDetectionEnabledSetting || !getLocationEnabledSetting()) {
configureGeolocationDetectionEnabledCapability = CAPABILITY_NOT_APPLICABLE;

View File

@@ -136,7 +136,7 @@ public final class MetricsTimeZoneDetectorState {
* testing only.
*/
public boolean getGeoDetectionRunInBackgroundEnabled() {
return mConfigurationInternal.getGeoDetectionRunInBackgroundEnabled();
return mConfigurationInternal.getGeoDetectionRunInBackgroundEnabledSetting();
}
/** Returns true if enhanced metric collection is enabled. */

View File

@@ -279,15 +279,18 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor {
final boolean autoDetectionEnabled = configuration.isAutoDetectionEnabled();
setAutoDetectionEnabledIfRequired(autoDetectionEnabled);
// Avoid writing the geo detection enabled setting for devices with settings that
// are currently overridden by server flags: otherwise we might overwrite a droidfood
// user's real setting permanently.
// Also avoid writing the geo detection enabled setting for devices that do not support
// geo time zone detection: if we wrote it down then we'd set the value explicitly,
// which would prevent detecting "default" later. That might influence what happens on
// later releases that start to support geo detection on the same hardware.
// Only write the geo detection enabled setting when its values is used, e.g.:
// 1) Devices with a setting value that is not currently overridden by server flags
// 2) Devices that support both telephony and location detection algorithms
//
// If we wrote a setting value down when it's not used then we'd be setting the value
// explicitly, which would prevent detecting the setting is in "default" state later.
// Not being able to detect if the user has actually expressed a preference could
// influence what happens on later releases that start to support geo detection on the
// user's same hardware.
if (!getGeoDetectionSettingEnabledOverride().isPresent()
&& isGeoTimeZoneDetectionFeatureSupported()) {
&& isGeoTimeZoneDetectionFeatureSupported()
&& isTelephonyTimeZoneDetectionFeatureSupported()) {
final boolean geoDetectionEnabledSetting = configuration.isGeoDetectionEnabled();
setGeoDetectionEnabledSettingIfRequired(userId, geoDetectionEnabledSetting);
}

View File

@@ -47,6 +47,7 @@ import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.SystemTimeZone.TimeZoneConfidence;
import com.android.server.timezonedetector.ConfigurationInternal.DetectionMode;
import java.io.PrintWriter;
import java.time.Duration;
@@ -597,9 +598,10 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
@GuardedBy("this")
private void doAutoTimeZoneDetection(
@NonNull ConfigurationInternal currentUserConfig, @NonNull String detectionReason) {
// Use the correct algorithm based on the user's current configuration. If it changes, then
// detection will be re-run.
switch (currentUserConfig.getDetectionMode()) {
// Use the correct detection algorithm based on the device's config and the user's current
// configuration. If user config changes, then detection will be re-run.
@DetectionMode int detectionMode = currentUserConfig.getDetectionMode();
switch (detectionMode) {
case ConfigurationInternal.DETECTION_MODE_MANUAL:
// No work to do.
break;
@@ -635,9 +637,14 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
case ConfigurationInternal.DETECTION_MODE_TELEPHONY:
doTelephonyTimeZoneDetection(detectionReason);
break;
case ConfigurationInternal.DETECTION_MODE_UNKNOWN:
// The "DETECTION_MODE_UNKNOWN" state can occur on devices with only location
// detection algorithm support and when the user's master location toggle is off.
Slog.i(LOG_TAG, "Unknown detection mode: " + detectionMode + ", is location off?");
break;
default:
Slog.wtf(LOG_TAG, "Unknown detection mode: "
+ currentUserConfig.getDetectionMode());
// Coding error
Slog.wtf(LOG_TAG, "Unknown detection mode: " + detectionMode);
}
}

View File

@@ -24,6 +24,7 @@ import static android.app.time.Capabilities.CAPABILITY_POSSESSED;
import static com.android.server.timezonedetector.ConfigurationInternal.DETECTION_MODE_GEO;
import static com.android.server.timezonedetector.ConfigurationInternal.DETECTION_MODE_MANUAL;
import static com.android.server.timezonedetector.ConfigurationInternal.DETECTION_MODE_TELEPHONY;
import static com.android.server.timezonedetector.ConfigurationInternal.DETECTION_MODE_UNKNOWN;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -51,11 +52,11 @@ public class ConfigurationInternalTest {
/**
* Tests {@link TimeCapabilitiesAndConfig} behavior in different scenarios when auto detection
* is supported (and geo detection is supported)
* is supported (both telephony and geo detection are supported)
*/
@Test
@Parameters({ "true,true", "true,false", "false,true", "false,false" })
public void test_autoDetectionSupported_capabilitiesAndConfiguration(
public void test_telephonyAndGeoSupported_capabilitiesAndConfiguration(
boolean userConfigAllowed, boolean bypassUserPolicyChecks) {
ConfigurationInternal baseConfig = new ConfigurationInternal.Builder()
.setUserId(ARBITRARY_USER_ID)
@@ -72,18 +73,20 @@ public class ConfigurationInternalTest {
boolean userRestrictionsExpected = !(userConfigAllowed || bypassUserPolicyChecks);
// Auto-detection enabled.
// Auto-detection enabled, location enabled.
{
ConfigurationInternal autoOnConfig = new ConfigurationInternal.Builder(baseConfig)
ConfigurationInternal config = new ConfigurationInternal.Builder(baseConfig)
.setAutoDetectionEnabledSetting(true)
.setLocationEnabledSetting(true)
.build();
assertTrue(autoOnConfig.getAutoDetectionEnabledSetting());
assertTrue(autoOnConfig.getGeoDetectionEnabledSetting());
assertTrue(autoOnConfig.getAutoDetectionEnabledBehavior());
assertTrue(autoOnConfig.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_GEO, autoOnConfig.getDetectionMode());
assertTrue(config.getAutoDetectionEnabledSetting());
assertTrue(config.getLocationEnabledSetting());
assertTrue(config.getGeoDetectionEnabledSetting());
assertTrue(config.getAutoDetectionEnabledBehavior());
assertTrue(config.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_GEO, config.getDetectionMode());
TimeZoneCapabilities capabilities = autoOnConfig.asCapabilities(bypassUserPolicyChecks);
TimeZoneCapabilities capabilities = config.asCapabilities(bypassUserPolicyChecks);
if (userRestrictionsExpected) {
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getConfigureAutoDetectionEnabledCapability());
@@ -99,24 +102,58 @@ public class ConfigurationInternalTest {
assertEquals(CAPABILITY_POSSESSED,
capabilities.getConfigureGeoDetectionEnabledCapability());
TimeZoneConfiguration configuration = autoOnConfig.asConfiguration();
TimeZoneConfiguration configuration = config.asConfiguration();
assertTrue(configuration.isAutoDetectionEnabled());
assertTrue(configuration.isGeoDetectionEnabled());
}
// Auto-detection enabled, location disabled.
{
ConfigurationInternal config = new ConfigurationInternal.Builder(baseConfig)
.setAutoDetectionEnabledSetting(true)
.setLocationEnabledSetting(false)
.build();
assertTrue(config.getAutoDetectionEnabledSetting());
assertFalse(config.getLocationEnabledSetting());
assertTrue(config.getGeoDetectionEnabledSetting());
assertTrue(config.getAutoDetectionEnabledBehavior());
assertFalse(config.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_TELEPHONY, config.getDetectionMode());
TimeZoneCapabilities capabilities = config.asCapabilities(bypassUserPolicyChecks);
if (userRestrictionsExpected) {
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getConfigureAutoDetectionEnabledCapability());
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getSetManualTimeZoneCapability());
} else {
assertEquals(CAPABILITY_POSSESSED,
capabilities.getConfigureAutoDetectionEnabledCapability());
assertEquals(CAPABILITY_NOT_APPLICABLE,
capabilities.getSetManualTimeZoneCapability());
}
// This has user privacy implications so it is not restricted in the same way as others.
assertEquals(CAPABILITY_NOT_APPLICABLE,
capabilities.getConfigureGeoDetectionEnabledCapability());
TimeZoneConfiguration configuration = config.asConfiguration();
assertTrue(configuration.isAutoDetectionEnabled());
assertTrue(configuration.isGeoDetectionEnabled());
}
// Auto-detection disabled.
{
ConfigurationInternal autoOffConfig = new ConfigurationInternal.Builder(baseConfig)
ConfigurationInternal config = new ConfigurationInternal.Builder(baseConfig)
.setAutoDetectionEnabledSetting(false)
.build();
assertFalse(autoOffConfig.getAutoDetectionEnabledSetting());
assertTrue(autoOffConfig.getGeoDetectionEnabledSetting());
assertFalse(autoOffConfig.getAutoDetectionEnabledBehavior());
assertFalse(autoOffConfig.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_MANUAL, autoOffConfig.getDetectionMode());
assertFalse(config.getAutoDetectionEnabledSetting());
assertTrue(config.getLocationEnabledSetting());
assertTrue(config.getGeoDetectionEnabledSetting());
assertFalse(config.getAutoDetectionEnabledBehavior());
assertFalse(config.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_MANUAL, config.getDetectionMode());
TimeZoneCapabilities capabilities =
autoOffConfig.asCapabilities(bypassUserPolicyChecks);
TimeZoneCapabilities capabilities = config.asCapabilities(bypassUserPolicyChecks);
if (userRestrictionsExpected) {
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getConfigureAutoDetectionEnabledCapability());
@@ -132,7 +169,7 @@ public class ConfigurationInternalTest {
assertEquals(CAPABILITY_NOT_APPLICABLE,
capabilities.getConfigureGeoDetectionEnabledCapability());
TimeZoneConfiguration configuration = autoOffConfig.asConfiguration();
TimeZoneConfiguration configuration = config.asConfiguration();
assertFalse(configuration.isAutoDetectionEnabled());
assertTrue(configuration.isGeoDetectionEnabled());
}
@@ -161,18 +198,20 @@ public class ConfigurationInternalTest {
boolean userRestrictionsExpected = !(userConfigAllowed || bypassUserPolicyChecks);
// Auto-detection enabled.
// Auto-detection enabled, location enabled.
{
ConfigurationInternal autoOnConfig = new ConfigurationInternal.Builder(baseConfig)
ConfigurationInternal config = new ConfigurationInternal.Builder(baseConfig)
.setAutoDetectionEnabledSetting(true)
.setLocationEnabledSetting(true)
.build();
assertTrue(autoOnConfig.getAutoDetectionEnabledSetting());
assertTrue(autoOnConfig.getGeoDetectionEnabledSetting());
assertFalse(autoOnConfig.getAutoDetectionEnabledBehavior());
assertFalse(autoOnConfig.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_MANUAL, autoOnConfig.getDetectionMode());
assertTrue(config.getAutoDetectionEnabledSetting());
assertTrue(config.getLocationEnabledSetting());
assertTrue(config.getGeoDetectionEnabledSetting());
assertFalse(config.getAutoDetectionEnabledBehavior());
assertFalse(config.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_MANUAL, config.getDetectionMode());
TimeZoneCapabilities capabilities = autoOnConfig.asCapabilities(bypassUserPolicyChecks);
TimeZoneCapabilities capabilities = config.asCapabilities(bypassUserPolicyChecks);
assertEquals(CAPABILITY_NOT_SUPPORTED,
capabilities.getConfigureAutoDetectionEnabledCapability());
if (userRestrictionsExpected) {
@@ -183,7 +222,36 @@ public class ConfigurationInternalTest {
assertEquals(CAPABILITY_NOT_SUPPORTED,
capabilities.getConfigureGeoDetectionEnabledCapability());
TimeZoneConfiguration configuration = autoOnConfig.asConfiguration();
TimeZoneConfiguration configuration = config.asConfiguration();
assertTrue(configuration.isAutoDetectionEnabled());
assertTrue(configuration.isGeoDetectionEnabled());
}
// Auto-detection enabled, location disabled.
{
ConfigurationInternal config = new ConfigurationInternal.Builder(baseConfig)
.setAutoDetectionEnabledSetting(true)
.setLocationEnabledSetting(false)
.build();
assertTrue(config.getAutoDetectionEnabledSetting());
assertFalse(config.getLocationEnabledSetting());
assertTrue(config.getGeoDetectionEnabledSetting());
assertFalse(config.getAutoDetectionEnabledBehavior());
assertFalse(config.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_MANUAL, config.getDetectionMode());
TimeZoneCapabilities capabilities = config.asCapabilities(bypassUserPolicyChecks);
assertEquals(CAPABILITY_NOT_SUPPORTED,
capabilities.getConfigureAutoDetectionEnabledCapability());
if (userRestrictionsExpected) {
assertEquals(CAPABILITY_NOT_ALLOWED, capabilities.getSetManualTimeZoneCapability());
} else {
assertEquals(CAPABILITY_POSSESSED, capabilities.getSetManualTimeZoneCapability());
}
assertEquals(CAPABILITY_NOT_SUPPORTED,
capabilities.getConfigureGeoDetectionEnabledCapability());
TimeZoneConfiguration configuration = config.asConfiguration();
assertTrue(configuration.isAutoDetectionEnabled());
assertTrue(configuration.isGeoDetectionEnabled());
}
@@ -219,11 +287,11 @@ public class ConfigurationInternalTest {
/**
* Tests {@link TimeCapabilitiesAndConfig} behavior in different scenarios when auto detection
* is supported (and geo detection is not supported).
* is supported (telephony only).
*/
@Test
@Parameters({ "true,true", "true,false", "false,true", "false,false" })
public void test_geoDetectNotSupported_capabilitiesAndConfiguration(
public void test_onlyTelephonySupported_capabilitiesAndConfiguration(
boolean userConfigAllowed, boolean bypassUserPolicyChecks) {
ConfigurationInternal baseConfig = new ConfigurationInternal.Builder()
.setUserId(ARBITRARY_USER_ID)
@@ -242,16 +310,16 @@ public class ConfigurationInternalTest {
// Auto-detection enabled.
{
ConfigurationInternal autoOnConfig = new ConfigurationInternal.Builder(baseConfig)
ConfigurationInternal config = new ConfigurationInternal.Builder(baseConfig)
.setAutoDetectionEnabledSetting(true)
.build();
assertTrue(autoOnConfig.getAutoDetectionEnabledSetting());
assertTrue(autoOnConfig.getGeoDetectionEnabledSetting());
assertTrue(autoOnConfig.getAutoDetectionEnabledBehavior());
assertFalse(autoOnConfig.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_TELEPHONY, autoOnConfig.getDetectionMode());
assertTrue(config.getAutoDetectionEnabledSetting());
assertTrue(config.getGeoDetectionEnabledSetting());
assertTrue(config.getAutoDetectionEnabledBehavior());
assertFalse(config.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_TELEPHONY, config.getDetectionMode());
TimeZoneCapabilities capabilities = autoOnConfig.asCapabilities(bypassUserPolicyChecks);
TimeZoneCapabilities capabilities = config.asCapabilities(bypassUserPolicyChecks);
if (userRestrictionsExpected) {
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getConfigureAutoDetectionEnabledCapability());
@@ -266,24 +334,23 @@ public class ConfigurationInternalTest {
assertEquals(CAPABILITY_NOT_SUPPORTED,
capabilities.getConfigureGeoDetectionEnabledCapability());
TimeZoneConfiguration configuration = autoOnConfig.asConfiguration();
TimeZoneConfiguration configuration = config.asConfiguration();
assertTrue(configuration.isAutoDetectionEnabled());
assertTrue(configuration.isGeoDetectionEnabled());
}
// Auto-detection disabled.
{
ConfigurationInternal autoOffConfig = new ConfigurationInternal.Builder(baseConfig)
ConfigurationInternal config = new ConfigurationInternal.Builder(baseConfig)
.setAutoDetectionEnabledSetting(false)
.build();
assertFalse(autoOffConfig.getAutoDetectionEnabledSetting());
assertTrue(autoOffConfig.getGeoDetectionEnabledSetting());
assertFalse(autoOffConfig.getAutoDetectionEnabledBehavior());
assertFalse(autoOffConfig.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_MANUAL, autoOffConfig.getDetectionMode());
assertFalse(config.getAutoDetectionEnabledSetting());
assertTrue(config.getGeoDetectionEnabledSetting());
assertFalse(config.getAutoDetectionEnabledBehavior());
assertFalse(config.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_MANUAL, config.getDetectionMode());
TimeZoneCapabilities capabilities =
autoOffConfig.asCapabilities(bypassUserPolicyChecks);
TimeZoneCapabilities capabilities = config.asCapabilities(bypassUserPolicyChecks);
if (userRestrictionsExpected) {
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getConfigureAutoDetectionEnabledCapability());
@@ -296,12 +363,137 @@ public class ConfigurationInternalTest {
assertEquals(CAPABILITY_NOT_SUPPORTED,
capabilities.getConfigureGeoDetectionEnabledCapability());
TimeZoneConfiguration configuration = autoOffConfig.asConfiguration();
TimeZoneConfiguration configuration = config.asConfiguration();
assertFalse(configuration.isAutoDetectionEnabled());
assertTrue(configuration.isGeoDetectionEnabled());
}
}
/**
* Tests {@link TimeCapabilitiesAndConfig} behavior in different scenarios when auto detection
* is supported (only geo detection)
*/
@Test
@Parameters({ "true,true", "true,false", "false,true", "false,false" })
public void test_onlyGeoSupported_capabilitiesAndConfiguration(
boolean userConfigAllowed, boolean bypassUserPolicyChecks) {
ConfigurationInternal baseConfig = new ConfigurationInternal.Builder()
.setUserId(ARBITRARY_USER_ID)
.setUserConfigAllowed(userConfigAllowed)
.setTelephonyDetectionFeatureSupported(false)
.setGeoDetectionFeatureSupported(true)
.setGeoDetectionRunInBackgroundEnabled(false)
.setTelephonyFallbackSupported(false)
.setEnhancedMetricsCollectionEnabled(false)
.setAutoDetectionEnabledSetting(true)
.setLocationEnabledSetting(true)
.setGeoDetectionEnabledSetting(false)
.build();
boolean userRestrictionsExpected = !(userConfigAllowed || bypassUserPolicyChecks);
// Auto-detection enabled, location enabled.
{
ConfigurationInternal config = new ConfigurationInternal.Builder(baseConfig)
.setAutoDetectionEnabledSetting(true)
.setLocationEnabledSetting(true)
.build();
assertTrue(config.getAutoDetectionEnabledSetting());
assertTrue(config.getLocationEnabledSetting());
assertFalse(config.getGeoDetectionEnabledSetting());
assertTrue(config.getAutoDetectionEnabledBehavior());
assertTrue(config.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_GEO, config.getDetectionMode());
TimeZoneCapabilities capabilities = config.asCapabilities(bypassUserPolicyChecks);
if (userRestrictionsExpected) {
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getConfigureAutoDetectionEnabledCapability());
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getSetManualTimeZoneCapability());
} else {
assertEquals(CAPABILITY_POSSESSED,
capabilities.getConfigureAutoDetectionEnabledCapability());
assertEquals(CAPABILITY_NOT_APPLICABLE,
capabilities.getSetManualTimeZoneCapability());
}
// This capability is always "not supported" if geo detection is the only mechanism.
assertEquals(CAPABILITY_NOT_SUPPORTED,
capabilities.getConfigureGeoDetectionEnabledCapability());
TimeZoneConfiguration configuration = config.asConfiguration();
assertTrue(configuration.isAutoDetectionEnabled());
assertFalse(configuration.isGeoDetectionEnabled());
}
// Auto-detection enabled, location disabled.
{
ConfigurationInternal config = new ConfigurationInternal.Builder(baseConfig)
.setAutoDetectionEnabledSetting(true)
.setLocationEnabledSetting(false)
.build();
assertTrue(config.getAutoDetectionEnabledSetting());
assertFalse(config.getLocationEnabledSetting());
assertFalse(config.getGeoDetectionEnabledSetting());
assertTrue(config.getAutoDetectionEnabledBehavior());
assertFalse(config.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_UNKNOWN, config.getDetectionMode());
TimeZoneCapabilities capabilities = config.asCapabilities(bypassUserPolicyChecks);
if (userRestrictionsExpected) {
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getConfigureAutoDetectionEnabledCapability());
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getSetManualTimeZoneCapability());
} else {
assertEquals(CAPABILITY_POSSESSED,
capabilities.getConfigureAutoDetectionEnabledCapability());
assertEquals(CAPABILITY_NOT_APPLICABLE,
capabilities.getSetManualTimeZoneCapability());
}
// This capability is always "not supported" if geo detection is the only mechanism.
assertEquals(CAPABILITY_NOT_SUPPORTED,
capabilities.getConfigureGeoDetectionEnabledCapability());
TimeZoneConfiguration configuration = config.asConfiguration();
assertTrue(configuration.isAutoDetectionEnabled());
assertFalse(configuration.isGeoDetectionEnabled());
}
// Auto-detection disabled.
{
ConfigurationInternal autoOffConfig = new ConfigurationInternal.Builder(baseConfig)
.setAutoDetectionEnabledSetting(false)
.build();
assertFalse(autoOffConfig.getAutoDetectionEnabledSetting());
assertFalse(autoOffConfig.getGeoDetectionEnabledSetting());
assertFalse(autoOffConfig.getAutoDetectionEnabledBehavior());
assertFalse(autoOffConfig.isGeoDetectionExecutionEnabled());
assertEquals(DETECTION_MODE_MANUAL, autoOffConfig.getDetectionMode());
TimeZoneCapabilities capabilities =
autoOffConfig.asCapabilities(bypassUserPolicyChecks);
if (userRestrictionsExpected) {
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getConfigureAutoDetectionEnabledCapability());
assertEquals(CAPABILITY_NOT_ALLOWED,
capabilities.getSetManualTimeZoneCapability());
} else {
assertEquals(CAPABILITY_POSSESSED,
capabilities.getConfigureAutoDetectionEnabledCapability());
assertEquals(CAPABILITY_POSSESSED,
capabilities.getSetManualTimeZoneCapability());
}
// This capability is always "not supported" if geo detection is the only mechanism.
assertEquals(CAPABILITY_NOT_SUPPORTED,
capabilities.getConfigureGeoDetectionEnabledCapability());
TimeZoneConfiguration configuration = autoOffConfig.asConfiguration();
assertFalse(configuration.isAutoDetectionEnabled());
assertFalse(configuration.isGeoDetectionEnabled());
}
}
@Test
public void test_telephonyFallbackSupported() {
ConfigurationInternal config = new ConfigurationInternal.Builder()
@@ -317,7 +509,10 @@ public class ConfigurationInternalTest {
assertTrue(config.isTelephonyFallbackSupported());
}
/** Tests when {@link ConfigurationInternal#getGeoDetectionRunInBackgroundEnabled()} is true. */
/**
* Tests when {@link ConfigurationInternal#getGeoDetectionRunInBackgroundEnabledSetting()}
* is true.
*/
@Test
public void test_geoDetectionRunInBackgroundEnabled() {
ConfigurationInternal baseConfig = new ConfigurationInternal.Builder()

View File

@@ -158,7 +158,7 @@ public class MetricsTimeZoneDetectorStateTest {
metricsTimeZoneDetectorState.isGeoDetectionSupported());
assertEquals(configurationInternal.isTelephonyFallbackSupported(),
metricsTimeZoneDetectorState.isTelephonyTimeZoneFallbackSupported());
assertEquals(configurationInternal.getGeoDetectionRunInBackgroundEnabled(),
assertEquals(configurationInternal.getGeoDetectionRunInBackgroundEnabledSetting(),
metricsTimeZoneDetectorState.getGeoDetectionRunInBackgroundEnabled());
assertEquals(configurationInternal.isEnhancedMetricsCollectionEnabled(),
metricsTimeZoneDetectorState.isEnhancedMetricsCollectionEnabled());