diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorService.java b/services/core/java/com/android/server/timedetector/TimeDetectorService.java index ed6424cb4a305..49a090b86d1db 100644 --- a/services/core/java/com/android/server/timedetector/TimeDetectorService.java +++ b/services/core/java/com/android/server/timedetector/TimeDetectorService.java @@ -64,9 +64,8 @@ public final class TimeDetectorService extends ITimeDetectorService.Stub { @NonNull private final TimeDetectorStrategy mTimeDetectorStrategy; private static TimeDetectorService create(@NonNull Context context) { - TimeDetectorStrategy timeDetectorStrategy = new TimeDetectorStrategyImpl(); - TimeDetectorStrategyCallbackImpl callback = new TimeDetectorStrategyCallbackImpl(context); - timeDetectorStrategy.initialize(callback); + TimeDetectorStrategyImpl.Callback callback = new TimeDetectorStrategyCallbackImpl(context); + TimeDetectorStrategy timeDetectorStrategy = new TimeDetectorStrategyImpl(callback); Handler handler = FgThread.getHandler(); TimeDetectorService timeDetectorService = diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorStrategy.java b/services/core/java/com/android/server/timedetector/TimeDetectorStrategy.java index a5fba4e6ba497..97687f7fae816 100644 --- a/services/core/java/com/android/server/timedetector/TimeDetectorStrategy.java +++ b/services/core/java/com/android/server/timedetector/TimeDetectorStrategy.java @@ -37,46 +37,6 @@ import java.io.PrintWriter; */ public interface TimeDetectorStrategy { - /** - * The interface used by the strategy to interact with the surrounding service. - * - *

Note: Because the system properties-derived value {@link #isAutoTimeDetectionEnabled()} - * can be modified independently and from different threads (and processes!). its use is prone - * to race conditions. That will be true until the responsibility for setting their values is - * moved to {@link TimeDetectorStrategy}. There are similar issues with - * {@link #systemClockMillis()} while any process can modify the system clock. - */ - interface Callback { - - /** - * The absolute threshold below which the system clock need not be updated. i.e. if setting - * the system clock would adjust it by less than this (either backwards or forwards) then it - * need not be set. - */ - int systemClockUpdateThresholdMillis(); - - /** Returns true if automatic time detection is enabled. */ - boolean isAutoTimeDetectionEnabled(); - - /** Acquire a suitable wake lock. Must be followed by {@link #releaseWakeLock()} */ - void acquireWakeLock(); - - /** Returns the elapsedRealtimeMillis clock value. */ - long elapsedRealtimeMillis(); - - /** Returns the system clock value. */ - long systemClockMillis(); - - /** Sets the device system clock. The WakeLock must be held. */ - void setSystemClock(long newTimeMillis); - - /** Release the wake lock acquired by a call to {@link #acquireWakeLock()}. */ - void releaseWakeLock(); - } - - /** Initialize the strategy. */ - void initialize(@NonNull Callback callback); - /** Process the suggested time from telephony sources. */ void suggestTelephonyTime(@NonNull TelephonyTimeSuggestion timeSuggestion); diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyCallbackImpl.java b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyCallbackImpl.java index 19484db149b16..e06fe92763231 100644 --- a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyCallbackImpl.java +++ b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyCallbackImpl.java @@ -29,9 +29,9 @@ import android.util.Slog; import java.util.Objects; /** - * The real implementation of {@link TimeDetectorStrategy.Callback} used on device. + * The real implementation of {@link TimeDetectorStrategyImpl.Callback} used on device. */ -public final class TimeDetectorStrategyCallbackImpl implements TimeDetectorStrategy.Callback { +public final class TimeDetectorStrategyCallbackImpl implements TimeDetectorStrategyImpl.Callback { private final static String TAG = "timedetector.TimeDetectorStrategyCallbackImpl"; diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java index 88de34027bb96..6ada077073144 100644 --- a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java +++ b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyImpl.java @@ -99,8 +99,8 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { @NonNull private final LocalLog mTimeChangesLog = new LocalLog(30, false /* useLocalTimestamps */); - // @NonNull after initialize() - private Callback mCallback; + @NonNull + private final Callback mCallback; // 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 @@ -122,8 +122,44 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy { private final ReferenceWithHistory mLastNetworkSuggestion = new ReferenceWithHistory<>(KEEP_SUGGESTION_HISTORY_SIZE); - @Override - public void initialize(@NonNull Callback callback) { + /** + * The interface used by the strategy to interact with the surrounding service. + * + *

Note: Because the system properties-derived value {@link #isAutoTimeDetectionEnabled()} + * can be modified independently and from different threads (and processes!), its use is prone + * to race conditions. That will be true until the responsibility for setting their values is + * moved to {@link TimeDetectorStrategy}. There are similar issues with + * {@link #systemClockMillis()} while any process can modify the system clock. + */ + public interface Callback { + + /** + * The absolute threshold below which the system clock need not be updated. i.e. if setting + * the system clock would adjust it by less than this (either backwards or forwards) then it + * need not be set. + */ + int systemClockUpdateThresholdMillis(); + + /** Returns true if automatic time detection is enabled. */ + boolean isAutoTimeDetectionEnabled(); + + /** Acquire a suitable wake lock. Must be followed by {@link #releaseWakeLock()} */ + void acquireWakeLock(); + + /** Returns the elapsedRealtimeMillis clock value. */ + long elapsedRealtimeMillis(); + + /** Returns the system clock value. */ + long systemClockMillis(); + + /** Sets the device system clock. The WakeLock must be held. */ + void setSystemClock(long newTimeMillis); + + /** Release the wake lock acquired by a call to {@link #acquireWakeLock()}. */ + void releaseWakeLock(); + } + + TimeDetectorStrategyImpl(@NonNull Callback callback) { mCallback = callback; } diff --git a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java index 2eeeb3ebaa2ab..fc28167cd20d3 100644 --- a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java @@ -226,10 +226,6 @@ public class TimeDetectorServiceTest { private boolean mHandleAutoTimeDetectionChangedCalled; private boolean mDumpCalled; - @Override - public void initialize(Callback ignored) { - } - @Override public void suggestTelephonyTime(TelephonyTimeSuggestion timeSuggestion) { mLastTelephonySuggestion = timeSuggestion; 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 803b245889e7e..1f38b7093f7a5 100644 --- a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java +++ b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyImplTest.java @@ -616,7 +616,7 @@ public class TimeDetectorStrategyImplTest { * A fake implementation of TimeDetectorStrategy.Callback. Besides tracking changes and behaving * like the real thing should, it also asserts preconditions. */ - private static class FakeCallback implements TimeDetectorStrategy.Callback { + private static class FakeCallback implements TimeDetectorStrategyImpl.Callback { private boolean mAutoTimeDetectionEnabled; private boolean mWakeLockAcquired; private long mElapsedRealtimeMillis; @@ -731,9 +731,7 @@ public class TimeDetectorStrategyImplTest { Script() { mFakeCallback = new FakeCallback(); - mTimeDetectorStrategy = new TimeDetectorStrategyImpl(); - mTimeDetectorStrategy.initialize(mFakeCallback); - + mTimeDetectorStrategy = new TimeDetectorStrategyImpl(mFakeCallback); } Script pokeAutoTimeDetectionEnabled(boolean enabled) {