Remove usages of TimestampedValue<Long>

Remove usages of TimestampedValue<Long> now we have UnixEpochTime, which
is the same thing but intended to be public and without the use of
generic Long (so no null checks needed).

Bug: 236612872
Test: Build only
Change-Id: I340754389536c09613d8c092ce5005a7eec605ef
This commit is contained in:
Neil Fuller
2022-09-30 18:10:37 +01:00
parent 2537e5d5b6
commit e932ab9a5e
25 changed files with 203 additions and 292 deletions

View File

@@ -24,7 +24,6 @@ import android.app.timedetector.TimeSuggestionHelper;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.ShellCommand;
import android.os.TimestampedValue;
import java.io.PrintWriter;
import java.util.List;
@@ -48,9 +47,9 @@ import java.util.Objects;
*
* <p>The creator of an external suggestion is expected to be separate Android process, e.g. a
* process integrating with the external time source via a HAL or local network. The creator must
* capture the elapsed realtime reference clock, e.g. via {@link SystemClock#elapsedRealtime()},
* when the Unix epoch time is first obtained (usually under a wakelock). This enables Android to
* adjust for latency introduced between suggestion creation and eventual use. Adjustments for other
* capture the elapsed realtime clock value, e.g. via {@link SystemClock#elapsedRealtime()}, when
* the Unix epoch time is first obtained (usually under a wakelock). This enables Android to adjust
* for latency introduced between suggestion creation and eventual use. Adjustments for other
* sources of latency, i.e. those before the external time suggestion is created, must be handled by
* the creator.
*
@@ -97,7 +96,7 @@ public final class ExternalTimeSuggestion implements Parcelable {
public ExternalTimeSuggestion(@ElapsedRealtimeLong long elapsedRealtimeMillis,
@CurrentTimeMillisLong long suggestionMillis) {
mTimeSuggestionHelper = new TimeSuggestionHelper(ExternalTimeSuggestion.class,
new TimestampedValue<>(elapsedRealtimeMillis, suggestionMillis));
new UnixEpochTime(elapsedRealtimeMillis, suggestionMillis));
}
private ExternalTimeSuggestion(@NonNull TimeSuggestionHelper helper) {
@@ -118,7 +117,7 @@ public final class ExternalTimeSuggestion implements Parcelable {
* {@hide}
*/
@NonNull
public TimestampedValue<Long> getUnixEpochTime() {
public UnixEpochTime getUnixEpochTime() {
return mTimeSuggestionHelper.getUnixEpochTime();
}

View File

@@ -28,7 +28,6 @@ import android.content.Context;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
import android.os.TimestampedValue;
import android.util.ArrayMap;
import android.util.Log;
@@ -339,10 +338,7 @@ public final class TimeManager {
Log.d(TAG, "setTime called: " + unixEpochTime);
}
try {
TimestampedValue<Long> manualTime = new TimestampedValue<>(
unixEpochTime.getElapsedRealtimeMillis(),
unixEpochTime.getUnixEpochTimeMillis());
ManualTimeSuggestion manualTimeSuggestion = new ManualTimeSuggestion(manualTime);
ManualTimeSuggestion manualTimeSuggestion = new ManualTimeSuggestion(unixEpochTime);
manualTimeSuggestion.addDebugInfo("TimeManager.setTime()");
manualTimeSuggestion.addDebugInfo("UID: " + android.os.Process.myUid());
manualTimeSuggestion.addDebugInfo("UserHandle: " + android.os.Process.myUserHandle());

View File

@@ -41,16 +41,15 @@ import java.util.Objects;
@SystemApi
public final class TimeZoneCapabilities implements Parcelable {
public static final @NonNull Creator<TimeZoneCapabilities> CREATOR =
new Creator<TimeZoneCapabilities>() {
public TimeZoneCapabilities createFromParcel(Parcel in) {
return TimeZoneCapabilities.createFromParcel(in);
}
public static final @NonNull Creator<TimeZoneCapabilities> CREATOR = new Creator<>() {
public TimeZoneCapabilities createFromParcel(Parcel in) {
return TimeZoneCapabilities.createFromParcel(in);
}
public TimeZoneCapabilities[] newArray(int size) {
return new TimeZoneCapabilities[size];
}
};
public TimeZoneCapabilities[] newArray(int size) {
return new TimeZoneCapabilities[size];
}
};
/**
* The user the capabilities are for. This is used for object equality and debugging but there

View File

@@ -23,7 +23,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.os.ShellCommand;
import android.os.SystemClock;
import android.os.TimestampedValue;
import java.io.PrintWriter;
import java.util.Objects;
@@ -181,10 +180,4 @@ public final class UnixEpochTime implements Parcelable {
@NonNull UnixEpochTime one, @NonNull UnixEpochTime two) {
return one.mElapsedRealtimeMillis - two.mElapsedRealtimeMillis;
}
// TODO(b/246256335) Switch to using UnixEpochTime where possible and remove this method.
/** @hide */
public TimestampedValue<Long> toTimestampedValue() {
return new TimestampedValue<>(mElapsedRealtimeMillis, mUnixEpochTimeMillis);
}
}

View File

@@ -18,10 +18,10 @@ package android.app.timedetector;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.time.UnixEpochTime;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.ShellCommand;
import android.os.TimestampedValue;
import java.io.PrintWriter;
import java.util.List;
@@ -51,7 +51,7 @@ public final class ManualTimeSuggestion implements Parcelable {
@NonNull private final TimeSuggestionHelper mTimeSuggestionHelper;
public ManualTimeSuggestion(@NonNull TimestampedValue<Long> unixEpochTime) {
public ManualTimeSuggestion(@NonNull UnixEpochTime unixEpochTime) {
mTimeSuggestionHelper = new TimeSuggestionHelper(ManualTimeSuggestion.class, unixEpochTime);
}
@@ -70,7 +70,7 @@ public final class ManualTimeSuggestion implements Parcelable {
}
@NonNull
public TimestampedValue<Long> getUnixEpochTime() {
public UnixEpochTime getUnixEpochTime() {
return mTimeSuggestionHelper.getUnixEpochTime();
}

View File

@@ -18,10 +18,10 @@ package android.app.timedetector;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.time.UnixEpochTime;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.ShellCommand;
import android.os.TimestampedValue;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -67,7 +67,7 @@ public final class TelephonyTimeSuggestion implements Parcelable {
};
private final int mSlotIndex;
@Nullable private final TimestampedValue<Long> mUnixEpochTime;
@Nullable private final UnixEpochTime mUnixEpochTime;
@Nullable private ArrayList<String> mDebugInfo;
private TelephonyTimeSuggestion(Builder builder) {
@@ -78,13 +78,13 @@ public final class TelephonyTimeSuggestion implements Parcelable {
private static TelephonyTimeSuggestion createFromParcel(Parcel in) {
int slotIndex = in.readInt();
TimestampedValue<Long> unixEpochTime =
in.readParcelable(null /* classLoader */, android.os.TimestampedValue.class);
UnixEpochTime unixEpochTime =
in.readParcelable(null /* classLoader */, UnixEpochTime.class);
TelephonyTimeSuggestion suggestion = new TelephonyTimeSuggestion.Builder(slotIndex)
.setUnixEpochTime(unixEpochTime)
.build();
@SuppressWarnings("unchecked")
ArrayList<String> debugInfo = (ArrayList<String>) in.readArrayList(
ArrayList<String> debugInfo = in.readArrayList(
null /* classLoader */, java.lang.String.class);
if (debugInfo != null) {
suggestion.addDebugInfo(debugInfo);
@@ -96,7 +96,7 @@ public final class TelephonyTimeSuggestion implements Parcelable {
public static TelephonyTimeSuggestion parseCommandLineArg(@NonNull ShellCommand cmd)
throws IllegalArgumentException {
Integer slotIndex = null;
Long referenceTimeMillis = null;
Long elapsedRealtimeMillis = null;
Long unixEpochTimeMillis = null;
String opt;
while ((opt = cmd.getNextArg()) != null) {
@@ -105,8 +105,9 @@ public final class TelephonyTimeSuggestion implements Parcelable {
slotIndex = Integer.parseInt(cmd.getNextArgRequired());
break;
}
case "--reference_time": {
referenceTimeMillis = Long.parseLong(cmd.getNextArgRequired());
case "--reference_time":
case "--elapsed_realtime": {
elapsedRealtimeMillis = Long.parseLong(cmd.getNextArgRequired());
break;
}
case "--unix_epoch_time": {
@@ -122,15 +123,14 @@ public final class TelephonyTimeSuggestion implements Parcelable {
if (slotIndex == null) {
throw new IllegalArgumentException("No slotIndex specified.");
}
if (referenceTimeMillis == null) {
throw new IllegalArgumentException("No referenceTimeMillis specified.");
if (elapsedRealtimeMillis == null) {
throw new IllegalArgumentException("No elapsedRealtimeMillis specified.");
}
if (unixEpochTimeMillis == null) {
throw new IllegalArgumentException("No unixEpochTimeMillis specified.");
}
TimestampedValue<Long> timeSignal =
new TimestampedValue<>(referenceTimeMillis, unixEpochTimeMillis);
UnixEpochTime timeSignal = new UnixEpochTime(elapsedRealtimeMillis, unixEpochTimeMillis);
Builder builder = new Builder(slotIndex)
.setUnixEpochTime(timeSignal)
.addDebugInfo("Command line injection");
@@ -141,7 +141,7 @@ public final class TelephonyTimeSuggestion implements Parcelable {
public static void printCommandLineOpts(PrintWriter pw) {
pw.println("Telephony suggestion options:");
pw.println(" --slot_index <number>");
pw.println(" --reference_time <elapsed realtime millis>");
pw.println(" --elapsed_realtime <elapsed realtime millis>");
pw.println(" --unix_epoch_time <Unix epoch time millis>");
pw.println();
pw.println("See " + TelephonyTimeSuggestion.class.getName() + " for more information");
@@ -174,7 +174,7 @@ public final class TelephonyTimeSuggestion implements Parcelable {
* <p>See {@link TelephonyTimeSuggestion} for more information about {@code unixEpochTime}.
*/
@Nullable
public TimestampedValue<Long> getUnixEpochTime() {
public UnixEpochTime getUnixEpochTime() {
return mUnixEpochTime;
}
@@ -247,7 +247,7 @@ public final class TelephonyTimeSuggestion implements Parcelable {
*/
public static final class Builder {
private final int mSlotIndex;
@Nullable private TimestampedValue<Long> mUnixEpochTime;
@Nullable private UnixEpochTime mUnixEpochTime;
@Nullable private List<String> mDebugInfo;
/**
@@ -265,12 +265,7 @@ public final class TelephonyTimeSuggestion implements Parcelable {
* <p>See {@link TelephonyTimeSuggestion} for more information about {@code unixEpochTime}.
*/
@NonNull
public Builder setUnixEpochTime(@Nullable TimestampedValue<Long> unixEpochTime) {
if (unixEpochTime != null) {
// unixEpochTime can be null, but the value it holds cannot.
Objects.requireNonNull(unixEpochTime.getValue());
}
public Builder setUnixEpochTime(@Nullable UnixEpochTime unixEpochTime) {
mUnixEpochTime = unixEpochTime;
return this;
}

View File

@@ -19,9 +19,9 @@ package android.app.timedetector;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemService;
import android.app.time.UnixEpochTime;
import android.content.Context;
import android.os.SystemClock;
import android.os.TimestampedValue;
/**
* The interface through which system components can query and send signals to the
@@ -108,9 +108,8 @@ public interface TimeDetector {
* @hide
*/
static ManualTimeSuggestion createManualTimeSuggestion(long when, String why) {
TimestampedValue<Long> utcTime =
new TimestampedValue<>(SystemClock.elapsedRealtime(), when);
ManualTimeSuggestion manualTimeSuggestion = new ManualTimeSuggestion(utcTime);
UnixEpochTime unixEpochTime = new UnixEpochTime(SystemClock.elapsedRealtime(), when);
ManualTimeSuggestion manualTimeSuggestion = new ManualTimeSuggestion(unixEpochTime);
manualTimeSuggestion.addDebugInfo(why);
return manualTimeSuggestion;
}

View File

@@ -18,9 +18,9 @@ package android.app.timedetector;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.time.UnixEpochTime;
import android.os.Parcel;
import android.os.ShellCommand;
import android.os.TimestampedValue;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -51,20 +51,19 @@ import java.util.Objects;
public final class TimeSuggestionHelper {
@NonNull private final Class<?> mHelpedClass;
@NonNull private final TimestampedValue<Long> mUnixEpochTime;
@NonNull private final UnixEpochTime mUnixEpochTime;
@Nullable private ArrayList<String> mDebugInfo;
/** Creates a helper for the specified class, containing the supplied properties. */
public TimeSuggestionHelper(@NonNull Class<?> helpedClass,
@NonNull TimestampedValue<Long> unixEpochTime) {
@NonNull UnixEpochTime unixEpochTime) {
mHelpedClass = Objects.requireNonNull(helpedClass);
mUnixEpochTime = Objects.requireNonNull(unixEpochTime);
Objects.requireNonNull(unixEpochTime.getValue());
}
/** See {@link TimeSuggestionHelper} for property details. */
@NonNull
public TimestampedValue<Long> getUnixEpochTime() {
public UnixEpochTime getUnixEpochTime() {
return mUnixEpochTime;
}
@@ -146,8 +145,8 @@ public final class TimeSuggestionHelper {
public static TimeSuggestionHelper handleCreateFromParcel(@NonNull Class<?> helpedClass,
@NonNull Parcel in) {
@SuppressWarnings("unchecked")
TimestampedValue<Long> unixEpochTime = in.readParcelable(
null /* classLoader */, TimestampedValue.class);
UnixEpochTime unixEpochTime =
in.readParcelable(null /* classLoader */, UnixEpochTime.class);
TimeSuggestionHelper suggestionHelper =
new TimeSuggestionHelper(helpedClass, unixEpochTime);
suggestionHelper.mDebugInfo = in.readArrayList(null /* classLoader */, String.class);
@@ -164,13 +163,14 @@ public final class TimeSuggestionHelper {
public static TimeSuggestionHelper handleParseCommandLineArg(
@NonNull Class<?> helpedClass, @NonNull ShellCommand cmd)
throws IllegalArgumentException {
Long referenceTimeMillis = null;
Long elapsedRealtimeMillis = null;
Long unixEpochTimeMillis = null;
String opt;
while ((opt = cmd.getNextArg()) != null) {
switch (opt) {
case "--reference_time": {
referenceTimeMillis = Long.parseLong(cmd.getNextArgRequired());
case "--reference_time":
case "--elapsed_realtime": {
elapsedRealtimeMillis = Long.parseLong(cmd.getNextArgRequired());
break;
}
case "--unix_epoch_time": {
@@ -183,15 +183,14 @@ public final class TimeSuggestionHelper {
}
}
if (referenceTimeMillis == null) {
if (elapsedRealtimeMillis == null) {
throw new IllegalArgumentException("No referenceTimeMillis specified.");
}
if (unixEpochTimeMillis == null) {
throw new IllegalArgumentException("No unixEpochTimeMillis specified.");
}
TimestampedValue<Long> timeSignal =
new TimestampedValue<>(referenceTimeMillis, unixEpochTimeMillis);
UnixEpochTime timeSignal = new UnixEpochTime(elapsedRealtimeMillis, unixEpochTimeMillis);
TimeSuggestionHelper suggestionHelper = new TimeSuggestionHelper(helpedClass, timeSignal);
suggestionHelper.addDebugInfo("Command line injection");
return suggestionHelper;
@@ -201,8 +200,8 @@ public final class TimeSuggestionHelper {
public static void handlePrintCommandLineOpts(
@NonNull PrintWriter pw, @NonNull String typeName, @NonNull Class<?> clazz) {
pw.printf("%s suggestion options:\n", typeName);
pw.println(" --reference_time <elapsed realtime millis> - the elapsed realtime millis when"
+ " unix epoch time was read");
pw.println(" --elapsed_realtime <elapsed realtime millis> - the elapsed realtime millis"
+ " when unix epoch time was read");
pw.println(" --unix_epoch_time <Unix epoch time millis>");
pw.println();
pw.println("See " + clazz.getName() + " for more information");

View File

@@ -40,14 +40,14 @@ public class ExternalTimeSuggestionTest {
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_noUnixEpochTime() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321");
"--elapsed_realtime 54321");
ExternalTimeSuggestion.parseCommandLineArg(testShellCommand);
}
@Test
public void testParseCommandLineArg_validSuggestion() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321 --unix_epoch_time 12345");
"--elapsed_realtime 54321 --unix_epoch_time 12345");
ExternalTimeSuggestion expectedSuggestion = new ExternalTimeSuggestion(54321L, 12345L);
ExternalTimeSuggestion actualSuggestion =
ExternalTimeSuggestion.parseCommandLineArg(testShellCommand);
@@ -57,7 +57,7 @@ public class ExternalTimeSuggestionTest {
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_unknownArgument() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321 --unix_epoch_time 12345 --bad_arg 0");
"--elapsed_realtime 54321 --unix_epoch_time 12345 --bad_arg 0");
ExternalTimeSuggestion.parseCommandLineArg(testShellCommand);
}
}

View File

@@ -23,15 +23,14 @@ import static android.app.timezonedetector.ShellCommandTestSupport.createShellCo
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import android.app.time.UnixEpochTime;
import android.os.ShellCommand;
import android.os.TimestampedValue;
import org.junit.Test;
public class ManualTimeSuggestionTest {
private static final TimestampedValue<Long> ARBITRARY_TIME =
new TimestampedValue<>(1111L, 2222L);
private static final UnixEpochTime ARBITRARY_TIME = new UnixEpochTime(1111L, 2222L);
@Test
public void testEquals() {
@@ -42,9 +41,9 @@ public class ManualTimeSuggestionTest {
assertEquals(one, two);
assertEquals(two, one);
TimestampedValue<Long> differentTime = new TimestampedValue<>(
ARBITRARY_TIME.getReferenceTimeMillis() + 1,
ARBITRARY_TIME.getValue());
UnixEpochTime differentTime = new UnixEpochTime(
ARBITRARY_TIME.getElapsedRealtimeMillis() + 1,
ARBITRARY_TIME.getUnixEpochTimeMillis());
ManualTimeSuggestion three = new ManualTimeSuggestion(differentTime);
assertNotEquals(one, three);
assertNotEquals(three, one);
@@ -76,15 +75,15 @@ public class ManualTimeSuggestionTest {
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_noUnixEpochTime() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321");
"--elapsed_realtime 54321");
ManualTimeSuggestion.parseCommandLineArg(testShellCommand);
}
@Test
public void testParseCommandLineArg_validSuggestion() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321 --unix_epoch_time 12345");
TimestampedValue<Long> timeSignal = new TimestampedValue<>(54321L, 12345L);
"--elapsed_realtime 54321 --unix_epoch_time 12345");
UnixEpochTime timeSignal = new UnixEpochTime(54321L, 12345L);
ManualTimeSuggestion expectedSuggestion = new ManualTimeSuggestion(timeSignal);
ManualTimeSuggestion actualSuggestion =
ManualTimeSuggestion.parseCommandLineArg(testShellCommand);
@@ -94,7 +93,7 @@ public class ManualTimeSuggestionTest {
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_unknownArgument() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321 --unix_epoch_time 12345 --bad_arg 0");
"--elapsed_realtime 54321 --unix_epoch_time 12345 --bad_arg 0");
ManualTimeSuggestion.parseCommandLineArg(testShellCommand);
}
}

View File

@@ -23,8 +23,8 @@ import static android.app.timezonedetector.ShellCommandTestSupport.createShellCo
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import android.app.time.UnixEpochTime;
import android.os.ShellCommand;
import android.os.TimestampedValue;
import org.junit.Test;
@@ -47,13 +47,13 @@ public class TelephonyTimeSuggestionTest {
assertEquals(two, one);
}
builder1.setUnixEpochTime(new TimestampedValue<>(1111L, 2222L));
builder1.setUnixEpochTime(new UnixEpochTime(1111L, 2222L));
{
TelephonyTimeSuggestion one = builder1.build();
assertEquals(one, one);
}
builder2.setUnixEpochTime(new TimestampedValue<>(1111L, 2222L));
builder2.setUnixEpochTime(new UnixEpochTime(1111L, 2222L));
{
TelephonyTimeSuggestion one = builder1.build();
TelephonyTimeSuggestion two = builder2.build();
@@ -63,7 +63,7 @@ public class TelephonyTimeSuggestionTest {
TelephonyTimeSuggestion.Builder builder3 =
new TelephonyTimeSuggestion.Builder(SLOT_INDEX + 1);
builder3.setUnixEpochTime(new TimestampedValue<>(1111L, 2222L));
builder3.setUnixEpochTime(new UnixEpochTime(1111L, 2222L));
{
TelephonyTimeSuggestion one = builder1.build();
TelephonyTimeSuggestion three = builder3.build();
@@ -86,7 +86,7 @@ public class TelephonyTimeSuggestionTest {
TelephonyTimeSuggestion.Builder builder = new TelephonyTimeSuggestion.Builder(SLOT_INDEX);
assertRoundTripParcelable(builder.build());
builder.setUnixEpochTime(new TimestampedValue<>(1111L, 2222L));
builder.setUnixEpochTime(new UnixEpochTime(1111L, 2222L));
assertRoundTripParcelable(builder.build());
// DebugInfo should also be stored (but is not checked by equals()
@@ -101,7 +101,7 @@ public class TelephonyTimeSuggestionTest {
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_noSlotIndex() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321 --unix_epoch_time 12345");
"--elapsed_realtime 54321 --unix_epoch_time 12345");
TelephonyTimeSuggestion.parseCommandLineArg(testShellCommand);
}
@@ -115,17 +115,17 @@ public class TelephonyTimeSuggestionTest {
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_noUnixEpochTime() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--slot_index 0 --reference_time 54321");
"--slot_index 0 --elapsed_realtime 54321");
TelephonyTimeSuggestion.parseCommandLineArg(testShellCommand);
}
@Test
public void testParseCommandLineArg_validSuggestion() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--slot_index 0 --reference_time 54321 --unix_epoch_time 12345");
"--slot_index 0 --elapsed_realtime 54321 --unix_epoch_time 12345");
TelephonyTimeSuggestion expectedSuggestion =
new TelephonyTimeSuggestion.Builder(0)
.setUnixEpochTime(new TimestampedValue<>(54321L, 12345L))
.setUnixEpochTime(new UnixEpochTime(54321L, 12345L))
.build();
TelephonyTimeSuggestion actualSuggestion =
TelephonyTimeSuggestion.parseCommandLineArg(testShellCommand);
@@ -135,7 +135,7 @@ public class TelephonyTimeSuggestionTest {
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_unknownArgument() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--slot_index 0 --reference_time 54321 --unix_epoch_time 12345 --bad_arg 0");
"--slot_index 0 --elapsed_realtime 54321 --unix_epoch_time 12345 --bad_arg 0");
TelephonyTimeSuggestion.parseCommandLineArg(testShellCommand);
}
}

View File

@@ -17,9 +17,9 @@
package com.android.server.timedetector;
import android.annotation.NonNull;
import android.app.time.UnixEpochTime;
import android.app.timedetector.TimeSuggestionHelper;
import android.os.ShellCommand;
import android.os.TimestampedValue;
import java.io.PrintWriter;
import java.util.List;
@@ -34,7 +34,7 @@ public final class GnssTimeSuggestion {
@NonNull private final TimeSuggestionHelper mTimeSuggestionHelper;
public GnssTimeSuggestion(@NonNull TimestampedValue<Long> unixEpochTime) {
public GnssTimeSuggestion(@NonNull UnixEpochTime unixEpochTime) {
mTimeSuggestionHelper = new TimeSuggestionHelper(GnssTimeSuggestion.class, unixEpochTime);
}
@@ -43,7 +43,7 @@ public final class GnssTimeSuggestion {
}
@NonNull
public TimestampedValue<Long> getUnixEpochTime() {
public UnixEpochTime getUnixEpochTime() {
return mTimeSuggestionHelper.getUnixEpochTime();
}

View File

@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.app.AlarmManager;
import android.app.time.UnixEpochTime;
import android.content.Context;
import android.location.LocationListener;
import android.location.LocationManager;
@@ -31,7 +32,6 @@ import android.os.Handler;
import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.os.SystemClock;
import android.os.TimestampedValue;
import android.util.LocalLog;
import android.util.Log;
@@ -122,7 +122,7 @@ public final class GnssTimeUpdateService extends Binder {
@GuardedBy("mLock") @Nullable private AlarmManager.OnAlarmListener mAlarmListener;
@GuardedBy("mLock") @Nullable private LocationListener mLocationListener;
@Nullable private volatile TimestampedValue<Long> mLastSuggestedGnssTime;
@Nullable private volatile UnixEpochTime mLastSuggestedGnssTime;
@VisibleForTesting
GnssTimeUpdateService(@NonNull Context context, @NonNull AlarmManager alarmManager,
@@ -263,8 +263,7 @@ public final class GnssTimeUpdateService extends Binder {
long gnssUnixEpochTimeMillis = locationTime.getUnixEpochTimeMillis();
long elapsedRealtimeMs = locationTime.getElapsedRealtimeNanos() / 1_000_000L;
TimestampedValue<Long> timeSignal =
new TimestampedValue<>(elapsedRealtimeMs, gnssUnixEpochTimeMillis);
UnixEpochTime timeSignal = new UnixEpochTime(elapsedRealtimeMs, gnssUnixEpochTimeMillis);
mLastSuggestedGnssTime = timeSignal;
GnssTimeSuggestion timeSuggestion = new GnssTimeSuggestion(timeSignal);

View File

@@ -18,8 +18,8 @@ package com.android.server.timedetector;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.time.UnixEpochTime;
import android.os.ShellCommand;
import android.os.TimestampedValue;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -48,7 +48,7 @@ import java.util.Objects;
*/
public final class NetworkTimeSuggestion {
@NonNull private final TimestampedValue<Long> mUnixEpochTime;
@NonNull private final UnixEpochTime mUnixEpochTime;
private final int mUncertaintyMillis;
@Nullable private ArrayList<String> mDebugInfo;
@@ -57,8 +57,7 @@ public final class NetworkTimeSuggestion {
*
* <p>See {@link NetworkTimeSuggestion} for property details.
*/
public NetworkTimeSuggestion(
@NonNull TimestampedValue<Long> unixEpochTime, int uncertaintyMillis) {
public NetworkTimeSuggestion(@NonNull UnixEpochTime unixEpochTime, int uncertaintyMillis) {
mUnixEpochTime = Objects.requireNonNull(unixEpochTime);
if (uncertaintyMillis < 0) {
throw new IllegalArgumentException("uncertaintyMillis < 0");
@@ -68,7 +67,7 @@ public final class NetworkTimeSuggestion {
/** See {@link NetworkTimeSuggestion} for property details. */
@NonNull
public TimestampedValue<Long> getUnixEpochTime() {
public UnixEpochTime getUnixEpochTime() {
return mUnixEpochTime;
}
@@ -126,14 +125,15 @@ public final class NetworkTimeSuggestion {
/** Parses command line args to create a {@link NetworkTimeSuggestion}. */
public static NetworkTimeSuggestion parseCommandLineArg(@NonNull ShellCommand cmd)
throws IllegalArgumentException {
Long referenceTimeMillis = null;
Long elapsedRealtimeMillis = null;
Long unixEpochTimeMillis = null;
Integer uncertaintyMillis = null;
String opt;
while ((opt = cmd.getNextArg()) != null) {
switch (opt) {
case "--reference_time": {
referenceTimeMillis = Long.parseLong(cmd.getNextArgRequired());
case "--reference_time":
case "--elapsed_realtime": {
elapsedRealtimeMillis = Long.parseLong(cmd.getNextArgRequired());
break;
}
case "--unix_epoch_time": {
@@ -150,8 +150,8 @@ public final class NetworkTimeSuggestion {
}
}
if (referenceTimeMillis == null) {
throw new IllegalArgumentException("No referenceTimeMillis specified.");
if (elapsedRealtimeMillis == null) {
throw new IllegalArgumentException("No elapsedRealtimeMillis specified.");
}
if (unixEpochTimeMillis == null) {
throw new IllegalArgumentException("No unixEpochTimeMillis specified.");
@@ -160,8 +160,7 @@ public final class NetworkTimeSuggestion {
throw new IllegalArgumentException("No uncertaintyMillis specified.");
}
TimestampedValue<Long> timeSignal =
new TimestampedValue<>(referenceTimeMillis, unixEpochTimeMillis);
UnixEpochTime timeSignal = new UnixEpochTime(elapsedRealtimeMillis, unixEpochTimeMillis);
NetworkTimeSuggestion networkTimeSuggestion =
new NetworkTimeSuggestion(timeSignal, uncertaintyMillis);
networkTimeSuggestion.addDebugInfo("Command line injection");
@@ -171,8 +170,8 @@ public final class NetworkTimeSuggestion {
/** Prints the command line args needed to create a {@link NetworkTimeSuggestion}. */
public static void printCommandLineOpts(PrintWriter pw) {
pw.printf("%s suggestion options:\n", "Network");
pw.println(" --reference_time <elapsed realtime millis> - the elapsed realtime millis when"
+ " unix epoch time was read");
pw.println(" --elapsed_realtime <elapsed realtime millis> - the elapsed realtime millis"
+ " when unix epoch time was read");
pw.println(" --unix_epoch_time <Unix epoch time millis>");
pw.println(" --uncertainty_millis <Uncertainty millis> - a positive error bound (+/-)"
+ " estimate for unix epoch time");

View File

@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.time.UnixEpochTime;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
@@ -38,7 +39,6 @@ import android.os.PowerManager;
import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.os.SystemClock;
import android.os.TimestampedValue;
import android.provider.Settings;
import android.util.LocalLog;
import android.util.Log;
@@ -278,7 +278,7 @@ public class NetworkTimeUpdateService extends Binder {
/** Suggests the time to the time detector. It may choose use it to set the system clock. */
private void makeNetworkTimeSuggestion(
@NonNull TimeResult ntpResult, @NonNull String debugInfo) {
TimestampedValue<Long> timeSignal = new TimestampedValue<>(
UnixEpochTime timeSignal = new UnixEpochTime(
ntpResult.getElapsedRealtimeMillis(), ntpResult.getTimeMillis());
NetworkTimeSuggestion timeSuggestion =
new NetworkTimeSuggestion(timeSignal, ntpResult.getUncertaintyMillis());

View File

@@ -24,7 +24,6 @@ import android.app.time.TimeState;
import android.app.time.UnixEpochTime;
import android.app.timedetector.ManualTimeSuggestion;
import android.app.timedetector.TelephonyTimeSuggestion;
import android.os.TimestampedValue;
import android.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
@@ -108,15 +107,6 @@ public interface TimeDetectorStrategy extends Dumpable {
// Utility methods below are to be moved to a better home when one becomes more obvious.
/**
* Adjusts the supplied time value by applying the difference between the reference time
* supplied and the reference time associated with the time.
*/
static long getTimeAt(@NonNull TimestampedValue<Long> timeValue, long referenceClockMillisNow) {
return (referenceClockMillisNow - timeValue.getReferenceTimeMillis())
+ timeValue.getValue();
}
/**
* Converts one of the {@code ORIGIN_} constants to a human readable string suitable for config
* and debug usage. Throws an {@link IllegalArgumentException} if the value is unrecognized.

View File

@@ -32,7 +32,6 @@ import android.app.timedetector.ManualTimeSuggestion;
import android.app.timedetector.TelephonyTimeSuggestion;
import android.content.Context;
import android.os.Handler;
import android.os.TimestampedValue;
import android.util.IndentingPrintWriter;
import android.util.Slog;
@@ -99,7 +98,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
// going through this strategy code.
@GuardedBy("this")
@Nullable
private TimestampedValue<Long> mLastAutoSystemClockTimeSet;
private UnixEpochTime mLastAutoSystemClockTimeSet;
/**
* A mapping from slotIndex to a time suggestion. We typically expect one or two mappings:
@@ -209,7 +208,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
}
Objects.requireNonNull(suggestion);
final TimestampedValue<Long> newUnixEpochTime = suggestion.getUnixEpochTime();
final UnixEpochTime newUnixEpochTime = suggestion.getUnixEpochTime();
if (!validateAutoSuggestionTime(newUnixEpochTime, suggestion)) {
return;
@@ -231,7 +230,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
}
Objects.requireNonNull(suggestion);
final TimestampedValue<Long> newUnixEpochTime = suggestion.getUnixEpochTime();
final UnixEpochTime newUnixEpochTime = suggestion.getUnixEpochTime();
if (!validateAutoSuggestionTime(newUnixEpochTime, suggestion)) {
return;
@@ -258,7 +257,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
Objects.requireNonNull(suggestion);
final TimestampedValue<Long> newUnixEpochTime = suggestion.getUnixEpochTime();
final UnixEpochTime newUnixEpochTime = suggestion.getUnixEpochTime();
if (!validateManualSuggestionTime(newUnixEpochTime, suggestion)) {
return false;
@@ -321,7 +320,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
@Origin int origin = ORIGIN_MANUAL;
UnixEpochTime unixEpochTime = timeState.getUnixEpochTime();
setSystemClockAndConfidenceUnderWakeLock(
origin, unixEpochTime.toTimestampedValue(), confidence, "setTimeZoneState()");
origin, unixEpochTime, confidence, "setTimeZoneState()");
} finally {
mEnvironment.releaseWakeLock();
}
@@ -473,14 +472,13 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
@GuardedBy("this")
private boolean storeTelephonySuggestion(
@NonNull TelephonyTimeSuggestion suggestion) {
TimestampedValue<Long> newUnixEpochTime = suggestion.getUnixEpochTime();
UnixEpochTime newUnixEpochTime = suggestion.getUnixEpochTime();
int slotIndex = suggestion.getSlotIndex();
TelephonyTimeSuggestion previousSuggestion = mSuggestionBySlotIndex.get(slotIndex);
if (previousSuggestion != null) {
// We can log / discard suggestions with obvious issues with the reference time clock.
if (previousSuggestion.getUnixEpochTime() == null
|| previousSuggestion.getUnixEpochTime().getValue() == null) {
// We can log / discard suggestions with obvious issues with the elapsed realtime clock.
if (previousSuggestion.getUnixEpochTime() == null) {
// This should be impossible given we only store validated suggestions.
Slog.w(LOG_TAG, "Previous suggestion is null or has a null time."
+ " previousSuggestion=" + previousSuggestion
@@ -488,10 +486,10 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
return false;
}
long referenceTimeDifference = TimestampedValue.referenceTimeDifference(
long referenceTimeDifference = UnixEpochTime.elapsedRealtimeDifference(
newUnixEpochTime, previousSuggestion.getUnixEpochTime());
if (referenceTimeDifference < 0) {
// The reference time is before the previously received suggestion. Ignore it.
// The elapsed realtime is before the previously received suggestion. Ignore it.
Slog.w(LOG_TAG, "Out of order telephony suggestion received."
+ " referenceTimeDifference=" + referenceTimeDifference
+ " previousSuggestion=" + previousSuggestion
@@ -507,23 +505,18 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
@GuardedBy("this")
private boolean validateSuggestionCommon(
@NonNull TimestampedValue<Long> newUnixEpochTime, @NonNull Object suggestion) {
if (newUnixEpochTime.getValue() == null) {
Slog.w(LOG_TAG, "Suggested time value is null. suggestion=" + suggestion);
return false;
}
// We can validate the suggestion against the reference time clock.
@NonNull UnixEpochTime newUnixEpochTime, @NonNull Object suggestion) {
// We can validate the suggestion against the elapsed realtime clock.
long elapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis();
if (elapsedRealtimeMillis < newUnixEpochTime.getReferenceTimeMillis()) {
if (elapsedRealtimeMillis < newUnixEpochTime.getElapsedRealtimeMillis()) {
// elapsedRealtime clock went backwards?
Slog.w(LOG_TAG, "New reference time is in the future? Ignoring."
Slog.w(LOG_TAG, "New elapsed realtime is in the future? Ignoring."
+ " elapsedRealtimeMillis=" + elapsedRealtimeMillis
+ ", suggestion=" + suggestion);
return false;
}
if (newUnixEpochTime.getValue()
if (newUnixEpochTime.getUnixEpochTimeMillis()
> mCurrentConfigurationInternal.getSuggestionUpperBound().toEpochMilli()) {
// This check won't prevent a device's system clock exceeding Integer.MAX_VALUE Unix
// seconds through the normal passage of time, but it will stop it jumping above 2038
@@ -537,11 +530,11 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
/**
* Returns {@code true} if an automatic time suggestion time is valid.
* See also {@link #validateManualSuggestionTime(TimestampedValue, Object)}.
* See also {@link #validateManualSuggestionTime(UnixEpochTime, Object)}.
*/
@GuardedBy("this")
private boolean validateAutoSuggestionTime(
@NonNull TimestampedValue<Long> newUnixEpochTime, @NonNull Object suggestion) {
@NonNull UnixEpochTime newUnixEpochTime, @NonNull Object suggestion) {
Instant lowerBound = mCurrentConfigurationInternal.getAutoSuggestionLowerBound();
return validateSuggestionCommon(newUnixEpochTime, suggestion)
&& validateSuggestionAgainstLowerBound(newUnixEpochTime, suggestion,
@@ -550,11 +543,11 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
/**
* Returns {@code true} if a manual time suggestion time is valid.
* See also {@link #validateAutoSuggestionTime(TimestampedValue, Object)}.
* See also {@link #validateAutoSuggestionTime(UnixEpochTime, Object)}.
*/
@GuardedBy("this")
private boolean validateManualSuggestionTime(
@NonNull TimestampedValue<Long> newUnixEpochTime, @NonNull Object suggestion) {
@NonNull UnixEpochTime newUnixEpochTime, @NonNull Object suggestion) {
Instant lowerBound = mCurrentConfigurationInternal.getManualSuggestionLowerBound();
// Suggestion is definitely wrong if it comes before lower time bound.
@@ -564,11 +557,11 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
@GuardedBy("this")
private boolean validateSuggestionAgainstLowerBound(
@NonNull TimestampedValue<Long> newUnixEpochTime, @NonNull Object suggestion,
@NonNull UnixEpochTime newUnixEpochTime, @NonNull Object suggestion,
@NonNull Instant lowerBound) {
// Suggestion is definitely wrong if it comes before lower time bound.
if (lowerBound.toEpochMilli() > newUnixEpochTime.getValue()) {
if (lowerBound.toEpochMilli() > newUnixEpochTime.getUnixEpochTimeMillis()) {
Slog.w(LOG_TAG, "Suggestion points to time before lower bound, skipping it. "
+ "suggestion=" + suggestion + ", lower bound=" + lowerBound);
return false;
@@ -582,7 +575,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
// Try the different origins one at a time.
int[] originPriorities = mCurrentConfigurationInternal.getAutoOriginPriorities();
for (int origin : originPriorities) {
TimestampedValue<Long> newUnixEpochTime = null;
UnixEpochTime newUnixEpochTime = null;
String cause = null;
if (origin == ORIGIN_TELEPHONY) {
TelephonyTimeSuggestion bestTelephonySuggestion = findBestTelephonySuggestion();
@@ -670,7 +663,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
// The heuristic works as follows:
// Recency: The most recent suggestion from each slotIndex is scored. The score is based on
// a discrete age bucket, i.e. so signals received around the same time will be in the same
// bucket, thus applying a loose reference time ordering. The suggestion with the highest
// bucket, thus applying a loose elapsed realtime ordering. The suggestion with the highest
// score is used.
// Consistency: If there a multiple suggestions with the same score, the suggestion with the
// lowest slotIndex is always taken.
@@ -722,7 +715,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
long elapsedRealtimeMillis, @NonNull TelephonyTimeSuggestion timeSuggestion) {
// Validate first.
TimestampedValue<Long> unixEpochTime = timeSuggestion.getUnixEpochTime();
UnixEpochTime unixEpochTime = timeSuggestion.getUnixEpochTime();
if (!validateSuggestionUnixEpochTime(elapsedRealtimeMillis, unixEpochTime)) {
Slog.w(LOG_TAG, "Existing suggestion found to be invalid"
+ " elapsedRealtimeMillis=" + elapsedRealtimeMillis
@@ -732,7 +725,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
// The score is based on the age since receipt. Suggestions are bucketed so two
// suggestions in the same bucket from different slotIndexs are scored the same.
long ageMillis = elapsedRealtimeMillis - unixEpochTime.getReferenceTimeMillis();
long ageMillis = elapsedRealtimeMillis - unixEpochTime.getElapsedRealtimeMillis();
// Turn the age into a discrete value: 0 <= bucketIndex < TELEPHONY_BUCKET_COUNT.
int bucketIndex = (int) (ageMillis / TELEPHONY_BUCKET_SIZE_MILLIS);
@@ -754,7 +747,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
return null;
}
TimestampedValue<Long> unixEpochTime = networkSuggestion.getUnixEpochTime();
UnixEpochTime unixEpochTime = networkSuggestion.getUnixEpochTime();
long elapsedRealTimeMillis = mEnvironment.elapsedRealtimeMillis();
if (!validateSuggestionUnixEpochTime(elapsedRealTimeMillis, unixEpochTime)) {
// The latest suggestion is not valid, usually due to its age.
@@ -774,7 +767,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
return null;
}
TimestampedValue<Long> unixEpochTime = gnssTimeSuggestion.getUnixEpochTime();
UnixEpochTime unixEpochTime = gnssTimeSuggestion.getUnixEpochTime();
long elapsedRealTimeMillis = mEnvironment.elapsedRealtimeMillis();
if (!validateSuggestionUnixEpochTime(elapsedRealTimeMillis, unixEpochTime)) {
// The latest suggestion is not valid, usually due to its age.
@@ -794,7 +787,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
return null;
}
TimestampedValue<Long> unixEpochTime = externalTimeSuggestion.getUnixEpochTime();
UnixEpochTime unixEpochTime = externalTimeSuggestion.getUnixEpochTime();
long elapsedRealTimeMillis = mEnvironment.elapsedRealtimeMillis();
if (!validateSuggestionUnixEpochTime(elapsedRealTimeMillis, unixEpochTime)) {
// The latest suggestion is not valid, usually due to its age.
@@ -806,7 +799,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
@GuardedBy("this")
private boolean setSystemClockAndConfidenceIfRequired(
@Origin int origin, @NonNull TimestampedValue<Long> time, @NonNull String cause) {
@Origin int origin, @NonNull UnixEpochTime time, @NonNull String cause) {
// Any time set through this class is inherently high confidence. Either it came directly
// from a user, or it was detected automatically.
@@ -851,7 +844,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
*/
@GuardedBy("this")
private void upgradeSystemClockConfidenceIfRequired(
@NonNull TimestampedValue<Long> autoDetectedUnixEpochTime, @NonNull String cause) {
@NonNull UnixEpochTime autoDetectedUnixEpochTime, @NonNull String cause) {
@TimeConfidence int newTimeConfidence = TIME_CONFIDENCE_HIGH;
@TimeConfidence int currentTimeConfidence = mEnvironment.systemClockConfidence();
boolean timeNeedsConfirmation = currentTimeConfidence < newTimeConfidence;
@@ -866,8 +859,8 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
// enough) to raise the confidence.
long elapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis();
long actualSystemClockMillis = mEnvironment.systemClockMillis();
long adjustedAutoDetectedUnixEpochMillis = TimeDetectorStrategy.getTimeAt(
autoDetectedUnixEpochTime, elapsedRealtimeMillis);
long adjustedAutoDetectedUnixEpochMillis =
autoDetectedUnixEpochTime.at(elapsedRealtimeMillis).getUnixEpochTimeMillis();
long absTimeDifferenceMillis =
Math.abs(adjustedAutoDetectedUnixEpochMillis - actualSystemClockMillis);
int confidenceUpgradeThresholdMillis =
@@ -899,7 +892,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
@GuardedBy("this")
private boolean setSystemClockAndConfidenceUnderWakeLock(
@Origin int origin, @NonNull TimestampedValue<Long> newTime,
@Origin int origin, @NonNull UnixEpochTime newTime,
@TimeConfidence int newTimeConfidence, @NonNull String cause) {
long elapsedRealtimeMillis = mEnvironment.elapsedRealtimeMillis();
@@ -909,8 +902,8 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
// CLOCK_PARANOIA : Check to see if this class owns the clock or if something else
// may be setting the clock.
if (mLastAutoSystemClockTimeSet != null) {
long expectedTimeMillis = TimeDetectorStrategy.getTimeAt(
mLastAutoSystemClockTimeSet, elapsedRealtimeMillis);
long expectedTimeMillis = mLastAutoSystemClockTimeSet.at(elapsedRealtimeMillis)
.getUnixEpochTimeMillis();
long absSystemClockDifference =
Math.abs(expectedTimeMillis - actualSystemClockMillis);
if (absSystemClockDifference > SYSTEM_CLOCK_PARANOIA_THRESHOLD_MILLIS) {
@@ -931,7 +924,7 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
// in confidence then system state must be updated.
// Adjust for the time that has elapsed since the signal was received.
long newSystemClockMillis = TimeDetectorStrategy.getTimeAt(newTime, elapsedRealtimeMillis);
long newSystemClockMillis = newTime.at(elapsedRealtimeMillis).getUnixEpochTimeMillis();
long absTimeDifference = Math.abs(newSystemClockMillis - actualSystemClockMillis);
long systemClockUpdateThreshold =
mCurrentConfigurationInternal.getSystemClockUpdateThresholdMillis();
@@ -1073,21 +1066,21 @@ public final class TimeDetectorStrategyImpl implements TimeDetectorStrategy {
}
private static boolean validateSuggestionUnixEpochTime(
long elapsedRealtimeMillis, TimestampedValue<Long> unixEpochTime) {
long referenceTimeMillis = unixEpochTime.getReferenceTimeMillis();
if (referenceTimeMillis > elapsedRealtimeMillis) {
// Future reference times are ignored. They imply the reference time was wrong, or the
// elapsed realtime clock used to derive it has gone backwards, neither of which are
long currentElapsedRealtimeMillis, UnixEpochTime unixEpochTime) {
long suggestionElapsedRealtimeMillis = unixEpochTime.getElapsedRealtimeMillis();
if (suggestionElapsedRealtimeMillis > currentElapsedRealtimeMillis) {
// Future elapsed realtimes are ignored. They imply the elapsed realtime was wrong, or
// the elapsed realtime clock used to derive it has gone backwards, neither of which are
// supportable situations.
return false;
}
// Any suggestion > MAX_AGE_MILLIS is treated as too old. Although time is relentless and
// predictable, the accuracy of the reference time clock may be poor over long periods which
// would lead to errors creeping in. Also, in edge cases where a bad suggestion has been
// made and never replaced, it could also mean that the time detection code remains
// predictable, the accuracy of the elapsed realtime clock may be poor over long periods
// which would lead to errors creeping in. Also, in edge cases where a bad suggestion has
// been made and never replaced, it could also mean that the time detection code remains
// opinionated using a bad invalid suggestion. This caps that edge case at MAX_AGE_MILLIS.
long ageMillis = elapsedRealtimeMillis - referenceTimeMillis;
long ageMillis = currentElapsedRealtimeMillis - suggestionElapsedRealtimeMillis;
return ageMillis <= MAX_SUGGESTION_TIME_AGE_MILLIS;
}
}

View File

@@ -216,8 +216,8 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat
*
* <p>This field is only actually used when telephony time zone fallback is supported, but the
* value is maintained even when it isn't supported as it can be turned on at any time via
* server flags. The reference time is the elapsed realtime when the mode last changed to help
* ordering between fallback mode switches and suggestions.
* server flags. The elapsed realtime when the mode last changed is used to help ordering
* between fallback mode switches and suggestions.
*
* <p>See {@link TimeZoneDetectorStrategy} for more information.
*/

View File

@@ -21,15 +21,15 @@ import static com.android.server.timezonedetector.ShellCommandTestSupport.create
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import android.app.time.UnixEpochTime;
import android.os.ShellCommand;
import android.os.TimestampedValue;
import org.junit.Test;
public class GnssTimeSuggestionTest {
private static final TimestampedValue<Long> ARBITRARY_TIME =
new TimestampedValue<>(1111L, 2222L);
private static final UnixEpochTime ARBITRARY_TIME =
new UnixEpochTime(1111L, 2222L);
@Test
public void testEquals() {
@@ -40,9 +40,9 @@ public class GnssTimeSuggestionTest {
assertEquals(one, two);
assertEquals(two, one);
TimestampedValue<Long> differentTime = new TimestampedValue<>(
ARBITRARY_TIME.getReferenceTimeMillis() + 1,
ARBITRARY_TIME.getValue());
UnixEpochTime differentTime = new UnixEpochTime(
ARBITRARY_TIME.getElapsedRealtimeMillis() + 1,
ARBITRARY_TIME.getUnixEpochTimeMillis());
GnssTimeSuggestion three = new GnssTimeSuggestion(differentTime);
assertNotEquals(one, three);
assertNotEquals(three, one);
@@ -63,15 +63,15 @@ public class GnssTimeSuggestionTest {
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_noUnixEpochTime() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321");
"--elapsed_realtime 54321");
GnssTimeSuggestion.parseCommandLineArg(testShellCommand);
}
@Test
public void testParseCommandLineArg_validSuggestion() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321 --unix_epoch_time 12345");
TimestampedValue<Long> timeSignal = new TimestampedValue<>(54321L, 12345L);
"--elapsed_realtime 54321 --unix_epoch_time 12345");
UnixEpochTime timeSignal = new UnixEpochTime(54321L, 12345L);
GnssTimeSuggestion expectedSuggestion = new GnssTimeSuggestion(timeSignal);
GnssTimeSuggestion actualSuggestion =
GnssTimeSuggestion.parseCommandLineArg(testShellCommand);
@@ -81,7 +81,7 @@ public class GnssTimeSuggestionTest {
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_unknownArgument() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321 --unix_epoch_time 12345 --bad_arg 0");
"--elapsed_realtime 54321 --unix_epoch_time 12345 --bad_arg 0");
GnssTimeSuggestion.parseCommandLineArg(testShellCommand);
}
}

View File

@@ -28,6 +28,7 @@ import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.app.AlarmManager.OnAlarmListener;
import android.app.time.UnixEpochTime;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
@@ -35,7 +36,6 @@ import android.location.LocationManager;
import android.location.LocationManagerInternal;
import android.location.LocationRequest;
import android.location.LocationTime;
import android.os.TimestampedValue;
import androidx.test.runner.AndroidJUnit4;
@@ -73,7 +73,7 @@ public final class GnssTimeUpdateServiceTest {
@Test
public void testLocationListenerOnLocationChanged_validLocationTime_suggestsGnssTime() {
TimestampedValue<Long> timeSignal = new TimestampedValue<>(
UnixEpochTime timeSignal = new UnixEpochTime(
ELAPSED_REALTIME_MS, GNSS_TIME);
GnssTimeSuggestion timeSuggestion = new GnssTimeSuggestion(timeSignal);
LocationTime locationTime = new LocationTime(GNSS_TIME, ELAPSED_REALTIME_NS);
@@ -178,7 +178,7 @@ public final class GnssTimeUpdateServiceTest {
private void advanceServiceToSleepingState(
ArgumentCaptor<LocationListener> locationListenerCaptor,
ArgumentCaptor<OnAlarmListener> alarmListenerCaptor) {
TimestampedValue<Long> timeSignal = new TimestampedValue<>(
UnixEpochTime timeSignal = new UnixEpochTime(
ELAPSED_REALTIME_MS, GNSS_TIME);
GnssTimeSuggestion timeSuggestion = new GnssTimeSuggestion(timeSignal);
LocationTime locationTime = new LocationTime(GNSS_TIME, ELAPSED_REALTIME_NS);

View File

@@ -21,15 +21,15 @@ import static com.android.server.timezonedetector.ShellCommandTestSupport.create
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import android.app.time.UnixEpochTime;
import android.os.ShellCommand;
import android.os.TimestampedValue;
import org.junit.Test;
public class NetworkTimeSuggestionTest {
private static final TimestampedValue<Long> ARBITRARY_TIME =
new TimestampedValue<>(1111L, 2222L);
private static final UnixEpochTime ARBITRARY_TIME =
new UnixEpochTime(1111L, 2222L);
private static final int ARBITRARY_UNCERTAINTY_MILLIS = 3333;
@Test
@@ -43,9 +43,9 @@ public class NetworkTimeSuggestionTest {
assertEquals(one, two);
assertEquals(two, one);
TimestampedValue<Long> differentTime = new TimestampedValue<>(
ARBITRARY_TIME.getReferenceTimeMillis() + 1,
ARBITRARY_TIME.getValue());
UnixEpochTime differentTime = new UnixEpochTime(
ARBITRARY_TIME.getElapsedRealtimeMillis() + 1,
ARBITRARY_TIME.getUnixEpochTimeMillis());
NetworkTimeSuggestion three = new NetworkTimeSuggestion(
differentTime, ARBITRARY_UNCERTAINTY_MILLIS);
assertNotEquals(one, three);
@@ -73,22 +73,22 @@ public class NetworkTimeSuggestionTest {
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_noUnixEpochTime() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321 --uncertainty_millis 111");
"--elapsed_realtime 54321 --uncertainty_millis 111");
NetworkTimeSuggestion.parseCommandLineArg(testShellCommand);
}
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_noUncertaintyMillis() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321 --unix_epoch_time 12345");
"--elapsed_realtime 54321 --unix_epoch_time 12345");
NetworkTimeSuggestion.parseCommandLineArg(testShellCommand);
}
@Test
public void testParseCommandLineArg_validSuggestion() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321 --unix_epoch_time 12345 --uncertainty_millis 111");
TimestampedValue<Long> timeSignal = new TimestampedValue<>(54321L, 12345L);
"--elapsed_realtime 54321 --unix_epoch_time 12345 --uncertainty_millis 111");
UnixEpochTime timeSignal = new UnixEpochTime(54321L, 12345L);
NetworkTimeSuggestion expectedSuggestion = new NetworkTimeSuggestion(timeSignal, 111);
NetworkTimeSuggestion actualSuggestion =
NetworkTimeSuggestion.parseCommandLineArg(testShellCommand);
@@ -98,7 +98,7 @@ public class NetworkTimeSuggestionTest {
@Test(expected = IllegalArgumentException.class)
public void testParseCommandLineArg_unknownArgument() {
ShellCommand testShellCommand = createShellCommandWithArgsAndOptions(
"--reference_time 54321 --unix_epoch_time 12345 --bad_arg 0");
"--elapsed_realtime 54321 --unix_epoch_time 12345 --bad_arg 0");
NetworkTimeSuggestion.parseCommandLineArg(testShellCommand);
}
}

View File

@@ -18,9 +18,9 @@ package com.android.server.timedetector;
import static org.mockito.Mockito.mock;
import android.app.time.UnixEpochTime;
import android.content.Context;
import android.os.HandlerThread;
import android.os.TimestampedValue;
import androidx.test.runner.AndroidJUnit4;
@@ -74,7 +74,7 @@ public class TimeDetectorInternalImplTest {
}
private static NetworkTimeSuggestion createNetworkTimeSuggestion() {
TimestampedValue<Long> timeValue = new TimestampedValue<>(100L, 1_000_000L);
UnixEpochTime timeValue = new UnixEpochTime(100L, 1_000_000L);
return new NetworkTimeSuggestion(timeValue, 123);
}
@@ -90,7 +90,7 @@ public class TimeDetectorInternalImplTest {
}
private static GnssTimeSuggestion createGnssTimeSuggestion() {
TimestampedValue<Long> timeValue = new TimestampedValue<>(100L, 1_000_000L);
UnixEpochTime timeValue = new UnixEpochTime(100L, 1_000_000L);
return new GnssTimeSuggestion(timeValue);
}
}

View File

@@ -49,7 +49,6 @@ import android.content.pm.PackageManager;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.ParcelableException;
import android.os.TimestampedValue;
import android.util.NtpTrustedTime;
import androidx.test.runner.AndroidJUnit4;
@@ -578,24 +577,24 @@ public class TimeDetectorServiceTest {
private static TelephonyTimeSuggestion createTelephonyTimeSuggestion() {
int slotIndex = 1234;
TimestampedValue<Long> timeValue = new TimestampedValue<>(100L, 1_000_000L);
UnixEpochTime timeValue = new UnixEpochTime(100L, 1_000_000L);
return new TelephonyTimeSuggestion.Builder(slotIndex)
.setUnixEpochTime(timeValue)
.build();
}
private static ManualTimeSuggestion createManualTimeSuggestion() {
TimestampedValue<Long> timeValue = new TimestampedValue<>(100L, 1_000_000L);
UnixEpochTime timeValue = new UnixEpochTime(100L, 1_000_000L);
return new ManualTimeSuggestion(timeValue);
}
private static NetworkTimeSuggestion createNetworkTimeSuggestion() {
TimestampedValue<Long> timeValue = new TimestampedValue<>(100L, 1_000_000L);
UnixEpochTime timeValue = new UnixEpochTime(100L, 1_000_000L);
return new NetworkTimeSuggestion(timeValue, 123);
}
private static GnssTimeSuggestion createGnssTimeSuggestion() {
TimestampedValue<Long> timeValue = new TimestampedValue<>(100L, 1_000_000L);
UnixEpochTime timeValue = new UnixEpochTime(100L, 1_000_000L);
return new GnssTimeSuggestion(timeValue);
}

View File

@@ -320,7 +320,7 @@ public class TimeDetectorStrategyImplTest {
Instant suggestionInstant = initialClockTime.getValue()
.plusMillis(timeElapsedMillis)
.plusMillis(confidenceUpgradeThresholdMillis);
TimestampedValue<Long> matchingClockTime = new TimestampedValue<>(
UnixEpochTime matchingClockTime = new UnixEpochTime(
script.peekElapsedRealtimeMillis(),
suggestionInstant.toEpochMilli());
TelephonyTimeSuggestion timeSuggestion = new TelephonyTimeSuggestion.Builder(slotIndex)
@@ -357,7 +357,7 @@ public class TimeDetectorStrategyImplTest {
Instant suggestionInstant = initialClockTime.getValue()
.plusMillis(timeElapsedMillis)
.plusMillis(confidenceUpgradeThresholdMillis + 1);
TimestampedValue<Long> mismatchingClockTime = new TimestampedValue<>(
UnixEpochTime mismatchingClockTime = new UnixEpochTime(
script.peekElapsedRealtimeMillis(),
suggestionInstant.toEpochMilli());
TelephonyTimeSuggestion timeSuggestion = new TelephonyTimeSuggestion.Builder(slotIndex)
@@ -392,7 +392,7 @@ public class TimeDetectorStrategyImplTest {
// Create a suggestion time that doesn't closely match the current system clock.
Instant initialClockInstant = initialClockTime.getValue();
TimestampedValue<Long> mismatchingClockTime = new TimestampedValue<>(
UnixEpochTime mismatchingClockTime = new UnixEpochTime(
script.peekElapsedRealtimeMillis(),
initialClockInstant.plusMillis(timeElapsedMillis + 1_000_000).toEpochMilli());
TelephonyTimeSuggestion timeSuggestion = new TelephonyTimeSuggestion.Builder(slotIndex)
@@ -418,7 +418,7 @@ public class TimeDetectorStrategyImplTest {
TelephonyTimeSuggestion timeSuggestion1 =
script.generateTelephonyTimeSuggestion(slotIndex, testTime);
TimestampedValue<Long> unixEpochTime1 = timeSuggestion1.getUnixEpochTime();
UnixEpochTime unixEpochTime1 = timeSuggestion1.getUnixEpochTime();
// Initialize the strategy / device with a time set from a telephony suggestion.
script.simulateTimePassing();
@@ -430,13 +430,13 @@ public class TimeDetectorStrategyImplTest {
// The Unix epoch time increment should be larger than the system clock update threshold so
// we know it shouldn't be ignored for other reasons.
long validUnixEpochTimeMillis = unixEpochTime1.getValue()
long validUnixEpochTimeMillis = unixEpochTime1.getUnixEpochTimeMillis()
+ (2 * systemClockUpdateThresholdMillis);
// Now supply a new signal that has an obviously bogus reference time : older than the last
// one.
long referenceTimeBeforeLastSignalMillis = unixEpochTime1.getReferenceTimeMillis() - 1;
TimestampedValue<Long> unixEpochTime2 = new TimestampedValue<>(
// Now supply a new signal that has an obviously bogus elapsed realtime : older than the
// last one.
long referenceTimeBeforeLastSignalMillis = unixEpochTime1.getElapsedRealtimeMillis() - 1;
UnixEpochTime unixEpochTime2 = new UnixEpochTime(
referenceTimeBeforeLastSignalMillis, validUnixEpochTimeMillis);
TelephonyTimeSuggestion timeSuggestion2 =
createTelephonyTimeSuggestion(slotIndex, unixEpochTime2);
@@ -445,11 +445,11 @@ public class TimeDetectorStrategyImplTest {
.verifySystemClockWasNotSetAndResetCallTracking()
.assertLatestTelephonySuggestion(slotIndex, timeSuggestion1);
// Now supply a new signal that has an obviously bogus reference time : substantially in the
// future.
// Now supply a new signal that has an obviously bogus elapsed realtime; one substantially
// in the future.
long referenceTimeInFutureMillis =
unixEpochTime1.getReferenceTimeMillis() + Integer.MAX_VALUE + 1;
TimestampedValue<Long> unixEpochTime3 = new TimestampedValue<>(
unixEpochTime1.getElapsedRealtimeMillis() + Integer.MAX_VALUE + 1;
UnixEpochTime unixEpochTime3 = new UnixEpochTime(
referenceTimeInFutureMillis, validUnixEpochTimeMillis);
TelephonyTimeSuggestion timeSuggestion3 =
createTelephonyTimeSuggestion(slotIndex, unixEpochTime3);
@@ -459,8 +459,8 @@ public class TimeDetectorStrategyImplTest {
.assertLatestTelephonySuggestion(slotIndex, timeSuggestion1);
// Just to prove validUnixEpochTimeMillis is valid.
long validReferenceTimeMillis = unixEpochTime1.getReferenceTimeMillis() + 100;
TimestampedValue<Long> unixEpochTime4 = new TimestampedValue<>(
long validReferenceTimeMillis = unixEpochTime1.getElapsedRealtimeMillis() + 100;
UnixEpochTime unixEpochTime4 = new UnixEpochTime(
validReferenceTimeMillis, validUnixEpochTimeMillis);
long expectedSystemClockMillis4 = script.calculateTimeInMillisForNow(unixEpochTime4);
TelephonyTimeSuggestion timeSuggestion4 =
@@ -486,7 +486,7 @@ public class TimeDetectorStrategyImplTest {
Instant testTime = ARBITRARY_TEST_TIME;
TelephonyTimeSuggestion timeSuggestion1 =
script.generateTelephonyTimeSuggestion(slotIndex, testTime);
TimestampedValue<Long> unixEpochTime1 = timeSuggestion1.getUnixEpochTime();
UnixEpochTime unixEpochTime1 = timeSuggestion1.getUnixEpochTime();
// Simulate time passing.
script.simulateTimePassing(clockIncrementMillis);
@@ -2099,11 +2099,11 @@ public class TimeDetectorStrategyImplTest {
/**
* Generates a ManualTimeSuggestion using the current elapsed realtime clock for the
* reference time.
* elapsed realtime.
*/
ManualTimeSuggestion generateManualTimeSuggestion(Instant suggestedTime) {
TimestampedValue<Long> unixEpochTime =
new TimestampedValue<>(
UnixEpochTime unixEpochTime =
new UnixEpochTime(
mFakeEnvironment.peekElapsedRealtimeMillis(),
suggestedTime.toEpochMilli());
return new ManualTimeSuggestion(unixEpochTime);
@@ -2111,17 +2111,16 @@ public class TimeDetectorStrategyImplTest {
/**
* Generates a {@link TelephonyTimeSuggestion} using the current elapsed realtime clock for
* the reference time.
* the elapsed realtime.
*/
TelephonyTimeSuggestion generateTelephonyTimeSuggestion(int slotIndex, long timeMillis) {
TimestampedValue<Long> time =
new TimestampedValue<>(peekElapsedRealtimeMillis(), timeMillis);
UnixEpochTime time = new UnixEpochTime(peekElapsedRealtimeMillis(), timeMillis);
return createTelephonyTimeSuggestion(slotIndex, time);
}
/**
* Generates a {@link TelephonyTimeSuggestion} using the current elapsed realtime clock for
* the reference time.
* the elapsed realtime.
*/
TelephonyTimeSuggestion generateTelephonyTimeSuggestion(
int slotIndex, Instant suggestedTime) {
@@ -2133,11 +2132,11 @@ public class TimeDetectorStrategyImplTest {
/**
* Generates a NetworkTimeSuggestion using the current elapsed realtime clock for the
* reference time.
* elapsed realtime.
*/
NetworkTimeSuggestion generateNetworkTimeSuggestion(Instant suggestedTime) {
TimestampedValue<Long> unixEpochTime =
new TimestampedValue<>(
UnixEpochTime unixEpochTime =
new UnixEpochTime(
mFakeEnvironment.peekElapsedRealtimeMillis(),
suggestedTime.toEpochMilli());
return new NetworkTimeSuggestion(unixEpochTime, 123);
@@ -2145,11 +2144,11 @@ public class TimeDetectorStrategyImplTest {
/**
* Generates a GnssTimeSuggestion using the current elapsed realtime clock for the
* reference time.
* elapsed realtime.
*/
GnssTimeSuggestion generateGnssTimeSuggestion(Instant suggestedTime) {
TimestampedValue<Long> unixEpochTime =
new TimestampedValue<>(
UnixEpochTime unixEpochTime =
new UnixEpochTime(
mFakeEnvironment.peekElapsedRealtimeMillis(),
suggestedTime.toEpochMilli());
return new GnssTimeSuggestion(unixEpochTime);
@@ -2157,7 +2156,7 @@ public class TimeDetectorStrategyImplTest {
/**
* Generates a ExternalTimeSuggestion using the current elapsed realtime clock for the
* reference time.
* elapsed realtime.
*/
ExternalTimeSuggestion generateExternalTimeSuggestion(Instant suggestedTime) {
return new ExternalTimeSuggestion(mFakeEnvironment.peekElapsedRealtimeMillis(),
@@ -2168,8 +2167,8 @@ public class TimeDetectorStrategyImplTest {
* Calculates what the supplied time would be when adjusted for the movement of the fake
* elapsed realtime clock.
*/
long calculateTimeInMillisForNow(TimestampedValue<Long> unixEpochTime) {
return TimeDetectorStrategy.getTimeAt(unixEpochTime, peekElapsedRealtimeMillis());
long calculateTimeInMillisForNow(UnixEpochTime unixEpochTime) {
return unixEpochTime.at(peekElapsedRealtimeMillis()).getUnixEpochTimeMillis();
}
Script simulateConfirmTime(UnixEpochTime confirmationTime, boolean expectedReturnValue) {
@@ -2179,7 +2178,7 @@ public class TimeDetectorStrategyImplTest {
}
private static TelephonyTimeSuggestion createTelephonyTimeSuggestion(int slotIndex,
TimestampedValue<Long> unixEpochTime) {
UnixEpochTime unixEpochTime) {
return new TelephonyTimeSuggestion.Builder(slotIndex)
.setUnixEpochTime(unixEpochTime)
.build();

View File

@@ -1,47 +0,0 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.timedetector;
import static org.junit.Assert.assertEquals;
import android.os.TimestampedValue;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class TimeDetectorStrategyTest {
@Test
public void testGetTimeAt() {
long timeMillis = 1000L;
int referenceTimeMillis = 100;
TimestampedValue<Long> timestampedValue =
new TimestampedValue<>(referenceTimeMillis, timeMillis);
// Reference time is after the timestamp.
assertEquals(
timeMillis + (125 - referenceTimeMillis),
TimeDetectorStrategy.getTimeAt(timestampedValue, 125));
// Reference time is before the timestamp.
assertEquals(
timeMillis + (75 - referenceTimeMillis),
TimeDetectorStrategy.getTimeAt(timestampedValue, 75));
}
}