summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/timedetector/EnvironmentImpl.java (renamed from services/core/java/com/android/server/timedetector/TimeDetectorStrategyCallbackImpl.java)11
-rw-r--r--services/core/java/com/android/server/timedetector/TimeDetectorService.java6
-rw-r--r--services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java67
-rw-r--r--services/core/java/com/android/server/timezonedetector/EnvironmentImpl.java (renamed from services/core/java/com/android/server/timezonedetector/TimeZoneDetectorCallbackImpl.java)16
-rw-r--r--services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java20
-rw-r--r--services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java65
-rw-r--r--services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerService.java20
-rw-r--r--services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java46
-rw-r--r--services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java48
9 files changed, 154 insertions, 145 deletions
diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyCallbackImpl.java b/services/core/java/com/android/server/timedetector/EnvironmentImpl.java
index 4f3f9dce8adb..5cd171839996 100644
--- a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyCallbackImpl.java
+++ b/services/core/java/com/android/server/timedetector/EnvironmentImpl.java
@@ -25,7 +25,6 @@ import android.app.AlarmManager;
import android.content.ContentResolver;
import android.content.Context;
import android.os.Build;
-import android.os.Environment;
import android.os.PowerManager;
import android.os.SystemClock;
import android.os.SystemProperties;
@@ -39,11 +38,11 @@ import java.time.Instant;
import java.util.Objects;
/**
- * The real implementation of {@link TimeDetectorStrategyImpl.Callback} used on device.
+ * The real implementation of {@link TimeDetectorStrategyImpl.Environment} used on device.
*/
-public final class TimeDetectorStrategyCallbackImpl implements TimeDetectorStrategyImpl.Callback {
+public final class EnvironmentImpl implements TimeDetectorStrategyImpl.Environment {
- private final static String TAG = "timedetector.TimeDetectorStrategyCallbackImpl";
+ private static final String TAG = TimeDetectorService.TAG;
private static final int SYSTEM_CLOCK_UPDATE_THRESHOLD_MILLIS_DEFAULT = 2 * 1000;
@@ -52,7 +51,7 @@ public final class TimeDetectorStrategyCallbackImpl implements TimeDetectorStrat
* incorrect for sure.
*/
private static final Instant TIME_LOWER_BOUND = Instant.ofEpochMilli(
- Long.max(Environment.getRootDirectory().lastModified(), Build.TIME));
+ Long.max(android.os.Environment.getRootDirectory().lastModified(), Build.TIME));
/**
* By default telephony and network only suggestions are accepted and telephony takes
@@ -74,7 +73,7 @@ public final class TimeDetectorStrategyCallbackImpl implements TimeDetectorStrat
@NonNull private final AlarmManager mAlarmManager;
@NonNull private final int[] mOriginPriorities;
- public TimeDetectorStrategyCallbackImpl(@NonNull Context context) {
+ public EnvironmentImpl(@NonNull Context context) {
mContext = Objects.requireNonNull(context);
mContentResolver = Objects.requireNonNull(context.getContentResolver());
diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorService.java b/services/core/java/com/android/server/timedetector/TimeDetectorService.java
index 71b1a49f0d10..bbbd19f7a49e 100644
--- a/services/core/java/com/android/server/timedetector/TimeDetectorService.java
+++ b/services/core/java/com/android/server/timedetector/TimeDetectorService.java
@@ -50,7 +50,7 @@ import java.util.Objects;
* implementation to deal with the logic around time detection.
*/
public final class TimeDetectorService extends ITimeDetectorService.Stub {
- private static final String TAG = "TimeDetectorService";
+ static final String TAG = "time_detector";
public static class Lifecycle extends SystemService {
@@ -73,8 +73,8 @@ public final class TimeDetectorService extends ITimeDetectorService.Stub {
@NonNull private final TimeDetectorStrategy mTimeDetectorStrategy;
private static TimeDetectorService create(@NonNull Context context) {
- TimeDetectorStrategyImpl.Callback callback = new TimeDetectorStrategyCallbackImpl(context);
- TimeDetectorStrategy timeDetectorStrategy = new TimeDetectorStrategyImpl(callback);
+ TimeDetectorStrategyImpl.Environment environment = new EnvironmentImpl(context);
+ TimeDetectorStrategy timeDetectorStrategy = new TimeDetectorStrategyImpl(environment);
Handler handler = FgThread.getHandler();
TimeDetectorService timeDetectorService =
diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java
index 2fbeb7535ab5..7cd4184f2bc9 100644
--- a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java
+++ b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java
@@ -40,6 +40,7 @@ import com.android.server.timezonedetector.ReferenceWithHistory;
import java.time.Instant;
import java.util.Arrays;
+import java.util.Objects;
/**
* An implementation of {@link TimeDetectorStrategy} that passes telephony and manual suggestions to
@@ -51,7 +52,7 @@ import java.util.Arrays;
public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
private static final boolean DBG = false;
- private static final String LOG_TAG = "SimpleTimeDetectorStrategy";
+ private static final String LOG_TAG = TimeDetectorService.TAG;
/** A score value used to indicate "no score", either due to validation failure or age. */
private static final int TELEPHONY_INVALID_SCORE = -1;
@@ -88,7 +89,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
private final LocalLog mTimeChangesLog = new LocalLog(30, false /* useLocalTimestamps */);
@NonNull
- private final Callback mCallback;
+ private final Environment mEnvironment;
// Used to store the last time the system clock state was set automatically. It is used to
// detect (and log) issues with the realtime clock or whether the clock is being set without
@@ -127,7 +128,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
* moved to {@link TimeDetectorStrategy}. There are similar issues with
* {@link #systemClockMillis()} while any process can modify the system clock.
*/
- public interface Callback {
+ public interface Environment {
/**
* The absolute threshold below which the system clock need not be updated. i.e. if setting
@@ -170,8 +171,8 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
void releaseWakeLock();
}
- TimeDetectorStrategyImpl(@NonNull Callback callback) {
- mCallback = callback;
+ TimeDetectorStrategyImpl(@NonNull Environment environment) {
+ mEnvironment = Objects.requireNonNull(environment);
}
@Override
@@ -267,7 +268,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
@Override
public synchronized void handleAutoTimeConfigChanged() {
- boolean enabled = mCallback.isAutoTimeDetectionEnabled();
+ boolean enabled = mEnvironment.isAutoTimeDetectionEnabled();
// When automatic time detection is enabled we update the system clock instantly if we can.
// Conversely, when automatic time detection is disabled we leave the clock as it is.
if (enabled) {
@@ -286,20 +287,20 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
ipw.increaseIndent(); // level 1
ipw.println("mLastAutoSystemClockTimeSet=" + mLastAutoSystemClockTimeSet);
- ipw.println("mCallback.isAutoTimeDetectionEnabled()="
- + mCallback.isAutoTimeDetectionEnabled());
- ipw.println("mCallback.elapsedRealtimeMillis()=" + mCallback.elapsedRealtimeMillis());
- ipw.println("mCallback.systemClockMillis()=" + mCallback.systemClockMillis());
- ipw.println("mCallback.systemClockUpdateThresholdMillis()="
- + mCallback.systemClockUpdateThresholdMillis());
- ipw.printf("mCallback.autoTimeLowerBound()=%s(%s)\n",
- mCallback.autoTimeLowerBound(),
- mCallback.autoTimeLowerBound().toEpochMilli());
+ ipw.println("mEnvironment.isAutoTimeDetectionEnabled()="
+ + mEnvironment.isAutoTimeDetectionEnabled());
+ ipw.println("mEnvironment.elapsedRealtimeMillis()=" + mEnvironment.elapsedRealtimeMillis());
+ ipw.println("mEnvironment.systemClockMillis()=" + mEnvironment.systemClockMillis());
+ ipw.println("mEnvironment.systemClockUpdateThresholdMillis()="
+ + mEnvironment.systemClockUpdateThresholdMillis());
+ ipw.printf("mEnvironment.autoTimeLowerBound()=%s(%s)\n",
+ mEnvironment.autoTimeLowerBound(),
+ mEnvironment.autoTimeLowerBound().toEpochMilli());
String priorities =
- Arrays.stream(mCallback.autoOriginPriorities())
+ Arrays.stream(mEnvironment.autoOriginPriorities())
.mapToObj(TimeDetectorStrategy::originToString)
.collect(joining(",", "[", "]"));
- ipw.println("mCallback.autoOriginPriorities()=" + priorities);
+ ipw.println("mEnvironment.autoOriginPriorities()=" + priorities);
ipw.println("Time change log:");
ipw.increaseIndent(); // level 2
@@ -372,7 +373,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
}
// We can validate the suggestion against the reference time clock.
- long elapsedRealtimeMillis = mCallback.elapsedRealtimeMillis();
+ long elapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis();
if (elapsedRealtimeMillis < newUtcTime.getReferenceTimeMillis()) {
// elapsedRealtime clock went backwards?
Slog.w(LOG_TAG, "New reference time is in the future? Ignoring."
@@ -391,7 +392,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
private boolean validateSuggestionAgainstLowerBound(
@NonNull TimestampedValue<Long> newUtcTime, @NonNull Object suggestion) {
- Instant lowerBound = mCallback.autoTimeLowerBound();
+ Instant lowerBound = mEnvironment.autoTimeLowerBound();
// Suggestion is definitely wrong if it comes before lower time bound.
if (lowerBound.isAfter(Instant.ofEpochMilli(newUtcTime.getValue()))) {
@@ -405,13 +406,13 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
@GuardedBy("this")
private void doAutoTimeDetection(@NonNull String detectionReason) {
- if (!mCallback.isAutoTimeDetectionEnabled()) {
+ if (!mEnvironment.isAutoTimeDetectionEnabled()) {
// Avoid doing unnecessary work with this (race-prone) check.
return;
}
// Try the different origins one at a time.
- int[] originPriorities = mCallback.autoOriginPriorities();
+ int[] originPriorities = mEnvironment.autoOriginPriorities();
for (int origin : originPriorities) {
TimestampedValue<Long> newUtcTime = null;
String cause = null;
@@ -470,7 +471,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
@GuardedBy("this")
@Nullable
private TelephonyTimeSuggestion findBestTelephonySuggestion() {
- long elapsedRealtimeMillis = mCallback.elapsedRealtimeMillis();
+ long elapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis();
// Telephony time suggestions are assumed to be derived from NITZ or NITZ-like signals.
// These have a number of limitations:
@@ -579,7 +580,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
}
TimestampedValue<Long> utcTime = networkSuggestion.getUtcTime();
- long elapsedRealTimeMillis = mCallback.elapsedRealtimeMillis();
+ long elapsedRealTimeMillis = mEnvironment.elapsedRealtimeMillis();
if (!validateSuggestionUtcTime(elapsedRealTimeMillis, utcTime)) {
// The latest suggestion is not valid, usually due to its age.
return null;
@@ -599,7 +600,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
}
TimestampedValue<Long> utcTime = gnssTimeSuggestion.getUtcTime();
- long elapsedRealTimeMillis = mCallback.elapsedRealtimeMillis();
+ long elapsedRealTimeMillis = mEnvironment.elapsedRealtimeMillis();
if (!validateSuggestionUtcTime(elapsedRealTimeMillis, utcTime)) {
// The latest suggestion is not valid, usually due to its age.
return null;
@@ -619,7 +620,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
}
TimestampedValue<Long> utcTime = externalTimeSuggestion.getUtcTime();
- long elapsedRealTimeMillis = mCallback.elapsedRealtimeMillis();
+ long elapsedRealTimeMillis = mEnvironment.elapsedRealtimeMillis();
if (!validateSuggestionUtcTime(elapsedRealTimeMillis, utcTime)) {
// The latest suggestion is not valid, usually due to its age.
return null;
@@ -634,7 +635,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
boolean isOriginAutomatic = isOriginAutomatic(origin);
if (isOriginAutomatic) {
- if (!mCallback.isAutoTimeDetectionEnabled()) {
+ if (!mEnvironment.isAutoTimeDetectionEnabled()) {
if (DBG) {
Slog.d(LOG_TAG, "Auto time detection is not enabled."
+ " origin=" + originToString(origin)
@@ -644,7 +645,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
return false;
}
} else {
- if (mCallback.isAutoTimeDetectionEnabled()) {
+ if (mEnvironment.isAutoTimeDetectionEnabled()) {
if (DBG) {
Slog.d(LOG_TAG, "Auto time detection is enabled."
+ " origin=" + originToString(origin)
@@ -655,11 +656,11 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
}
}
- mCallback.acquireWakeLock();
+ mEnvironment.acquireWakeLock();
try {
return setSystemClockUnderWakeLock(origin, time, cause);
} finally {
- mCallback.releaseWakeLock();
+ mEnvironment.releaseWakeLock();
}
}
@@ -671,9 +672,9 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
private boolean setSystemClockUnderWakeLock(
@Origin int origin, @NonNull TimestampedValue<Long> newTime, @NonNull String cause) {
- long elapsedRealtimeMillis = mCallback.elapsedRealtimeMillis();
+ long elapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis();
boolean isOriginAutomatic = isOriginAutomatic(origin);
- long actualSystemClockMillis = mCallback.systemClockMillis();
+ long actualSystemClockMillis = mEnvironment.systemClockMillis();
if (isOriginAutomatic) {
// CLOCK_PARANOIA : Check to see if this class owns the clock or if something else
// may be setting the clock.
@@ -701,7 +702,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
// Check if the new signal would make sufficient difference to the system clock. If it's
// below the threshold then ignore it.
long absTimeDifference = Math.abs(newSystemClockMillis - actualSystemClockMillis);
- long systemClockUpdateThreshold = mCallback.systemClockUpdateThresholdMillis();
+ long systemClockUpdateThreshold = mEnvironment.systemClockUpdateThresholdMillis();
if (absTimeDifference < systemClockUpdateThreshold) {
if (DBG) {
Slog.d(LOG_TAG, "Not setting system clock. New time and"
@@ -715,7 +716,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
return true;
}
- mCallback.setSystemClock(newSystemClockMillis);
+ mEnvironment.setSystemClock(newSystemClockMillis);
String logMsg = "Set system clock using time=" + newTime
+ " cause=" + cause
+ " elapsedRealtimeMillis=" + elapsedRealtimeMillis
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorCallbackImpl.java b/services/core/java/com/android/server/timezonedetector/EnvironmentImpl.java
index 1357608ef9d4..3340792fe5e0 100644
--- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorCallbackImpl.java
+++ b/services/core/java/com/android/server/timezonedetector/EnvironmentImpl.java
@@ -44,30 +44,30 @@ import com.android.server.LocalServices;
import java.util.Objects;
/**
- * The real implementation of {@link TimeZoneDetectorStrategyImpl.Callback}.
+ * The real implementation of {@link TimeZoneDetectorStrategyImpl.Environment}.
*/
-public final class TimeZoneDetectorCallbackImpl implements TimeZoneDetectorStrategyImpl.Callback {
+public final class EnvironmentImpl implements TimeZoneDetectorStrategyImpl.Environment {
- private static final String LOG_TAG = "TimeZoneDetectorCallbackImpl";
+ private static final String LOG_TAG = TimeZoneDetectorService.TAG;
private static final String TIMEZONE_PROPERTY = "persist.sys.timezone";
@NonNull private final Context mContext;
@NonNull private final Handler mHandler;
@NonNull private final ContentResolver mCr;
@NonNull private final UserManager mUserManager;
- @NonNull private final boolean mGeoDetectionFeatureEnabled;
+ @NonNull private final boolean mGeoDetectionSupported;
@NonNull private final LocationManager mLocationManager;
// @NonNull after setConfigChangeListener() is called.
private ConfigurationChangeListener mConfigChangeListener;
- TimeZoneDetectorCallbackImpl(@NonNull Context context, @NonNull Handler handler,
- boolean geoDetectionFeatureEnabled) {
+ EnvironmentImpl(@NonNull Context context, @NonNull Handler handler,
+ boolean geoDetectionSupported) {
mContext = Objects.requireNonNull(context);
mHandler = Objects.requireNonNull(handler);
mCr = context.getContentResolver();
mUserManager = context.getSystemService(UserManager.class);
mLocationManager = context.getSystemService(LocationManager.class);
- mGeoDetectionFeatureEnabled = geoDetectionFeatureEnabled;
+ mGeoDetectionSupported = geoDetectionSupported;
// Wire up the change listener. All invocations are performed on the mHandler thread.
@@ -191,7 +191,7 @@ public final class TimeZoneDetectorCallbackImpl implements TimeZoneDetectorStrat
}
private boolean isGeoDetectionSupported() {
- return mGeoDetectionFeatureEnabled;
+ return mGeoDetectionSupported;
}
private boolean isAutoDetectionEnabled() {
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
index 2ead3bedab0f..bd71ddf67094 100644
--- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
+++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
@@ -59,7 +59,7 @@ import java.util.Objects;
public final class TimeZoneDetectorService extends ITimeZoneDetectorService.Stub
implements IBinder.DeathRecipient {
- private static final String TAG = "TimeZoneDetectorService";
+ static final String TAG = "time_zone_detector";
/**
* A "feature switch" for location-based time zone detection. If this is {@code false}. It is
@@ -67,19 +67,19 @@ public final class TimeZoneDetectorService extends ITimeZoneDetectorService.Stub
* is important.
*/
@Nullable
- private static Boolean sGeoLocationTimeZoneDetectionEnabled;
+ private static Boolean sGeoLocationTimeZoneDetectionSupported;
/** Returns {@code true} if the location-based time zone detection feature is enabled. */
- public static boolean isGeoLocationTimeZoneDetectionEnabled(Context context) {
- if (sGeoLocationTimeZoneDetectionEnabled == null) {
+ public static boolean isGeoLocationTimeZoneDetectionSupported(Context context) {
+ if (sGeoLocationTimeZoneDetectionSupported == null) {
// The config value is expected to be the main switch. Platform developers can also
// enable the feature using a persistent system property.
- sGeoLocationTimeZoneDetectionEnabled = context.getResources().getBoolean(
+ sGeoLocationTimeZoneDetectionSupported = context.getResources().getBoolean(
com.android.internal.R.bool.config_enableGeolocationTimeZoneDetection)
|| SystemProperties.getBoolean(
"persist.sys.location_time_zone_detection_feature_enabled", false);
}
- return sGeoLocationTimeZoneDetectionEnabled;
+ return sGeoLocationTimeZoneDetectionSupported;
}
/**
@@ -98,11 +98,11 @@ public final class TimeZoneDetectorService extends ITimeZoneDetectorService.Stub
Context context = getContext();
Handler handler = FgThread.getHandler();
- boolean geolocationTimeZoneDetectionEnabled =
- isGeoLocationTimeZoneDetectionEnabled(context);
+ boolean geolocationTimeZoneDetectionSupported =
+ isGeoLocationTimeZoneDetectionSupported(context);
TimeZoneDetectorStrategy timeZoneDetectorStrategy =
TimeZoneDetectorStrategyImpl.create(
- context, handler, geolocationTimeZoneDetectionEnabled);
+ context, handler, geolocationTimeZoneDetectionSupported);
// Create and publish the local service for use by internal callers.
TimeZoneDetectorInternal internal =
@@ -330,7 +330,7 @@ public final class TimeZoneDetectorService extends ITimeZoneDetectorService.Stub
boolean isGeoTimeZoneDetectionSupported() {
enforceManageTimeZoneDetectorPermission();
- return isGeoLocationTimeZoneDetectionEnabled(mContext);
+ return isGeoLocationTimeZoneDetectionSupported(mContext);
}
@Override
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java
index 781668bebbc9..cac1a6d29829 100644
--- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java
+++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java
@@ -59,7 +59,7 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
* conditions.
*/
@VisibleForTesting
- public interface Callback {
+ public interface Environment {
/**
* Sets a {@link ConfigurationChangeListener} that will be invoked when there are any
@@ -97,7 +97,7 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
void storeConfiguration(@UserIdInt int userId, TimeZoneConfiguration newConfiguration);
}
- private static final String LOG_TAG = "TimeZoneDetectorStrategy";
+ private static final String LOG_TAG = TimeZoneDetectorService.TAG;
private static final boolean DBG = false;
/**
@@ -164,7 +164,7 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
private static final int KEEP_SUGGESTION_HISTORY_SIZE = 10;
@NonNull
- private final Callback mCallback;
+ private final Environment mEnvironment;
@GuardedBy("this")
@NonNull
@@ -203,17 +203,17 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
*/
public static TimeZoneDetectorStrategyImpl create(
@NonNull Context context, @NonNull Handler handler,
- boolean geolocationTimeZoneDetectionEnabled) {
+ boolean geolocationTimeZoneDetectionSupported) {
- TimeZoneDetectorCallbackImpl callback = new TimeZoneDetectorCallbackImpl(
- context, handler, geolocationTimeZoneDetectionEnabled);
- return new TimeZoneDetectorStrategyImpl(callback);
+ EnvironmentImpl environment = new EnvironmentImpl(
+ context, handler, geolocationTimeZoneDetectionSupported);
+ return new TimeZoneDetectorStrategyImpl(environment);
}
@VisibleForTesting
- public TimeZoneDetectorStrategyImpl(@NonNull Callback callback) {
- mCallback = Objects.requireNonNull(callback);
- mCallback.setConfigChangeListener(this::handleConfigChanged);
+ public TimeZoneDetectorStrategyImpl(@NonNull Environment environment) {
+ mEnvironment = Objects.requireNonNull(environment);
+ mEnvironment.setConfigChangeListener(this::handleConfigChanged);
}
/**
@@ -230,13 +230,13 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
@Override
@NonNull
public ConfigurationInternal getConfigurationInternal(@UserIdInt int userId) {
- return mCallback.getConfigurationInternal(userId);
+ return mEnvironment.getConfigurationInternal(userId);
}
@Override
@NonNull
public synchronized ConfigurationInternal getCurrentUserConfigurationInternal() {
- int currentUserId = mCallback.getCurrentUserId();
+ int currentUserId = mEnvironment.getCurrentUserId();
return getConfigurationInternal(currentUserId);
}
@@ -257,9 +257,9 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
return false;
}
- // Store the configuration / notify as needed. This will cause the mCallback to invoke
+ // Store the configuration / notify as needed. This will cause the mEnvironment to invoke
// handleConfigChanged() asynchronously.
- mCallback.storeConfiguration(userId, newConfiguration);
+ mEnvironment.storeConfiguration(userId, newConfiguration);
String logMsg = "Configuration changed:"
+ " oldConfiguration=" + oldConfiguration
@@ -275,8 +275,9 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
public synchronized void suggestGeolocationTimeZone(
@NonNull GeolocationTimeZoneSuggestion suggestion) {
- int currentUserId = mCallback.getCurrentUserId();
- ConfigurationInternal currentUserConfig = mCallback.getConfigurationInternal(currentUserId);
+ int currentUserId = mEnvironment.getCurrentUserId();
+ ConfigurationInternal currentUserConfig =
+ mEnvironment.getConfigurationInternal(currentUserId);
if (DBG) {
Slog.d(LOG_TAG, "Geolocation suggestion received."
+ " currentUserConfig=" + currentUserConfig
@@ -299,7 +300,7 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
public synchronized boolean suggestManualTimeZone(
@UserIdInt int userId, @NonNull ManualTimeZoneSuggestion suggestion) {
- int currentUserId = mCallback.getCurrentUserId();
+ int currentUserId = mEnvironment.getCurrentUserId();
if (userId != currentUserId) {
Slog.w(LOG_TAG, "Manual suggestion received but user != current user, userId=" + userId
+ " suggestion=" + suggestion);
@@ -332,8 +333,9 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
public synchronized void suggestTelephonyTimeZone(
@NonNull TelephonyTimeZoneSuggestion suggestion) {
- int currentUserId = mCallback.getCurrentUserId();
- ConfigurationInternal currentUserConfig = mCallback.getConfigurationInternal(currentUserId);
+ int currentUserId = mEnvironment.getCurrentUserId();
+ ConfigurationInternal currentUserConfig =
+ mEnvironment.getConfigurationInternal(currentUserId);
if (DBG) {
Slog.d(LOG_TAG, "Telephony suggestion received. currentUserConfig=" + currentUserConfig
+ " newSuggestion=" + suggestion);
@@ -423,7 +425,7 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
String zoneId;
// Introduce bias towards the device's current zone when there are multiple zone suggested.
- String deviceTimeZone = mCallback.getDeviceTimeZone();
+ String deviceTimeZone = mEnvironment.getDeviceTimeZone();
if (zoneIds.contains(deviceTimeZone)) {
if (DBG) {
Slog.d(LOG_TAG,
@@ -486,7 +488,7 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
@GuardedBy("this")
private void setDeviceTimeZoneIfRequired(@NonNull String newZoneId, @NonNull String cause) {
- String currentZoneId = mCallback.getDeviceTimeZone();
+ String currentZoneId = mEnvironment.getDeviceTimeZone();
// Avoid unnecessary changes / intents.
if (newZoneId.equals(currentZoneId)) {
@@ -501,7 +503,7 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
return;
}
- mCallback.setDeviceTimeZone(newZoneId);
+ mEnvironment.setDeviceTimeZone(newZoneId);
String msg = "Set device time zone."
+ ", currentZoneId=" + currentZoneId
+ ", newZoneId=" + newZoneId
@@ -572,8 +574,9 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
// This method is called whenever the user changes or the config for any user changes. We
// don't know what happened, so we capture the current user's config, check to see if we
// need to clear state associated with a previous user, and rerun detection.
- int currentUserId = mCallback.getCurrentUserId();
- ConfigurationInternal currentUserConfig = mCallback.getConfigurationInternal(currentUserId);
+ int currentUserId = mEnvironment.getCurrentUserId();
+ ConfigurationInternal currentUserConfig =
+ mEnvironment.getConfigurationInternal(currentUserId);
GeolocationTimeZoneSuggestion latestGeoLocationSuggestion =
mLatestGeoLocationSuggestion.get();
@@ -603,14 +606,14 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
ipw.println("TimeZoneDetectorStrategy:");
ipw.increaseIndent(); // level 1
- int currentUserId = mCallback.getCurrentUserId();
- ipw.println("mCallback.getCurrentUserId()=" + currentUserId);
- ConfigurationInternal configuration = mCallback.getConfigurationInternal(currentUserId);
- ipw.println("mCallback.getConfiguration(currentUserId)=" + configuration);
+ int currentUserId = mEnvironment.getCurrentUserId();
+ ipw.println("mEnvironment.getCurrentUserId()=" + currentUserId);
+ ConfigurationInternal configuration = mEnvironment.getConfigurationInternal(currentUserId);
+ ipw.println("mEnvironment.getConfiguration(currentUserId)=" + configuration);
ipw.println("[Capabilities=" + configuration.createCapabilitiesAndConfig() + "]");
- ipw.println("mCallback.isDeviceTimeZoneInitialized()="
- + mCallback.isDeviceTimeZoneInitialized());
- ipw.println("mCallback.getDeviceTimeZone()=" + mCallback.getDeviceTimeZone());
+ ipw.println("mEnvironment.isDeviceTimeZoneInitialized()="
+ + mEnvironment.isDeviceTimeZoneInitialized());
+ ipw.println("mEnvironment.getDeviceTimeZone()=" + mEnvironment.getDeviceTimeZone());
ipw.println("Time zone change log:");
ipw.increaseIndent(); // level 2
diff --git a/services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerService.java b/services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerService.java
index 5bee7ee9d4b2..220810f137ad 100644
--- a/services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerService.java
+++ b/services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerService.java
@@ -74,11 +74,17 @@ import java.util.concurrent.atomic.AtomicReference;
* mode" where the real binder clients are replaced by {@link
* SimulatedLocationTimeZoneProviderProxy}. This means that the real client providers are never
* bound (ensuring no real location events will be received) and simulated events / behaviors
- * can be injected via the command line. To enter simulation mode for a provider, use
- * "{@code adb shell setprop persist.sys.location_tz_simulation_mode.<provider name> 1}" and reboot.
- * e.g. "{@code adb shell setprop persist.sys.location_tz_simulation_mode.primary 1}}"
- * Then use "{@code adb shell cmd location_time_zone_manager help}" for injection. Set the system
- * properties to "0" and reboot to return to exit simulation mode.
+ * can be injected via the command line.
+ *
+ * <p>To enter simulation mode for a provider, use {@code adb shell cmd location_time_zone_manager
+ * set_provider_mode_override &lt;provider name&gt; simulated} and restart the service with {@code
+ * adb shell cmd location_time_zone_manager stop} and {@code adb shell cmd
+ * location_time_zone_manager start}.
+ *
+ * <p>e.g. {@code adb shell cmd location_time_zone_manager set_provider_mode_override primary
+ * simulated}.
+ *
+ * <p>See {@code adb shell cmd location_time_zone_manager help}" for more options.
*/
public class LocationTimeZoneManagerService extends Binder {
@@ -96,7 +102,7 @@ public class LocationTimeZoneManagerService extends Binder {
@Override
public void onStart() {
Context context = getContext();
- if (TimeZoneDetectorService.isGeoLocationTimeZoneDetectionEnabled(context)) {
+ if (TimeZoneDetectorService.isGeoLocationTimeZoneDetectionSupported(context)) {
mService = new LocationTimeZoneManagerService(context);
// The service currently exposes no LocalService or Binder API, but it extends
@@ -110,7 +116,7 @@ public class LocationTimeZoneManagerService extends Binder {
@Override
public void onBootPhase(int phase) {
Context context = getContext();
- if (TimeZoneDetectorService.isGeoLocationTimeZoneDetectionEnabled(context)) {
+ if (TimeZoneDetectorService.isGeoLocationTimeZoneDetectionSupported(context)) {
if (phase == PHASE_SYSTEM_SERVICES_READY) {
// The location service must be functioning after this boot phase.
mService.onSystemReady();
diff --git a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java
index c59ead987b1c..6dcfb42f7f08 100644
--- a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java
@@ -1123,10 +1123,10 @@ public class TimeDetectorStrategyImplTest {
}
/**
- * A fake implementation of TimeDetectorStrategy.Callback. Besides tracking changes and behaving
- * like the real thing should, it also asserts preconditions.
+ * A fake implementation of {@link TimeDetectorStrategyImpl.Environment}. Besides tracking
+ * changes and behaving like the real thing should, it also asserts preconditions.
*/
- private static class FakeCallback implements TimeDetectorStrategyImpl.Callback {
+ private static class FakeEnvironment implements TimeDetectorStrategyImpl.Environment {
private boolean mAutoTimeDetectionEnabled;
private boolean mWakeLockAcquired;
private long mElapsedRealtimeMillis;
@@ -1254,41 +1254,41 @@ public class TimeDetectorStrategyImplTest {
*/
private class Script {
- private final FakeCallback mFakeCallback;
+ private final FakeEnvironment mFakeEnvironment;
private final TimeDetectorStrategyImpl mTimeDetectorStrategy;
Script() {
- mFakeCallback = new FakeCallback();
- mTimeDetectorStrategy = new TimeDetectorStrategyImpl(mFakeCallback);
+ mFakeEnvironment = new FakeEnvironment();
+ mTimeDetectorStrategy = new TimeDetectorStrategyImpl(mFakeEnvironment);
}
Script pokeAutoTimeDetectionEnabled(boolean enabled) {
- mFakeCallback.pokeAutoTimeDetectionEnabled(enabled);
+ mFakeEnvironment.pokeAutoTimeDetectionEnabled(enabled);
return this;
}
Script pokeFakeClocks(TimestampedValue<Instant> timeInfo) {
- mFakeCallback.pokeElapsedRealtimeMillis(timeInfo.getReferenceTimeMillis());
- mFakeCallback.pokeSystemClockMillis(timeInfo.getValue().toEpochMilli());
+ mFakeEnvironment.pokeElapsedRealtimeMillis(timeInfo.getReferenceTimeMillis());
+ mFakeEnvironment.pokeSystemClockMillis(timeInfo.getValue().toEpochMilli());
return this;
}
Script pokeThresholds(int systemClockUpdateThreshold) {
- mFakeCallback.pokeSystemClockUpdateThreshold(systemClockUpdateThreshold);
+ mFakeEnvironment.pokeSystemClockUpdateThreshold(systemClockUpdateThreshold);
return this;
}
Script pokeAutoOriginPriorities(@Origin int... autoOriginPriorities) {
- mFakeCallback.pokeAutoOriginPriorities(autoOriginPriorities);
+ mFakeEnvironment.pokeAutoOriginPriorities(autoOriginPriorities);
return this;
}
long peekElapsedRealtimeMillis() {
- return mFakeCallback.peekElapsedRealtimeMillis();
+ return mFakeEnvironment.peekElapsedRealtimeMillis();
}
long peekSystemClockMillis() {
- return mFakeCallback.peekSystemClockMillis();
+ return mFakeEnvironment.peekSystemClockMillis();
}
Script simulateTelephonyTimeSuggestion(TelephonyTimeSuggestion timeSuggestion) {
@@ -1324,13 +1324,13 @@ public class TimeDetectorStrategyImplTest {
}
Script simulateAutoTimeDetectionToggle() {
- mFakeCallback.simulateAutoTimeZoneDetectionToggle();
+ mFakeEnvironment.simulateAutoTimeZoneDetectionToggle();
mTimeDetectorStrategy.handleAutoTimeConfigChanged();
return this;
}
Script simulateTimePassing(long clockIncrementMillis) {
- mFakeCallback.simulateTimePassing(clockIncrementMillis);
+ mFakeEnvironment.simulateTimePassing(clockIncrementMillis);
return this;
}
@@ -1342,14 +1342,14 @@ public class TimeDetectorStrategyImplTest {
}
Script verifySystemClockWasNotSetAndResetCallTracking() {
- mFakeCallback.verifySystemClockNotSet();
- mFakeCallback.resetCallTracking();
+ mFakeEnvironment.verifySystemClockNotSet();
+ mFakeEnvironment.resetCallTracking();
return this;
}
Script verifySystemClockWasSetAndResetCallTracking(long expectedSystemClockMillis) {
- mFakeCallback.verifySystemClockWasSet(expectedSystemClockMillis);
- mFakeCallback.resetCallTracking();
+ mFakeEnvironment.verifySystemClockWasSet(expectedSystemClockMillis);
+ mFakeEnvironment.resetCallTracking();
return this;
}
@@ -1427,7 +1427,7 @@ public class TimeDetectorStrategyImplTest {
ManualTimeSuggestion generateManualTimeSuggestion(Instant suggestedTime) {
TimestampedValue<Long> utcTime =
new TimestampedValue<>(
- mFakeCallback.peekElapsedRealtimeMillis(),
+ mFakeEnvironment.peekElapsedRealtimeMillis(),
suggestedTime.toEpochMilli());
return new ManualTimeSuggestion(utcTime);
}
@@ -1461,7 +1461,7 @@ public class TimeDetectorStrategyImplTest {
NetworkTimeSuggestion generateNetworkTimeSuggestion(Instant suggestedTime) {
TimestampedValue<Long> utcTime =
new TimestampedValue<>(
- mFakeCallback.peekElapsedRealtimeMillis(),
+ mFakeEnvironment.peekElapsedRealtimeMillis(),
suggestedTime.toEpochMilli());
return new NetworkTimeSuggestion(utcTime);
}
@@ -1473,7 +1473,7 @@ public class TimeDetectorStrategyImplTest {
GnssTimeSuggestion generateGnssTimeSuggestion(Instant suggestedTime) {
TimestampedValue<Long> utcTime =
new TimestampedValue<>(
- mFakeCallback.peekElapsedRealtimeMillis(),
+ mFakeEnvironment.peekElapsedRealtimeMillis(),
suggestedTime.toEpochMilli());
return new GnssTimeSuggestion(utcTime);
}
@@ -1485,7 +1485,7 @@ public class TimeDetectorStrategyImplTest {
ExternalTimeSuggestion generateExternalTimeSuggestion(Instant suggestedTime) {
TimestampedValue<Long> utcTime =
new TimestampedValue<>(
- mFakeCallback.peekElapsedRealtimeMillis(),
+ mFakeEnvironment.peekElapsedRealtimeMillis(),
suggestedTime.toEpochMilli());
return new ExternalTimeSuggestion(utcTime);
}
diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java
index a6ffd201c16e..c8dba5f40882 100644
--- a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java
@@ -167,15 +167,15 @@ public class TimeZoneDetectorStrategyImplTest {
createConfig(null, false /* geoDetection */);
private TimeZoneDetectorStrategyImpl mTimeZoneDetectorStrategy;
- private FakeCallback mFakeCallback;
+ private FakeEnvironment mFakeEnvironment;
private MockConfigChangeListener mMockConfigChangeListener;
@Before
public void setUp() {
- mFakeCallback = new FakeCallback();
+ mFakeEnvironment = new FakeEnvironment();
mMockConfigChangeListener = new MockConfigChangeListener();
- mTimeZoneDetectorStrategy = new TimeZoneDetectorStrategyImpl(mFakeCallback);
+ mTimeZoneDetectorStrategy = new TimeZoneDetectorStrategyImpl(mFakeEnvironment);
mTimeZoneDetectorStrategy.addConfigChangeListener(mMockConfigChangeListener);
}
@@ -183,7 +183,7 @@ public class TimeZoneDetectorStrategyImplTest {
public void testGetCurrentUserConfiguration() {
new Script().initializeConfig(CONFIG_INT_AUTO_ENABLED_GEO_DISABLED);
ConfigurationInternal expectedConfiguration =
- mFakeCallback.getConfigurationInternal(USER_ID);
+ mFakeEnvironment.getConfigurationInternal(USER_ID);
assertEquals(expectedConfiguration,
mTimeZoneDetectorStrategy.getCurrentUserConfigurationInternal());
}
@@ -490,7 +490,7 @@ public class TimeZoneDetectorStrategyImplTest {
private void makeSlotIndex1SuggestionAndCheckState(Script script, TelephonyTestCase testCase) {
// Give the next suggestion a different zone from the currently set device time zone;
- String currentZoneId = mFakeCallback.getDeviceTimeZone();
+ String currentZoneId = mFakeEnvironment.getDeviceTimeZone();
String suggestionZoneId =
"Europe/London".equals(currentZoneId) ? "Europe/Paris" : "Europe/London";
TelephonyTimeZoneSuggestion zoneSlotIndex1Suggestion =
@@ -610,9 +610,9 @@ public class TimeZoneDetectorStrategyImplTest {
}
/**
- * The {@link TimeZoneDetectorStrategyImpl.Callback} is left to detect whether changing the time
- * zone is actually necessary. This test proves that the strategy doesn't assume it knows the
- * current settings.
+ * The {@link TimeZoneDetectorStrategyImpl.Environment} is left to detect whether changing the
+ * time zone is actually necessary. This test proves that the strategy doesn't assume it knows
+ * the current settings.
*/
@Test
public void testTelephonySuggestionStrategyDoesNotAssumeCurrentSetting_autoTelephony() {
@@ -958,7 +958,7 @@ public class TimeZoneDetectorStrategyImplTest {
return builder.build();
}
- static class FakeCallback implements TimeZoneDetectorStrategyImpl.Callback {
+ static class FakeEnvironment implements TimeZoneDetectorStrategyImpl.Environment {
private final TestState<ConfigurationInternal> mConfigurationInternal = new TestState<>();
private final TestState<String> mTimeZoneId = new TestState<>();
@@ -1051,12 +1051,12 @@ public class TimeZoneDetectorStrategyImplTest {
private class Script {
Script initializeConfig(ConfigurationInternal configuration) {
- mFakeCallback.initializeConfig(configuration);
+ mFakeEnvironment.initializeConfig(configuration);
return this;
}
Script initializeTimeZoneSetting(String zoneId) {
- mFakeCallback.initializeTimeZoneSetting(zoneId);
+ mFakeEnvironment.initializeTimeZoneSetting(zoneId);
return this;
}
@@ -1084,7 +1084,7 @@ public class TimeZoneDetectorStrategyImplTest {
Script simulateManualTimeZoneSuggestion(
@UserIdInt int userId, ManualTimeZoneSuggestion manualTimeZoneSuggestion,
boolean expectedResult) {
- mFakeCallback.assertKnownUser(userId);
+ mFakeEnvironment.assertKnownUser(userId);
boolean actualResult = mTimeZoneDetectorStrategy.suggestManualTimeZone(
userId, manualTimeZoneSuggestion);
assertEquals(expectedResult, actualResult);
@@ -1104,26 +1104,26 @@ public class TimeZoneDetectorStrategyImplTest {
* state was last reset.
*/
Script verifyTimeZoneNotChanged() {
- mFakeCallback.assertTimeZoneNotChanged();
+ mFakeEnvironment.assertTimeZoneNotChanged();
return this;
}
/** Verifies the device's time zone has been set and clears change tracking history. */
Script verifyTimeZoneChangedAndReset(String zoneId) {
- mFakeCallback.assertTimeZoneChangedTo(zoneId);
- mFakeCallback.commitAllChanges();
+ mFakeEnvironment.assertTimeZoneChangedTo(zoneId);
+ mFakeEnvironment.commitAllChanges();
return this;
}
Script verifyTimeZoneChangedAndReset(ManualTimeZoneSuggestion suggestion) {
- mFakeCallback.assertTimeZoneChangedTo(suggestion.getZoneId());
- mFakeCallback.commitAllChanges();
+ mFakeEnvironment.assertTimeZoneChangedTo(suggestion.getZoneId());
+ mFakeEnvironment.commitAllChanges();
return this;
}
Script verifyTimeZoneChangedAndReset(TelephonyTimeZoneSuggestion suggestion) {
- mFakeCallback.assertTimeZoneChangedTo(suggestion.getZoneId());
- mFakeCallback.commitAllChanges();
+ mFakeEnvironment.assertTimeZoneChangedTo(suggestion.getZoneId());
+ mFakeEnvironment.commitAllChanges();
return this;
}
@@ -1131,9 +1131,9 @@ public class TimeZoneDetectorStrategyImplTest {
* Verifies that the configuration has been changed to the expected value.
*/
Script verifyConfigurationChangedAndReset(ConfigurationInternal expected) {
- mFakeCallback.mConfigurationInternal.assertHasBeenSet();
- assertEquals(expected, mFakeCallback.mConfigurationInternal.getLatest());
- mFakeCallback.commitAllChanges();
+ mFakeEnvironment.mConfigurationInternal.assertHasBeenSet();
+ assertEquals(expected, mFakeEnvironment.mConfigurationInternal.getLatest());
+ mFakeEnvironment.commitAllChanges();
// Also confirm the listener triggered.
mMockConfigChangeListener.verifyOnChangeCalled();
@@ -1146,7 +1146,7 @@ public class TimeZoneDetectorStrategyImplTest {
* {@link TimeZoneConfiguration} have been changed.
*/
Script verifyConfigurationNotChanged() {
- mFakeCallback.mConfigurationInternal.assertHasNotBeenSet();
+ mFakeEnvironment.mConfigurationInternal.assertHasNotBeenSet();
// Also confirm the listener did not trigger.
mMockConfigChangeListener.verifyOnChangeNotCalled();
@@ -1154,7 +1154,7 @@ public class TimeZoneDetectorStrategyImplTest {
}
Script resetConfigurationTracking() {
- mFakeCallback.commitAllChanges();
+ mFakeEnvironment.commitAllChanges();
return this;
}
}