Loading location/java/android/location/timezone/LocationTimeZoneEvent.java +40 −14 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; import java.util.ArrayList; import java.util.Collections; Loading @@ -37,7 +38,7 @@ public final class LocationTimeZoneEvent implements Parcelable { @IntDef({ EVENT_TYPE_UNKNOWN, EVENT_TYPE_SUCCESS, EVENT_TYPE_SUCCESS }) @interface EventType {} /** Uninitialized value for {@link #mEventType} */ /** Uninitialized value for {@link #mEventType} - must not be used for real events. */ private static final int EVENT_TYPE_UNKNOWN = 0; /** Loading @@ -60,6 +61,9 @@ public final class LocationTimeZoneEvent implements Parcelable { private static final int EVENT_TYPE_MAX = EVENT_TYPE_UNCERTAIN; @NonNull private final UserHandle mUserHandle; @EventType private final int mEventType; Loading @@ -68,8 +72,9 @@ public final class LocationTimeZoneEvent implements Parcelable { private final long mElapsedRealtimeNanos; private LocationTimeZoneEvent(@EventType int eventType, @NonNull List<String> timeZoneIds, long elapsedRealtimeNanos) { private LocationTimeZoneEvent(@NonNull UserHandle userHandle, @EventType int eventType, @NonNull List<String> timeZoneIds, long elapsedRealtimeNanos) { mUserHandle = Objects.requireNonNull(userHandle); mEventType = checkValidEventType(eventType); mTimeZoneIds = immutableList(timeZoneIds); Loading @@ -82,6 +87,14 @@ public final class LocationTimeZoneEvent implements Parcelable { mElapsedRealtimeNanos = elapsedRealtimeNanos; } /** * Returns the current user when the event was generated. */ @NonNull public UserHandle getUserHandle() { return mUserHandle; } /** * Returns the time of this fix, in elapsed real-time since system boot. * Loading Loading @@ -117,7 +130,8 @@ public final class LocationTimeZoneEvent implements Parcelable { @Override public String toString() { return "LocationTimeZoneEvent{" + "mEventType=" + mEventType + "mUserHandle=" + mUserHandle + ", mEventType=" + mEventType + ", mTimeZoneIds=" + mTimeZoneIds + ", mElapsedRealtimeNanos=" + mElapsedRealtimeNanos + '}'; Loading @@ -127,12 +141,14 @@ public final class LocationTimeZoneEvent implements Parcelable { new Parcelable.Creator<LocationTimeZoneEvent>() { @Override public LocationTimeZoneEvent createFromParcel(Parcel in) { UserHandle userHandle = UserHandle.readFromParcel(in); int eventType = in.readInt(); @SuppressWarnings("unchecked") ArrayList<String> timeZoneIds = (ArrayList<String>) in.readArrayList(null /* classLoader */); long elapsedRealtimeNanos = in.readLong(); return new LocationTimeZoneEvent(eventType, timeZoneIds, elapsedRealtimeNanos); return new LocationTimeZoneEvent( userHandle, eventType, timeZoneIds, elapsedRealtimeNanos); } @Override Loading @@ -148,6 +164,7 @@ public final class LocationTimeZoneEvent implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { mUserHandle.writeToParcel(parcel, flags); parcel.writeInt(mEventType); parcel.writeList(mTimeZoneIds); parcel.writeLong(mElapsedRealtimeNanos); Loading @@ -162,19 +179,21 @@ public final class LocationTimeZoneEvent implements Parcelable { return false; } LocationTimeZoneEvent that = (LocationTimeZoneEvent) o; return mEventType == that.mEventType return mUserHandle.equals(that.mUserHandle) && mEventType == that.mEventType && mElapsedRealtimeNanos == that.mElapsedRealtimeNanos && mTimeZoneIds.equals(that.mTimeZoneIds); } @Override public int hashCode() { return Objects.hash(mEventType, mTimeZoneIds, mElapsedRealtimeNanos); return Objects.hash(mUserHandle, mEventType, mTimeZoneIds, mElapsedRealtimeNanos); } /** @hide */ public static final class Builder { private UserHandle mUserHandle; private @EventType int mEventType = EVENT_TYPE_UNKNOWN; private @NonNull List<String> mTimeZoneIds = Collections.emptyList(); private long mElapsedRealtimeNanos; Loading @@ -186,13 +205,22 @@ public final class LocationTimeZoneEvent implements Parcelable { * Sets the contents of this from the supplied instance. */ public Builder(@NonNull LocationTimeZoneEvent ltz) { mUserHandle = ltz.mUserHandle; mEventType = ltz.mEventType; mTimeZoneIds = ltz.mTimeZoneIds; mElapsedRealtimeNanos = ltz.mElapsedRealtimeNanos; } /** * Set the time zone ID of this fix. * Set the current user when this event was generated. */ public Builder setUserHandle(@NonNull UserHandle userHandle) { mUserHandle = Objects.requireNonNull(userHandle); return this; } /** * Set the time zone ID of this event. */ public Builder setEventType(@EventType int eventType) { checkValidEventType(eventType); Loading @@ -201,7 +229,7 @@ public final class LocationTimeZoneEvent implements Parcelable { } /** * Sets the time zone IDs of this fix. * Sets the time zone IDs of this event. */ public Builder setTimeZoneIds(@NonNull List<String> timeZoneIds) { mTimeZoneIds = Objects.requireNonNull(timeZoneIds); Loading @@ -209,9 +237,7 @@ public final class LocationTimeZoneEvent implements Parcelable { } /** * Sets the time of this fix, in elapsed real-time since system boot. * * @param time elapsed real-time of fix, in nanoseconds since system boot. * Sets the time of this event, in elapsed real-time since system boot. */ public Builder setElapsedRealtimeNanos(long time) { mElapsedRealtimeNanos = time; Loading @@ -222,8 +248,8 @@ public final class LocationTimeZoneEvent implements Parcelable { * Builds a {@link LocationTimeZoneEvent} instance. */ public LocationTimeZoneEvent build() { return new LocationTimeZoneEvent(this.mEventType, this.mTimeZoneIds, this.mElapsedRealtimeNanos); return new LocationTimeZoneEvent( mUserHandle, mEventType, mTimeZoneIds, mElapsedRealtimeNanos); } } Loading location/lib/java/com/android/location/timezone/provider/LocationTimeZoneProviderBase.java +1 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,7 @@ import java.util.Objects; /** * Base class for location time zone providers implemented as unbundled services. * * TODO Provide details of the expected service actions. * TODO(b/152744911): Provide details of the expected service actions and threading. * * <p>IMPORTANT: This class is effectively a public API for unbundled applications, and must remain * API stable. Loading location/lib/java/com/android/location/timezone/provider/LocationTimeZoneProviderRequestUnbundled.java +18 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,24 @@ public final class LocationTimeZoneProviderRequestUnbundled { return mRequest.getReportLocationTimeZone(); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } LocationTimeZoneProviderRequestUnbundled that = (LocationTimeZoneProviderRequestUnbundled) o; return mRequest.equals(that.mRequest); } @Override public int hashCode() { return Objects.hash(mRequest); } @Override public String toString() { return mRequest.toString(); Loading services/tests/servicestests/src/android/location/timezone/LocationTimeZoneEventTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import static org.junit.Assert.assertNotEquals; import static java.util.Collections.singletonList; import android.os.UserHandle; import org.junit.Test; import java.util.List; Loading @@ -33,6 +35,10 @@ public class LocationTimeZoneEventTest { private static final List<String> ARBITRARY_TIME_ZONE_IDS = singletonList("Europe/London"); private static final UserHandle ARBITRARY_USER_HANDLE = UserHandle.SYSTEM; private static final UserHandle ARBITRARY_USER_HANDLE2 = UserHandle.of(ARBITRARY_USER_HANDLE.getIdentifier() + 1); @Test(expected = RuntimeException.class) public void testSetInvalidEventType() { new LocationTimeZoneEvent.Builder().setEventType(Integer.MAX_VALUE); Loading @@ -41,6 +47,7 @@ public class LocationTimeZoneEventTest { @Test(expected = RuntimeException.class) public void testBuildUnsetEventType() { new LocationTimeZoneEvent.Builder() .setUserHandle(ARBITRARY_USER_HANDLE) .setTimeZoneIds(ARBITRARY_TIME_ZONE_IDS) .setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS) .build(); Loading @@ -49,6 +56,7 @@ public class LocationTimeZoneEventTest { @Test(expected = RuntimeException.class) public void testInvalidTimeZoneIds() { new LocationTimeZoneEvent.Builder() .setUserHandle(ARBITRARY_USER_HANDLE) .setEventType(LocationTimeZoneEvent.EVENT_TYPE_UNCERTAIN) .setTimeZoneIds(ARBITRARY_TIME_ZONE_IDS) .setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS) Loading @@ -58,6 +66,7 @@ public class LocationTimeZoneEventTest { @Test public void testEquals() { LocationTimeZoneEvent.Builder builder1 = new LocationTimeZoneEvent.Builder() .setUserHandle(ARBITRARY_USER_HANDLE) .setEventType(LocationTimeZoneEvent.EVENT_TYPE_UNCERTAIN) .setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS); { Loading @@ -66,6 +75,7 @@ public class LocationTimeZoneEventTest { } LocationTimeZoneEvent.Builder builder2 = new LocationTimeZoneEvent.Builder() .setUserHandle(ARBITRARY_USER_HANDLE) .setEventType(LocationTimeZoneEvent.EVENT_TYPE_UNCERTAIN) .setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS); { Loading @@ -75,6 +85,22 @@ public class LocationTimeZoneEventTest { assertEquals(two, one); } builder1.setUserHandle(ARBITRARY_USER_HANDLE2); { LocationTimeZoneEvent one = builder1.build(); LocationTimeZoneEvent two = builder2.build(); assertNotEquals(one, two); assertNotEquals(two, one); } builder2.setUserHandle(ARBITRARY_USER_HANDLE2); { LocationTimeZoneEvent one = builder1.build(); LocationTimeZoneEvent two = builder2.build(); assertEquals(one, two); assertEquals(two, one); } builder1.setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS + 1); { LocationTimeZoneEvent one = builder1.build(); Loading Loading @@ -127,6 +153,7 @@ public class LocationTimeZoneEventTest { @Test public void testParcelable() { LocationTimeZoneEvent.Builder builder = new LocationTimeZoneEvent.Builder() .setUserHandle(ARBITRARY_USER_HANDLE) .setEventType(LocationTimeZoneEvent.EVENT_TYPE_PERMANENT_FAILURE) .setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS); assertRoundTripParcelable(builder.build()); Loading Loading
location/java/android/location/timezone/LocationTimeZoneEvent.java +40 −14 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; import java.util.ArrayList; import java.util.Collections; Loading @@ -37,7 +38,7 @@ public final class LocationTimeZoneEvent implements Parcelable { @IntDef({ EVENT_TYPE_UNKNOWN, EVENT_TYPE_SUCCESS, EVENT_TYPE_SUCCESS }) @interface EventType {} /** Uninitialized value for {@link #mEventType} */ /** Uninitialized value for {@link #mEventType} - must not be used for real events. */ private static final int EVENT_TYPE_UNKNOWN = 0; /** Loading @@ -60,6 +61,9 @@ public final class LocationTimeZoneEvent implements Parcelable { private static final int EVENT_TYPE_MAX = EVENT_TYPE_UNCERTAIN; @NonNull private final UserHandle mUserHandle; @EventType private final int mEventType; Loading @@ -68,8 +72,9 @@ public final class LocationTimeZoneEvent implements Parcelable { private final long mElapsedRealtimeNanos; private LocationTimeZoneEvent(@EventType int eventType, @NonNull List<String> timeZoneIds, long elapsedRealtimeNanos) { private LocationTimeZoneEvent(@NonNull UserHandle userHandle, @EventType int eventType, @NonNull List<String> timeZoneIds, long elapsedRealtimeNanos) { mUserHandle = Objects.requireNonNull(userHandle); mEventType = checkValidEventType(eventType); mTimeZoneIds = immutableList(timeZoneIds); Loading @@ -82,6 +87,14 @@ public final class LocationTimeZoneEvent implements Parcelable { mElapsedRealtimeNanos = elapsedRealtimeNanos; } /** * Returns the current user when the event was generated. */ @NonNull public UserHandle getUserHandle() { return mUserHandle; } /** * Returns the time of this fix, in elapsed real-time since system boot. * Loading Loading @@ -117,7 +130,8 @@ public final class LocationTimeZoneEvent implements Parcelable { @Override public String toString() { return "LocationTimeZoneEvent{" + "mEventType=" + mEventType + "mUserHandle=" + mUserHandle + ", mEventType=" + mEventType + ", mTimeZoneIds=" + mTimeZoneIds + ", mElapsedRealtimeNanos=" + mElapsedRealtimeNanos + '}'; Loading @@ -127,12 +141,14 @@ public final class LocationTimeZoneEvent implements Parcelable { new Parcelable.Creator<LocationTimeZoneEvent>() { @Override public LocationTimeZoneEvent createFromParcel(Parcel in) { UserHandle userHandle = UserHandle.readFromParcel(in); int eventType = in.readInt(); @SuppressWarnings("unchecked") ArrayList<String> timeZoneIds = (ArrayList<String>) in.readArrayList(null /* classLoader */); long elapsedRealtimeNanos = in.readLong(); return new LocationTimeZoneEvent(eventType, timeZoneIds, elapsedRealtimeNanos); return new LocationTimeZoneEvent( userHandle, eventType, timeZoneIds, elapsedRealtimeNanos); } @Override Loading @@ -148,6 +164,7 @@ public final class LocationTimeZoneEvent implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { mUserHandle.writeToParcel(parcel, flags); parcel.writeInt(mEventType); parcel.writeList(mTimeZoneIds); parcel.writeLong(mElapsedRealtimeNanos); Loading @@ -162,19 +179,21 @@ public final class LocationTimeZoneEvent implements Parcelable { return false; } LocationTimeZoneEvent that = (LocationTimeZoneEvent) o; return mEventType == that.mEventType return mUserHandle.equals(that.mUserHandle) && mEventType == that.mEventType && mElapsedRealtimeNanos == that.mElapsedRealtimeNanos && mTimeZoneIds.equals(that.mTimeZoneIds); } @Override public int hashCode() { return Objects.hash(mEventType, mTimeZoneIds, mElapsedRealtimeNanos); return Objects.hash(mUserHandle, mEventType, mTimeZoneIds, mElapsedRealtimeNanos); } /** @hide */ public static final class Builder { private UserHandle mUserHandle; private @EventType int mEventType = EVENT_TYPE_UNKNOWN; private @NonNull List<String> mTimeZoneIds = Collections.emptyList(); private long mElapsedRealtimeNanos; Loading @@ -186,13 +205,22 @@ public final class LocationTimeZoneEvent implements Parcelable { * Sets the contents of this from the supplied instance. */ public Builder(@NonNull LocationTimeZoneEvent ltz) { mUserHandle = ltz.mUserHandle; mEventType = ltz.mEventType; mTimeZoneIds = ltz.mTimeZoneIds; mElapsedRealtimeNanos = ltz.mElapsedRealtimeNanos; } /** * Set the time zone ID of this fix. * Set the current user when this event was generated. */ public Builder setUserHandle(@NonNull UserHandle userHandle) { mUserHandle = Objects.requireNonNull(userHandle); return this; } /** * Set the time zone ID of this event. */ public Builder setEventType(@EventType int eventType) { checkValidEventType(eventType); Loading @@ -201,7 +229,7 @@ public final class LocationTimeZoneEvent implements Parcelable { } /** * Sets the time zone IDs of this fix. * Sets the time zone IDs of this event. */ public Builder setTimeZoneIds(@NonNull List<String> timeZoneIds) { mTimeZoneIds = Objects.requireNonNull(timeZoneIds); Loading @@ -209,9 +237,7 @@ public final class LocationTimeZoneEvent implements Parcelable { } /** * Sets the time of this fix, in elapsed real-time since system boot. * * @param time elapsed real-time of fix, in nanoseconds since system boot. * Sets the time of this event, in elapsed real-time since system boot. */ public Builder setElapsedRealtimeNanos(long time) { mElapsedRealtimeNanos = time; Loading @@ -222,8 +248,8 @@ public final class LocationTimeZoneEvent implements Parcelable { * Builds a {@link LocationTimeZoneEvent} instance. */ public LocationTimeZoneEvent build() { return new LocationTimeZoneEvent(this.mEventType, this.mTimeZoneIds, this.mElapsedRealtimeNanos); return new LocationTimeZoneEvent( mUserHandle, mEventType, mTimeZoneIds, mElapsedRealtimeNanos); } } Loading
location/lib/java/com/android/location/timezone/provider/LocationTimeZoneProviderBase.java +1 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,7 @@ import java.util.Objects; /** * Base class for location time zone providers implemented as unbundled services. * * TODO Provide details of the expected service actions. * TODO(b/152744911): Provide details of the expected service actions and threading. * * <p>IMPORTANT: This class is effectively a public API for unbundled applications, and must remain * API stable. Loading
location/lib/java/com/android/location/timezone/provider/LocationTimeZoneProviderRequestUnbundled.java +18 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,24 @@ public final class LocationTimeZoneProviderRequestUnbundled { return mRequest.getReportLocationTimeZone(); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } LocationTimeZoneProviderRequestUnbundled that = (LocationTimeZoneProviderRequestUnbundled) o; return mRequest.equals(that.mRequest); } @Override public int hashCode() { return Objects.hash(mRequest); } @Override public String toString() { return mRequest.toString(); Loading
services/tests/servicestests/src/android/location/timezone/LocationTimeZoneEventTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import static org.junit.Assert.assertNotEquals; import static java.util.Collections.singletonList; import android.os.UserHandle; import org.junit.Test; import java.util.List; Loading @@ -33,6 +35,10 @@ public class LocationTimeZoneEventTest { private static final List<String> ARBITRARY_TIME_ZONE_IDS = singletonList("Europe/London"); private static final UserHandle ARBITRARY_USER_HANDLE = UserHandle.SYSTEM; private static final UserHandle ARBITRARY_USER_HANDLE2 = UserHandle.of(ARBITRARY_USER_HANDLE.getIdentifier() + 1); @Test(expected = RuntimeException.class) public void testSetInvalidEventType() { new LocationTimeZoneEvent.Builder().setEventType(Integer.MAX_VALUE); Loading @@ -41,6 +47,7 @@ public class LocationTimeZoneEventTest { @Test(expected = RuntimeException.class) public void testBuildUnsetEventType() { new LocationTimeZoneEvent.Builder() .setUserHandle(ARBITRARY_USER_HANDLE) .setTimeZoneIds(ARBITRARY_TIME_ZONE_IDS) .setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS) .build(); Loading @@ -49,6 +56,7 @@ public class LocationTimeZoneEventTest { @Test(expected = RuntimeException.class) public void testInvalidTimeZoneIds() { new LocationTimeZoneEvent.Builder() .setUserHandle(ARBITRARY_USER_HANDLE) .setEventType(LocationTimeZoneEvent.EVENT_TYPE_UNCERTAIN) .setTimeZoneIds(ARBITRARY_TIME_ZONE_IDS) .setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS) Loading @@ -58,6 +66,7 @@ public class LocationTimeZoneEventTest { @Test public void testEquals() { LocationTimeZoneEvent.Builder builder1 = new LocationTimeZoneEvent.Builder() .setUserHandle(ARBITRARY_USER_HANDLE) .setEventType(LocationTimeZoneEvent.EVENT_TYPE_UNCERTAIN) .setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS); { Loading @@ -66,6 +75,7 @@ public class LocationTimeZoneEventTest { } LocationTimeZoneEvent.Builder builder2 = new LocationTimeZoneEvent.Builder() .setUserHandle(ARBITRARY_USER_HANDLE) .setEventType(LocationTimeZoneEvent.EVENT_TYPE_UNCERTAIN) .setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS); { Loading @@ -75,6 +85,22 @@ public class LocationTimeZoneEventTest { assertEquals(two, one); } builder1.setUserHandle(ARBITRARY_USER_HANDLE2); { LocationTimeZoneEvent one = builder1.build(); LocationTimeZoneEvent two = builder2.build(); assertNotEquals(one, two); assertNotEquals(two, one); } builder2.setUserHandle(ARBITRARY_USER_HANDLE2); { LocationTimeZoneEvent one = builder1.build(); LocationTimeZoneEvent two = builder2.build(); assertEquals(one, two); assertEquals(two, one); } builder1.setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS + 1); { LocationTimeZoneEvent one = builder1.build(); Loading Loading @@ -127,6 +153,7 @@ public class LocationTimeZoneEventTest { @Test public void testParcelable() { LocationTimeZoneEvent.Builder builder = new LocationTimeZoneEvent.Builder() .setUserHandle(ARBITRARY_USER_HANDLE) .setEventType(LocationTimeZoneEvent.EVENT_TYPE_PERMANENT_FAILURE) .setElapsedRealtimeNanos(ARBITRARY_ELAPSED_REALTIME_NANOS); assertRoundTripParcelable(builder.build()); Loading