summaryrefslogtreecommitdiff
path: root/location
diff options
context:
space:
mode:
author Shinru Han <shinruhan@google.com> 2024-12-06 03:43:44 +0000
committer Shinru Han <shinruhan@google.com> 2024-12-06 03:43:44 +0000
commitb39d62d5083b3f732b049e71a43af3d34c40abe8 (patch)
tree6323f8e98e5fd388fc90b70ca0edfc6e6b560f43 /location
parent3ebccb43a0a6fc3940e743cee0c8d457029f1511 (diff)
Add GnssAssistanceInterface (framework/base)
Bug: 358381377 Test: atest CtsLocationNoneTestCases Flag: android.location.flags.gnss_assistance_interface Change-Id: Ie174dfadc3e5320ccc63753a227e55a3b0a383e5
Diffstat (limited to 'location')
-rw-r--r--location/api/system-current.txt814
-rw-r--r--location/java/android/location/BeidouAssistance.java283
-rw-r--r--location/java/android/location/BeidouSatelliteEphemeris.java647
-rw-r--r--location/java/android/location/GalileoAssistance.java283
-rw-r--r--location/java/android/location/GalileoIonosphericModel.java148
-rw-r--r--location/java/android/location/GalileoSatelliteEphemeris.java660
-rw-r--r--location/java/android/location/GlonassAlmanac.java418
-rw-r--r--location/java/android/location/GlonassAssistance.java213
-rw-r--r--location/java/android/location/GlonassSatelliteEphemeris.java623
-rw-r--r--location/java/android/location/GnssAlmanac.java619
-rw-r--r--location/java/android/location/GnssAssistance.aidl18
-rw-r--r--location/java/android/location/GnssAssistance.java310
-rw-r--r--location/java/android/location/GnssCorrectionComponent.java300
-rw-r--r--location/java/android/location/GpsAssistance.java289
-rw-r--r--location/java/android/location/GpsSatelliteEphemeris.java632
-rw-r--r--location/java/android/location/IonosphericCorrection.java112
-rw-r--r--location/java/android/location/KeplerianOrbitModel.java518
-rw-r--r--location/java/android/location/KlobucharIonosphericModel.java252
-rw-r--r--location/java/android/location/LeapSecondsModel.java171
-rw-r--r--location/java/android/location/QzssAssistance.java282
-rw-r--r--location/java/android/location/QzssSatelliteEphemeris.java229
-rw-r--r--location/java/android/location/RealTimeIntegrityModel.java284
-rw-r--r--location/java/android/location/SatelliteEphemerisTime.java151
-rw-r--r--location/java/android/location/TimeModel.java208
-rw-r--r--location/java/android/location/UtcModel.java176
-rw-r--r--location/java/android/location/flags/location.aconfig7
26 files changed, 8647 insertions, 0 deletions
diff --git a/location/api/system-current.txt b/location/api/system-current.txt
index cf3f74085d66..e386de690d62 100644
--- a/location/api/system-current.txt
+++ b/location/api/system-current.txt
@@ -6,6 +6,111 @@ package android.location {
method public void onLocationBatch(java.util.List<android.location.Location>);
}
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class BeidouAssistance implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public android.location.GnssAlmanac getAlmanac();
+ method @Nullable public android.location.KlobucharIonosphericModel getIonosphericModel();
+ method @Nullable public android.location.LeapSecondsModel getLeapSecondsModel();
+ method @NonNull public java.util.List<android.location.RealTimeIntegrityModel> getRealTimeIntegrityModels();
+ method @NonNull public java.util.List<android.location.GnssAssistance.GnssSatelliteCorrections> getSatelliteCorrections();
+ method @NonNull public java.util.List<android.location.BeidouSatelliteEphemeris> getSatelliteEphemeris();
+ method @NonNull public java.util.List<android.location.TimeModel> getTimeModels();
+ method @Nullable public android.location.UtcModel getUtcModel();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.BeidouAssistance> CREATOR;
+ }
+
+ public static final class BeidouAssistance.Builder {
+ ctor public BeidouAssistance.Builder();
+ method @NonNull public android.location.BeidouAssistance build();
+ method @NonNull public android.location.BeidouAssistance.Builder setAlmanac(@Nullable android.location.GnssAlmanac);
+ method @NonNull public android.location.BeidouAssistance.Builder setIonosphericModel(@Nullable android.location.KlobucharIonosphericModel);
+ method @NonNull public android.location.BeidouAssistance.Builder setLeapSecondsModel(@Nullable android.location.LeapSecondsModel);
+ method @NonNull public android.location.BeidouAssistance.Builder setRealTimeIntegrityModels(@Nullable java.util.List<android.location.RealTimeIntegrityModel>);
+ method @NonNull public android.location.BeidouAssistance.Builder setSatelliteCorrections(@Nullable java.util.List<android.location.GnssAssistance.GnssSatelliteCorrections>);
+ method @NonNull public android.location.BeidouAssistance.Builder setSatelliteEphemeris(@Nullable java.util.List<android.location.BeidouSatelliteEphemeris>);
+ method @NonNull public android.location.BeidouAssistance.Builder setTimeModels(@Nullable java.util.List<android.location.TimeModel>);
+ method @NonNull public android.location.BeidouAssistance.Builder setUtcModel(@Nullable android.location.UtcModel);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class BeidouSatelliteEphemeris implements android.os.Parcelable {
+ method public int describeContents();
+ method @IntRange(from=1, to=63) public int getPrn();
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteClockModel getSatelliteClockModel();
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteEphemerisTime getSatelliteEphemerisTime();
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteHealth getSatelliteHealth();
+ method @NonNull public android.location.KeplerianOrbitModel getSatelliteOrbitModel();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.BeidouSatelliteEphemeris> CREATOR;
+ }
+
+ public static final class BeidouSatelliteEphemeris.BeidouSatelliteClockModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-0.00977F, to=0.00977f) public double getAf0();
+ method @FloatRange(from=-1.87E-9F, to=1.87E-9f) public double getAf1();
+ method @FloatRange(from=-1.39E-17F, to=1.39E-17f) public double getAf2();
+ method @IntRange(from=0, to=31) public int getAodc();
+ method @FloatRange(from=-5.12E-8F, to=5.12E-8f) public double getTgd1();
+ method @FloatRange(from=-5.12E-8F, to=5.12E-8f) public double getTgd2();
+ method @IntRange(from=0) public long getTimeOfClockSeconds();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.BeidouSatelliteEphemeris.BeidouSatelliteClockModel> CREATOR;
+ }
+
+ public static final class BeidouSatelliteEphemeris.BeidouSatelliteClockModel.Builder {
+ ctor public BeidouSatelliteEphemeris.BeidouSatelliteClockModel.Builder();
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteClockModel build();
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteClockModel.Builder setAf0(@FloatRange(from=-0.00977F, to=0.00977f) double);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteClockModel.Builder setAf1(@FloatRange(from=-1.87E-9F, to=1.87E-9f) double);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteClockModel.Builder setAf2(@FloatRange(from=-1.39E-17F, to=1.39E-17f) double);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteClockModel.Builder setAodc(@IntRange(from=0, to=31) int);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteClockModel.Builder setTgd1(@FloatRange(from=-5.12E-8F, to=5.12E-8f) double);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteClockModel.Builder setTgd2(@FloatRange(from=-5.12E-8F, to=5.12E-8f) double);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteClockModel.Builder setTimeOfClockSeconds(@IntRange(from=0) long);
+ }
+
+ public static final class BeidouSatelliteEphemeris.BeidouSatelliteEphemerisTime implements android.os.Parcelable {
+ method public int describeContents();
+ method @IntRange(from=0) public int getBeidouWeekNumber();
+ method @IntRange(from=0, to=31) public int getIode();
+ method @IntRange(from=0, to=604792) public int getToeSeconds();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.BeidouSatelliteEphemeris.BeidouSatelliteEphemerisTime> CREATOR;
+ }
+
+ public static final class BeidouSatelliteEphemeris.BeidouSatelliteEphemerisTime.Builder {
+ ctor public BeidouSatelliteEphemeris.BeidouSatelliteEphemerisTime.Builder();
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteEphemerisTime build();
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteEphemerisTime.Builder setBeidouWeekNumber(@IntRange(from=0) int);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteEphemerisTime.Builder setIode(int);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteEphemerisTime.Builder setToeSeconds(@IntRange(from=0, to=604792) int);
+ }
+
+ public static final class BeidouSatelliteEphemeris.BeidouSatelliteHealth implements android.os.Parcelable {
+ method public int describeContents();
+ method @IntRange(from=0, to=1) public int getSatH1();
+ method @FloatRange(from=0.0f, to=8192.0f) public double getSvAccur();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.BeidouSatelliteEphemeris.BeidouSatelliteHealth> CREATOR;
+ }
+
+ public static final class BeidouSatelliteEphemeris.BeidouSatelliteHealth.Builder {
+ ctor public BeidouSatelliteEphemeris.BeidouSatelliteHealth.Builder();
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteHealth build();
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteHealth.Builder setSatH1(int);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.BeidouSatelliteHealth.Builder setSvAccur(double);
+ }
+
+ public static final class BeidouSatelliteEphemeris.Builder {
+ ctor public BeidouSatelliteEphemeris.Builder();
+ method @NonNull public android.location.BeidouSatelliteEphemeris build();
+ method @NonNull public android.location.BeidouSatelliteEphemeris.Builder setPrn(int);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.Builder setSatelliteClockModel(@NonNull android.location.BeidouSatelliteEphemeris.BeidouSatelliteClockModel);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.Builder setSatelliteEphemerisTime(@NonNull android.location.BeidouSatelliteEphemeris.BeidouSatelliteEphemerisTime);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.Builder setSatelliteHealth(@NonNull android.location.BeidouSatelliteEphemeris.BeidouSatelliteHealth);
+ method @NonNull public android.location.BeidouSatelliteEphemeris.Builder setSatelliteOrbitModel(@NonNull android.location.KeplerianOrbitModel);
+ }
+
public final class CorrelationVector implements android.os.Parcelable {
method public int describeContents();
method @FloatRange(from=0.0f) public double getFrequencyOffsetMetersPerSecond();
@@ -43,12 +148,375 @@ package android.location {
method public void unregisterCountryDetectorCallback(@NonNull java.util.function.Consumer<android.location.Country>);
}
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class GalileoAssistance implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public android.location.GnssAlmanac getAlmanac();
+ method @Nullable public android.location.KlobucharIonosphericModel getIonosphericModel();
+ method @Nullable public android.location.LeapSecondsModel getLeapSecondsModel();
+ method @NonNull public java.util.List<android.location.RealTimeIntegrityModel> getRealTimeIntegrityModels();
+ method @NonNull public java.util.List<android.location.GnssAssistance.GnssSatelliteCorrections> getSatelliteCorrections();
+ method @NonNull public java.util.List<android.location.GalileoSatelliteEphemeris> getSatelliteEphemeris();
+ method @NonNull public java.util.List<android.location.TimeModel> getTimeModels();
+ method @Nullable public android.location.UtcModel getUtcModel();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GalileoAssistance> CREATOR;
+ }
+
+ public static final class GalileoAssistance.Builder {
+ ctor public GalileoAssistance.Builder();
+ method @NonNull public android.location.GalileoAssistance build();
+ method @NonNull public android.location.GalileoAssistance.Builder setAlmanac(@Nullable android.location.GnssAlmanac);
+ method @NonNull public android.location.GalileoAssistance.Builder setIonosphericModel(@Nullable android.location.KlobucharIonosphericModel);
+ method @NonNull public android.location.GalileoAssistance.Builder setLeapSecondsModel(@Nullable android.location.LeapSecondsModel);
+ method @NonNull public android.location.GalileoAssistance.Builder setRealTimeIntegrityModels(@Nullable java.util.List<android.location.RealTimeIntegrityModel>);
+ method @NonNull public android.location.GalileoAssistance.Builder setSatelliteCorrections(@Nullable java.util.List<android.location.GnssAssistance.GnssSatelliteCorrections>);
+ method @NonNull public android.location.GalileoAssistance.Builder setSatelliteEphemeris(@Nullable java.util.List<android.location.GalileoSatelliteEphemeris>);
+ method @NonNull public android.location.GalileoAssistance.Builder setTimeModels(@Nullable java.util.List<android.location.TimeModel>);
+ method @NonNull public android.location.GalileoAssistance.Builder setUtcModel(@Nullable android.location.UtcModel);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class GalileoIonosphericModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=0.0f, to=512.0f) public double getAi0();
+ method @FloatRange(from=-4.0F, to=4.0f) public double getAi1();
+ method @FloatRange(from=-0.5F, to=0.5f) public double getAi2();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GalileoIonosphericModel> CREATOR;
+ }
+
+ public static final class GalileoIonosphericModel.Builder {
+ ctor public GalileoIonosphericModel.Builder();
+ method @NonNull public android.location.GalileoIonosphericModel build();
+ method @NonNull public android.location.GalileoIonosphericModel.Builder setAi0(@FloatRange(from=0.0f, to=512.0f) double);
+ method @NonNull public android.location.GalileoIonosphericModel.Builder setAi1(@FloatRange(from=-4.0F, to=4.0f) double);
+ method @NonNull public android.location.GalileoIonosphericModel.Builder setAi2(@FloatRange(from=-0.5F, to=0.5f) double);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class GalileoSatelliteEphemeris implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public java.util.List<android.location.GalileoSatelliteEphemeris.GalileoSatelliteClockModel> getSatelliteClockModels();
+ method @IntRange(from=1, to=36) public int getSatelliteCodeNumber();
+ method @NonNull public android.location.SatelliteEphemerisTime getSatelliteEphemerisTime();
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSvHealth getSatelliteHealth();
+ method @NonNull public android.location.KeplerianOrbitModel getSatelliteOrbitModel();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GalileoSatelliteEphemeris> CREATOR;
+ }
+
+ public static final class GalileoSatelliteEphemeris.Builder {
+ ctor public GalileoSatelliteEphemeris.Builder();
+ method @NonNull public android.location.GalileoSatelliteEphemeris build();
+ method @NonNull public android.location.GalileoSatelliteEphemeris.Builder setSatelliteClockModels(@NonNull java.util.List<android.location.GalileoSatelliteEphemeris.GalileoSatelliteClockModel>);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.Builder setSatelliteCodeNumber(@IntRange(from=1, to=36) int);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.Builder setSatelliteEphemerisTime(@NonNull android.location.SatelliteEphemerisTime);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.Builder setSatelliteHealth(@NonNull android.location.GalileoSatelliteEphemeris.GalileoSvHealth);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.Builder setSatelliteOrbitModel(@NonNull android.location.KeplerianOrbitModel);
+ }
+
+ public static final class GalileoSatelliteEphemeris.GalileoSatelliteClockModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-0.0625F, to=0.0625f) public double getAf0();
+ method @FloatRange(from=-1.5E-8F, to=1.5E-8f) public double getAf1();
+ method @FloatRange(from=-5.56E-17F, to=5.56E-17f) public double getAf2();
+ method @FloatRange(from=-1.2E-7F, to=1.2E-7f) public double getBgdSeconds();
+ method public int getSatelliteClockType();
+ method @FloatRange(from=0.0f) public double getSisaMeters();
+ method @IntRange(from=0) public long getTimeOfClockSeconds();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GalileoSatelliteEphemeris.GalileoSatelliteClockModel> CREATOR;
+ field public static final int TYPE_FNAV = 1; // 0x1
+ field public static final int TYPE_INAV = 2; // 0x2
+ field public static final int TYPE_UNDEFINED = 0; // 0x0
+ }
+
+ public static final class GalileoSatelliteEphemeris.GalileoSatelliteClockModel.Builder {
+ ctor public GalileoSatelliteEphemeris.GalileoSatelliteClockModel.Builder();
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSatelliteClockModel build();
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSatelliteClockModel.Builder setAf0(@FloatRange(from=-0.0625F, to=0.0625f) double);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSatelliteClockModel.Builder setAf1(@FloatRange(from=-1.5E-8F, to=1.5E-8f) double);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSatelliteClockModel.Builder setAf2(@FloatRange(from=-5.56E-17F, to=5.56E-17f) double);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSatelliteClockModel.Builder setBgdSeconds(@FloatRange(from=-1.2E-7F, to=1.2E-7f) double);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSatelliteClockModel.Builder setSatelliteClockType(int);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSatelliteClockModel.Builder setSisaMeters(@FloatRange(from=0.0f) double);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSatelliteClockModel.Builder setTimeOfClockSeconds(@IntRange(from=0) long);
+ }
+
+ public static final class GalileoSatelliteEphemeris.GalileoSvHealth implements android.os.Parcelable {
+ method public int describeContents();
+ method @IntRange(from=0, to=1) public int getDataValidityStatusE1b();
+ method @IntRange(from=0, to=1) public int getDataValidityStatusE5a();
+ method @IntRange(from=0, to=1) public int getDataValidityStatusE5b();
+ method @IntRange(from=0, to=3) public int getSignalHealthStatusE1b();
+ method @IntRange(from=0, to=3) public int getSignalHealthStatusE5a();
+ method @IntRange(from=0, to=3) public int getSignalHealthStatusE5b();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GalileoSatelliteEphemeris.GalileoSvHealth> CREATOR;
+ }
+
+ public static final class GalileoSatelliteEphemeris.GalileoSvHealth.Builder {
+ ctor public GalileoSatelliteEphemeris.GalileoSvHealth.Builder();
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSvHealth build();
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSvHealth.Builder setDataValidityStatusE1b(@IntRange(from=0, to=1) int);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSvHealth.Builder setDataValidityStatusE5a(@IntRange(from=0, to=1) int);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSvHealth.Builder setDataValidityStatusE5b(@IntRange(from=0, to=1) int);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSvHealth.Builder setSignalHealthStatusE1b(@IntRange(from=0, to=3) int);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSvHealth.Builder setSignalHealthStatusE5a(@IntRange(from=0, to=3) int);
+ method @NonNull public android.location.GalileoSatelliteEphemeris.GalileoSvHealth.Builder setSignalHealthStatusE5b(@IntRange(from=0, to=3) int);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class GlonassAlmanac implements android.os.Parcelable {
+ ctor public GlonassAlmanac(@IntRange(from=0) long, @NonNull java.util.List<android.location.GlonassAlmanac.GlonassSatelliteAlmanac>);
+ method public int describeContents();
+ method @IntRange(from=0) public long getIssueDateMillis();
+ method @NonNull public java.util.List<android.location.GlonassAlmanac.GlonassSatelliteAlmanac> getSatelliteAlmanacs();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GlonassAlmanac> CREATOR;
+ }
+
+ public static final class GlonassAlmanac.GlonassSatelliteAlmanac implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-0.067F, to=0.067f) public double getDeltaI();
+ method @FloatRange(from=-3600.0F, to=3600.0f) public double getDeltaT();
+ method @FloatRange(from=-0.004F, to=0.004f) public double getDeltaTDot();
+ method @FloatRange(from=0.0f, to=0.03f) public double getEccentricity();
+ method @IntRange(from=0, to=31) public int getFreqChannel();
+ method @FloatRange(from=-1.0F, to=1.0f) public double getLambda();
+ method @FloatRange(from=-1.0F, to=1.0f) public double getOmega();
+ method @IntRange(from=1, to=25) public int getSlotNumber();
+ method @IntRange(from=0, to=1) public int getSvHealth();
+ method @FloatRange(from=0.0f, to=44100.0f) public double getTLambda();
+ method @FloatRange(from=-0.0019F, to=0.0019f) public double getTau();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GlonassAlmanac.GlonassSatelliteAlmanac> CREATOR;
+ }
+
+ public static final class GlonassAlmanac.GlonassSatelliteAlmanac.Builder {
+ ctor public GlonassAlmanac.GlonassSatelliteAlmanac.Builder();
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac build();
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac.Builder setDeltaI(@FloatRange(from=-0.067F, to=0.067f) double);
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac.Builder setDeltaT(@FloatRange(from=-3600.0F, to=3600.0f) double);
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac.Builder setDeltaTDot(@FloatRange(from=-0.004F, to=0.004f) double);
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac.Builder setEccentricity(@FloatRange(from=0.0f, to=0.03f) double);
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac.Builder setFreqChannel(@IntRange(from=0, to=31) int);
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac.Builder setLambda(@FloatRange(from=-1.0F, to=1.0f) double);
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac.Builder setOmega(@FloatRange(from=-1.0F, to=1.0f) double);
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac.Builder setSlotNumber(@IntRange(from=1, to=25) int);
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac.Builder setSvHealth(@IntRange(from=0, to=1) int);
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac.Builder setTLambda(@FloatRange(from=0.0f, to=44100.0f) double);
+ method @NonNull public android.location.GlonassAlmanac.GlonassSatelliteAlmanac.Builder setTau(@FloatRange(from=-0.0019F, to=0.0019f) double);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class GlonassAssistance implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public android.location.GlonassAlmanac getAlmanac();
+ method @NonNull public java.util.List<android.location.GnssAssistance.GnssSatelliteCorrections> getSatelliteCorrections();
+ method @NonNull public java.util.List<android.location.GlonassSatelliteEphemeris> getSatelliteEphemeris();
+ method @NonNull public java.util.List<android.location.TimeModel> getTimeModels();
+ method @Nullable public android.location.UtcModel getUtcModel();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GlonassAssistance> CREATOR;
+ }
+
+ public static final class GlonassAssistance.Builder {
+ ctor public GlonassAssistance.Builder();
+ method @NonNull public android.location.GlonassAssistance build();
+ method @NonNull public android.location.GlonassAssistance.Builder setAlmanac(@Nullable android.location.GlonassAlmanac);
+ method @NonNull public android.location.GlonassAssistance.Builder setSatelliteCorrections(@Nullable java.util.List<android.location.GnssAssistance.GnssSatelliteCorrections>);
+ method @NonNull public android.location.GlonassAssistance.Builder setSatelliteEphemeris(@Nullable java.util.List<android.location.GlonassSatelliteEphemeris>);
+ method @NonNull public android.location.GlonassAssistance.Builder setTimeModels(@Nullable java.util.List<android.location.TimeModel>);
+ method @NonNull public android.location.GlonassAssistance.Builder setUtcModel(@Nullable android.location.UtcModel);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class GlonassSatelliteEphemeris implements android.os.Parcelable {
+ method public int describeContents();
+ method @IntRange(from=0, to=31) public int getAgeInDays();
+ method @FloatRange(from=0.0f) public double getFrameTimeSeconds();
+ method @IntRange(from=0, to=1) public int getHealthState();
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteClockModel getSatelliteClockModel();
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel getSatelliteOrbitModel();
+ method @IntRange(from=1, to=25) public int getSlotNumber();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GlonassSatelliteEphemeris> CREATOR;
+ }
+
+ public static final class GlonassSatelliteEphemeris.Builder {
+ ctor public GlonassSatelliteEphemeris.Builder();
+ method @NonNull public android.location.GlonassSatelliteEphemeris build();
+ method @NonNull public android.location.GlonassSatelliteEphemeris.Builder setAgeInDays(@IntRange(from=0, to=31) int);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.Builder setFrameTimeSeconds(@FloatRange(from=0.0f) double);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.Builder setHealthState(@IntRange(from=0, to=1) int);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.Builder setSatelliteClockModel(@NonNull android.location.GlonassSatelliteEphemeris.GlonassSatelliteClockModel);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.Builder setSatelliteOrbitModel(@NonNull android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.Builder setSlotNumber(@IntRange(from=1, to=25) int);
+ }
+
+ public static final class GlonassSatelliteEphemeris.GlonassSatelliteClockModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-0.002F, to=0.002f) public double getClockBias();
+ method @FloatRange(from=-9.32E-10F, to=9.32E-10f) public double getFrequencyBias();
+ method @IntRange(from=0xfffffff9, to=6) public int getFrequencyNumber();
+ method @IntRange(from=0) public long getTimeOfClockSeconds();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GlonassSatelliteEphemeris.GlonassSatelliteClockModel> CREATOR;
+ }
+
+ public static final class GlonassSatelliteEphemeris.GlonassSatelliteClockModel.Builder {
+ ctor public GlonassSatelliteEphemeris.GlonassSatelliteClockModel.Builder();
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteClockModel build();
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteClockModel.Builder setClockBias(@FloatRange(from=-0.002F, to=0.002f) double);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteClockModel.Builder setFrequencyBias(@FloatRange(from=-9.32E-10F, to=9.32E-10f) double);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteClockModel.Builder setFrequencyNumber(@IntRange(from=0xfffffff9, to=6) int);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteClockModel.Builder setTimeOfClockSeconds(@IntRange(from=0) long);
+ }
+
+ public static final class GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-27000.0F, to=27000.0f) public double getX();
+ method @FloatRange(from=-6.2E-9F, to=6.2E-9f) public double getXAccel();
+ method @FloatRange(from=-4.3F, to=4.3f) public double getXDot();
+ method @FloatRange(from=-27000.0F, to=27000.0f) public double getY();
+ method @FloatRange(from=-6.2E-9F, to=6.2E-9f) public double getYAccel();
+ method @FloatRange(from=-4.3F, to=4.3f) public double getYDot();
+ method @FloatRange(from=-27000.0F, to=27000.0f) public double getZ();
+ method @FloatRange(from=-6.2E-9F, to=6.2E-9f) public double getZAccel();
+ method @FloatRange(from=-4.3F, to=4.3f) public double getZDot();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel> CREATOR;
+ }
+
+ public static final class GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel.Builder {
+ ctor public GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel.Builder();
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel build();
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel.Builder setX(@FloatRange(from=-27000.0F, to=27000.0f) double);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel.Builder setXAccel(@FloatRange(from=-6.2E-9F, to=6.2E-9f) double);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel.Builder setXDot(@FloatRange(from=-4.3F, to=4.3f) double);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel.Builder setY(@FloatRange(from=-27000.0F, to=27000.0f) double);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel.Builder setYAccel(@FloatRange(from=-6.2E-9F, to=6.2E-9f) double);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel.Builder setYDot(@FloatRange(from=-4.3F, to=4.3f) double);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel.Builder setZ(@FloatRange(from=-27000.0F, to=27000.0f) double);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel.Builder setZAccel(@FloatRange(from=-6.2E-9F, to=6.2E-9f) double);
+ method @NonNull public android.location.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel.Builder setZDot(@FloatRange(from=-4.3F, to=4.3f) double);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class GnssAlmanac implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public java.util.List<android.location.GnssAlmanac.GnssSatelliteAlmanac> getGnssSatelliteAlmanacs();
+ method @IntRange(from=0) public int getIod();
+ method @IntRange(from=0) public long getIssueDateMillis();
+ method @IntRange(from=0, to=604800) public int getToaSeconds();
+ method @IntRange(from=0) public int getWeekNumber();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GnssAlmanac> CREATOR;
+ }
+
+ public static final class GnssAlmanac.Builder {
+ ctor public GnssAlmanac.Builder();
+ method @NonNull public android.location.GnssAlmanac build();
+ method @NonNull public android.location.GnssAlmanac.Builder setGnssSatelliteAlmanacs(@NonNull java.util.List<android.location.GnssAlmanac.GnssSatelliteAlmanac>);
+ method @NonNull public android.location.GnssAlmanac.Builder setIod(@IntRange(from=0) int);
+ method @NonNull public android.location.GnssAlmanac.Builder setIssueDateMillis(@IntRange(from=0) long);
+ method @NonNull public android.location.GnssAlmanac.Builder setToaSeconds(@IntRange(from=0, to=604800) int);
+ method @NonNull public android.location.GnssAlmanac.Builder setWeekNumber(@IntRange(from=0) int);
+ }
+
+ public static final class GnssAlmanac.GnssSatelliteAlmanac implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-0.0625F, to=0.0625f) public double getAf0();
+ method @FloatRange(from=-1.5E-8F, to=1.5E-8f) public double getAf1();
+ method @FloatRange(from=0.0f) public double getEccentricity();
+ method @FloatRange(from=-1.0F, to=1.0f) public double getInclination();
+ method @FloatRange(from=-1.0F, to=1.0f) public double getM0();
+ method @FloatRange(from=-1.0F, to=1.0f) public double getOmega();
+ method @FloatRange(from=-1.0F, to=1.0f) public double getOmega0();
+ method @FloatRange(from=-1.0F, to=1.0f) public double getOmegaDot();
+ method @FloatRange(from=0.0f, to=8192.0f) public double getRootA();
+ method @IntRange(from=0) public int getSvHealth();
+ method @IntRange(from=1) public int getSvid();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GnssAlmanac.GnssSatelliteAlmanac> CREATOR;
+ }
+
+ public static final class GnssAlmanac.GnssSatelliteAlmanac.Builder {
+ ctor public GnssAlmanac.GnssSatelliteAlmanac.Builder();
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac build();
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac.Builder setAf0(@FloatRange(from=-0.0625F, to=0.0625f) double);
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac.Builder setAf1(@FloatRange(from=-1.5E-8F, to=1.5E-8f) double);
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac.Builder setEccentricity(@FloatRange(from=0.0f) double);
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac.Builder setInclination(@FloatRange(from=-1.0F, to=1.0f) double);
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac.Builder setM0(@FloatRange(from=-1.0F, to=1.0f) double);
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac.Builder setOmega(@FloatRange(from=-1.0F, to=1.0f) double);
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac.Builder setOmega0(@FloatRange(from=-1.0F, to=1.0f) double);
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac.Builder setOmegaDot(@FloatRange(from=-1.0F, to=1.0f) double);
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac.Builder setRootA(@FloatRange(from=0.0f, to=8192.0f) double);
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac.Builder setSvHealth(@IntRange(from=0) int);
+ method @NonNull public android.location.GnssAlmanac.GnssSatelliteAlmanac.Builder setSvid(@IntRange(from=1) int);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class GnssAssistance implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public android.location.BeidouAssistance getBeidouAssistance();
+ method @Nullable public android.location.GalileoAssistance getGalileoAssistance();
+ method @Nullable public android.location.GlonassAssistance getGlonassAssistance();
+ method @Nullable public android.location.GpsAssistance getGpsAssistance();
+ method @Nullable public android.location.QzssAssistance getQzssAssistance();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GnssAssistance> CREATOR;
+ }
+
+ public static final class GnssAssistance.Builder {
+ ctor public GnssAssistance.Builder();
+ method @NonNull public android.location.GnssAssistance build();
+ method @NonNull public android.location.GnssAssistance.Builder setBeidouAssistance(@Nullable android.location.BeidouAssistance);
+ method @NonNull public android.location.GnssAssistance.Builder setGalileoAssistance(@Nullable android.location.GalileoAssistance);
+ method @NonNull public android.location.GnssAssistance.Builder setGlonassAssistance(@Nullable android.location.GlonassAssistance);
+ method @NonNull public android.location.GnssAssistance.Builder setGpsAssistance(@Nullable android.location.GpsAssistance);
+ method @NonNull public android.location.GnssAssistance.Builder setQzssAssistance(@Nullable android.location.QzssAssistance);
+ }
+
+ public static final class GnssAssistance.GnssSatelliteCorrections implements android.os.Parcelable {
+ ctor public GnssAssistance.GnssSatelliteCorrections(@IntRange(from=1, to=206) int, @NonNull java.util.List<android.location.IonosphericCorrection>);
+ method public int describeContents();
+ method @NonNull public java.util.List<android.location.IonosphericCorrection> getIonosphericCorrections();
+ method @IntRange(from=1, to=206) public int getSvid();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GnssAssistance.GnssSatelliteCorrections> CREATOR;
+ }
+
public final class GnssCapabilities implements android.os.Parcelable {
method @Deprecated public boolean hasMeasurementCorrectionsReflectingPane();
method @Deprecated public boolean hasNavMessages();
method @Deprecated public boolean hasSatelliteBlacklist();
}
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class GnssCorrectionComponent implements android.os.Parcelable {
+ ctor public GnssCorrectionComponent(@NonNull String, @NonNull android.location.GnssCorrectionComponent.GnssInterval, @NonNull android.location.GnssCorrectionComponent.PseudorangeCorrection);
+ method public int describeContents();
+ method @NonNull public android.location.GnssCorrectionComponent.PseudorangeCorrection getPseudorangeCorrection();
+ method @NonNull public String getSourceKey();
+ method @NonNull public android.location.GnssCorrectionComponent.GnssInterval getValidityInterval();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GnssCorrectionComponent> CREATOR;
+ }
+
+ public static final class GnssCorrectionComponent.GnssInterval implements android.os.Parcelable {
+ ctor public GnssCorrectionComponent.GnssInterval(@IntRange(from=0) long, @IntRange(from=0) long);
+ method public int describeContents();
+ method @IntRange(from=0) public long getEndMillisSinceGpsEpoch();
+ method @IntRange(from=0) public long getStartMillisSinceGpsEpoch();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GnssCorrectionComponent.GnssInterval> CREATOR;
+ }
+
+ public static final class GnssCorrectionComponent.PseudorangeCorrection implements android.os.Parcelable {
+ ctor public GnssCorrectionComponent.PseudorangeCorrection(double, double, double);
+ method public int describeContents();
+ method public double getCorrectionMeters();
+ method public double getCorrectionRateMetersPerSecond();
+ method @FloatRange(from=0.0f) public double getCorrectionUncertaintyMeters();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GnssCorrectionComponent.PseudorangeCorrection> CREATOR;
+ }
+
public final class GnssExcessPathInfo implements android.os.Parcelable {
method public int describeContents();
method @FloatRange(from=0.0f) public float getAttenuationDb();
@@ -193,6 +661,33 @@ package android.location {
method @NonNull public android.location.GnssSingleSatCorrection.Builder setSatelliteId(@IntRange(from=0) int);
}
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class GpsAssistance implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public android.location.GnssAlmanac getAlmanac();
+ method @Nullable public android.location.KlobucharIonosphericModel getIonosphericModel();
+ method @Nullable public android.location.LeapSecondsModel getLeapSecondsModel();
+ method @NonNull public java.util.List<android.location.RealTimeIntegrityModel> getRealTimeIntegrityModels();
+ method @NonNull public java.util.List<android.location.GnssAssistance.GnssSatelliteCorrections> getSatelliteCorrections();
+ method @NonNull public java.util.List<android.location.GpsSatelliteEphemeris> getSatelliteEphemeris();
+ method @NonNull public java.util.List<android.location.TimeModel> getTimeModels();
+ method @Nullable public android.location.UtcModel getUtcModel();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GpsAssistance> CREATOR;
+ }
+
+ public static final class GpsAssistance.Builder {
+ ctor public GpsAssistance.Builder();
+ method @NonNull public android.location.GpsAssistance build();
+ method @NonNull public android.location.GpsAssistance.Builder setAlmanac(@Nullable android.location.GnssAlmanac);
+ method @NonNull public android.location.GpsAssistance.Builder setIonosphericModel(@Nullable android.location.KlobucharIonosphericModel);
+ method @NonNull public android.location.GpsAssistance.Builder setLeapSecondsModel(@Nullable android.location.LeapSecondsModel);
+ method @NonNull public android.location.GpsAssistance.Builder setRealTimeIntegrityModels(@Nullable java.util.List<android.location.RealTimeIntegrityModel>);
+ method @NonNull public android.location.GpsAssistance.Builder setSatelliteCorrections(@Nullable java.util.List<android.location.GnssAssistance.GnssSatelliteCorrections>);
+ method @NonNull public android.location.GpsAssistance.Builder setSatelliteEphemeris(@Nullable java.util.List<android.location.GpsSatelliteEphemeris>);
+ method @NonNull public android.location.GpsAssistance.Builder setTimeModels(@Nullable java.util.List<android.location.TimeModel>);
+ method @NonNull public android.location.GpsAssistance.Builder setUtcModel(@Nullable android.location.UtcModel);
+ }
+
@Deprecated public class GpsClock implements android.os.Parcelable {
method @Deprecated public int describeContents();
method @Deprecated public double getBiasInNs();
@@ -418,6 +913,174 @@ package android.location {
method @Deprecated public void onStatusChanged(int);
}
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class GpsSatelliteEphemeris implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsL2Params getGpsL2Params();
+ method @IntRange(from=1, to=32) public int getPrn();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel getSatelliteClockModel();
+ method @NonNull public android.location.SatelliteEphemerisTime getSatelliteEphemerisTime();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteHealth getSatelliteHealth();
+ method @NonNull public android.location.KeplerianOrbitModel getSatelliteOrbitModel();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GpsSatelliteEphemeris> CREATOR;
+ }
+
+ public static final class GpsSatelliteEphemeris.Builder {
+ ctor public GpsSatelliteEphemeris.Builder();
+ method @NonNull public android.location.GpsSatelliteEphemeris build();
+ method @NonNull public android.location.GpsSatelliteEphemeris.Builder setGpsL2Params(@NonNull android.location.GpsSatelliteEphemeris.GpsL2Params);
+ method @NonNull public android.location.GpsSatelliteEphemeris.Builder setPrn(@IntRange(from=1, to=32) int);
+ method @NonNull public android.location.GpsSatelliteEphemeris.Builder setSatelliteClockModel(@NonNull android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel);
+ method @NonNull public android.location.GpsSatelliteEphemeris.Builder setSatelliteEphemerisTime(@NonNull android.location.SatelliteEphemerisTime);
+ method @NonNull public android.location.GpsSatelliteEphemeris.Builder setSatelliteHealth(@NonNull android.location.GpsSatelliteEphemeris.GpsSatelliteHealth);
+ method @NonNull public android.location.GpsSatelliteEphemeris.Builder setSatelliteOrbitModel(@NonNull android.location.KeplerianOrbitModel);
+ }
+
+ public static final class GpsSatelliteEphemeris.GpsL2Params implements android.os.Parcelable {
+ method public int describeContents();
+ method @IntRange(from=0, to=3) public int getL2Code();
+ method @IntRange(from=0, to=1) public int getL2Flag();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GpsSatelliteEphemeris.GpsL2Params> CREATOR;
+ }
+
+ public static final class GpsSatelliteEphemeris.GpsL2Params.Builder {
+ ctor public GpsSatelliteEphemeris.GpsL2Params.Builder();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsL2Params build();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsL2Params.Builder setL2Code(@IntRange(from=0, to=3) int);
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsL2Params.Builder setL2Flag(@IntRange(from=0, to=1) int);
+ }
+
+ public static final class GpsSatelliteEphemeris.GpsSatelliteClockModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-0.00977F, to=0.00977f) public double getAf0();
+ method @FloatRange(from=-3.73E-9F, to=3.73E-9f) public double getAf1();
+ method @FloatRange(from=-3.56E-15F, to=3.56E-15f) public double getAf2();
+ method @IntRange(from=0, to=1023) public int getIodc();
+ method @FloatRange(from=-5.97E-8F, to=5.97E-8f) public double getTgd();
+ method @IntRange(from=0) public long getTimeOfClockSeconds();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel> CREATOR;
+ }
+
+ public static final class GpsSatelliteEphemeris.GpsSatelliteClockModel.Builder {
+ ctor public GpsSatelliteEphemeris.GpsSatelliteClockModel.Builder();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel build();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel.Builder setAf0(@FloatRange(from=-0.00977F, to=0.00977f) double);
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel.Builder setAf1(@FloatRange(from=-3.73E-9F, to=3.73E-9f) double);
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel.Builder setAf2(@FloatRange(from=-3.56E-15F, to=3.56E-15f) double);
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel.Builder setIodc(@IntRange(from=0, to=1023) int);
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel.Builder setTgd(@FloatRange(from=-5.97E-8F, to=5.97E-8f) double);
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel.Builder setTimeOfClockSeconds(@IntRange(from=0) long);
+ }
+
+ public static final class GpsSatelliteEphemeris.GpsSatelliteHealth implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=0.0f) public double getFitInt();
+ method @FloatRange(from=0.0f, to=8192.0f) public double getSvAccur();
+ method @IntRange(from=0, to=63) public int getSvHealth();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.GpsSatelliteEphemeris.GpsSatelliteHealth> CREATOR;
+ }
+
+ public static final class GpsSatelliteEphemeris.GpsSatelliteHealth.Builder {
+ ctor public GpsSatelliteEphemeris.GpsSatelliteHealth.Builder();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteHealth build();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteHealth.Builder setFitInt(@FloatRange(from=0.0f) double);
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteHealth.Builder setSvAccur(@FloatRange(from=0.0f, to=8192.0f) double);
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteHealth.Builder setSvHealth(@IntRange(from=0, to=63) int);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class IonosphericCorrection implements android.os.Parcelable {
+ ctor public IonosphericCorrection(@IntRange(from=0) long, @NonNull android.location.GnssCorrectionComponent);
+ method public int describeContents();
+ method @IntRange(from=0) public long getCarrierFrequencyHz();
+ method @NonNull public android.location.GnssCorrectionComponent getIonosphericCorrection();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.IonosphericCorrection> CREATOR;
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class KeplerianOrbitModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-1.18E-8F, to=1.18E-8f) public double getDeltaN();
+ method @FloatRange(from=0.0f, to=0.5f) public double getEccentricity();
+ method @FloatRange(from=-3.15F, to=3.15f) public double getI0();
+ method @FloatRange(from=-2.94E-9F, to=2.94E-9f) public double getIDot();
+ method @FloatRange(from=-3.15F, to=3.15f) public double getM0();
+ method @FloatRange(from=-3.15F, to=3.15f) public double getOmega();
+ method @FloatRange(from=-3.15F, to=3.15f) public double getOmega0();
+ method @FloatRange(from=-3.1E-6F, to=3.1E-6f) public double getOmegaDot();
+ method @FloatRange(from=0.0f, to=8192.0f) public double getRootA();
+ method @NonNull public android.location.KeplerianOrbitModel.SecondOrderHarmonicPerturbation getSecondOrderHarmonicPerturbation();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.KeplerianOrbitModel> CREATOR;
+ }
+
+ public static final class KeplerianOrbitModel.Builder {
+ ctor public KeplerianOrbitModel.Builder();
+ method @NonNull public android.location.KeplerianOrbitModel build();
+ method @NonNull public android.location.KeplerianOrbitModel.Builder setDeltaN(@FloatRange(from=-1.18E-8F, to=1.18E-8f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.Builder setEccentricity(@FloatRange(from=0.0f, to=0.5f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.Builder setI0(@FloatRange(from=-3.15F, to=3.15f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.Builder setIDot(@FloatRange(from=-2.94E-9F, to=2.94E-9f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.Builder setM0(@FloatRange(from=-3.15F, to=3.15f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.Builder setOmega(@FloatRange(from=-3.15F, to=3.15f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.Builder setOmega0(@FloatRange(from=-3.15F, to=3.15f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.Builder setOmegaDot(@FloatRange(from=-3.1E-6F, to=3.1E-6f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.Builder setRootA(@FloatRange(from=0.0f, to=8192.0f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.Builder setSecondOrderHarmonicPerturbation(@NonNull android.location.KeplerianOrbitModel.SecondOrderHarmonicPerturbation);
+ }
+
+ public static final class KeplerianOrbitModel.SecondOrderHarmonicPerturbation implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-6.11E-5F, to=6.11E-5f) public double getCic();
+ method @FloatRange(from=-6.11E-5F, to=6.11E-5f) public double getCis();
+ method @FloatRange(from=-2048.0F, to=2048.0f) public double getCrc();
+ method @FloatRange(from=-2048.0F, to=2048.0f) public double getCrs();
+ method @FloatRange(from=-6.11E-5F, to=6.11E-5f) public double getCuc();
+ method @FloatRange(from=-6.11E-5F, to=6.11E-5f) public double getCus();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.KeplerianOrbitModel.SecondOrderHarmonicPerturbation> CREATOR;
+ }
+
+ public static final class KeplerianOrbitModel.SecondOrderHarmonicPerturbation.Builder {
+ ctor public KeplerianOrbitModel.SecondOrderHarmonicPerturbation.Builder();
+ method @NonNull public android.location.KeplerianOrbitModel.SecondOrderHarmonicPerturbation build();
+ method @NonNull public android.location.KeplerianOrbitModel.SecondOrderHarmonicPerturbation.Builder setCic(@FloatRange(from=-6.11E-5F, to=6.11E-5f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.SecondOrderHarmonicPerturbation.Builder setCis(@FloatRange(from=-6.11E-5F, to=6.11E-5f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.SecondOrderHarmonicPerturbation.Builder setCrc(@FloatRange(from=-2048.0F, to=2048.0f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.SecondOrderHarmonicPerturbation.Builder setCrs(@FloatRange(from=-2048.0F, to=2048.0f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.SecondOrderHarmonicPerturbation.Builder setCuc(@FloatRange(from=-6.11E-5F, to=6.11E-5f) double);
+ method @NonNull public android.location.KeplerianOrbitModel.SecondOrderHarmonicPerturbation.Builder setCus(@FloatRange(from=-6.11E-5F, to=6.11E-5f) double);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class KlobucharIonosphericModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-1.193E-7F, to=1.193E-7f) public double getAlpha0();
+ method @FloatRange(from=-9.54E-7F, to=9.54E-7f) public double getAlpha1();
+ method @FloatRange(from=-7.63E-6F, to=7.63E-6f) public double getAlpha2();
+ method @FloatRange(from=-7.63E-6F, to=7.63E-6f) public double getAlpha3();
+ method @FloatRange(from=-262144.0F, to=262144.0f) public double getBeta0();
+ method @FloatRange(from=-2097152.0F, to=2097152.0f) public double getBeta1();
+ method @FloatRange(from=-8388608.0F, to=8388608.0f) public double getBeta2();
+ method @FloatRange(from=-8388608.0F, to=8388608.0f) public double getBeta3();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.KlobucharIonosphericModel> CREATOR;
+ }
+
+ public static final class KlobucharIonosphericModel.Builder {
+ ctor public KlobucharIonosphericModel.Builder();
+ method @NonNull public android.location.KlobucharIonosphericModel build();
+ method @NonNull public android.location.KlobucharIonosphericModel.Builder setAlpha0(@FloatRange(from=-1.193E-7F, to=1.193E-7f) double);
+ method @NonNull public android.location.KlobucharIonosphericModel.Builder setAlpha1(@FloatRange(from=-9.54E-7F, to=9.54E-7f) double);
+ method @NonNull public android.location.KlobucharIonosphericModel.Builder setAlpha2(@FloatRange(from=-7.63E-6F, to=7.63E-6f) double);
+ method @NonNull public android.location.KlobucharIonosphericModel.Builder setAlpha3(@FloatRange(from=-7.63E-6F, to=7.63E-6f) double);
+ method @NonNull public android.location.KlobucharIonosphericModel.Builder setBeta0(@FloatRange(from=-262144.0F, to=262144.0f) double);
+ method @NonNull public android.location.KlobucharIonosphericModel.Builder setBeta1(@FloatRange(from=-2097152.0F, to=2097152.0f) double);
+ method @NonNull public android.location.KlobucharIonosphericModel.Builder setBeta2(@FloatRange(from=-8388608.0F, to=8388608.0f) double);
+ method @NonNull public android.location.KlobucharIonosphericModel.Builder setBeta3(@FloatRange(from=-8388608.0F, to=8388608.0f) double);
+ }
+
public final class LastLocationRequest implements android.os.Parcelable {
method public int describeContents();
method public boolean isAdasGnssBypass();
@@ -436,6 +1099,25 @@ package android.location {
method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_BYPASS) public android.location.LastLocationRequest.Builder setLocationSettingsIgnored(boolean);
}
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class LeapSecondsModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @IntRange(from=0) public int getDayNumberLeapSecondsFuture();
+ method @IntRange(from=0) public int getLeapSeconds();
+ method @IntRange(from=0) public int getLeapSecondsFuture();
+ method @IntRange(from=0) public int getWeekNumberLeapSecondsFuture();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.LeapSecondsModel> CREATOR;
+ }
+
+ public static final class LeapSecondsModel.Builder {
+ ctor public LeapSecondsModel.Builder();
+ method @NonNull public android.location.LeapSecondsModel build();
+ method @NonNull public android.location.LeapSecondsModel.Builder setDayNumberLeapSecondsFuture(@IntRange(from=0) int);
+ method @NonNull public android.location.LeapSecondsModel.Builder setLeapSeconds(@IntRange(from=0) int);
+ method @NonNull public android.location.LeapSecondsModel.Builder setLeapSecondsFuture(@IntRange(from=0) int);
+ method @NonNull public android.location.LeapSecondsModel.Builder setWeekNumberLeapSecondsFuture(@IntRange(from=0) int);
+ }
+
public class LocationManager {
method @Deprecated @FlaggedApi("android.location.flags.deprecate_provider_request_apis") @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.INTERACT_ACROSS_USERS}) public void addProviderRequestChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.location.provider.ProviderRequest.ChangedListener);
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void flushGnssBatch();
@@ -513,6 +1195,98 @@ package android.location {
method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.location.LocationRequest.Builder setWorkSource(@Nullable android.os.WorkSource);
}
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class QzssAssistance implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public android.location.GnssAlmanac getAlmanac();
+ method @Nullable public android.location.KlobucharIonosphericModel getIonosphericModel();
+ method @Nullable public android.location.LeapSecondsModel getLeapSecondsModel();
+ method @NonNull public java.util.List<android.location.RealTimeIntegrityModel> getRealTimeIntegrityModels();
+ method @NonNull public java.util.List<android.location.GnssAssistance.GnssSatelliteCorrections> getSatelliteCorrections();
+ method @NonNull public java.util.List<android.location.QzssSatelliteEphemeris> getSatelliteEphemeris();
+ method @NonNull public java.util.List<android.location.TimeModel> getTimeModels();
+ method @Nullable public android.location.UtcModel getUtcModel();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.QzssAssistance> CREATOR;
+ }
+
+ public static final class QzssAssistance.Builder {
+ ctor public QzssAssistance.Builder();
+ method @NonNull public android.location.QzssAssistance build();
+ method @NonNull public android.location.QzssAssistance.Builder setAlmanac(@Nullable android.location.GnssAlmanac);
+ method @NonNull public android.location.QzssAssistance.Builder setIonosphericModel(@Nullable android.location.KlobucharIonosphericModel);
+ method @NonNull public android.location.QzssAssistance.Builder setLeapSecondsModel(@Nullable android.location.LeapSecondsModel);
+ method @NonNull public android.location.QzssAssistance.Builder setRealTimeIntegrityModels(@Nullable java.util.List<android.location.RealTimeIntegrityModel>);
+ method @NonNull public android.location.QzssAssistance.Builder setSatelliteCorrections(@Nullable java.util.List<android.location.GnssAssistance.GnssSatelliteCorrections>);
+ method @NonNull public android.location.QzssAssistance.Builder setSatelliteEphemeris(@Nullable java.util.List<android.location.QzssSatelliteEphemeris>);
+ method @NonNull public android.location.QzssAssistance.Builder setTimeModels(@Nullable java.util.List<android.location.TimeModel>);
+ method @NonNull public android.location.QzssAssistance.Builder setUtcModel(@Nullable android.location.UtcModel);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class QzssSatelliteEphemeris implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsL2Params getGpsL2Params();
+ method @IntRange(from=183, to=206) public int getPrn();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel getSatelliteClockModel();
+ method @NonNull public android.location.SatelliteEphemerisTime getSatelliteEphemerisTime();
+ method @NonNull public android.location.GpsSatelliteEphemeris.GpsSatelliteHealth getSatelliteHealth();
+ method @NonNull public android.location.KeplerianOrbitModel getSatelliteOrbitModel();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.QzssSatelliteEphemeris> CREATOR;
+ }
+
+ public static final class QzssSatelliteEphemeris.Builder {
+ ctor public QzssSatelliteEphemeris.Builder();
+ method @NonNull public android.location.QzssSatelliteEphemeris build();
+ method @NonNull public android.location.QzssSatelliteEphemeris.Builder setGpsL2Params(@NonNull android.location.GpsSatelliteEphemeris.GpsL2Params);
+ method @NonNull public android.location.QzssSatelliteEphemeris.Builder setPrn(@IntRange(from=183, to=206) int);
+ method @NonNull public android.location.QzssSatelliteEphemeris.Builder setSatelliteClockModel(@NonNull android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel);
+ method @NonNull public android.location.QzssSatelliteEphemeris.Builder setSatelliteEphemerisTime(@NonNull android.location.SatelliteEphemerisTime);
+ method @NonNull public android.location.QzssSatelliteEphemeris.Builder setSatelliteHealth(@NonNull android.location.GpsSatelliteEphemeris.GpsSatelliteHealth);
+ method @NonNull public android.location.QzssSatelliteEphemeris.Builder setSatelliteOrbitModel(@NonNull android.location.KeplerianOrbitModel);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class RealTimeIntegrityModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public String getAdvisoryNumber();
+ method @NonNull public String getAdvisoryType();
+ method @IntRange(from=0) public long getEndDateSeconds();
+ method @IntRange(from=0) public long getPublishDateSeconds();
+ method @IntRange(from=0) public long getStartDateSeconds();
+ method @IntRange(from=1, to=206) public int getSvid();
+ method public boolean isUsable();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.RealTimeIntegrityModel> CREATOR;
+ }
+
+ public static final class RealTimeIntegrityModel.Builder {
+ ctor public RealTimeIntegrityModel.Builder();
+ method @NonNull public android.location.RealTimeIntegrityModel build();
+ method @NonNull public android.location.RealTimeIntegrityModel.Builder setAdvisoryNumber(@NonNull String);
+ method @NonNull public android.location.RealTimeIntegrityModel.Builder setAdvisoryType(@NonNull String);
+ method @NonNull public android.location.RealTimeIntegrityModel.Builder setEndDateSeconds(@IntRange(from=0) long);
+ method @NonNull public android.location.RealTimeIntegrityModel.Builder setPublishDateSeconds(@IntRange(from=0) long);
+ method @NonNull public android.location.RealTimeIntegrityModel.Builder setStartDateSeconds(@IntRange(from=0) long);
+ method @NonNull public android.location.RealTimeIntegrityModel.Builder setSvid(@IntRange(from=1, to=206) int);
+ method @NonNull public android.location.RealTimeIntegrityModel.Builder setUsable(boolean);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class SatelliteEphemerisTime implements android.os.Parcelable {
+ method public int describeContents();
+ method @IntRange(from=0, to=1023) public int getIode();
+ method @IntRange(from=0, to=604799) public int getToeSeconds();
+ method @IntRange(from=0) public int getWeekNumber();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.SatelliteEphemerisTime> CREATOR;
+ }
+
+ public static final class SatelliteEphemerisTime.Builder {
+ ctor public SatelliteEphemerisTime.Builder();
+ method @NonNull public android.location.SatelliteEphemerisTime build();
+ method @NonNull public android.location.SatelliteEphemerisTime.Builder setIode(@IntRange(from=0, to=1023) int);
+ method @NonNull public android.location.SatelliteEphemerisTime.Builder setToeSeconds(@IntRange(from=0, to=604799) int);
+ method @NonNull public android.location.SatelliteEphemerisTime.Builder setWeekNumber(@IntRange(from=0) int);
+ }
+
public final class SatellitePvt implements android.os.Parcelable {
method public int describeContents();
method @Nullable public android.location.SatellitePvt.ClockInfo getClockInfo();
@@ -587,6 +1361,46 @@ package android.location {
field @NonNull public static final android.os.Parcelable.Creator<android.location.SatellitePvt.VelocityEcef> CREATOR;
}
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class TimeModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-1.0F, to=1.0f) public double getA0();
+ method @FloatRange(from=-3.28E-6F, to=3.28E-6f) public double getA1();
+ method @IntRange(from=0, to=604800) public int getTimeOfWeek();
+ method public int getToGnss();
+ method @IntRange(from=0) public int getWeekNumber();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.TimeModel> CREATOR;
+ }
+
+ public static final class TimeModel.Builder {
+ ctor public TimeModel.Builder();
+ method @NonNull public android.location.TimeModel build();
+ method @NonNull public android.location.TimeModel.Builder setA0(@FloatRange(from=-1.0F, to=1.0f) double);
+ method @NonNull public android.location.TimeModel.Builder setA1(@FloatRange(from=-3.28E-6F, to=3.28E-6f) double);
+ method @NonNull public android.location.TimeModel.Builder setTimeOfWeek(@IntRange(from=0, to=604800) int);
+ method @NonNull public android.location.TimeModel.Builder setToGnss(int);
+ method @NonNull public android.location.TimeModel.Builder setWeekNumber(@IntRange(from=0) int);
+ }
+
+ @FlaggedApi("android.location.flags.gnss_assistance_interface") public final class UtcModel implements android.os.Parcelable {
+ method public int describeContents();
+ method @FloatRange(from=-2.0F, to=2.0f) public double getA0();
+ method @FloatRange(from=-7.45E-9F, to=7.45E-9f) public double getA1();
+ method @IntRange(from=0, to=604800) public int getTimeOfWeek();
+ method @IntRange(from=0) public int getWeekNumber();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.location.UtcModel> CREATOR;
+ }
+
+ public static final class UtcModel.Builder {
+ ctor public UtcModel.Builder();
+ method @NonNull public android.location.UtcModel build();
+ method @NonNull public android.location.UtcModel.Builder setA0(@FloatRange(from=-2.0F, to=2.0f) double);
+ method @NonNull public android.location.UtcModel.Builder setA1(@FloatRange(from=-7.45E-9F, to=7.45E-9f) double);
+ method @NonNull public android.location.UtcModel.Builder setTimeOfWeek(@IntRange(from=0, to=604800) int);
+ method @NonNull public android.location.UtcModel.Builder setWeekNumber(@IntRange(from=0) int);
+ }
+
}
package android.location.provider {
diff --git a/location/java/android/location/BeidouAssistance.java b/location/java/android/location/BeidouAssistance.java
new file mode 100644
index 000000000000..f55249e605a0
--- /dev/null
+++ b/location/java/android/location/BeidouAssistance.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
+import android.location.GnssAssistance.GnssSatelliteCorrections;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A class contains Beidou assistance.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class BeidouAssistance implements Parcelable {
+
+ /** The Beidou almanac. */
+ @Nullable private final GnssAlmanac mAlmanac;
+
+ /** The Klobuchar ionospheric model. */
+ @Nullable private final KlobucharIonosphericModel mIonosphericModel;
+
+ /** The UTC model. */
+ @Nullable private final UtcModel mUtcModel;
+
+ /** The leap seconds model. */
+ @Nullable private final LeapSecondsModel mLeapSecondsModel;
+
+ /** The list of time models. */
+ @NonNull private final List<TimeModel> mTimeModels;
+
+ /** The list of Beidou ephemeris. */
+ @NonNull private final List<BeidouSatelliteEphemeris> mSatelliteEphemeris;
+
+ /** The list of real time integrity models. */
+ @NonNull private final List<RealTimeIntegrityModel> mRealTimeIntegrityModels;
+
+ /** The list of Beidou satellite corrections. */
+ @NonNull private final List<GnssSatelliteCorrections> mSatelliteCorrections;
+
+ private BeidouAssistance(Builder builder) {
+ mAlmanac = builder.mAlmanac;
+ mIonosphericModel = builder.mIonosphericModel;
+ mUtcModel = builder.mUtcModel;
+ mLeapSecondsModel = builder.mLeapSecondsModel;
+ if (builder.mTimeModels != null) {
+ mTimeModels = Collections.unmodifiableList(new ArrayList<>(builder.mTimeModels));
+ } else {
+ mTimeModels = new ArrayList<>();
+ }
+ if (builder.mSatelliteEphemeris != null) {
+ mSatelliteEphemeris =
+ Collections.unmodifiableList(new ArrayList<>(builder.mSatelliteEphemeris));
+ } else {
+ mSatelliteEphemeris = new ArrayList<>();
+ }
+ if (builder.mRealTimeIntegrityModels != null) {
+ mRealTimeIntegrityModels =
+ Collections.unmodifiableList(new ArrayList<>(builder.mRealTimeIntegrityModels));
+ } else {
+ mRealTimeIntegrityModels = new ArrayList<>();
+ }
+ if (builder.mSatelliteCorrections != null) {
+ mSatelliteCorrections =
+ Collections.unmodifiableList(new ArrayList<>(builder.mSatelliteCorrections));
+ } else {
+ mSatelliteCorrections = new ArrayList<>();
+ }
+ }
+
+ /** Returns the Beidou almanac. */
+ @Nullable
+ public GnssAlmanac getAlmanac() {
+ return mAlmanac;
+ }
+
+ /** Returns the Klobuchar ionospheric model. */
+ @Nullable
+ public KlobucharIonosphericModel getIonosphericModel() {
+ return mIonosphericModel;
+ }
+
+ /** Returns the UTC model. */
+ @Nullable
+ public UtcModel getUtcModel() {
+ return mUtcModel;
+ }
+
+ /** Returns the leap seconds model. */
+ @Nullable
+ public LeapSecondsModel getLeapSecondsModel() {
+ return mLeapSecondsModel;
+ }
+
+ /** Returns the list of time models. */
+ @NonNull
+ public List<TimeModel> getTimeModels() {
+ return mTimeModels;
+ }
+
+ /** Returns the list ofBeidou ephemeris. */
+ @NonNull
+ public List<BeidouSatelliteEphemeris> getSatelliteEphemeris() {
+ return mSatelliteEphemeris;
+ }
+
+ /** Returns the list of real time integrity models. */
+ @NonNull
+ public List<RealTimeIntegrityModel> getRealTimeIntegrityModels() {
+ return mRealTimeIntegrityModels;
+ }
+
+ /** Returns the list of Beidou satellite corrections. */
+ @NonNull
+ public List<GnssSatelliteCorrections> getSatelliteCorrections() {
+ return mSatelliteCorrections;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("BeidouAssistance[");
+ builder.append("almanac = ").append(mAlmanac);
+ builder.append(", ionosphericModel = ").append(mIonosphericModel);
+ builder.append(", utcModel = ").append(mUtcModel);
+ builder.append(", leapSecondsModel = ").append(mLeapSecondsModel);
+ builder.append(", timeModels = ").append(mTimeModels);
+ builder.append(", satelliteEphemeris = ").append(mSatelliteEphemeris);
+ builder.append(", realTimeIntegrityModels = ").append(mRealTimeIntegrityModels);
+ builder.append(", satelliteCorrections = ").append(mSatelliteCorrections);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeTypedObject(mAlmanac, flags);
+ dest.writeTypedObject(mIonosphericModel, flags);
+ dest.writeTypedObject(mUtcModel, flags);
+ dest.writeTypedObject(mLeapSecondsModel, flags);
+ dest.writeTypedList(mTimeModels);
+ dest.writeTypedList(mSatelliteEphemeris);
+ dest.writeTypedList(mRealTimeIntegrityModels);
+ dest.writeTypedList(mSatelliteCorrections);
+ }
+
+ public static final @android.annotation.NonNull Creator<BeidouAssistance> CREATOR =
+ new Creator<BeidouAssistance>() {
+ @Override
+ public BeidouAssistance createFromParcel(Parcel in) {
+ return new BeidouAssistance.Builder()
+ .setAlmanac(in.readTypedObject(GnssAlmanac.CREATOR))
+ .setIonosphericModel(
+ in.readTypedObject(KlobucharIonosphericModel.CREATOR))
+ .setUtcModel(in.readTypedObject(UtcModel.CREATOR))
+ .setLeapSecondsModel(in.readTypedObject(LeapSecondsModel.CREATOR))
+ .setTimeModels(in.createTypedArrayList(TimeModel.CREATOR))
+ .setSatelliteEphemeris(
+ in.createTypedArrayList(BeidouSatelliteEphemeris.CREATOR))
+ .setRealTimeIntegrityModels(
+ in.createTypedArrayList(RealTimeIntegrityModel.CREATOR))
+ .setSatelliteCorrections(
+ in.createTypedArrayList(GnssSatelliteCorrections.CREATOR))
+ .build();
+ }
+
+ @Override
+ public BeidouAssistance[] newArray(int size) {
+ return new BeidouAssistance[size];
+ }
+ };
+
+ /** Builder for {@link BeidouAssistance}. */
+ public static final class Builder {
+ private GnssAlmanac mAlmanac;
+ private KlobucharIonosphericModel mIonosphericModel;
+ private UtcModel mUtcModel;
+ private LeapSecondsModel mLeapSecondsModel;
+ private List<TimeModel> mTimeModels;
+ private List<BeidouSatelliteEphemeris> mSatelliteEphemeris;
+ private List<RealTimeIntegrityModel> mRealTimeIntegrityModels;
+ private List<GnssSatelliteCorrections> mSatelliteCorrections;
+
+ /** Sets the Beidou almanac. */
+ @NonNull
+ public Builder setAlmanac(@Nullable GnssAlmanac almanac) {
+ mAlmanac = almanac;
+ return this;
+ }
+
+ /** Sets the Klobuchar ionospheric model. */
+ @NonNull
+ public Builder setIonosphericModel(@Nullable KlobucharIonosphericModel ionosphericModel) {
+ mIonosphericModel = ionosphericModel;
+ return this;
+ }
+
+ /** Sets the UTC model. */
+ @NonNull
+ public Builder setUtcModel(@Nullable UtcModel utcModel) {
+ mUtcModel = utcModel;
+ return this;
+ }
+
+ /** Sets the leap seconds model. */
+ @NonNull
+ public Builder setLeapSecondsModel(@Nullable LeapSecondsModel leapSecondsModel) {
+ mLeapSecondsModel = leapSecondsModel;
+ return this;
+ }
+
+ /** Sets the list of time models. */
+ @NonNull
+ public Builder setTimeModels(
+ @Nullable @SuppressLint("NullableCollection") List<TimeModel> timeModels) {
+ mTimeModels = timeModels;
+ return this;
+ }
+
+ /** Sets the list of Beidou ephemeris. */
+ @NonNull
+ public Builder setSatelliteEphemeris(
+ @Nullable @SuppressLint("NullableCollection")
+ List<BeidouSatelliteEphemeris> satelliteEphemeris) {
+ mSatelliteEphemeris = satelliteEphemeris;
+ return this;
+ }
+
+ /** Sets the list of real time integrity models. */
+ @NonNull
+ public Builder setRealTimeIntegrityModels(
+ @Nullable @SuppressLint("NullableCollection")
+ List<RealTimeIntegrityModel> realTimeIntegrityModels) {
+ mRealTimeIntegrityModels = realTimeIntegrityModels;
+ return this;
+ }
+
+ /** Sets the list of Beidou satellite corrections. */
+ @NonNull
+ public Builder setSatelliteCorrections(
+ @Nullable @SuppressLint("NullableCollection")
+ List<GnssSatelliteCorrections> satelliteCorrections) {
+ mSatelliteCorrections = satelliteCorrections;
+ return this;
+ }
+
+ /** Builds the {@link BeidouAssistance}. */
+ @NonNull
+ public BeidouAssistance build() {
+ return new BeidouAssistance(this);
+ }
+ }
+}
diff --git a/location/java/android/location/BeidouSatelliteEphemeris.java b/location/java/android/location/BeidouSatelliteEphemeris.java
new file mode 100644
index 000000000000..6bd91e3318c3
--- /dev/null
+++ b/location/java/android/location/BeidouSatelliteEphemeris.java
@@ -0,0 +1,647 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A class contains ephemeris parameters specific to Beidou satellites.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class BeidouSatelliteEphemeris implements Parcelable {
+ /** The PRN number of the Beidou satellite. */
+ private final int mPrn;
+
+ /** Satellite clock model. */
+ private final BeidouSatelliteClockModel mSatelliteClockModel;
+
+ /** Satellite orbit model. */
+ private final KeplerianOrbitModel mSatelliteOrbitModel;
+
+ /** Satellite health. */
+ private final BeidouSatelliteHealth mSatelliteHealth;
+
+ /** Satellite ephemeris time. */
+ private final BeidouSatelliteEphemerisTime mSatelliteEphemerisTime;
+
+ private BeidouSatelliteEphemeris(Builder builder) {
+ // Allow PRN beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(builder.mPrn >= 1);
+ Preconditions.checkNotNull(builder.mSatelliteClockModel,
+ "SatelliteClockModel cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteOrbitModel,
+ "SatelliteOrbitModel cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteHealth,
+ "SatelliteHealth cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteEphemerisTime,
+ "SatelliteEphemerisTime cannot be null");
+ mPrn = builder.mPrn;
+ mSatelliteClockModel = builder.mSatelliteClockModel;
+ mSatelliteOrbitModel = builder.mSatelliteOrbitModel;
+ mSatelliteHealth = builder.mSatelliteHealth;
+ mSatelliteEphemerisTime = builder.mSatelliteEphemerisTime;
+ }
+
+ /** Returns the PRN of the satellite. */
+ @IntRange(from = 1, to = 63)
+ public int getPrn() {
+ return mPrn;
+ }
+
+ /** Returns the satellite clock model. */
+ @NonNull
+ public BeidouSatelliteClockModel getSatelliteClockModel() {
+ return mSatelliteClockModel;
+ }
+
+ /** Returns the satellite orbit model. */
+ @NonNull
+ public KeplerianOrbitModel getSatelliteOrbitModel() {
+ return mSatelliteOrbitModel;
+ }
+
+ /** Returns the satellite health. */
+ @NonNull
+ public BeidouSatelliteHealth getSatelliteHealth() {
+ return mSatelliteHealth;
+ }
+
+ /** Returns the satellite ephemeris time. */
+ @NonNull
+ public BeidouSatelliteEphemerisTime getSatelliteEphemerisTime() {
+ return mSatelliteEphemerisTime;
+ }
+
+ public static final @NonNull Creator<BeidouSatelliteEphemeris> CREATOR =
+ new Creator<BeidouSatelliteEphemeris>() {
+ @Override
+ @NonNull
+ public BeidouSatelliteEphemeris createFromParcel(Parcel in) {
+ final BeidouSatelliteEphemeris.Builder beidouSatelliteEphemeris =
+ new Builder()
+ .setPrn(in.readInt())
+ .setSatelliteClockModel(
+ in.readTypedObject(BeidouSatelliteClockModel.CREATOR))
+ .setSatelliteOrbitModel(
+ in.readTypedObject(KeplerianOrbitModel.CREATOR))
+ .setSatelliteHealth(
+ in.readTypedObject(BeidouSatelliteHealth.CREATOR))
+ .setSatelliteEphemerisTime(
+ in.readTypedObject(
+ BeidouSatelliteEphemerisTime.CREATOR));
+ return beidouSatelliteEphemeris.build();
+ }
+
+ @Override
+ public BeidouSatelliteEphemeris[] newArray(int size) {
+ return new BeidouSatelliteEphemeris[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mPrn);
+ parcel.writeTypedObject(mSatelliteClockModel, flags);
+ parcel.writeTypedObject(mSatelliteOrbitModel, flags);
+ parcel.writeTypedObject(mSatelliteHealth, flags);
+ parcel.writeTypedObject(mSatelliteEphemerisTime, flags);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("BeidouSatelliteEphemeris[");
+ builder.append("prn = ").append(mPrn);
+ builder.append(", satelliteClockModel = ").append(mSatelliteClockModel);
+ builder.append(", satelliteOrbitModel = ").append(mSatelliteOrbitModel);
+ builder.append(", satelliteHealth = ").append(mSatelliteHealth);
+ builder.append(", satelliteEphemerisTime = ").append(mSatelliteEphemerisTime);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link BeidouSatelliteEphemeris} */
+ public static final class Builder {
+ private int mPrn;
+ private BeidouSatelliteClockModel mSatelliteClockModel;
+ private KeplerianOrbitModel mSatelliteOrbitModel;
+ private BeidouSatelliteHealth mSatelliteHealth;
+ private BeidouSatelliteEphemerisTime mSatelliteEphemerisTime;
+
+ /** Sets the PRN of the satellite. */
+ @NonNull
+ public Builder setPrn(int prn) {
+ mPrn = prn;
+ return this;
+ }
+
+ /** Sets the satellite clock model. */
+ @NonNull
+ public Builder setSatelliteClockModel(
+ @NonNull BeidouSatelliteClockModel satelliteClockModel) {
+ mSatelliteClockModel = satelliteClockModel;
+ return this;
+ }
+
+ /** Sets the satellite orbit model. */
+ @NonNull
+ public Builder setSatelliteOrbitModel(@NonNull KeplerianOrbitModel satelliteOrbitModel) {
+ mSatelliteOrbitModel = satelliteOrbitModel;
+ return this;
+ }
+
+ /** Sets the satellite health. */
+ @NonNull
+ public Builder setSatelliteHealth(@NonNull BeidouSatelliteHealth satelliteHealth) {
+ mSatelliteHealth = satelliteHealth;
+ return this;
+ }
+
+ /** Sets the satellite ephemeris time. */
+ @NonNull
+ public Builder setSatelliteEphemerisTime(
+ @NonNull BeidouSatelliteEphemerisTime satelliteEphemerisTime) {
+ mSatelliteEphemerisTime = satelliteEphemerisTime;
+ return this;
+ }
+
+ /** Builds a {@link BeidouSatelliteEphemeris} instance as specified by this builder. */
+ @NonNull
+ public BeidouSatelliteEphemeris build() {
+ return new BeidouSatelliteEphemeris(this);
+ }
+ }
+
+ /**
+ * A class contains the set of parameters needed for Beidou satellite clock correction.
+ *
+ * <p>This is defined in BDS-SIS-ICD-B1I-3.0, section 5.2.4.9, 5.2.4.10.
+ */
+ public static final class BeidouSatelliteClockModel implements Parcelable {
+ /**
+ * Time of the clock in seconds since Beidou epoch.
+ *
+ * <p>Corresponds to the 'Epoch' field within the 'SV/EPOCH/SV CLK' record of Beidou
+ * navigation message in RINEX 3.05 Table A14.
+ */
+ private final long mTimeOfClockSeconds;
+
+ /** SV clock bias in seconds. */
+ private final double mAf0;
+
+ /** SV clock drift in seconds per second. */
+ private final double mAf1;
+
+ /** SV clock drift in seconds per second squared. */
+ private final double mAf2;
+
+ /** Group delay differential 1 B1/B3 in seconds. */
+ private final double mTgd1;
+
+ /** Group delay differential 2 B2/B3 in seconds. */
+ private final double mTgd2;
+
+ /**
+ * Age of Data Clock.
+ * <p>This is defined in BDS-SIS-ICD-B1I-3.0 Section 5.2.4.8 Table 5-6.
+ */
+ private final int mAodc;
+
+ private BeidouSatelliteClockModel(Builder builder) {
+ Preconditions.checkArgument(builder.mTimeOfClockSeconds >= 0);
+ Preconditions.checkArgumentInRange(builder.mAf0, -9.77e-3f, 9.77e-3f, "Af0");
+ Preconditions.checkArgumentInRange(builder.mAf1, -1.87e-9f, 1.87e-9f, "Af1");
+ Preconditions.checkArgumentInRange(builder.mAf2, -1.39e-17f, 1.39e-17f, "Af2");
+ Preconditions.checkArgumentInRange(builder.mTgd1, -5.12e-8f, 5.12e-8f, "Tgd1");
+ Preconditions.checkArgumentInRange(builder.mTgd2, -5.12e-8f, 5.12e-8f, "Tgd2");
+ Preconditions.checkArgumentInRange(builder.mAodc, 0, 31, "Aodc");
+ mTimeOfClockSeconds = builder.mTimeOfClockSeconds;
+ mAf0 = builder.mAf0;
+ mAf1 = builder.mAf1;
+ mAf2 = builder.mAf2;
+ mTgd1 = builder.mTgd1;
+ mTgd2 = builder.mTgd2;
+ mAodc = builder.mAodc;
+ }
+
+ /** Returns the time of the clock in seconds since Beidou epoch. */
+ @IntRange(from = 0)
+ public long getTimeOfClockSeconds() {
+ return mTimeOfClockSeconds;
+ }
+
+ /** Returns the SV clock bias in seconds. */
+ @FloatRange(from = -9.77e-3f, to = 9.77e-3f)
+ public double getAf0() {
+ return mAf0;
+ }
+
+ /** Returns the SV clock drift in seconds per second. */
+ @FloatRange(from = -1.87e-9f, to = 1.87e-9f)
+ public double getAf1() {
+ return mAf1;
+ }
+
+ /** Returns the SV clock drift in seconds per second squared. */
+ @FloatRange(from = -1.39e-17f, to = 1.39e-17f)
+ public double getAf2() {
+ return mAf2;
+ }
+
+ /** Returns the group delay differential 1 B1/B3 in seconds. */
+ @FloatRange(from = -5.12e-8f, to = 5.12e-8f)
+ public double getTgd1() {
+ return mTgd1;
+ }
+
+ /** Returns the group delay differential 2 B2/B3 in seconds. */
+ @FloatRange(from = -5.12e-8f, to = 5.12e-8f)
+ public double getTgd2() {
+ return mTgd2;
+ }
+
+ /** Returns the age of data clock. */
+ @IntRange(from = 0, to = 31)
+ public int getAodc() {
+ return mAodc;
+ }
+
+ public static final @NonNull Creator<BeidouSatelliteClockModel> CREATOR =
+ new Creator<BeidouSatelliteClockModel>() {
+ @Override
+ @NonNull
+ public BeidouSatelliteClockModel createFromParcel(Parcel in) {
+ final BeidouSatelliteClockModel.Builder beidouSatelliteClockModel =
+ new Builder()
+ .setTimeOfClockSeconds(in.readLong())
+ .setAf0(in.readDouble())
+ .setAf1(in.readDouble())
+ .setAf2(in.readDouble())
+ .setTgd1(in.readDouble())
+ .setTgd2(in.readDouble())
+ .setAodc(in.readInt());
+ return beidouSatelliteClockModel.build();
+ }
+
+ @Override
+ public BeidouSatelliteClockModel[] newArray(int size) {
+ return new BeidouSatelliteClockModel[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeLong(mTimeOfClockSeconds);
+ parcel.writeDouble(mAf0);
+ parcel.writeDouble(mAf1);
+ parcel.writeDouble(mAf2);
+ parcel.writeDouble(mTgd1);
+ parcel.writeDouble(mTgd2);
+ parcel.writeInt(mAodc);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("BeidouSatelliteClockModel[");
+ builder.append("timeOfClockSeonds = ").append(mTimeOfClockSeconds);
+ builder.append(", af0 = ").append(mAf0);
+ builder.append(", af1 = ").append(mAf1);
+ builder.append(", af2 = ").append(mAf2);
+ builder.append(", tgd1 = ").append(mTgd1);
+ builder.append(", tgd2 = ").append(mTgd2);
+ builder.append(", aodc = ").append(mAodc);
+ return builder.toString();
+ }
+
+ /** Builder for {@link BeidouSatelliteClockModel} */
+ public static final class Builder {
+ private long mTimeOfClockSeconds;
+ private double mAf0;
+ private double mAf1;
+ private double mAf2;
+ private double mTgd1;
+ private double mTgd2;
+ private int mAodc;
+
+ /** Sets the time of the clock in seconds since Beidou epoch. */
+ @NonNull
+ public Builder setTimeOfClockSeconds(@IntRange(from = 0) long timeOfClockSeconds) {
+ mTimeOfClockSeconds = timeOfClockSeconds;
+ return this;
+ }
+
+ /** Sets the SV clock bias in seconds. */
+ @NonNull
+ public Builder setAf0(@FloatRange(from = -9.77e-3f, to = 9.77e-3f)double af0) {
+ mAf0 = af0;
+ return this;
+ }
+
+ /** Sets the SV clock drift in seconds per second. */
+ @NonNull
+ public Builder setAf1(@FloatRange(from = -1.87e-9f, to = 1.87e-9f) double af1) {
+ mAf1 = af1;
+ return this;
+ }
+
+ /** Sets the SV clock drift in seconds per second squared. */
+ @NonNull
+ public Builder setAf2(@FloatRange(from = -1.39e-17f, to = 1.39e-17f) double af2) {
+ mAf2 = af2;
+ return this;
+ }
+
+ /** Sets the group delay differential 1 B1/B3 in seconds. */
+ @NonNull
+ public Builder setTgd1(@FloatRange(from = -5.12e-8f, to = 5.12e-8f) double tgd1) {
+ mTgd1 = tgd1;
+ return this;
+ }
+
+ /** Sets the group delay differential 2 B2/B3 in seconds. */
+ @NonNull
+ public Builder setTgd2(@FloatRange(from = -5.12e-8f, to = 5.12e-8f) double tgd2) {
+ mTgd2 = tgd2;
+ return this;
+ }
+
+ /** Sets the age of data clock. */
+ @NonNull
+ public Builder setAodc(@IntRange(from = 0, to = 31) int aodc) {
+ mAodc = aodc;
+ return this;
+ }
+
+ /** Builds a {@link BeidouSatelliteClockModel} instance as specified by this builder. */
+ @NonNull
+ public BeidouSatelliteClockModel build() {
+ return new BeidouSatelliteClockModel(this);
+ }
+ }
+ }
+
+ /** A class contains Beidou satellite health. */
+ public static final class BeidouSatelliteHealth implements Parcelable {
+ /**
+ * The autonomous satellite health flag (SatH1) occupies 1 bit.
+ *
+ * <p>“0” means broadcasting satellite is good and “1” means not.
+ *
+ * <p>This is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.6.
+ */
+ private final int mSatH1;
+
+ /**
+ * SV accuracy in meters.
+ *
+ * <p>This is defined in the "BROADCAST ORBIT - 6" record of RINEX 3.05
+ * Table A14, pp.78.
+ */
+ private final double mSvAccur;
+
+ private BeidouSatelliteHealth(Builder builder) {
+ // Allow SatH1 beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(builder.mSatH1 >= 0);
+ Preconditions.checkArgumentInRange(builder.mSvAccur, 0.0f, 8192.0f, "SvAccur");
+ mSatH1 = builder.mSatH1;
+ mSvAccur = builder.mSvAccur;
+ }
+
+ /** Returns the autonomous satellite health flag (SatH1) */
+ @IntRange(from = 0, to = 1)
+ public int getSatH1() {
+ return mSatH1;
+ }
+
+ /** Returns the SV accuracy in meters. */
+ @FloatRange(from = 0.0f, to = 8192.0f)
+ public double getSvAccur() {
+ return mSvAccur;
+ }
+
+ public static final @NonNull Creator<BeidouSatelliteHealth> CREATOR =
+ new Creator<BeidouSatelliteHealth>() {
+ @Override
+ @NonNull
+ public BeidouSatelliteHealth createFromParcel(Parcel in) {
+ final BeidouSatelliteHealth.Builder beidouSatelliteHealth =
+ new Builder().setSatH1(in.readInt()).setSvAccur(in.readDouble());
+ return beidouSatelliteHealth.build();
+ }
+
+ @Override
+ public BeidouSatelliteHealth[] newArray(int size) {
+ return new BeidouSatelliteHealth[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mSatH1);
+ parcel.writeDouble(mSvAccur);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("BeidouSatelliteHealth[");
+ builder.append("satH1 = ").append(mSatH1);
+ builder.append(", svAccur = ").append(mSvAccur);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link BeidouSatelliteHealth} */
+ public static final class Builder {
+ private int mSatH1;
+ private double mSvAccur;
+
+ /** Sets the autonomous satellite health flag (SatH1) */
+ @NonNull
+ public Builder setSatH1(int satH1) {
+ mSatH1 = satH1;
+ return this;
+ }
+
+ /** Sets the SV accuracy in meters. */
+ @NonNull
+ public Builder setSvAccur(double svAccur) {
+ mSvAccur = svAccur;
+ return this;
+ }
+
+ /** Builds a {@link BeidouSatelliteHealth} instance as specified by this builder. */
+ @NonNull
+ public BeidouSatelliteHealth build() {
+ return new BeidouSatelliteHealth(this);
+ }
+ }
+ }
+
+ /** A class contains Beidou satellite ephemeris time. */
+ public static final class BeidouSatelliteEphemerisTime implements Parcelable {
+ /**
+ * AODE Age of Data, Ephemeris.
+ *
+ * <p>This is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.11 Table 5-8.
+ */
+ private final int mIode;
+
+ /** Beidou week number without rollover */
+ private final int mBeidouWeekNumber;
+
+ /**
+ * Time of ephemeris in seconds.
+ *
+ * <p>This is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.12.
+ */
+ private final int mToeSeconds;
+
+ private BeidouSatelliteEphemerisTime(Builder builder) {
+ Preconditions.checkArgumentInRange(builder.mIode, 0, 31, "Iode");
+ Preconditions.checkArgument(builder.mBeidouWeekNumber >= 0);
+ Preconditions.checkArgumentInRange(builder.mToeSeconds, 0, 604792, "ToeSeconds");
+ mIode = builder.mIode;
+ mBeidouWeekNumber = builder.mBeidouWeekNumber;
+ mToeSeconds = builder.mToeSeconds;
+ }
+
+ /** Returns the AODE Age of Data, Ephemeris. */
+ @IntRange(from = 0, to = 31)
+ public int getIode() {
+ return mIode;
+ }
+
+ /** Returns the Beidou week number without rollover . */
+ @IntRange(from = 0)
+ public int getBeidouWeekNumber() {
+ return mBeidouWeekNumber;
+ }
+
+ /** Returns the time of ephemeris in seconds. */
+ @IntRange(from = 0, to = 604792)
+ public int getToeSeconds() {
+ return mToeSeconds;
+ }
+
+ public static final @NonNull Creator<BeidouSatelliteEphemerisTime> CREATOR =
+ new Creator<BeidouSatelliteEphemerisTime>() {
+ @Override
+ @NonNull
+ public BeidouSatelliteEphemerisTime createFromParcel(Parcel in) {
+ final BeidouSatelliteEphemerisTime.Builder beidouSatelliteEphemerisTime =
+ new Builder()
+ .setIode(in.readInt())
+ .setBeidouWeekNumber(in.readInt())
+ .setToeSeconds(in.readInt());
+ return beidouSatelliteEphemerisTime.build();
+ }
+
+ @Override
+ public BeidouSatelliteEphemerisTime[] newArray(int size) {
+ return new BeidouSatelliteEphemerisTime[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mIode);
+ parcel.writeInt(mBeidouWeekNumber);
+ parcel.writeInt(mToeSeconds);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder("BeidouSatelliteEphemerisTime[");
+ builder.append("iode = ").append(mIode);
+ builder.append(", beidouWeekNumber = ").append(mBeidouWeekNumber);
+ builder.append(", toeSeconds = ").append(mToeSeconds);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link BeidouSatelliteEphemerisTime} */
+ public static final class Builder {
+ private int mIode;
+ private int mBeidouWeekNumber;
+ private int mToeSeconds;
+
+ /** Sets the AODE Age of Data, Ephemeris. */
+ @NonNull
+ public Builder setIode(int iode) {
+ mIode = iode;
+ return this;
+ }
+
+ /** Sets the Beidou week number without rollover */
+ @NonNull
+ public Builder setBeidouWeekNumber(
+ @IntRange(from = 0) int beidouWeekNumber) {
+ mBeidouWeekNumber = beidouWeekNumber;
+ return this;
+ }
+
+ /** Sets the time of ephemeris in seconds. */
+ @NonNull
+ public Builder setToeSeconds(@IntRange(from = 0, to = 604792) int toeSeconds) {
+ mToeSeconds = toeSeconds;
+ return this;
+ }
+
+ /**
+ * Builds a {@link BeidouSatelliteEphemerisTime} instance as specified by this builder.
+ */
+ @NonNull
+ public BeidouSatelliteEphemerisTime build() {
+ return new BeidouSatelliteEphemerisTime(this);
+ }
+ }
+ }
+}
diff --git a/location/java/android/location/GalileoAssistance.java b/location/java/android/location/GalileoAssistance.java
new file mode 100644
index 000000000000..07c5bab856db
--- /dev/null
+++ b/location/java/android/location/GalileoAssistance.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
+import android.location.GnssAssistance.GnssSatelliteCorrections;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A class contains Galileo assistance.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class GalileoAssistance implements Parcelable {
+
+ /** The Galileo almanac. */
+ @Nullable private final GnssAlmanac mAlmanac;
+
+ /** The Klobuchar ionospheric model. */
+ @Nullable private final KlobucharIonosphericModel mIonosphericModel;
+
+ /** The UTC model. */
+ @Nullable private final UtcModel mUtcModel;
+
+ /** The leap seconds model. */
+ @Nullable private final LeapSecondsModel mLeapSecondsModel;
+
+ /** The list of time models. */
+ @NonNull private final List<TimeModel> mTimeModels;
+
+ /** The list of Galileo ephemeris. */
+ @NonNull private final List<GalileoSatelliteEphemeris> mSatelliteEphemeris;
+
+ /** The list of real time integrity models. */
+ @NonNull private final List<RealTimeIntegrityModel> mRealTimeIntegrityModels;
+
+ /** The list of Galileo satellite corrections. */
+ @NonNull private final List<GnssSatelliteCorrections> mSatelliteCorrections;
+
+ private GalileoAssistance(Builder builder) {
+ mAlmanac = builder.mAlmanac;
+ mIonosphericModel = builder.mIonosphericModel;
+ mUtcModel = builder.mUtcModel;
+ mLeapSecondsModel = builder.mLeapSecondsModel;
+ if (builder.mTimeModels != null) {
+ mTimeModels = Collections.unmodifiableList(new ArrayList<>(builder.mTimeModels));
+ } else {
+ mTimeModels = new ArrayList<>();
+ }
+ if (builder.mSatelliteEphemeris != null) {
+ mSatelliteEphemeris =
+ Collections.unmodifiableList(new ArrayList<>(builder.mSatelliteEphemeris));
+ } else {
+ mSatelliteEphemeris = new ArrayList<>();
+ }
+ if (builder.mRealTimeIntegrityModels != null) {
+ mRealTimeIntegrityModels =
+ Collections.unmodifiableList(new ArrayList<>(builder.mRealTimeIntegrityModels));
+ } else {
+ mRealTimeIntegrityModels = new ArrayList<>();
+ }
+ if (builder.mSatelliteCorrections != null) {
+ mSatelliteCorrections =
+ Collections.unmodifiableList(new ArrayList<>(builder.mSatelliteCorrections));
+ } else {
+ mSatelliteCorrections = new ArrayList<>();
+ }
+ }
+
+ /** Returns the Galileo almanac. */
+ @Nullable
+ public GnssAlmanac getAlmanac() {
+ return mAlmanac;
+ }
+
+ /** Returns the Klobuchar ionospheric model. */
+ @Nullable
+ public KlobucharIonosphericModel getIonosphericModel() {
+ return mIonosphericModel;
+ }
+
+ /** Returns the UTC model. */
+ @Nullable
+ public UtcModel getUtcModel() {
+ return mUtcModel;
+ }
+
+ /** Returns the leap seconds model. */
+ @Nullable
+ public LeapSecondsModel getLeapSecondsModel() {
+ return mLeapSecondsModel;
+ }
+
+ /** Returns the list of time models. */
+ @NonNull
+ public List<TimeModel> getTimeModels() {
+ return mTimeModels;
+ }
+
+ /** Returns the list of Galileo ephemeris. */
+ @NonNull
+ public List<GalileoSatelliteEphemeris> getSatelliteEphemeris() {
+ return mSatelliteEphemeris;
+ }
+
+ /** Returns the list of real time integrity models. */
+ @NonNull
+ public List<RealTimeIntegrityModel> getRealTimeIntegrityModels() {
+ return mRealTimeIntegrityModels;
+ }
+
+ /** Returns the list of Galileo satellite corrections. */
+ @NonNull
+ public List<GnssSatelliteCorrections> getSatelliteCorrections() {
+ return mSatelliteCorrections;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeTypedObject(mAlmanac, flags);
+ dest.writeTypedObject(mIonosphericModel, flags);
+ dest.writeTypedObject(mUtcModel, flags);
+ dest.writeTypedObject(mLeapSecondsModel, flags);
+ dest.writeTypedList(mTimeModels);
+ dest.writeTypedList(mSatelliteEphemeris);
+ dest.writeTypedList(mRealTimeIntegrityModels);
+ dest.writeTypedList(mSatelliteCorrections);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GalileoAssistance[");
+ builder.append("almanac = ").append(mAlmanac);
+ builder.append(", ionosphericModel = ").append(mIonosphericModel);
+ builder.append(", utcModel = ").append(mUtcModel);
+ builder.append(", leapSecondsModel = ").append(mLeapSecondsModel);
+ builder.append(", timeModels = ").append(mTimeModels);
+ builder.append(", satelliteEphemeris = ").append(mSatelliteEphemeris);
+ builder.append(", realTimeIntegrityModels = ").append(mRealTimeIntegrityModels);
+ builder.append(", satelliteCorrections = ").append(mSatelliteCorrections);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ public static final @android.annotation.NonNull Creator<GalileoAssistance> CREATOR =
+ new Creator<GalileoAssistance>() {
+ @Override
+ public GalileoAssistance createFromParcel(Parcel in) {
+ return new GalileoAssistance.Builder()
+ .setAlmanac(in.readTypedObject(GnssAlmanac.CREATOR))
+ .setIonosphericModel(
+ in.readTypedObject(KlobucharIonosphericModel.CREATOR))
+ .setUtcModel(in.readTypedObject(UtcModel.CREATOR))
+ .setLeapSecondsModel(in.readTypedObject(LeapSecondsModel.CREATOR))
+ .setTimeModels(in.createTypedArrayList(TimeModel.CREATOR))
+ .setSatelliteEphemeris(
+ in.createTypedArrayList(GalileoSatelliteEphemeris.CREATOR))
+ .setRealTimeIntegrityModels(
+ in.createTypedArrayList(RealTimeIntegrityModel.CREATOR))
+ .setSatelliteCorrections(
+ in.createTypedArrayList(GnssSatelliteCorrections.CREATOR))
+ .build();
+ }
+
+ @Override
+ public GalileoAssistance[] newArray(int size) {
+ return new GalileoAssistance[size];
+ }
+ };
+
+ /** Builder for {@link GalileoAssistance}. */
+ public static final class Builder {
+ private GnssAlmanac mAlmanac;
+ private KlobucharIonosphericModel mIonosphericModel;
+ private UtcModel mUtcModel;
+ private LeapSecondsModel mLeapSecondsModel;
+ private List<TimeModel> mTimeModels;
+ private List<GalileoSatelliteEphemeris> mSatelliteEphemeris;
+ private List<RealTimeIntegrityModel> mRealTimeIntegrityModels;
+ private List<GnssSatelliteCorrections> mSatelliteCorrections;
+
+ /** Sets the Galileo almanac. */
+ @NonNull
+ public Builder setAlmanac(@Nullable GnssAlmanac almanac) {
+ mAlmanac = almanac;
+ return this;
+ }
+
+ /** Sets the Klobuchar ionospheric model. */
+ @NonNull
+ public Builder setIonosphericModel(@Nullable KlobucharIonosphericModel ionosphericModel) {
+ mIonosphericModel = ionosphericModel;
+ return this;
+ }
+
+ /** Sets the UTC model. */
+ @NonNull
+ public Builder setUtcModel(@Nullable UtcModel utcModel) {
+ mUtcModel = utcModel;
+ return this;
+ }
+
+ /** Sets the leap seconds model. */
+ @NonNull
+ public Builder setLeapSecondsModel(@Nullable LeapSecondsModel leapSecondsModel) {
+ mLeapSecondsModel = leapSecondsModel;
+ return this;
+ }
+
+ /** Sets the list of time models. */
+ @NonNull
+ public Builder setTimeModels(
+ @Nullable @SuppressLint("NullableCollection") List<TimeModel> timeModels) {
+ mTimeModels = timeModels;
+ return this;
+ }
+
+ /** Sets the list of Galileo ephemeris. */
+ @NonNull
+ public Builder setSatelliteEphemeris(
+ @Nullable @SuppressLint("NullableCollection")
+ List<GalileoSatelliteEphemeris> satelliteEphemeris) {
+ mSatelliteEphemeris = satelliteEphemeris;
+ return this;
+ }
+
+ /** Sets the list of real time integrity models. */
+ @NonNull
+ public Builder setRealTimeIntegrityModels(
+ @Nullable @SuppressLint("NullableCollection")
+ List<RealTimeIntegrityModel> realTimeIntegrityModels) {
+ mRealTimeIntegrityModels = realTimeIntegrityModels;
+ return this;
+ }
+
+ /** Sets the list of Galileo satellite corrections. */
+ @NonNull
+ public Builder setSatelliteCorrections(
+ @Nullable @SuppressLint("NullableCollection")
+ List<GnssSatelliteCorrections> satelliteCorrections) {
+ mSatelliteCorrections = satelliteCorrections;
+ return this;
+ }
+
+ /** Builds the {@link GalileoAssistance}. */
+ @NonNull
+ public GalileoAssistance build() {
+ return new GalileoAssistance(this);
+ }
+ }
+}
diff --git a/location/java/android/location/GalileoIonosphericModel.java b/location/java/android/location/GalileoIonosphericModel.java
new file mode 100644
index 000000000000..6638be9af2b6
--- /dev/null
+++ b/location/java/android/location/GalileoIonosphericModel.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * Contains Galileo ionospheric model.
+ *
+ * <p>This is defined in Galileo-OS-SIS-ICD-v2.1, section 5.1.6.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class GalileoIonosphericModel implements Parcelable {
+ /** Effective ionisation level 1st order parameter in sfu. */
+ private final double mAi0;
+
+ /** Effective ionisation level 2nd order parameter in sfu per degree. */
+ private final double mAi1;
+
+ /** Effective ionisation level 3nd order parameter in sfu per degree squared. */
+ private final double mAi2;
+
+ private GalileoIonosphericModel(Builder builder) {
+ Preconditions.checkArgumentInRange(builder.mAi0, 0.0f, 512.0f, "Ai0");
+ Preconditions.checkArgumentInRange(builder.mAi1, -4.0f, 4.0f, "Ai1");
+ Preconditions.checkArgumentInRange(builder.mAi2, -0.5f, 0.5f, "Ai2");
+ mAi0 = builder.mAi0;
+ mAi1 = builder.mAi1;
+ mAi2 = builder.mAi2;
+ }
+
+ /** Returns the effective ionisation level 1st order parameter in sfu. */
+ @FloatRange(from = 0.0f, to = 512.0f)
+ public double getAi0() {
+ return mAi0;
+ }
+
+ /** Returns the effective ionisation level 2nd order parameter in sfu per degree. */
+ @FloatRange(from = -4.0f, to = 4.0f)
+ public double getAi1() {
+ return mAi1;
+ }
+
+ /** Returns the effective ionisation level 3nd order parameter in sfu per degree squared. */
+ @FloatRange(from = -0.5f, to = 0.5f)
+ public double getAi2() {
+ return mAi2;
+ }
+
+ public static final @NonNull Parcelable.Creator<GalileoIonosphericModel> CREATOR =
+ new Parcelable.Creator<GalileoIonosphericModel>() {
+ @Override
+ public GalileoIonosphericModel createFromParcel(@NonNull Parcel source) {
+ return new GalileoIonosphericModel.Builder()
+ .setAi0(source.readDouble())
+ .setAi1(source.readDouble())
+ .setAi2(source.readDouble())
+ .build();
+ }
+
+ @Override
+ public GalileoIonosphericModel[] newArray(int size) {
+ return new GalileoIonosphericModel[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeDouble(mAi0);
+ dest.writeDouble(mAi1);
+ dest.writeDouble(mAi2);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GalileoIonosphericModel[");
+ builder.append("ai0 = ").append(mAi0);
+ builder.append(", ai1 = ").append(mAi1);
+ builder.append(", ai2 = ").append(mAi2);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GalileoIonosphericModel}. */
+ public static final class Builder {
+ private double mAi0;
+ private double mAi1;
+ private double mAi2;
+
+ /** Sets the effective ionisation level 1st order parameter in sfu. */
+ @NonNull
+ public Builder setAi0(@FloatRange(from = 0.0f, to = 512.0f) double ai0) {
+ mAi0 = ai0;
+ return this;
+ }
+
+ /** Sets the effective ionisation level 2nd order parameter in sfu per degree. */
+ @NonNull
+ public Builder setAi1(@FloatRange(from = -4.0f, to = 4.0f) double ai1) {
+ mAi1 = ai1;
+ return this;
+ }
+
+ /** Sets the effective ionisation level 3nd order parameter in sfu per degree squared. */
+ @NonNull
+ public Builder setAi2(@FloatRange(from = -0.5f, to = 0.5f) double ai2) {
+ mAi2 = ai2;
+ return this;
+ }
+
+ /** Builds a {@link GalileoIonosphericModel}. */
+ @NonNull
+ public GalileoIonosphericModel build() {
+ return new GalileoIonosphericModel(this);
+ }
+ }
+}
diff --git a/location/java/android/location/GalileoSatelliteEphemeris.java b/location/java/android/location/GalileoSatelliteEphemeris.java
new file mode 100644
index 000000000000..7dd371176267
--- /dev/null
+++ b/location/java/android/location/GalileoSatelliteEphemeris.java
@@ -0,0 +1,660 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.IntDef;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Contains ephemeris parameters specific to Galileo satellites.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class GalileoSatelliteEphemeris implements Parcelable {
+
+ /** Satellite code number. */
+ private int mSatelliteCodeNumber;
+
+ /** Array of satellite clock model. */
+ @NonNull private final List<GalileoSatelliteClockModel> mSatelliteClockModels;
+
+ /** Satellite orbit model. */
+ @NonNull private final KeplerianOrbitModel mSatelliteOrbitModel;
+
+ /** Satellite health. */
+ @NonNull private final GalileoSvHealth mSatelliteHealth;
+
+ /** Satellite ephemeris time. */
+ @NonNull private final SatelliteEphemerisTime mSatelliteEphemerisTime;
+
+ private GalileoSatelliteEphemeris(Builder builder) {
+ // Allow satelliteCodeNumber beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(builder.mSatelliteCodeNumber >= 1);
+ Preconditions.checkNotNull(
+ builder.mSatelliteClockModels, "SatelliteClockModels cannot be null");
+ Preconditions.checkNotNull(
+ builder.mSatelliteOrbitModel, "SatelliteOrbitModel cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteHealth, "SatelliteHealth cannot be null");
+ Preconditions.checkNotNull(
+ builder.mSatelliteEphemerisTime, "SatelliteEphemerisTime cannot be null");
+ mSatelliteCodeNumber = builder.mSatelliteCodeNumber;
+ final List<GalileoSatelliteClockModel> satelliteClockModels = builder.mSatelliteClockModels;
+ mSatelliteClockModels = Collections.unmodifiableList(new ArrayList<>(satelliteClockModels));
+ mSatelliteOrbitModel = builder.mSatelliteOrbitModel;
+ mSatelliteHealth = builder.mSatelliteHealth;
+ mSatelliteEphemerisTime = builder.mSatelliteEphemerisTime;
+ }
+
+ /** Returns the satellite code number. */
+ @IntRange(from = 1, to = 36)
+ public int getSatelliteCodeNumber() {
+ return mSatelliteCodeNumber;
+ }
+
+ /** Returns the list of satellite clock models. */
+ @NonNull
+ public List<GalileoSatelliteClockModel> getSatelliteClockModels() {
+ return mSatelliteClockModels;
+ }
+
+ /** Returns the satellite orbit model. */
+ @NonNull
+ public KeplerianOrbitModel getSatelliteOrbitModel() {
+ return mSatelliteOrbitModel;
+ }
+
+ /** Returns the satellite health. */
+ @NonNull
+ public GalileoSvHealth getSatelliteHealth() {
+ return mSatelliteHealth;
+ }
+
+ /** Returns the satellite ephemeris time. */
+ @NonNull
+ public SatelliteEphemerisTime getSatelliteEphemerisTime() {
+ return mSatelliteEphemerisTime;
+ }
+
+ public static final @NonNull Creator<GalileoSatelliteEphemeris> CREATOR =
+ new Creator<GalileoSatelliteEphemeris>() {
+ @Override
+ @NonNull
+ public GalileoSatelliteEphemeris createFromParcel(Parcel in) {
+ final GalileoSatelliteEphemeris.Builder galileoSatelliteEphemeris =
+ new Builder();
+ galileoSatelliteEphemeris.setSatelliteCodeNumber(in.readInt());
+ List<GalileoSatelliteClockModel> satelliteClockModels = new ArrayList<>();
+ in.readTypedList(satelliteClockModels, GalileoSatelliteClockModel.CREATOR);
+ galileoSatelliteEphemeris.setSatelliteClockModels(satelliteClockModels);
+ galileoSatelliteEphemeris.setSatelliteOrbitModel(
+ in.readTypedObject(KeplerianOrbitModel.CREATOR));
+ galileoSatelliteEphemeris.setSatelliteHealth(
+ in.readTypedObject(GalileoSvHealth.CREATOR));
+ galileoSatelliteEphemeris.setSatelliteEphemerisTime(
+ in.readTypedObject(SatelliteEphemerisTime.CREATOR));
+ return galileoSatelliteEphemeris.build();
+ }
+
+ @Override
+ public GalileoSatelliteEphemeris[] newArray(int size) {
+ return new GalileoSatelliteEphemeris[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mSatelliteCodeNumber);
+ parcel.writeTypedList(mSatelliteClockModels, flags);
+ parcel.writeTypedObject(mSatelliteOrbitModel, flags);
+ parcel.writeTypedObject(mSatelliteHealth, flags);
+ parcel.writeTypedObject(mSatelliteEphemerisTime, flags);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GalileoSatelliteEphemeris[");
+ builder.append("satelliteCodeNumber = ").append(mSatelliteCodeNumber);
+ builder.append(", satelliteClockModels = ").append(mSatelliteClockModels);
+ builder.append(", satelliteOrbitModel = ").append(mSatelliteOrbitModel);
+ builder.append(", satelliteHealth = ").append(mSatelliteHealth);
+ builder.append(", satelliteEphemerisTime = ").append(mSatelliteEphemerisTime);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GalileoSatelliteEphemeris}. */
+ public static final class Builder {
+ private int mSatelliteCodeNumber;
+ private List<GalileoSatelliteClockModel> mSatelliteClockModels;
+ private KeplerianOrbitModel mSatelliteOrbitModel;
+ private GalileoSvHealth mSatelliteHealth;
+ private SatelliteEphemerisTime mSatelliteEphemerisTime;
+
+ /** Sets the satellite code number. */
+ @NonNull
+ public Builder setSatelliteCodeNumber(
+ @IntRange(from = 1, to = 36) int satelliteCodeNumber) {
+ mSatelliteCodeNumber = satelliteCodeNumber;
+ return this;
+ }
+
+ /** Sets the array of satellite clock model. */
+ @NonNull
+ public Builder setSatelliteClockModels(
+ @NonNull List<GalileoSatelliteClockModel> satelliteClockModels) {
+ mSatelliteClockModels = satelliteClockModels;
+ return this;
+ }
+
+ /** Sets the satellite orbit model. */
+ @NonNull
+ public Builder setSatelliteOrbitModel(@NonNull KeplerianOrbitModel satelliteOrbitModel) {
+ mSatelliteOrbitModel = satelliteOrbitModel;
+ return this;
+ }
+
+ /** Sets the satellite health. */
+ @NonNull
+ public Builder setSatelliteHealth(@NonNull GalileoSvHealth satelliteHealth) {
+ mSatelliteHealth = satelliteHealth;
+ return this;
+ }
+
+ /** Sets the satellite ephemeris time. */
+ @NonNull
+ public Builder setSatelliteEphemerisTime(
+ @NonNull SatelliteEphemerisTime satelliteEphemerisTime) {
+ mSatelliteEphemerisTime = satelliteEphemerisTime;
+ return this;
+ }
+
+ /** Builds a {@link GalileoSatelliteEphemeris} instance as specified by this builder. */
+ @NonNull
+ public GalileoSatelliteEphemeris build() {
+ return new GalileoSatelliteEphemeris(this);
+ }
+ }
+
+ /**
+ * A class contains the set of parameters needed for Galileo satellite health.
+ *
+ * <p>This is defined in Galileo-OS-SIS-ICD 5.1.9.3.
+ */
+ public static final class GalileoSvHealth implements Parcelable {
+ /** E1-B data validity status. */
+ private int mDataValidityStatusE1b;
+
+ /** E1-B/C signal health status. */
+ private int mSignalHealthStatusE1b;
+
+ /** E5a data validity status. */
+ private int mDataValidityStatusE5a;
+
+ /** E5a signal health status. */
+ private int mSignalHealthStatusE5a;
+
+ /** E5b data validity status. */
+ private int mDataValidityStatusE5b;
+
+ /** E5b signal health status. */
+ private int mSignalHealthStatusE5b;
+
+ private GalileoSvHealth(Builder builder) {
+ Preconditions.checkArgumentInRange(
+ builder.mDataValidityStatusE1b, 0, 1, "DataValidityStatusE1b");
+ Preconditions.checkArgumentInRange(
+ builder.mSignalHealthStatusE1b, 0, 3, "SignalHealthStatusE1b");
+ Preconditions.checkArgumentInRange(
+ builder.mDataValidityStatusE5a, 0, 1, "DataValidityStatusE5a");
+ Preconditions.checkArgumentInRange(
+ builder.mSignalHealthStatusE5a, 0, 3, "SignalHealthStatusE5a");
+ Preconditions.checkArgumentInRange(
+ builder.mDataValidityStatusE5b, 0, 1, "DataValidityStatusE5b");
+ Preconditions.checkArgumentInRange(
+ builder.mSignalHealthStatusE5b, 0, 3, "SignalHealthStatusE5b");
+ mDataValidityStatusE1b = builder.mDataValidityStatusE1b;
+ mSignalHealthStatusE1b = builder.mSignalHealthStatusE1b;
+ mDataValidityStatusE5a = builder.mDataValidityStatusE5a;
+ mSignalHealthStatusE5a = builder.mSignalHealthStatusE5a;
+ mDataValidityStatusE5b = builder.mDataValidityStatusE5b;
+ mSignalHealthStatusE5b = builder.mSignalHealthStatusE5b;
+ }
+
+ /** Returns the E1-B data validity status. */
+ @IntRange(from = 0, to = 1)
+ public int getDataValidityStatusE1b() {
+ return mDataValidityStatusE1b;
+ }
+
+ /** Returns the E1-B/C signal health status. */
+ @IntRange(from = 0, to = 3)
+ public int getSignalHealthStatusE1b() {
+ return mSignalHealthStatusE1b;
+ }
+
+ /** Returns the E5a data validity status. */
+ @IntRange(from = 0, to = 1)
+ public int getDataValidityStatusE5a() {
+ return mDataValidityStatusE5a;
+ }
+
+ /** Returns the E5a signal health status. */
+ @IntRange(from = 0, to = 3)
+ public int getSignalHealthStatusE5a() {
+ return mSignalHealthStatusE5a;
+ }
+
+ /** Returns the E5b data validity status. */
+ @IntRange(from = 0, to = 1)
+ public int getDataValidityStatusE5b() {
+ return mDataValidityStatusE5b;
+ }
+
+ /** Returns the E5b signal health status. */
+ @IntRange(from = 0, to = 3)
+ public int getSignalHealthStatusE5b() {
+ return mSignalHealthStatusE5b;
+ }
+
+ public static final @NonNull Creator<GalileoSvHealth> CREATOR =
+ new Creator<GalileoSvHealth>() {
+ @Override
+ @NonNull
+ public GalileoSvHealth createFromParcel(Parcel in) {
+ final GalileoSvHealth.Builder galileoSvHealth = new Builder();
+ galileoSvHealth.setDataValidityStatusE1b(in.readInt());
+ galileoSvHealth.setSignalHealthStatusE1b(in.readInt());
+ galileoSvHealth.setDataValidityStatusE5a(in.readInt());
+ galileoSvHealth.setSignalHealthStatusE5a(in.readInt());
+ galileoSvHealth.setDataValidityStatusE5b(in.readInt());
+ galileoSvHealth.setSignalHealthStatusE5b(in.readInt());
+ return galileoSvHealth.build();
+ }
+
+ @Override
+ public GalileoSvHealth[] newArray(int size) {
+ return new GalileoSvHealth[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mDataValidityStatusE1b);
+ parcel.writeInt(mSignalHealthStatusE1b);
+ parcel.writeInt(mDataValidityStatusE5a);
+ parcel.writeInt(mSignalHealthStatusE5a);
+ parcel.writeInt(mDataValidityStatusE5b);
+ parcel.writeInt(mSignalHealthStatusE5b);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GalileoSvHealth[");
+ builder.append("dataValidityStatusE1b = ").append(mDataValidityStatusE1b);
+ builder.append(", signalHealthStatusE1b = ").append(mSignalHealthStatusE1b);
+ builder.append(", dataValidityStatusE5a = ").append(mDataValidityStatusE5a);
+ builder.append(", signalHealthStatusE5a = ").append(mSignalHealthStatusE5a);
+ builder.append(", dataValidityStatusE5b = ").append(mDataValidityStatusE5b);
+ builder.append(", signalHealthStatusE5b = ").append(mSignalHealthStatusE5b);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GalileoSvHealth}. */
+ public static final class Builder {
+ private int mDataValidityStatusE1b;
+ private int mSignalHealthStatusE1b;
+ private int mDataValidityStatusE5a;
+ private int mSignalHealthStatusE5a;
+ private int mDataValidityStatusE5b;
+ private int mSignalHealthStatusE5b;
+
+ /** Sets the E1-B data validity status. */
+ @NonNull
+ public Builder setDataValidityStatusE1b(
+ @IntRange(from = 0, to = 1) int dataValidityStatusE1b) {
+ mDataValidityStatusE1b = dataValidityStatusE1b;
+ return this;
+ }
+
+ /** Sets the E1-B/C signal health status. */
+ @NonNull
+ public Builder setSignalHealthStatusE1b(
+ @IntRange(from = 0, to = 3) int signalHealthStatusE1b) {
+ mSignalHealthStatusE1b = signalHealthStatusE1b;
+ return this;
+ }
+
+ /** Sets the E5a data validity status. */
+ @NonNull
+ public Builder setDataValidityStatusE5a(
+ @IntRange(from = 0, to = 1) int dataValidityStatusE5a) {
+ mDataValidityStatusE5a = dataValidityStatusE5a;
+ return this;
+ }
+
+ /** Sets the E5a signal health status. */
+ @NonNull
+ public Builder setSignalHealthStatusE5a(
+ @IntRange(from = 0, to = 3) int signalHealthStatusE5a) {
+ mSignalHealthStatusE5a = signalHealthStatusE5a;
+ return this;
+ }
+
+ /** Sets the E5b data validity status. */
+ @NonNull
+ public Builder setDataValidityStatusE5b(
+ @IntRange(from = 0, to = 1) int dataValidityStatusE5b) {
+ mDataValidityStatusE5b = dataValidityStatusE5b;
+ return this;
+ }
+
+ /** Sets the E5b signal health status. */
+ @NonNull
+ public Builder setSignalHealthStatusE5b(
+ @IntRange(from = 0, to = 3) int signalHealthStatusE5b) {
+ mSignalHealthStatusE5b = signalHealthStatusE5b;
+ return this;
+ }
+
+ /** Builds a {@link GalileoSvHealth}. */
+ @NonNull
+ public GalileoSvHealth build() {
+ return new GalileoSvHealth(this);
+ }
+ }
+ }
+
+ /**
+ * A class contains the set of parameters needed for Galileo satellite clock correction.
+ *
+ * <p>This is defined in Galileo-OS-SIS-ICD 5.1.3.
+ */
+ public static final class GalileoSatelliteClockModel implements Parcelable {
+
+ /**
+ * The type of the satellite clock.
+ *
+ * @hide
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({TYPE_UNDEFINED, TYPE_FNAV, TYPE_INAV})
+ public @interface SatelliteClockType {}
+
+ /**
+ * The following enumerations must be in sync with the values declared in
+ * GalileoSatelliteEphemeris.aidl.
+ */
+
+ /** The type of the satellite clock is unknown. */
+ public static final int TYPE_UNDEFINED = 0;
+
+ /** The type of the satellite clock is FNAV. */
+ public static final int TYPE_FNAV = 1;
+
+ /** The type of the satellite clock is INAV. */
+ public static final int TYPE_INAV = 2;
+
+ /**
+ * Time of the clock in seconds since Galileo epoch.
+ *
+ * <p>Corresponds to the 'Epoch' field within the 'SV/EPOCH/SV CLK' record of Galileo
+ * navigation message in RINEX 3.05 Table A8.
+ */
+ private final long mTimeOfClockSeconds;
+
+ /** SV clock bias correction coefficient in seconds. */
+ private double mAf0;
+
+ /** SV clock drift correction coefficient in seconds per second. */
+ private double mAf1;
+
+ /** SV clock drift rate correction coefficient in seconds per second squared. */
+ private double mAf2;
+
+ /**
+ * Broadcast group delay in seconds.
+ *
+ * <p>This is defined in Galileo-OS-SIS-ICD 5.1.5.
+ */
+ private double mBgdSeconds;
+
+ /**
+ * Signal in space accuracy in meters.
+ *
+ * <p>This is defined in Galileo-OS-SIS-ICD 5.1.12.
+ */
+ private double mSisaMeters;
+
+ /** Type of satellite clock . */
+ private final @SatelliteClockType int mSatelliteClockType;
+
+ private GalileoSatelliteClockModel(Builder builder) {
+ Preconditions.checkArgument(builder.mTimeOfClockSeconds >= 0);
+ Preconditions.checkArgumentInRange(builder.mAf0, -0.0625f, 0.0625f, "AF0");
+ Preconditions.checkArgumentInRange(builder.mAf1, -1.5e-8f, 1.5e-8f, "AF1");
+ Preconditions.checkArgumentInRange(builder.mAf2, -5.56e-17f, 5.56e-17f, "AF2");
+ Preconditions.checkArgumentInRange(
+ builder.mBgdSeconds, -1.2e-7f, 1.2e-7f, "BgdSeconds");
+ Preconditions.checkArgument(builder.mSisaMeters >= 0.0f);
+ Preconditions.checkArgumentInRange(
+ builder.mSatelliteClockType, TYPE_UNDEFINED, TYPE_INAV, "SatelliteClockType");
+ mTimeOfClockSeconds = builder.mTimeOfClockSeconds;
+ mAf0 = builder.mAf0;
+ mAf1 = builder.mAf1;
+ mAf2 = builder.mAf2;
+ mBgdSeconds = builder.mBgdSeconds;
+ mSisaMeters = builder.mSisaMeters;
+ mSatelliteClockType = builder.mSatelliteClockType;
+ }
+
+ /** Returns the time of the clock in seconds since Galileo epoch. */
+ @IntRange(from = 0)
+ public long getTimeOfClockSeconds() {
+ return mTimeOfClockSeconds;
+ }
+
+ /** Returns the SV clock bias correction coefficient in seconds. */
+ @FloatRange(from = -0.0625f, to = 0.0625f)
+ public double getAf0() {
+ return mAf0;
+ }
+
+ /** Returns the SV clock drift correction coefficient in seconds per second. */
+ @FloatRange(from = -1.5e-8f, to = 1.5e-8f)
+ public double getAf1() {
+ return mAf1;
+ }
+
+ /** Returns the SV clock drift rate correction coefficient in seconds per second squared. */
+ @FloatRange(from = -5.56e-17f, to = 5.56e-17f)
+ public double getAf2() {
+ return mAf2;
+ }
+
+ /** Returns the broadcast group delay in seconds. */
+ @FloatRange(from = -1.2e-7f, to = 1.2e-7f)
+ public double getBgdSeconds() {
+ return mBgdSeconds;
+ }
+
+ /** Returns the signal in space accuracy in meters. */
+ @FloatRange(from = 0.0f)
+ public double getSisaMeters() {
+ return mSisaMeters;
+ }
+
+ /** Returns the type of satellite clock. */
+ public @SatelliteClockType int getSatelliteClockType() {
+ return mSatelliteClockType;
+ }
+
+ public static final @NonNull Creator<GalileoSatelliteClockModel> CREATOR =
+ new Creator<GalileoSatelliteClockModel>() {
+ @Override
+ @NonNull
+ public GalileoSatelliteClockModel createFromParcel(Parcel in) {
+ final GalileoSatelliteClockModel.Builder galileoSatelliteClockModel =
+ new Builder();
+ galileoSatelliteClockModel.setTimeOfClockSeconds(in.readLong());
+ galileoSatelliteClockModel.setAf0(in.readDouble());
+ galileoSatelliteClockModel.setAf1(in.readDouble());
+ galileoSatelliteClockModel.setAf2(in.readDouble());
+ galileoSatelliteClockModel.setBgdSeconds(in.readDouble());
+ galileoSatelliteClockModel.setSisaMeters(in.readDouble());
+ galileoSatelliteClockModel.setSatelliteClockType(in.readInt());
+ return galileoSatelliteClockModel.build();
+ }
+
+ @Override
+ public GalileoSatelliteClockModel[] newArray(int size) {
+ return new GalileoSatelliteClockModel[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeLong(mTimeOfClockSeconds);
+ parcel.writeDouble(mAf0);
+ parcel.writeDouble(mAf1);
+ parcel.writeDouble(mAf2);
+ parcel.writeDouble(mBgdSeconds);
+ parcel.writeDouble(mSisaMeters);
+ parcel.writeInt(mSatelliteClockType);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GalileoSatelliteClockModel[");
+ builder.append("timeOfClockSeconds = ").append(mTimeOfClockSeconds);
+ builder.append(", af0 = ").append(mAf0);
+ builder.append(", af1 = ").append(mAf1);
+ builder.append(", af2 = ").append(mAf2);
+ builder.append(", bgdSeconds = ").append(mBgdSeconds);
+ builder.append(", sisaMeters = ").append(mSisaMeters);
+ builder.append(", satelliteClockType = ").append(mSatelliteClockType);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GalileoSatelliteClockModel}. */
+ public static final class Builder {
+ private long mTimeOfClockSeconds;
+ private double mAf0;
+ private double mAf1;
+ private double mAf2;
+ private double mBgdSeconds;
+ private double mSisaMeters;
+ private @SatelliteClockType int mSatelliteClockType;
+
+ /** Sets the time of the clock in seconds since Galileo epoch. */
+ @NonNull
+ public Builder setTimeOfClockSeconds(@IntRange(from = 0) long timeOfClockSeconds) {
+ mTimeOfClockSeconds = timeOfClockSeconds;
+ return this;
+ }
+
+ /** Sets the SV clock bias correction coefficient in seconds. */
+ @NonNull
+ public Builder setAf0(@FloatRange(from = -0.0625f, to = 0.0625f) double af0) {
+ mAf0 = af0;
+ return this;
+ }
+
+ /** Sets the SV clock drift correction coefficient in seconds per second. */
+ @NonNull
+ public Builder setAf1(@FloatRange(from = -1.5e-8f, to = 1.5e-8f) double af1) {
+ mAf1 = af1;
+ return this;
+ }
+
+ /**
+ * Sets the SV clock drift rate correction coefficient in seconds per second squared.
+ */
+ @NonNull
+ public Builder setAf2(@FloatRange(from = -5.56e-17f, to = 5.56e-17f) double af2) {
+ mAf2 = af2;
+ return this;
+ }
+
+ /** Sets the broadcast group delay in seconds. */
+ @NonNull
+ public Builder setBgdSeconds(
+ @FloatRange(from = -1.2e-7f, to = 1.2e-7f) double bgdSeconds) {
+ mBgdSeconds = bgdSeconds;
+ return this;
+ }
+
+ /** Sets the signal in space accuracy in meters. */
+ @NonNull
+ public Builder setSisaMeters(@FloatRange(from = 0.0f) double sisaMeters) {
+ mSisaMeters = sisaMeters;
+ return this;
+ }
+
+ /** Sets the type of satellite clock. */
+ @NonNull
+ public Builder setSatelliteClockType(@SatelliteClockType int satelliteClockType) {
+ mSatelliteClockType = satelliteClockType;
+ return this;
+ }
+
+ /**
+ * Builds a {@link GalileoSatelliteClockModel} instance as specified by this builder.
+ */
+ @NonNull
+ public GalileoSatelliteClockModel build() {
+ return new GalileoSatelliteClockModel(this);
+ }
+ }
+ }
+}
diff --git a/location/java/android/location/GlonassAlmanac.java b/location/java/android/location/GlonassAlmanac.java
new file mode 100644
index 000000000000..861dc5d257c4
--- /dev/null
+++ b/location/java/android/location/GlonassAlmanac.java
@@ -0,0 +1,418 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A class contains Glonass almanac data.
+ *
+ * <p>This is defined in Glonass ICD v5.1 section 4.5.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class GlonassAlmanac implements Parcelable {
+
+ /** Almanac issue date in milliseconds (UTC) */
+ private final long mIssueDateMillis;
+
+ /** List of GlonassSatelliteAlmanacs. */
+ @NonNull private final List<GlonassSatelliteAlmanac> mSatelliteAlmanacs;
+
+ /**
+ * Constructor for GlonassAlmanac.
+ *
+ * @param issueDateMillis The almanac issue date in milliseconds (UTC).
+ * @param satelliteAlmanacs The list of GlonassSatelliteAlmanac.
+ */
+ public GlonassAlmanac(
+ @IntRange(from = 0) long issueDateMillis,
+ @NonNull List<GlonassSatelliteAlmanac> satelliteAlmanacs) {
+ Preconditions.checkArgument(issueDateMillis >= 0);
+ Preconditions.checkNotNull(satelliteAlmanacs, "satelliteAlmanacs cannot be null");
+ mIssueDateMillis = issueDateMillis;
+ mSatelliteAlmanacs = Collections.unmodifiableList(new ArrayList<>(satelliteAlmanacs));
+ }
+
+ /** Returns the almanac issue date in milliseconds (UTC). */
+ @IntRange(from = 0)
+ public long getIssueDateMillis() {
+ return mIssueDateMillis;
+ }
+
+ /** Returns the list of GlonassSatelliteAlmanacs. */
+ @NonNull
+ public List<GlonassSatelliteAlmanac> getSatelliteAlmanacs() {
+ return mSatelliteAlmanacs;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeLong(mIssueDateMillis);
+ dest.writeTypedList(mSatelliteAlmanacs);
+ }
+
+ public static final @NonNull Parcelable.Creator<GlonassAlmanac> CREATOR =
+ new Parcelable.Creator<GlonassAlmanac>() {
+ @Override
+ public GlonassAlmanac createFromParcel(@NonNull Parcel in) {
+ long issueDateMillis = in.readLong();
+ List<GlonassSatelliteAlmanac> satelliteAlmanacs = new ArrayList<>();
+ in.readTypedList(satelliteAlmanacs, GlonassSatelliteAlmanac.CREATOR);
+ return new GlonassAlmanac(issueDateMillis, satelliteAlmanacs);
+ }
+
+ @Override
+ public GlonassAlmanac[] newArray(int size) {
+ return new GlonassAlmanac[size];
+ }
+ };
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GlonassAlmanac[");
+ builder.append("issueDateMillis = ").append(mIssueDateMillis);
+ builder.append(", satelliteAlmanacs = ").append(mSatelliteAlmanacs);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /**
+ * A class contains Glonass satellite almanac data.
+ *
+ * <p>This is defined in Glonass ICD v5.1 section 4.5.
+ */
+ public static final class GlonassSatelliteAlmanac implements Parcelable {
+ /** Slot number. */
+ private final int mSlotNumber;
+
+ /** Satellite health information (0=healthy, 1=unhealthy). */
+ private final int mSvHealth;
+
+ /** Frequency channel number. */
+ private final int mFreqChannel;
+
+ /** Coarse value of satellite time correction to GLONASS time in seconds. */
+ private final double mTau;
+
+ /** Time of first ascending node passage of satellite in seconds. */
+ private final double mTLambda;
+
+ /** Longitude of the first ascending node in semi-circles. */
+ private final double mLambda;
+
+ /** Correction to the mean value of inclination in semi-circles. */
+ private final double mDeltaI;
+
+ /** Correction to the mean value of the draconian period in seconds per orbital period */
+ private final double mDeltaT;
+
+ /** Rate of change of draconian period in seconds per orbital period squared. */
+ private final double mDeltaTDot;
+
+ /** Eccentricity. */
+ private final double mEccentricity;
+
+ /** Argument of perigee in radians. */
+ private final double mOmega;
+
+ private GlonassSatelliteAlmanac(Builder builder) {
+ // Allow slotNumber beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(builder.mSlotNumber >= 1);
+ // Allow svHealth beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(builder.mSvHealth >= 0);
+ Preconditions.checkArgumentInRange(builder.mFreqChannel, 0, 31, "FreqChannel");
+ Preconditions.checkArgumentInRange(builder.mTau, -1.9e-3f, 1.9e-3f, "Tau");
+ Preconditions.checkArgumentInRange(builder.mTLambda, 0.0f, 44100.0f, "TLambda");
+ Preconditions.checkArgumentInRange(builder.mLambda, -1.0f, 1.0f, "Lambda");
+ Preconditions.checkArgumentInRange(builder.mDeltaI, -0.067f, 0.067f, "DeltaI");
+ Preconditions.checkArgumentInRange(builder.mDeltaT, -3600.0f, 3600.0f, "DeltaT");
+ Preconditions.checkArgumentInRange(builder.mDeltaTDot, -0.004f, 0.004f, "DeltaTDot");
+ Preconditions.checkArgumentInRange(builder.mEccentricity, 0.0f, 0.03f, "Eccentricity");
+ Preconditions.checkArgumentInRange(builder.mOmega, -1.0f, 1.0f, "Omega");
+ mSlotNumber = builder.mSlotNumber;
+ mSvHealth = builder.mSvHealth;
+ mFreqChannel = builder.mFreqChannel;
+ mTau = builder.mTau;
+ mTLambda = builder.mTLambda;
+ mLambda = builder.mLambda;
+ mDeltaI = builder.mDeltaI;
+ mDeltaT = builder.mDeltaT;
+ mDeltaTDot = builder.mDeltaTDot;
+ mEccentricity = builder.mEccentricity;
+ mOmega = builder.mOmega;
+ }
+
+ /** Returns the slot number. */
+ @IntRange(from = 1, to = 25)
+ public int getSlotNumber() {
+ return mSlotNumber;
+ }
+
+ /** Returns the Satellite health information (0=healthy, 1=unhealthy). */
+ @IntRange(from = 0, to = 1)
+ public int getSvHealth() {
+ return mSvHealth;
+ }
+
+ /** Returns the frequency channel number. */
+ @IntRange(from = 0, to = 31)
+ public int getFreqChannel() {
+ return mFreqChannel;
+ }
+
+ /** Returns the coarse value of satellite time correction to GLONASS time in seconds. */
+ @FloatRange(from = -1.9e-3f, to = 1.9e-3f)
+ public double getTau() {
+ return mTau;
+ }
+
+ /** Returns the time of first ascending node passage of satellite in seconds. */
+ @FloatRange(from = 0.0f, to = 44100.0f)
+ public double getTLambda() {
+ return mTLambda;
+ }
+
+ /** Returns the longitude of the first ascending node in semi-circles. */
+ @FloatRange(from = -1.0f, to = 1.0f)
+ public double getLambda() {
+ return mLambda;
+ }
+
+ /** Returns the correction to the mean value of inclination in semi-circles. */
+ @FloatRange(from = -0.067f, to = 0.067f)
+ public double getDeltaI() {
+ return mDeltaI;
+ }
+
+ /**
+ * Returns the correction to the mean value of the draconian period in seconds per orbital
+ * period
+ */
+ @FloatRange(from = -3600.0f, to = 3600.0f)
+ public double getDeltaT() {
+ return mDeltaT;
+ }
+
+ /** Returns the rate of change of draconian period in seconds per orbital period squared. */
+ @FloatRange(from = -0.004f, to = 0.004f)
+ public double getDeltaTDot() {
+ return mDeltaTDot;
+ }
+
+ /** Returns the eccentricity. */
+ @FloatRange(from = 0.0f, to = 0.03f)
+ public double getEccentricity() {
+ return mEccentricity;
+ }
+
+ /** Returns the argument of perigee in radians. */
+ @FloatRange(from = -1.0f, to = 1.0f)
+ public double getOmega() {
+ return mOmega;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(mSlotNumber);
+ dest.writeInt(mSvHealth);
+ dest.writeInt(mFreqChannel);
+ dest.writeDouble(mTau);
+ dest.writeDouble(mTLambda);
+ dest.writeDouble(mLambda);
+ dest.writeDouble(mDeltaI);
+ dest.writeDouble(mDeltaT);
+ dest.writeDouble(mDeltaTDot);
+ dest.writeDouble(mEccentricity);
+ dest.writeDouble(mOmega);
+ }
+
+ public static final @NonNull Parcelable.Creator<GlonassSatelliteAlmanac> CREATOR =
+ new Parcelable.Creator<GlonassSatelliteAlmanac>() {
+ @Override
+ public GlonassSatelliteAlmanac createFromParcel(@NonNull Parcel source) {
+ return new GlonassSatelliteAlmanac.Builder()
+ .setSlotNumber(source.readInt())
+ .setSvHealth(source.readInt())
+ .setFreqChannel(source.readInt())
+ .setTau(source.readDouble())
+ .setTLambda(source.readDouble())
+ .setLambda(source.readDouble())
+ .setDeltaI(source.readDouble())
+ .setDeltaT(source.readDouble())
+ .setDeltaTDot(source.readDouble())
+ .setEccentricity(source.readDouble())
+ .setOmega(source.readDouble())
+ .build();
+ }
+
+ @Override
+ public GlonassSatelliteAlmanac[] newArray(int size) {
+ return new GlonassSatelliteAlmanac[size];
+ }
+ };
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GlonassSatelliteAlmanac[");
+ builder.append("slotNumber = ").append(mSlotNumber);
+ builder.append(", svHealth = ").append(mSvHealth);
+ builder.append(", freqChannel = ").append(mFreqChannel);
+ builder.append(", tau = ").append(mTau);
+ builder.append(", tLambda = ").append(mTLambda);
+ builder.append(", lambda = ").append(mLambda);
+ builder.append(", deltaI = ").append(mDeltaI);
+ builder.append(", deltaT = ").append(mDeltaT);
+ builder.append(", deltaTDot = ").append(mDeltaTDot);
+ builder.append(", eccentricity = ").append(mEccentricity);
+ builder.append(", omega = ").append(mOmega);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GlonassSatelliteAlmanac}. */
+ public static final class Builder {
+ private int mSlotNumber;
+ private int mSvHealth;
+ private int mFreqChannel;
+ private double mTau;
+ private double mTLambda;
+ private double mLambda;
+ private double mDeltaI;
+ private double mDeltaT;
+ private double mDeltaTDot;
+ private double mEccentricity;
+ private double mOmega;
+
+ /** Sets the slot number. */
+ @NonNull
+ public Builder setSlotNumber(@IntRange(from = 1, to = 25) int slotNumber) {
+ mSlotNumber = slotNumber;
+ return this;
+ }
+
+ /** Sets the Satellite health information (0=healthy, 1=unhealthy). */
+ @NonNull
+ public Builder setSvHealth(@IntRange(from = 0, to = 1) int svHealth) {
+ mSvHealth = svHealth;
+ return this;
+ }
+
+ /** Sets the frequency channel number. */
+ @NonNull
+ public Builder setFreqChannel(@IntRange(from = 0, to = 31) int freqChannel) {
+ mFreqChannel = freqChannel;
+ return this;
+ }
+
+ /** Sets the coarse value of satellite time correction to GLONASS time in seconds. */
+ @NonNull
+ public Builder setTau(@FloatRange(from = -1.9e-3f, to = 1.9e-3f) double tau) {
+ mTau = tau;
+ return this;
+ }
+
+ /** Sets the time of first ascending node passage of satellite in seconds. */
+ @NonNull
+ public Builder setTLambda(@FloatRange(from = 0.0f, to = 44100.0f) double tLambda) {
+ mTLambda = tLambda;
+ return this;
+ }
+
+ /** Sets the longitude of the first ascending node in semi-circles. */
+ @NonNull
+ public Builder setLambda(@FloatRange(from = -1.0f, to = 1.0f) double lambda) {
+ mLambda = lambda;
+ return this;
+ }
+
+ /** Sets the correction to the mean value of inclination in semi-circles. */
+ @NonNull
+ public Builder setDeltaI(@FloatRange(from = -0.067f, to = 0.067f) double deltaI) {
+ mDeltaI = deltaI;
+ return this;
+ }
+
+ /**
+ * Sets the correction to the mean value of the draconian period in seconds per orbital
+ * period.
+ */
+ @NonNull
+ public Builder setDeltaT(@FloatRange(from = -3600.0f, to = 3600.0f) double deltaT) {
+ mDeltaT = deltaT;
+ return this;
+ }
+
+ /**
+ * Sets the rate of change of draconian period in seconds per orbital period squared.
+ */
+ @NonNull
+ public Builder setDeltaTDot(@FloatRange(from = -0.004f, to = 0.004f) double deltaTDot) {
+ mDeltaTDot = deltaTDot;
+ return this;
+ }
+
+ /** Sets the eccentricity. */
+ @NonNull
+ public Builder setEccentricity(
+ @FloatRange(from = 0.0f, to = 0.03f) double eccentricity) {
+ mEccentricity = eccentricity;
+ return this;
+ }
+
+ /** Sets the argument of perigee in radians. */
+ @NonNull
+ public Builder setOmega(@FloatRange(from = -1.0f, to = 1.0f) double omega) {
+ mOmega = omega;
+ return this;
+ }
+
+ /** Builds a {@link GlonassSatelliteAlmanac}. */
+ @NonNull
+ public GlonassSatelliteAlmanac build() {
+ return new GlonassSatelliteAlmanac(this);
+ }
+ }
+ }
+}
diff --git a/location/java/android/location/GlonassAssistance.java b/location/java/android/location/GlonassAssistance.java
new file mode 100644
index 000000000000..cc0820197d8d
--- /dev/null
+++ b/location/java/android/location/GlonassAssistance.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
+import android.location.GnssAssistance.GnssSatelliteCorrections;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A class contains Glonass assistance.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class GlonassAssistance implements Parcelable {
+
+ /** The Glonass almanac. */
+ @Nullable private final GlonassAlmanac mAlmanac;
+
+ /** The UTC model. */
+ @Nullable private final UtcModel mUtcModel;
+
+ /** The list of time models. */
+ @NonNull private final List<TimeModel> mTimeModels;
+
+ /** The list of Glonass ephemeris. */
+ @NonNull private final List<GlonassSatelliteEphemeris> mSatelliteEphemeris;
+
+ /** The list of Glonass satellite corrections. */
+ @NonNull private final List<GnssSatelliteCorrections> mSatelliteCorrections;
+
+ private GlonassAssistance(Builder builder) {
+ mAlmanac = builder.mAlmanac;
+ mUtcModel = builder.mUtcModel;
+ if (builder.mTimeModels != null) {
+ mTimeModels = Collections.unmodifiableList(new ArrayList<>(builder.mTimeModels));
+ } else {
+ mTimeModels = new ArrayList<>();
+ }
+ if (builder.mSatelliteEphemeris != null) {
+ mSatelliteEphemeris =
+ Collections.unmodifiableList(new ArrayList<>(builder.mSatelliteEphemeris));
+ } else {
+ mSatelliteEphemeris = new ArrayList<>();
+ }
+ if (builder.mSatelliteCorrections != null) {
+ mSatelliteCorrections =
+ Collections.unmodifiableList(new ArrayList<>(builder.mSatelliteCorrections));
+ } else {
+ mSatelliteCorrections = new ArrayList<>();
+ }
+ }
+
+ /** Returns the Glonass almanac. */
+ @Nullable
+ public GlonassAlmanac getAlmanac() {
+ return mAlmanac;
+ }
+
+ /** Returns the UTC model. */
+ @Nullable
+ public UtcModel getUtcModel() {
+ return mUtcModel;
+ }
+
+ /** Returns the list of time models. */
+ @NonNull
+ public List<TimeModel> getTimeModels() {
+ return mTimeModels;
+ }
+
+ /** Returns the list of Glonass satellite ephemeris. */
+ @NonNull
+ public List<GlonassSatelliteEphemeris> getSatelliteEphemeris() {
+ return mSatelliteEphemeris;
+ }
+
+ /** Returns the list of Glonass satellite corrections. */
+ @NonNull
+ public List<GnssSatelliteCorrections> getSatelliteCorrections() {
+ return mSatelliteCorrections;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeTypedObject(mAlmanac, flags);
+ dest.writeTypedObject(mUtcModel, flags);
+ dest.writeTypedList(mTimeModels);
+ dest.writeTypedList(mSatelliteEphemeris);
+ dest.writeTypedList(mSatelliteCorrections);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GlonassAssistance[");
+ builder.append("almanac = ").append(mAlmanac);
+ builder.append(", utcModel = ").append(mUtcModel);
+ builder.append(", timeModels = ").append(mTimeModels);
+ builder.append(", satelliteEphemeris = ").append(mSatelliteEphemeris);
+ builder.append(", satelliteCorrections = ").append(mSatelliteCorrections);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ public static final @NonNull Creator<GlonassAssistance> CREATOR =
+ new Creator<GlonassAssistance>() {
+ @Override
+ public GlonassAssistance createFromParcel(Parcel in) {
+ return new GlonassAssistance.Builder()
+ .setAlmanac(in.readTypedObject(GlonassAlmanac.CREATOR))
+ .setUtcModel(in.readTypedObject(UtcModel.CREATOR))
+ .setTimeModels(in.createTypedArrayList(TimeModel.CREATOR))
+ .setSatelliteEphemeris(
+ in.createTypedArrayList(GlonassSatelliteEphemeris.CREATOR))
+ .setSatelliteCorrections(
+ in.createTypedArrayList(GnssSatelliteCorrections.CREATOR))
+ .build();
+ }
+
+ @Override
+ public GlonassAssistance[] newArray(int size) {
+ return new GlonassAssistance[size];
+ }
+ };
+
+ /** Builder for {@link GlonassAssistance}. */
+ public static final class Builder {
+ private GlonassAlmanac mAlmanac;
+ private UtcModel mUtcModel;
+ private List<TimeModel> mTimeModels;
+ private List<GlonassSatelliteEphemeris> mSatelliteEphemeris;
+ private List<GnssSatelliteCorrections> mSatelliteCorrections;
+
+ /** Sets the Glonass almanac. */
+ @NonNull
+ public Builder setAlmanac(
+ @Nullable @SuppressLint("NullableCollection") GlonassAlmanac almanac) {
+ mAlmanac = almanac;
+ return this;
+ }
+
+ /** Sets the UTC model. */
+ @NonNull
+ public Builder setUtcModel(
+ @Nullable @SuppressLint("NullableCollection") UtcModel utcModel) {
+ mUtcModel = utcModel;
+ return this;
+ }
+
+ /** Sets the list of time models. */
+ @NonNull
+ public Builder setTimeModels(
+ @Nullable @SuppressLint("NullableCollection") List<TimeModel> timeModels) {
+ mTimeModels = timeModels;
+ return this;
+ }
+
+ /** Sets the list of Glonass satellite ephemeris. */
+ @NonNull
+ public Builder setSatelliteEphemeris(
+ @Nullable @SuppressLint("NullableCollection")
+ List<GlonassSatelliteEphemeris> satelliteEphemeris) {
+ mSatelliteEphemeris = satelliteEphemeris;
+ return this;
+ }
+
+ /** Sets the list of Glonass satellite corrections. */
+ @NonNull
+ public Builder setSatelliteCorrections(
+ @Nullable @SuppressLint("NullableCollection")
+ List<GnssSatelliteCorrections> satelliteCorrections) {
+ mSatelliteCorrections = satelliteCorrections;
+ return this;
+ }
+
+ /** Builds the {@link GlonassAssistance}. */
+ @NonNull
+ public GlonassAssistance build() {
+ return new GlonassAssistance(this);
+ }
+ }
+}
diff --git a/location/java/android/location/GlonassSatelliteEphemeris.java b/location/java/android/location/GlonassSatelliteEphemeris.java
new file mode 100644
index 000000000000..77a6ebb50cfb
--- /dev/null
+++ b/location/java/android/location/GlonassSatelliteEphemeris.java
@@ -0,0 +1,623 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A class contains ephemeris parameters specific to Glonass satellites.
+ *
+ * <p>This is defined in RINEX 3.05 APPENDIX 10 and Glonass ICD v5.1 section 4.4.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class GlonassSatelliteEphemeris implements Parcelable {
+
+ /** L1/Satellite system (R), satellite number (slot number in sat. constellation). */
+ private final int mSlotNumber;
+
+ /** Health state (0=healthy, 1=unhealthy). */
+ private final int mHealthState;
+
+ /** Message frame time in seconds of the UTC week (tk+nd*86400). */
+ private final double mFrameTimeSeconds;
+
+ /** Age of current information in days (E). */
+ private final int mAgeInDays;
+
+ /** Satellite clock model. */
+ @NonNull private final GlonassSatelliteClockModel mSatelliteClockModel;
+
+ /** Satellite orbit model. */
+ @NonNull private final GlonassSatelliteOrbitModel mSatelliteOrbitModel;
+
+ private GlonassSatelliteEphemeris(Builder builder) {
+ // Allow SlotNumber beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(builder.mSlotNumber >= 1);
+ // Allow HealthState beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(builder.mHealthState >= 0);
+ Preconditions.checkArgument(builder.mFrameTimeSeconds >= 0.0f);
+ Preconditions.checkArgumentInRange(builder.mAgeInDays, 0, 31, "AgeInDays");
+ Preconditions.checkNotNull(
+ builder.mSatelliteClockModel, "SatelliteClockModel cannot be null");
+ Preconditions.checkNotNull(
+ builder.mSatelliteOrbitModel, "SatelliteOrbitModel cannot be null");
+ mSlotNumber = builder.mSlotNumber;
+ mHealthState = builder.mHealthState;
+ mFrameTimeSeconds = builder.mFrameTimeSeconds;
+ mAgeInDays = builder.mAgeInDays;
+ mSatelliteClockModel = builder.mSatelliteClockModel;
+ mSatelliteOrbitModel = builder.mSatelliteOrbitModel;
+ }
+
+ /**
+ * Returns the L1/Satellite system (R), satellite number (slot number in sat. constellation).
+ */
+ @IntRange(from = 1, to = 25)
+ public int getSlotNumber() {
+ return mSlotNumber;
+ }
+
+ /** Returns the health state (0=healthy, 1=unhealthy). */
+ @IntRange(from = 0, to = 1)
+ public int getHealthState() {
+ return mHealthState;
+ }
+
+ /** Returns the message frame time in seconds of the UTC week (tk+nd*86400). */
+ @FloatRange(from = 0.0f)
+ public double getFrameTimeSeconds() {
+ return mFrameTimeSeconds;
+ }
+
+ /** Returns the age of current information in days (E). */
+ @IntRange(from = 0, to = 31)
+ public int getAgeInDays() {
+ return mAgeInDays;
+ }
+
+ /** Returns the satellite clock model. */
+ @NonNull
+ public GlonassSatelliteClockModel getSatelliteClockModel() {
+ return mSatelliteClockModel;
+ }
+
+ /** Returns the satellite orbit model. */
+ @NonNull
+ public GlonassSatelliteOrbitModel getSatelliteOrbitModel() {
+ return mSatelliteOrbitModel;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(mSlotNumber);
+ dest.writeInt(mHealthState);
+ dest.writeDouble(mFrameTimeSeconds);
+ dest.writeInt(mAgeInDays);
+ dest.writeTypedObject(mSatelliteClockModel, flags);
+ dest.writeTypedObject(mSatelliteOrbitModel, flags);
+ }
+
+ public static final @NonNull Parcelable.Creator<GlonassSatelliteEphemeris> CREATOR =
+ new Parcelable.Creator<GlonassSatelliteEphemeris>() {
+ @Override
+ public GlonassSatelliteEphemeris createFromParcel(@NonNull Parcel source) {
+ return new GlonassSatelliteEphemeris.Builder()
+ .setSlotNumber(source.readInt())
+ .setHealthState(source.readInt())
+ .setFrameTimeSeconds(source.readDouble())
+ .setAgeInDays(source.readInt())
+ .setSatelliteClockModel(
+ source.readTypedObject(GlonassSatelliteClockModel.CREATOR))
+ .setSatelliteOrbitModel(
+ source.readTypedObject(GlonassSatelliteOrbitModel.CREATOR))
+ .build();
+ }
+
+ @Override
+ public GlonassSatelliteEphemeris[] newArray(int size) {
+ return new GlonassSatelliteEphemeris[size];
+ }
+ };
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GlonassSatelliteEphemeris[");
+ builder.append("slotNumber = ").append(mSlotNumber);
+ builder.append(", healthState = ").append(mHealthState);
+ builder.append(", frameTimeSeconds = ").append(mFrameTimeSeconds);
+ builder.append(", ageInDays = ").append(mAgeInDays);
+ builder.append(", satelliteClockModel = ").append(mSatelliteClockModel);
+ builder.append(", satelliteOrbitModel = ").append(mSatelliteOrbitModel);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GlonassSatelliteEphemeris}. */
+ public static final class Builder {
+ private int mSlotNumber;
+ private int mHealthState;
+ private double mFrameTimeSeconds;
+ private int mAgeInDays;
+ private GlonassSatelliteClockModel mSatelliteClockModel;
+ private GlonassSatelliteOrbitModel mSatelliteOrbitModel;
+
+ /**
+ * Sets the L1/Satellite system (R), satellite number (slot number in sat. constellation).
+ */
+ @NonNull
+ public Builder setSlotNumber(@IntRange(from = 1, to = 25) int slotNumber) {
+ mSlotNumber = slotNumber;
+ return this;
+ }
+
+ /** Sets the health state (0=healthy, 1=unhealthy). */
+ @NonNull
+ public Builder setHealthState(@IntRange(from = 0, to = 1) int healthState) {
+ mHealthState = healthState;
+ return this;
+ }
+
+ /** Sets the message frame time in seconds of the UTC week (tk+nd*86400). */
+ @NonNull
+ public Builder setFrameTimeSeconds(@FloatRange(from = 0.0f) double frameTimeSeconds) {
+ mFrameTimeSeconds = frameTimeSeconds;
+ return this;
+ }
+
+ /** Sets the age of current information in days (E). */
+ @NonNull
+ public Builder setAgeInDays(@IntRange(from = 0, to = 31) int ageInDays) {
+ mAgeInDays = ageInDays;
+ return this;
+ }
+
+ /** Sets the satellite clock model. */
+ @NonNull
+ public Builder setSatelliteClockModel(
+ @NonNull GlonassSatelliteClockModel satelliteClockModel) {
+ mSatelliteClockModel = satelliteClockModel;
+ return this;
+ }
+
+ /** Sets the satellite orbit model. */
+ @NonNull
+ public Builder setSatelliteOrbitModel(
+ @NonNull GlonassSatelliteOrbitModel satelliteOrbitModel) {
+ mSatelliteOrbitModel = satelliteOrbitModel;
+ return this;
+ }
+
+ /** Builds a {@link GlonassSatelliteEphemeris}. */
+ @NonNull
+ public GlonassSatelliteEphemeris build() {
+ return new GlonassSatelliteEphemeris(this);
+ }
+ }
+
+ /**
+ * A class contains the set of parameters needed for Glonass satellite clock correction.
+ *
+ * <p>This is defined in RINEX 3.05 APPENDIX 10 and Glonass ICD v5.1 section 4.4.
+ */
+ public static final class GlonassSatelliteClockModel implements Parcelable {
+ /**
+ * Time of the clock in seconds (UTC)
+ *
+ * <p>Corresponds to the 'Epoch' field within the 'SV/EPOCH/SV CLK' record of Glonass
+ * navigation message in RINEX 3.05 Table A10.
+ */
+ private final long mTimeOfClockSeconds;
+
+ /** Clock bias in seconds (-TauN). */
+ private final double mClockBias;
+
+ /** Frequency bias (+GammaN). */
+ private final double mFrequencyBias;
+
+ /** Frequency number. */
+ private final int mFrequencyNumber;
+
+ private GlonassSatelliteClockModel(Builder builder) {
+ Preconditions.checkArgument(builder.mTimeOfClockSeconds >= 0);
+ Preconditions.checkArgumentInRange(builder.mClockBias, -0.002f, 0.002f, "ClockBias");
+ Preconditions.checkArgumentInRange(
+ builder.mFrequencyBias, -9.32e-10f, 9.32e-10f, "FrequencyBias");
+ Preconditions.checkArgumentInRange(builder.mFrequencyNumber, -7, 6, "FrequencyNumber");
+ mTimeOfClockSeconds = builder.mTimeOfClockSeconds;
+ mClockBias = builder.mClockBias;
+ mFrequencyBias = builder.mFrequencyBias;
+ mFrequencyNumber = builder.mFrequencyNumber;
+ }
+
+ /** Returns the time of clock in seconds (UTC). */
+ @IntRange(from = 0)
+ public long getTimeOfClockSeconds() {
+ return mTimeOfClockSeconds;
+ }
+
+ /** Returns the clock bias in seconds (-TauN). */
+ @FloatRange(from = -0.002f, to = 0.002f)
+ public double getClockBias() {
+ return mClockBias;
+ }
+
+ /** Returns the frequency bias (+GammaN). */
+ @FloatRange(from = -9.32e-10f, to = 9.32e-10f)
+ public double getFrequencyBias() {
+ return mFrequencyBias;
+ }
+
+ /** Returns the frequency number. */
+ @IntRange(from = -7, to = 6)
+ public int getFrequencyNumber() {
+ return mFrequencyNumber;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeLong(mTimeOfClockSeconds);
+ dest.writeDouble(mClockBias);
+ dest.writeDouble(mFrequencyBias);
+ dest.writeInt(mFrequencyNumber);
+ }
+
+ public static final @NonNull Parcelable.Creator<GlonassSatelliteClockModel> CREATOR =
+ new Parcelable.Creator<GlonassSatelliteClockModel>() {
+ @Override
+ public GlonassSatelliteClockModel createFromParcel(@NonNull Parcel source) {
+ return new GlonassSatelliteClockModel.Builder()
+ .setTimeOfClockSeconds(source.readLong())
+ .setClockBias(source.readDouble())
+ .setFrequencyBias(source.readDouble())
+ .setFrequencyNumber(source.readInt())
+ .build();
+ }
+
+ @Override
+ public GlonassSatelliteClockModel[] newArray(int size) {
+ return new GlonassSatelliteClockModel[size];
+ }
+ };
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GlonassSatelliteClockModel[");
+ builder.append("timeOfClockSeconds = ").append(mTimeOfClockSeconds);
+ builder.append(", clockBias = ").append(mClockBias);
+ builder.append(", frequencyBias = ").append(mFrequencyBias);
+ builder.append(", frequencyNumber = ").append(mFrequencyNumber);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GlonassSatelliteClockModel}. */
+ public static final class Builder {
+ private long mTimeOfClockSeconds;
+ private double mClockBias;
+ private double mFrequencyBias;
+ private int mFrequencyNumber;
+
+ /** Sets the time of clock in seconds (UTC). */
+ @NonNull
+ public Builder setTimeOfClockSeconds(@IntRange(from = 0) long timeOfClockSeconds) {
+ mTimeOfClockSeconds = timeOfClockSeconds;
+ return this;
+ }
+
+ /** Sets the clock bias in seconds (-TauN). */
+ @NonNull
+ public Builder setClockBias(@FloatRange(from = -0.002f, to = 0.002f) double clockBias) {
+ mClockBias = clockBias;
+ return this;
+ }
+
+ /** Sets the frequency bias (+GammaN). */
+ @NonNull
+ public Builder setFrequencyBias(
+ @FloatRange(from = -9.32e-10f, to = 9.32e-10f) double frequencyBias) {
+ mFrequencyBias = frequencyBias;
+ return this;
+ }
+
+ /** Sets the frequency number. */
+ @NonNull
+ public Builder setFrequencyNumber(@IntRange(from = -7, to = 6) int frequencyNumber) {
+ mFrequencyNumber = frequencyNumber;
+ return this;
+ }
+
+ /** Builds a {@link GlonassSatelliteClockModel}. */
+ @NonNull
+ public GlonassSatelliteClockModel build() {
+ return new GlonassSatelliteClockModel(this);
+ }
+ }
+ }
+
+ /**
+ * A class contains the set of parameters needed for Glonass satellite orbit correction.
+ *
+ * <p>This is defined in RINEX 3.05 APPENDIX 10 and Glonass ICD v5.1 section 4.4.
+ */
+ public static final class GlonassSatelliteOrbitModel implements Parcelable {
+ /** X position in kilometers. */
+ private final double mX;
+
+ /** X velocity in kilometers per second. */
+ private final double mXDot;
+
+ /** X acceleration in kilometers per second squared. */
+ private final double mXAccel;
+
+ /** Y position in kilometers. */
+ private final double mY;
+
+ /** Y velocity in kilometers per second. */
+ private final double mYDot;
+
+ /** Y acceleration in kilometers per second squared. */
+ private final double mYAccel;
+
+ /** Z position in kilometers. */
+ private final double mZ;
+
+ /** Z velocity in kilometers per second. */
+ private final double mZDot;
+
+ /** Z acceleration in kilometers per second squared. */
+ private final double mZAccel;
+
+ private GlonassSatelliteOrbitModel(Builder builder) {
+ Preconditions.checkArgumentInRange(builder.mX, -2.7e4f, 2.7e4f, "X");
+ Preconditions.checkArgumentInRange(builder.mXDot, -4.3f, 4.3f, "XDot");
+ Preconditions.checkArgumentInRange(builder.mXAccel, -6.2e-9f, 6.2e-9f, "XAccel");
+ Preconditions.checkArgumentInRange(builder.mY, -2.7e4f, 2.7e4f, "Y");
+ Preconditions.checkArgumentInRange(builder.mYDot, -4.3f, 4.3f, "YDot");
+ Preconditions.checkArgumentInRange(builder.mYAccel, -6.2e-9f, 6.2e-9f, "YAccel");
+ Preconditions.checkArgumentInRange(builder.mZ, -2.7e4f, 2.7e4f, "Z");
+ Preconditions.checkArgumentInRange(builder.mZDot, -4.3f, 4.3f, "ZDot");
+ Preconditions.checkArgumentInRange(builder.mZAccel, -6.2e-9f, 6.2e-9f, "ZAccel");
+ mX = builder.mX;
+ mXDot = builder.mXDot;
+ mXAccel = builder.mXAccel;
+ mY = builder.mY;
+ mYDot = builder.mYDot;
+ mYAccel = builder.mYAccel;
+ mZ = builder.mZ;
+ mZDot = builder.mZDot;
+ mZAccel = builder.mZAccel;
+ }
+
+ /** Returns the X position in kilometers. */
+ @FloatRange(from = -2.7e4f, to = 2.7e4f)
+ public double getX() {
+ return mX;
+ }
+
+ /** Returns the X velocity in kilometers per second. */
+ @FloatRange(from = -4.3f, to = 4.3f)
+ public double getXDot() {
+ return mXDot;
+ }
+
+ /** Returns the X acceleration in kilometers per second squared. */
+ @FloatRange(from = -6.2e-9f, to = 6.2e-9f)
+ public double getXAccel() {
+ return mXAccel;
+ }
+
+ /** Returns the Y position in kilometers. */
+ @FloatRange(from = -2.7e4f, to = 2.7e4f)
+ public double getY() {
+ return mY;
+ }
+
+ /** Returns the Y velocity in kilometers per second. */
+ @FloatRange(from = -4.3f, to = 4.3f)
+ public double getYDot() {
+ return mYDot;
+ }
+
+ /** Returns the Y acceleration in kilometers per second squared. */
+ @FloatRange(from = -6.2e-9f, to = 6.2e-9f)
+ public double getYAccel() {
+ return mYAccel;
+ }
+
+ /** Returns the Z position in kilometers. */
+ @FloatRange(from = -2.7e4f, to = 2.7e4f)
+ public double getZ() {
+ return mZ;
+ }
+
+ /** Returns the Z velocity in kilometers per second. */
+ @FloatRange(from = -4.3f, to = 4.3f)
+ public double getZDot() {
+ return mZDot;
+ }
+
+ /** Returns the Z acceleration in kilometers per second squared. */
+ @FloatRange(from = -6.2e-9f, to = 6.2e-9f)
+ public double getZAccel() {
+ return mZAccel;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeDouble(mX);
+ dest.writeDouble(mXDot);
+ dest.writeDouble(mXAccel);
+ dest.writeDouble(mY);
+ dest.writeDouble(mYDot);
+ dest.writeDouble(mYAccel);
+ dest.writeDouble(mZ);
+ dest.writeDouble(mZDot);
+ dest.writeDouble(mZAccel);
+ }
+
+ public static final @NonNull Parcelable.Creator<GlonassSatelliteOrbitModel> CREATOR =
+ new Parcelable.Creator<GlonassSatelliteOrbitModel>() {
+ @Override
+ public GlonassSatelliteOrbitModel createFromParcel(@NonNull Parcel source) {
+ return new GlonassSatelliteOrbitModel.Builder()
+ .setX(source.readDouble())
+ .setXDot(source.readDouble())
+ .setXAccel(source.readDouble())
+ .setY(source.readDouble())
+ .setYDot(source.readDouble())
+ .setYAccel(source.readDouble())
+ .setZ(source.readDouble())
+ .setZDot(source.readDouble())
+ .setZAccel(source.readDouble())
+ .build();
+ }
+
+ @Override
+ public GlonassSatelliteOrbitModel[] newArray(int size) {
+ return new GlonassSatelliteOrbitModel[size];
+ }
+ };
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GlonassSatelliteOrbitModel[");
+ builder.append("x = ").append(mX);
+ builder.append(", xDot = ").append(mXDot);
+ builder.append(", xAccel = ").append(mXAccel);
+ builder.append(", y = ").append(mY);
+ builder.append(", yDot = ").append(mYDot);
+ builder.append(", yAccel = ").append(mYAccel);
+ builder.append(", z = ").append(mZ);
+ builder.append(", zDot = ").append(mZDot);
+ builder.append(", zAccel = ").append(mZAccel);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GlonassSatelliteOrbitModel}. */
+ public static final class Builder {
+ private double mX;
+ private double mXDot;
+ private double mXAccel;
+ private double mY;
+ private double mYDot;
+ private double mYAccel;
+ private double mZ;
+ private double mZDot;
+ private double mZAccel;
+
+ /** Sets the X position in kilometers. */
+ @NonNull
+ public Builder setX(@FloatRange(from = -2.7e4f, to = 2.7e4f) double x) {
+ mX = x;
+ return this;
+ }
+
+ /** Sets the X velocity in kilometers per second. */
+ @NonNull
+ public Builder setXDot(@FloatRange(from = -4.3f, to = 4.3f) double xDot) {
+ mXDot = xDot;
+ return this;
+ }
+
+ /** Sets the X acceleration in kilometers per second squared. */
+ @NonNull
+ public Builder setXAccel(@FloatRange(from = -6.2e-9f, to = 6.2e-9f) double xAccel) {
+ mXAccel = xAccel;
+ return this;
+ }
+
+ /** Sets the Y position in kilometers. */
+ @NonNull
+ public Builder setY(@FloatRange(from = -2.7e4f, to = 2.7e4f) double y) {
+ mY = y;
+ return this;
+ }
+
+ /** Sets the Y velocity in kilometers per second. */
+ @NonNull
+ public Builder setYDot(@FloatRange(from = -4.3f, to = 4.3f) double yDot) {
+ mYDot = yDot;
+ return this;
+ }
+
+ /** Sets the Y acceleration in kilometers per second squared. */
+ @NonNull
+ public Builder setYAccel(@FloatRange(from = -6.2e-9f, to = 6.2e-9f) double yAccel) {
+ mYAccel = yAccel;
+ return this;
+ }
+
+ /** Sets the Z position in kilometers. */
+ @NonNull
+ public Builder setZ(@FloatRange(from = -2.7e4f, to = 2.7e4f) double z) {
+ mZ = z;
+ return this;
+ }
+
+ /** Sets the Z velocity in kilometers per second. */
+ @NonNull
+ public Builder setZDot(@FloatRange(from = -4.3f, to = 4.3f) double zDot) {
+ mZDot = zDot;
+ return this;
+ }
+
+ /** Sets the Z acceleration in kilometers per second squared. */
+ @NonNull
+ public Builder setZAccel(@FloatRange(from = -6.2e-9f, to = 6.2e-9f) double zAccel) {
+ mZAccel = zAccel;
+ return this;
+ }
+
+ /** Builds a {@link GlonassSatelliteOrbitModel}. */
+ @NonNull
+ public GlonassSatelliteOrbitModel build() {
+ return new GlonassSatelliteOrbitModel(this);
+ }
+ }
+ }
+}
diff --git a/location/java/android/location/GnssAlmanac.java b/location/java/android/location/GnssAlmanac.java
new file mode 100644
index 000000000000..6466e45a965e
--- /dev/null
+++ b/location/java/android/location/GnssAlmanac.java
@@ -0,0 +1,619 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A class contains almanac parameters for GPS, QZSS, Galileo, Beidou.
+ *
+ * <p>For Beidou, this is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.15.
+ *
+ * <p>For GPS, this is defined in IS-GPS-200 section 20.3.3.5.1.2.
+ *
+ * <p>For QZSS, this is defined in IS-QZSS-PNT section 4.1.2.6.
+ *
+ * <p>For Galileo, this is defined in Galileo-OS-SIS-ICD-v2.1 section 5.1.10.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class GnssAlmanac implements Parcelable {
+ /**
+ * Almanac issue date in milliseconds (UTC).
+ *
+ * <p>This is unused for GPS/QZSS/Baidou.
+ */
+ private final long mIssueDateMillis;
+
+ /**
+ * Almanac issue of data.
+ *
+ * <p>This is unused for GPS/QZSS/Baidou.
+ */
+ private final int mIod;
+
+ /**
+ * Almanac reference week number.
+ *
+ * <p>For GPS and QZSS, this is GPS week number (modulo 1024).
+ *
+ * <p>For Beidou, this is Baidou week number (modulo 8192).
+ *
+ * <p>For Galileo, this is modulo 4 representation of the Galileo week number.
+ */
+ private final int mWeekNumber;
+
+ /** Almanac reference time in seconds. */
+ private final int mToaSeconds;
+
+ /** The list of GnssSatelliteAlmanacs. */
+ @NonNull private final List<GnssSatelliteAlmanac> mGnssSatelliteAlmanacs;
+
+ private GnssAlmanac(Builder builder) {
+ Preconditions.checkArgument(builder.mIssueDateMillis >= 0);
+ Preconditions.checkArgument(builder.mIod >= 0);
+ Preconditions.checkArgument(builder.mWeekNumber >= 0);
+ Preconditions.checkArgumentInRange(builder.mToaSeconds, 0, 604800, "ToaSeconds");
+ Preconditions.checkNotNull(
+ builder.mGnssSatelliteAlmanacs, "GnssSatelliteAlmanacs cannot be null");
+ mIssueDateMillis = builder.mIssueDateMillis;
+ mIod = builder.mIod;
+ mWeekNumber = builder.mWeekNumber;
+ mToaSeconds = builder.mToaSeconds;
+ mGnssSatelliteAlmanacs =
+ Collections.unmodifiableList(new ArrayList<>(builder.mGnssSatelliteAlmanacs));
+ }
+
+ /** Returns the almanac issue date in milliseconds (UTC). */
+ @IntRange(from = 0)
+ public long getIssueDateMillis() {
+ return mIssueDateMillis;
+ }
+
+ /** Returns the almanac issue of data. */
+ @IntRange(from = 0)
+ public int getIod() {
+ return mIod;
+ }
+
+ /**
+ * Returns the almanac reference week number.
+ *
+ * <p>For GPS and QZSS, this is GPS week number (modulo 1024).
+ *
+ * <p>For Beidou, this is Baidou week number (modulo 8192).
+ *
+ * <p>For Galileo, this is modulo 4 representation of the Galileo week number.
+ */
+ @IntRange(from = 0)
+ public int getWeekNumber() {
+ return mWeekNumber;
+ }
+
+ /** Returns the almanac reference time in seconds. */
+ @IntRange(from = 0, to = 604800)
+ public int getToaSeconds() {
+ return mToaSeconds;
+ }
+
+ /** Returns the list of GnssSatelliteAlmanacs. */
+ @NonNull
+ public List<GnssSatelliteAlmanac> getGnssSatelliteAlmanacs() {
+ return mGnssSatelliteAlmanacs;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeLong(mIssueDateMillis);
+ dest.writeInt(mIod);
+ dest.writeInt(mWeekNumber);
+ dest.writeInt(mToaSeconds);
+ dest.writeTypedList(mGnssSatelliteAlmanacs);
+ }
+
+ public static final @NonNull Creator<GnssAlmanac> CREATOR =
+ new Creator<GnssAlmanac>() {
+ @Override
+ public GnssAlmanac createFromParcel(Parcel in) {
+ GnssAlmanac.Builder gnssAlmanac = new GnssAlmanac.Builder();
+ gnssAlmanac.setIssueDateMillis(in.readLong());
+ gnssAlmanac.setIod(in.readInt());
+ gnssAlmanac.setWeekNumber(in.readInt());
+ gnssAlmanac.setToaSeconds(in.readInt());
+ List<GnssSatelliteAlmanac> satelliteAlmanacs = new ArrayList<>();
+ in.readTypedList(satelliteAlmanacs, GnssSatelliteAlmanac.CREATOR);
+ gnssAlmanac.setGnssSatelliteAlmanacs(satelliteAlmanacs);
+ return gnssAlmanac.build();
+ }
+
+ @Override
+ public GnssAlmanac[] newArray(int size) {
+ return new GnssAlmanac[size];
+ }
+ };
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GnssAlmanac[");
+ builder.append("issueDateMillis=").append(mIssueDateMillis);
+ builder.append(", iod=").append(mIod);
+ builder.append(", weekNumber=").append(mWeekNumber);
+ builder.append(", toaSeconds=").append(mToaSeconds);
+ builder.append(", satelliteAlmanacs=").append(mGnssSatelliteAlmanacs);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GnssAlmanac}. */
+ public static final class Builder {
+ private long mIssueDateMillis;
+ private int mIod;
+ private int mWeekNumber;
+ private int mToaSeconds;
+ private List<GnssSatelliteAlmanac> mGnssSatelliteAlmanacs;
+
+ /** Sets the almanac issue date in milliseconds (UTC). */
+ @NonNull
+ public Builder setIssueDateMillis(@IntRange(from = 0) long issueDateMillis) {
+ mIssueDateMillis = issueDateMillis;
+ return this;
+ }
+
+ /** Sets the almanac issue of data. */
+ @NonNull
+ public Builder setIod(@IntRange(from = 0) int iod) {
+ mIod = iod;
+ return this;
+ }
+
+ /**
+ * Sets the almanac reference week number.
+ *
+ * <p>For GPS and QZSS, this is GPS week number (modulo 1024).
+ *
+ * <p>For Beidou, this is Baidou week number (modulo 8192).
+ *
+ * <p>For Galileo, this is modulo 4 representation of the Galileo week number.
+ */
+ @NonNull
+ public Builder setWeekNumber(@IntRange(from = 0) int weekNumber) {
+ mWeekNumber = weekNumber;
+ return this;
+ }
+
+ /** Sets the almanac reference time in seconds. */
+ @NonNull
+ public Builder setToaSeconds(@IntRange(from = 0, to = 604800) int toaSeconds) {
+ mToaSeconds = toaSeconds;
+ return this;
+ }
+
+ /** Sets the list of GnssSatelliteAlmanacs. */
+ @NonNull
+ public Builder setGnssSatelliteAlmanacs(
+ @NonNull List<GnssSatelliteAlmanac> gnssSatelliteAlmanacs) {
+ mGnssSatelliteAlmanacs = gnssSatelliteAlmanacs;
+ return this;
+ }
+
+ /** Builds a {@link GnssAlmanac} instance as specified by this builder. */
+ @NonNull
+ public GnssAlmanac build() {
+ return new GnssAlmanac(this);
+ }
+ }
+
+ /**
+ * A class contains almanac parameters for GPS, QZSS, Galileo, Beidou.
+ *
+ * <p>For Beidou, this is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.15.
+ *
+ * <p>For GPS, this is defined in IS-GPS-200 section 20.3.3.5.1.2.
+ *
+ * <p>For QZSS, this is defined in IS-QZSS-PNT section 4.1.2.6.
+ *
+ * <p>For Galileo, this is defined in Galileo-OS-SIS-ICD-v2.1 section 5.1.10.
+ */
+ public static final class GnssSatelliteAlmanac implements Parcelable {
+ /** The PRN number of the GNSS satellite. */
+ private final int mSvid;
+
+ /**
+ * Satellite health information.
+ *
+ * <p>For GPS, this is satellite subframe 4 and 5, page 25 6-bit health code as defined in
+ * IS-GPS-200 Table 20-VIII expressed in integer form.
+ *
+ * <p>For QZSS, this is the 5-bit health code as defined in IS-QZSS-PNT, Table 4.1.2-5-2
+ * expressed in integer form.
+ *
+ * <p>For Beidou, this is 1-bit health information. (0=healthy, 1=unhealthy).
+ *
+ * <p>For Galileo, this is 6-bit health, bit 0 and 1 is for E5a, bit 2 and 3 is for E5b, bit
+ * 4 and 5 is for E1b.
+ */
+ private final int mSvHealth;
+
+ /** Eccentricity. */
+ private final double mEccentricity;
+
+ /**
+ * Inclination in semi-circles.
+ *
+ * <p>For GPS and Galileo, this is the difference between the inclination angle at reference
+ * time and the nominal inclination in semi-circles.
+ *
+ * <p>For Beidou and QZSS, this is the inclination angle at reference time in semi-circles.
+ */
+ private final double mInclination;
+
+ /** Argument of perigee in semi-circles. */
+ private final double mOmega;
+
+ /** Longitude of ascending node of orbital plane at weekly epoch in semi-circles. */
+ private final double mOmega0;
+
+ /** Rate of right ascension in semi-circles per second. */
+ private final double mOmegaDot;
+
+ /**
+ * Square root of semi-major axis in square root of meters.
+ *
+ * <p>For Galileo, this is the difference with respect to the square root of the nominal
+ * semi-major axis in square root of meters.
+ */
+ private final double mRootA;
+
+ /** Mean anomaly at reference time in semi-circles. */
+ private final double mM0;
+
+ /** Satellite clock time bias correction coefficient in seconds. */
+ private final double mAf0;
+
+ /** Satellite clock time drift correction coefficient in seconds per second. */
+ private final double mAf1;
+
+ private GnssSatelliteAlmanac(Builder builder) {
+ Preconditions.checkArgument(builder.mSvid > 0);
+ Preconditions.checkArgument(builder.mSvHealth >= 0);
+ Preconditions.checkArgument(builder.mEccentricity >= 0.0f);
+ Preconditions.checkArgumentInRange(builder.mInclination, -1.0f, 1.0f, "Inclination");
+ Preconditions.checkArgumentInRange(builder.mOmega, -1.0f, 1.0f, "Omega");
+ Preconditions.checkArgumentInRange(builder.mOmega0, -1.0f, 1.0f, "Omega0");
+ Preconditions.checkArgumentInRange(builder.mOmegaDot, -1.0f, 1.0f, "OmegaDot");
+ Preconditions.checkArgumentInRange(builder.mRootA, 0.0f, 8192.0f, "RootA");
+ Preconditions.checkArgumentInRange(builder.mM0, -1.0f, 1.0f, "M0");
+ Preconditions.checkArgumentInRange(builder.mAf0, -0.0625f, 0.0625f, "Af0");
+ Preconditions.checkArgumentInRange(builder.mAf1, -1.5e-8f, 1.5e-8f, "Af1");
+ mSvid = builder.mSvid;
+ mSvHealth = builder.mSvHealth;
+ mEccentricity = builder.mEccentricity;
+ mInclination = builder.mInclination;
+ mOmega = builder.mOmega;
+ mOmega0 = builder.mOmega0;
+ mOmegaDot = builder.mOmegaDot;
+ mRootA = builder.mRootA;
+ mM0 = builder.mM0;
+ mAf0 = builder.mAf0;
+ mAf1 = builder.mAf1;
+ }
+
+ /** Returns the PRN number of the GNSS satellite. */
+ @IntRange(from = 1)
+ public int getSvid() {
+ return mSvid;
+ }
+
+ /**
+ * Returns the satellite health information.
+ *
+ * <p>For GPS, this is satellite subframe 4 and 5, page 25 6-bit health code as defined in
+ * IS-GPS-200 Table 20-VIII expressed in integer form.
+ *
+ * <p>For QZSS, this is the 5-bit health code as defined in IS-QZSS-PNT, Table 4.1.2-5-2
+ * expressed in integer form.
+ *
+ * <p>For Beidou, this is 1-bit health information. (0=healthy, 1=unhealthy).
+ *
+ * <p>For Galileo, this is 6-bit health, bit 0 and 1 is for E5a, bit 2 and 3 is for E5b,
+ * bit 4 and 5 is for E1b.
+ */
+ @IntRange(from = 0)
+ public int getSvHealth() {
+ return mSvHealth;
+ }
+
+ /** Returns the eccentricity. */
+ @FloatRange(from = 0.0f)
+ public double getEccentricity() {
+ return mEccentricity;
+ }
+
+ /**
+ * Returns the inclination in semi-circles.
+ *
+ * <p>For GPS and Galileo, this is the difference between the inclination angle at reference
+ * time and the nominal inclination in semi-circles.
+ *
+ * <p>For Beidou and QZSS, this is the inclination angle at reference time in semi-circles.
+ */
+ @FloatRange(from = -1.0f, to = 1.0f)
+ public double getInclination() {
+ return mInclination;
+ }
+
+ /** Returns the argument of perigee in semi-circles. */
+ @FloatRange(from = -1.0f, to = 1.0f)
+ public double getOmega() {
+ return mOmega;
+ }
+
+ /**
+ * Returns the longitude of ascending node of orbital plane at weekly epoch in semi-circles.
+ */
+ @FloatRange(from = -1.0f, to = 1.0f)
+ public double getOmega0() {
+ return mOmega0;
+ }
+
+ /** Returns the rate of right ascension in semi-circles per second. */
+ @FloatRange(from = -1.0f, to = 1.0f)
+ public double getOmegaDot() {
+ return mOmegaDot;
+ }
+
+ /**
+ * Returns the square root of semi-major axis in square root of meters.
+ *
+ * <p>For Galileo, this is the difference with respect to the square root of the nominal
+ * semi-major axis in square root of meters.
+ */
+ @FloatRange(from = 0.0f, to = 8192.0f)
+ public double getRootA() {
+ return mRootA;
+ }
+
+ /** Returns the mean anomaly at reference time in semi-circles. */
+ @FloatRange(from = -1.0f, to = 1.0f)
+ public double getM0() {
+ return mM0;
+ }
+
+ /** Returns the satellite clock time bias correction coefficient in seconds. */
+ @FloatRange(from = -0.0625f, to = 0.0625f)
+ public double getAf0() {
+ return mAf0;
+ }
+
+ /** Returns the satellite clock time drift correction coefficient in seconds per second. */
+ @FloatRange(from = -1.5e-8f, to = 1.5e-8f)
+ public double getAf1() {
+ return mAf1;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(mSvid);
+ dest.writeInt(mSvHealth);
+ dest.writeDouble(mEccentricity);
+ dest.writeDouble(mInclination);
+ dest.writeDouble(mOmega);
+ dest.writeDouble(mOmega0);
+ dest.writeDouble(mOmegaDot);
+ dest.writeDouble(mRootA);
+ dest.writeDouble(mM0);
+ dest.writeDouble(mAf0);
+ dest.writeDouble(mAf1);
+ }
+
+ public static final @NonNull Creator<GnssSatelliteAlmanac> CREATOR =
+ new Creator<GnssSatelliteAlmanac>() {
+ @Override
+ public GnssSatelliteAlmanac createFromParcel(Parcel in) {
+ return new GnssSatelliteAlmanac(
+ new Builder()
+ .setSvid(in.readInt())
+ .setSvHealth(in.readInt())
+ .setEccentricity(in.readDouble())
+ .setInclination(in.readDouble())
+ .setOmega(in.readDouble())
+ .setOmega0(in.readDouble())
+ .setOmegaDot(in.readDouble())
+ .setRootA(in.readDouble())
+ .setM0(in.readDouble())
+ .setAf0(in.readDouble())
+ .setAf1(in.readDouble()));
+ }
+
+ @Override
+ public GnssSatelliteAlmanac[] newArray(int size) {
+ return new GnssSatelliteAlmanac[size];
+ }
+ };
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GnssSatelliteAlmanac[");
+ builder.append("svid = ").append(mSvid);
+ builder.append(", svHealth = ").append(mSvHealth);
+ builder.append(", eccentricity = ").append(mEccentricity);
+ builder.append(", inclination = ").append(mInclination);
+ builder.append(", omega = ").append(mOmega);
+ builder.append(", omega0 = ").append(mOmega0);
+ builder.append(", omegaDot = ").append(mOmegaDot);
+ builder.append(", rootA = ").append(mRootA);
+ builder.append(", m0 = ").append(mM0);
+ builder.append(", af0 = ").append(mAf0);
+ builder.append(", af1 = ").append(mAf1);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GnssSatelliteAlmanac}. */
+ public static final class Builder {
+ private int mSvid;
+ private int mSvHealth;
+ private double mEccentricity;
+ private double mInclination;
+ private double mOmega;
+ private double mOmega0;
+ private double mOmegaDot;
+ private double mRootA;
+ private double mM0;
+ private double mAf0;
+ private double mAf1;
+
+ /** Sets the PRN number of the GNSS satellite. */
+ @NonNull
+ public Builder setSvid(@IntRange(from = 1) int svid) {
+ mSvid = svid;
+ return this;
+ }
+
+ /**
+ * Sets the satellite health information.
+ *
+ * <p>For GPS, this is satellite subframe 4 and 5, page 25 6-bit health code as defined
+ * in IS-GPS-200 Table 20-VIII expressed in integer form.
+ *
+ * <p>For QZSS, this is the 5-bit health code as defined in IS-QZSS-PNT, Table 4.1.2-5-2
+ * expressed in integer form.
+ *
+ * <p>For Beidou, this is 1-bit health information. (0=healthy, 1=unhealthy).
+ *
+ * <p>For Galileo, this is 6-bit health, bit 0 and 1 is for E5a,
+ * bit 2 and 3 is for E5b, bit 4 and 5 is for E1b.
+ */
+ @NonNull
+ public Builder setSvHealth(@IntRange(from = 0) int svHealth) {
+ mSvHealth = svHealth;
+ return this;
+ }
+
+ /** Sets the eccentricity. */
+ @NonNull
+ public Builder setEccentricity(@FloatRange(from = 0.0f) double eccentricity) {
+ mEccentricity = eccentricity;
+ return this;
+ }
+
+ /**
+ * Sets the inclination in semi-circles.
+ *
+ * <p>For GPS and Galileo, this is the difference between the inclination angle at
+ * reference time and the nominal inclination in semi-circles.
+ *
+ * <p>For Beidou and QZSS, this is the inclination angle at reference time in
+ * semi-circles.
+ */
+ @NonNull
+ public Builder setInclination(@FloatRange(from = -1.0f, to = 1.0f) double inclination) {
+ mInclination = inclination;
+ return this;
+ }
+
+ /** Sets the argument of perigee in semi-circles. */
+ @NonNull
+ public Builder setOmega(@FloatRange(from = -1.0f, to = 1.0f) double omega) {
+ mOmega = omega;
+ return this;
+ }
+
+ /**
+ * Sets the longitude of ascending node of orbital plane at weekly epoch in
+ * semi-circles.
+ */
+ @NonNull
+ public Builder setOmega0(@FloatRange(from = -1.0f, to = 1.0f) double omega0) {
+ mOmega0 = omega0;
+ return this;
+ }
+
+ /** Sets the rate of right ascension in semi-circles per second. */
+ @NonNull
+ public Builder setOmegaDot(@FloatRange(from = -1.0f, to = 1.0f) double omegaDot) {
+ mOmegaDot = omegaDot;
+ return this;
+ }
+
+ /**
+ * Sets the square root of semi-major axis in square root of meters.
+ *
+ * <p>For Galileo, this is the difference with respect to the square root of the nominal
+ * semi-major axis in square root of meters.
+ */
+ @NonNull
+ public Builder setRootA(@FloatRange(from = 0.0f, to = 8192.0f) double rootA) {
+ mRootA = rootA;
+ return this;
+ }
+
+ /** Sets the mean anomaly at reference time in semi-circles. */
+ @NonNull
+ public Builder setM0(@FloatRange(from = -1.0f, to = 1.0f) double m0) {
+ mM0 = m0;
+ return this;
+ }
+
+ /** Sets the satellite clock time bias correction coefficient in seconds. */
+ @NonNull
+ public Builder setAf0(@FloatRange(from = -0.0625f, to = 0.0625f) double af0) {
+ mAf0 = af0;
+ return this;
+ }
+
+ /** Sets the satellite clock time drift correction coefficient in seconds per second. */
+ @NonNull
+ public Builder setAf1(@FloatRange(from = -1.5e-8f, to = 1.5e-8f) double af1) {
+ mAf1 = af1;
+ return this;
+ }
+
+ /** Builds a {@link GnssSatelliteAlmanac} instance as specified by this builder. */
+ @NonNull
+ public GnssSatelliteAlmanac build() {
+ return new GnssSatelliteAlmanac(this);
+ }
+ }
+ }
+}
diff --git a/location/java/android/location/GnssAssistance.aidl b/location/java/android/location/GnssAssistance.aidl
new file mode 100644
index 000000000000..2745683ec330
--- /dev/null
+++ b/location/java/android/location/GnssAssistance.aidl
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+parcelable GnssAssistance; \ No newline at end of file
diff --git a/location/java/android/location/GnssAssistance.java b/location/java/android/location/GnssAssistance.java
new file mode 100644
index 000000000000..e941122f8c79
--- /dev/null
+++ b/location/java/android/location/GnssAssistance.java
@@ -0,0 +1,310 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A class contains GNSS assistance.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class GnssAssistance implements Parcelable {
+
+ /** GPS assistance. */
+ @Nullable private final GpsAssistance mGpsAssistance;
+
+ /** Glonass assistance. */
+ @Nullable private final GlonassAssistance mGlonassAssistance;
+
+ /** Galileo assistance. */
+ @Nullable private final GalileoAssistance mGalileoAssistance;
+
+ /** Beidou assistance. */
+ @Nullable private final BeidouAssistance mBeidouAssistance;
+
+ /** QZSS assistance. */
+ @Nullable private final QzssAssistance mQzssAssistance;
+
+ private GnssAssistance(Builder builder) {
+ mGpsAssistance = builder.mGpsAssistance;
+ mGlonassAssistance = builder.mGlonassAssistance;
+ mGalileoAssistance = builder.mGalileoAssistance;
+ mBeidouAssistance = builder.mBeidouAssistance;
+ mQzssAssistance = builder.mQzssAssistance;
+ }
+
+ /** Returns the GPS assistance. */
+ @Nullable
+ public GpsAssistance getGpsAssistance() {
+ return mGpsAssistance;
+ }
+
+ /** Returns the Glonass assistance. */
+ @Nullable
+ public GlonassAssistance getGlonassAssistance() {
+ return mGlonassAssistance;
+ }
+
+ /** Returns the Galileo assistance. */
+ @Nullable
+ public GalileoAssistance getGalileoAssistance() {
+ return mGalileoAssistance;
+ }
+
+ /** Returns the Beidou assistance. */
+ @Nullable
+ public BeidouAssistance getBeidouAssistance() {
+ return mBeidouAssistance;
+ }
+
+ /** Returns the Qzss assistance. */
+ @Nullable
+ public QzssAssistance getQzssAssistance() {
+ return mQzssAssistance;
+ }
+
+ public static final @NonNull Creator<GnssAssistance> CREATOR =
+ new Creator<GnssAssistance>() {
+ @Override
+ @NonNull
+ public GnssAssistance createFromParcel(Parcel in) {
+ return new GnssAssistance.Builder()
+ .setGpsAssistance(in.readTypedObject(GpsAssistance.CREATOR))
+ .setGlonassAssistance(in.readTypedObject(GlonassAssistance.CREATOR))
+ .setGalileoAssistance(in.readTypedObject(GalileoAssistance.CREATOR))
+ .setBeidouAssistance(in.readTypedObject(BeidouAssistance.CREATOR))
+ .setQzssAssistance(in.readTypedObject(QzssAssistance.CREATOR))
+ .build();
+ }
+
+ @Override
+ public GnssAssistance[] newArray(int size) {
+ return new GnssAssistance[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeTypedObject(mGpsAssistance, flags);
+ parcel.writeTypedObject(mGlonassAssistance, flags);
+ parcel.writeTypedObject(mGalileoAssistance, flags);
+ parcel.writeTypedObject(mBeidouAssistance, flags);
+ parcel.writeTypedObject(mQzssAssistance, flags);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GnssAssistance[");
+ builder.append("gpsAssistance = ").append(mGpsAssistance);
+ builder.append(", glonassAssistance = ").append(mGlonassAssistance);
+ builder.append(", galileoAssistance = ").append(mGalileoAssistance);
+ builder.append(", beidouAssistance = ").append(mBeidouAssistance);
+ builder.append(", qzssAssistance = ").append(mQzssAssistance);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GnssAssistance}. */
+ public static final class Builder {
+ private GpsAssistance mGpsAssistance;
+ private GlonassAssistance mGlonassAssistance;
+ private GalileoAssistance mGalileoAssistance;
+ private BeidouAssistance mBeidouAssistance;
+ private QzssAssistance mQzssAssistance;
+
+ /** Sets the GPS assistance. */
+ @NonNull
+ public Builder setGpsAssistance(@Nullable GpsAssistance gpsAssistance) {
+ mGpsAssistance = gpsAssistance;
+ return this;
+ }
+
+ /** Sets the Glonass assistance. */
+ @NonNull
+ public Builder setGlonassAssistance(@Nullable GlonassAssistance glonassAssistance) {
+ mGlonassAssistance = glonassAssistance;
+ return this;
+ }
+
+ /** Sets the Galileo assistance. */
+ @NonNull
+ public Builder setGalileoAssistance(@Nullable GalileoAssistance galileoAssistance) {
+ mGalileoAssistance = galileoAssistance;
+ return this;
+ }
+
+ /** Sets the Beidou assistance. */
+ @NonNull
+ public Builder setBeidouAssistance(@Nullable BeidouAssistance beidouAssistance) {
+ mBeidouAssistance = beidouAssistance;
+ return this;
+ }
+
+ /** Sets the QZSS assistance. */
+ @NonNull
+ public Builder setQzssAssistance(@Nullable QzssAssistance qzssAssistance) {
+ mQzssAssistance = qzssAssistance;
+ return this;
+ }
+
+ /** Builds a {@link GnssAssistance} instance as specified by this builder. */
+ @NonNull
+ public GnssAssistance build() {
+ return new GnssAssistance(this);
+ }
+ }
+
+ /** A class contains GNSS corrections for satellites. */
+ public static final class GnssSatelliteCorrections implements Parcelable {
+ /**
+ * Pseudo-random or satellite ID number for the satellite, a.k.a. Space Vehicle (SV), or OSN
+ * number for Glonass.
+ *
+ * <p>The distinction is made by looking at the constellation field. Values must be in the
+ * range of:
+ *
+ * <p>- GPS: 1-32
+ *
+ * <p>- GLONASS: 1-25
+ *
+ * <p>- QZSS: 183-206
+ *
+ * <p>- Galileo: 1-36
+ *
+ * <p>- Beidou: 1-63
+ */
+ @IntRange(from = 1, to = 206)
+ int mSvid;
+
+ /** List of Ionospheric corrections */
+ @NonNull List<IonosphericCorrection> mIonosphericCorrections;
+
+ /**
+ * Creates a new {@link GnssSatelliteCorrections} instance.
+ *
+ * @param svid The Pseudo-random or satellite ID number for the satellite, a.k.a. Space
+ * Vehicle (SV), or OSN number for Glonass.
+ * <p>The distinction is made by looking at the constellation field. Values must be in
+ * the range of:
+ * <p>- GPS: 1-32
+ * <p>- GLONASS: 1-25
+ * <p>- QZSS: 183-206
+ * <p>- Galileo: 1-36
+ * <p>- Beidou: 1-63
+ * @param ionosphericCorrections The list of Ionospheric corrections.
+ */
+ public GnssSatelliteCorrections(
+ @IntRange(from = 1, to = 206) int svid,
+ @NonNull final List<IonosphericCorrection> ionosphericCorrections) {
+ // Allow SV ID beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(svid >= 1);
+ Preconditions.checkNotNull(
+ ionosphericCorrections, "IonosphericCorrections cannot be null");
+ mSvid = svid;
+ mIonosphericCorrections =
+ Collections.unmodifiableList(new ArrayList<>(ionosphericCorrections));
+ }
+
+ /**
+ * Returns the Pseudo-random or satellite ID number for the satellite, a.k.a. Space Vehicle
+ * (SV), or OSN number for Glonass.
+ *
+ * <p>The distinction is made by looking at the constellation field. Values must be in the
+ * range of:
+ *
+ * <p>- GPS: 1-32
+ *
+ * <p>- GLONASS: 1-25
+ *
+ * <p>- QZSS: 183-206
+ *
+ * <p>- Galileo: 1-36
+ *
+ * <p>- Beidou: 1-63
+ */
+ @IntRange(from = 1, to = 206)
+ public int getSvid() {
+ return mSvid;
+ }
+
+ /** Returns the list of Ionospheric corrections. */
+ @NonNull
+ public List<IonosphericCorrection> getIonosphericCorrections() {
+ return mIonosphericCorrections;
+ }
+
+ public static final @NonNull Creator<GnssSatelliteCorrections> CREATOR =
+ new Creator<GnssSatelliteCorrections>() {
+ @Override
+ @NonNull
+ public GnssSatelliteCorrections createFromParcel(Parcel in) {
+ int svid = in.readInt();
+ List<IonosphericCorrection> ionosphericCorrections = new ArrayList<>();
+ in.readTypedList(ionosphericCorrections, IonosphericCorrection.CREATOR);
+ return new GnssSatelliteCorrections(svid, ionosphericCorrections);
+ }
+
+ @Override
+ public GnssSatelliteCorrections[] newArray(int size) {
+ return new GnssSatelliteCorrections[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mSvid);
+ parcel.writeTypedList(mIonosphericCorrections, flags);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GnssSatelliteCorrections[");
+ builder.append("svid = ").append(mSvid);
+ builder.append(", ionosphericCorrections = ").append(mIonosphericCorrections);
+ builder.append("]");
+ return builder.toString();
+ }
+ }
+}
diff --git a/location/java/android/location/GnssCorrectionComponent.java b/location/java/android/location/GnssCorrectionComponent.java
new file mode 100644
index 000000000000..f55dde1c9228
--- /dev/null
+++ b/location/java/android/location/GnssCorrectionComponent.java
@@ -0,0 +1,300 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A class that contains Gnss correction associated with a component (e.g. the Ionospheric error).
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class GnssCorrectionComponent implements Parcelable {
+ /**
+ * Uniquely identifies the source of correction (e.g. "Klobuchar" for ionospheric corrections).
+ * Clients should not depend on the value of the source key but, rather, can compare
+ * before/after to detect changes.
+ */
+ @NonNull private final String mSourceKey;
+
+ /** The correction is only applicable during this time interval. */
+ @NonNull private final GnssInterval mValidityInterval;
+
+ /** Pseudorange correction. */
+ @NonNull private final PseudorangeCorrection mPseudorangeCorrection;
+
+ /**
+ * Creates a GnssCorrectionComponent.
+ *
+ * @param sourceKey Uniquely identifies the source of correction (e.g. "Klobuchar" for
+ * ionospheric corrections). Clients should not depend on the value of the source key but,
+ * rather, can compare before/after to detect changes.
+ * @param validityInterval The correction is only applicable during this time interval.
+ * @param pseudorangeCorrection Pseudorange correction.
+ */
+ public GnssCorrectionComponent(
+ @NonNull String sourceKey,
+ @NonNull GnssInterval validityInterval,
+ @NonNull PseudorangeCorrection pseudorangeCorrection) {
+ Preconditions.checkNotNull(sourceKey, "SourceKey cannot be null");
+ Preconditions.checkNotNull(validityInterval, "ValidityInterval cannot be null");
+ Preconditions.checkNotNull(pseudorangeCorrection, "PseudorangeCorrection cannot be null");
+ mSourceKey = sourceKey;
+ mValidityInterval = validityInterval;
+ mPseudorangeCorrection = pseudorangeCorrection;
+ }
+
+ /** Returns the source key of the correction. */
+ @NonNull
+ public String getSourceKey() {
+ return mSourceKey;
+ }
+
+ /** Returns the validity interval of the correction. */
+ @NonNull
+ public GnssInterval getValidityInterval() {
+ return mValidityInterval;
+ }
+
+ /** Returns the pseudorange correction. */
+ @NonNull
+ public PseudorangeCorrection getPseudorangeCorrection() {
+ return mPseudorangeCorrection;
+ }
+
+ public static final @NonNull Creator<GnssCorrectionComponent> CREATOR =
+ new Creator<GnssCorrectionComponent>() {
+ @Override
+ @NonNull
+ public GnssCorrectionComponent createFromParcel(Parcel in) {
+ String sourceKey = in.readString8();
+ GnssInterval validityInterval = in.readTypedObject(GnssInterval.CREATOR);
+ PseudorangeCorrection pseudorangeCorrection =
+ in.readTypedObject(PseudorangeCorrection.CREATOR);
+ return new GnssCorrectionComponent(
+ sourceKey, validityInterval, pseudorangeCorrection);
+ }
+
+ @Override
+ public GnssCorrectionComponent[] newArray(int size) {
+ return new GnssCorrectionComponent[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeString8(mSourceKey);
+ dest.writeTypedObject(mValidityInterval, flags);
+ dest.writeTypedObject(mPseudorangeCorrection, flags);
+ }
+
+ /**
+ * Time interval referenced against the GPS epoch. The start must be less than or equal to the
+ * end. When the start equals the end, the interval is empty.
+ */
+ public static final class GnssInterval implements Parcelable {
+ /**
+ * Inclusive start of the interval in milliseconds since the GPS epoch. A timestamp matching
+ * this interval will have to be the same or after the start. Required as a reference time
+ * for the initial correction value and its rate of change over time.
+ */
+ private final long mStartMillisSinceGpsEpoch;
+
+ /**
+ * Exclusive end of the interval in milliseconds since the GPS epoch. If specified, a
+ * timestamp matching this interval will have to be before the end.
+ */
+ private final long mEndMillisSinceGpsEpoch;
+
+ /**
+ * Creates a GnssInterval.
+ *
+ * @param startMillisSinceGpsEpoch Inclusive start of the interval in milliseconds since the
+ * GPS epoch. A timestamp matching this interval will have to be the same or after the
+ * start. Required as a reference time for the initial correction value and its rate of
+ * change over time.
+ * @param endMillisSinceGpsEpoch Exclusive end of the interval in milliseconds since the GPS
+ * epoch. If specified, a timestamp matching this interval will have to be before the
+ * end.
+ */
+ public GnssInterval(
+ @IntRange(from = 0) long startMillisSinceGpsEpoch,
+ @IntRange(from = 0) long endMillisSinceGpsEpoch) {
+ Preconditions.checkArgument(startMillisSinceGpsEpoch >= 0);
+ Preconditions.checkArgument(endMillisSinceGpsEpoch >= 0);
+ mStartMillisSinceGpsEpoch = startMillisSinceGpsEpoch;
+ mEndMillisSinceGpsEpoch = endMillisSinceGpsEpoch;
+ }
+
+ /** Returns the inclusive start of the interval in milliseconds since the GPS epoch. */
+ @IntRange(from = 0)
+ public long getStartMillisSinceGpsEpoch() {
+ return mStartMillisSinceGpsEpoch;
+ }
+
+ /** Returns the exclusive end of the interval in milliseconds since the GPS epoch. */
+ @IntRange(from = 0)
+ public long getEndMillisSinceGpsEpoch() {
+ return mEndMillisSinceGpsEpoch;
+ }
+
+ public static final @NonNull Creator<GnssInterval> CREATOR =
+ new Creator<GnssInterval>() {
+ @Override
+ @NonNull
+ public GnssInterval createFromParcel(Parcel in) {
+ return new GnssInterval(in.readLong(), in.readLong());
+ }
+
+ @Override
+ public GnssInterval[] newArray(int size) {
+ return new GnssInterval[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeLong(mStartMillisSinceGpsEpoch);
+ parcel.writeLong(mEndMillisSinceGpsEpoch);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GnssInterval[");
+ builder.append("startMillisSinceGpsEpoch = ").append(mStartMillisSinceGpsEpoch);
+ builder.append(", endMillisSinceGpsEpoch = ").append(mEndMillisSinceGpsEpoch);
+ builder.append("]");
+ return builder.toString();
+ }
+ }
+
+ /** Pseudorange correction. */
+ public static final class PseudorangeCorrection implements Parcelable {
+
+ /** Correction to be added to the measured pseudorange, in meters. */
+ private final double mCorrectionMeters;
+
+ /** Uncertainty of the correction, in meters. */
+ private final double mCorrectionUncertaintyMeters;
+
+ /**
+ * Linear approximation of the change in correction over time. Intended usage is to adjust
+ * the correction using the formula: correctionMeters + correctionRateMetersPerSecond *
+ * delta_seconds Where `delta_seconds` is the number of elapsed seconds since the beginning
+ * of the correction validity interval.
+ */
+ private final double mCorrectionRateMetersPerSecond;
+
+ /**
+ * Creates a PseudorangeCorrection.
+ *
+ * @param correctionMeters Correction to be added to the measured pseudorange, in meters.
+ * @param correctionUncertaintyMeters Uncertainty of the correction, in meters.
+ * @param correctionRateMetersPerSecond Linear approximation of the change in correction
+ * over time. Intended usage is to adjust the correction using the formula:
+ * correctionMeters + correctionRateMetersPerSecond * delta_seconds Where
+ * `delta_seconds` is the number of elapsed seconds since the beginning of the
+ * correction validity interval.
+ */
+ public PseudorangeCorrection(
+ double correctionMeters,
+ double correctionUncertaintyMeters,
+ double correctionRateMetersPerSecond) {
+ Preconditions.checkArgument(correctionUncertaintyMeters >= 0);
+ mCorrectionMeters = correctionMeters;
+ mCorrectionUncertaintyMeters = correctionUncertaintyMeters;
+ mCorrectionRateMetersPerSecond = correctionRateMetersPerSecond;
+ }
+
+ /** Returns the correction to be added to the measured pseudorange, in meters. */
+ public double getCorrectionMeters() {
+ return mCorrectionMeters;
+ }
+
+ /** Returns the uncertainty of the correction, in meters. */
+ @FloatRange(from = 0.0f)
+ public double getCorrectionUncertaintyMeters() {
+ return mCorrectionUncertaintyMeters;
+ }
+
+ /** Returns the linear approximation of the change in correction over time. */
+ public double getCorrectionRateMetersPerSecond() {
+ return mCorrectionRateMetersPerSecond;
+ }
+
+ public static final @NonNull Creator<PseudorangeCorrection> CREATOR =
+ new Creator<PseudorangeCorrection>() {
+ @Override
+ @NonNull
+ public PseudorangeCorrection createFromParcel(Parcel in) {
+ return new PseudorangeCorrection(
+ in.readDouble(), in.readDouble(), in.readDouble());
+ }
+
+ @Override
+ public PseudorangeCorrection[] newArray(int size) {
+ return new PseudorangeCorrection[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeDouble(mCorrectionMeters);
+ parcel.writeDouble(mCorrectionUncertaintyMeters);
+ parcel.writeDouble(mCorrectionRateMetersPerSecond);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("PseudorangeCorrection[");
+ builder.append("correctionMeters = ").append(mCorrectionMeters);
+ builder.append(", correctionUncertaintyMeters = ").append(mCorrectionUncertaintyMeters);
+ builder.append(", correctionRateMetersPerSecond = ")
+ .append(mCorrectionRateMetersPerSecond);
+ builder.append("]");
+ return builder.toString();
+ }
+ }
+}
diff --git a/location/java/android/location/GpsAssistance.java b/location/java/android/location/GpsAssistance.java
new file mode 100644
index 000000000000..5202fc4cd851
--- /dev/null
+++ b/location/java/android/location/GpsAssistance.java
@@ -0,0 +1,289 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
+import android.location.GnssAssistance.GnssSatelliteCorrections;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A class contains GPS assistance.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class GpsAssistance implements Parcelable {
+
+ /** The GPS almanac. */
+ @Nullable private final GnssAlmanac mAlmanac;
+
+ /** The Klobuchar ionospheric model. */
+ @Nullable private final KlobucharIonosphericModel mIonosphericModel;
+
+ /** The UTC model. */
+ @Nullable private final UtcModel mUtcModel;
+
+ /** The leap seconds model. */
+ @Nullable private final LeapSecondsModel mLeapSecondsModel;
+
+ /** The list of time models. */
+ @NonNull private final List<TimeModel> mTimeModels;
+
+ /** The list of GPS ephemeris. */
+ @NonNull private final List<GpsSatelliteEphemeris> mSatelliteEphemeris;
+
+ /** The list of real time integrity models. */
+ @NonNull private final List<RealTimeIntegrityModel> mRealTimeIntegrityModels;
+
+ /** The list of GPS satellite corrections. */
+ @NonNull private final List<GnssSatelliteCorrections> mSatelliteCorrections;
+
+ private GpsAssistance(Builder builder) {
+ mAlmanac = builder.mAlmanac;
+ mIonosphericModel = builder.mIonosphericModel;
+ mUtcModel = builder.mUtcModel;
+ mLeapSecondsModel = builder.mLeapSecondsModel;
+ if (builder.mTimeModels != null) {
+ mTimeModels = Collections.unmodifiableList(new ArrayList<>(builder.mTimeModels));
+ } else {
+ mTimeModels = new ArrayList<>();
+ }
+ if (builder.mSatelliteEphemeris != null) {
+ mSatelliteEphemeris =
+ Collections.unmodifiableList(new ArrayList<>(builder.mSatelliteEphemeris));
+ } else {
+ mSatelliteEphemeris = new ArrayList<>();
+ }
+ if (builder.mRealTimeIntegrityModels != null) {
+ mRealTimeIntegrityModels =
+ Collections.unmodifiableList(new ArrayList<>(builder.mRealTimeIntegrityModels));
+ } else {
+ mRealTimeIntegrityModels = new ArrayList<>();
+ }
+ if (builder.mSatelliteCorrections != null) {
+ mSatelliteCorrections =
+ Collections.unmodifiableList(new ArrayList<>(builder.mSatelliteCorrections));
+ } else {
+ mSatelliteCorrections = new ArrayList<>();
+ }
+ }
+
+ /** Returns the GPS almanac. */
+ @Nullable
+ public GnssAlmanac getAlmanac() {
+ return mAlmanac;
+ }
+
+ /** Returns the Klobuchar ionospheric model. */
+ @Nullable
+ public KlobucharIonosphericModel getIonosphericModel() {
+ return mIonosphericModel;
+ }
+
+ /** Returns the UTC model. */
+ @Nullable
+ public UtcModel getUtcModel() {
+ return mUtcModel;
+ }
+
+ /** Returns the leap seconds model. */
+ @Nullable
+ public LeapSecondsModel getLeapSecondsModel() {
+ return mLeapSecondsModel;
+ }
+
+ /** Returns the list of time models. */
+ @NonNull
+ public List<TimeModel> getTimeModels() {
+ return mTimeModels;
+ }
+
+ /** Returns the list of GPS ephemeris. */
+ @NonNull
+ public List<GpsSatelliteEphemeris> getSatelliteEphemeris() {
+ return mSatelliteEphemeris;
+ }
+
+ /** Returns the list of real time integrity models. */
+ @NonNull
+ public List<RealTimeIntegrityModel> getRealTimeIntegrityModels() {
+ return mRealTimeIntegrityModels;
+ }
+
+ /** Returns the list of GPS satellite corrections. */
+ @NonNull
+ public List<GnssSatelliteCorrections> getSatelliteCorrections() {
+ return mSatelliteCorrections;
+ }
+
+ public static final @NonNull Creator<GpsAssistance> CREATOR =
+ new Creator<GpsAssistance>() {
+ @Override
+ @NonNull
+ public GpsAssistance createFromParcel(Parcel in) {
+ return new GpsAssistance.Builder()
+ .setAlmanac(in.readTypedObject(GnssAlmanac.CREATOR))
+ .setIonosphericModel(
+ in.readTypedObject(KlobucharIonosphericModel.CREATOR))
+ .setUtcModel(in.readTypedObject(UtcModel.CREATOR))
+ .setLeapSecondsModel(in.readTypedObject(LeapSecondsModel.CREATOR))
+ .setTimeModels(in.createTypedArrayList(TimeModel.CREATOR))
+ .setSatelliteEphemeris(
+ in.createTypedArrayList(GpsSatelliteEphemeris.CREATOR))
+ .setRealTimeIntegrityModels(
+ in.createTypedArrayList(RealTimeIntegrityModel.CREATOR))
+ .setSatelliteCorrections(
+ in.createTypedArrayList(GnssSatelliteCorrections.CREATOR))
+ .build();
+ }
+
+ @Override
+ public GpsAssistance[] newArray(int size) {
+ return new GpsAssistance[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeTypedObject(mAlmanac, flags);
+ dest.writeTypedObject(mIonosphericModel, flags);
+ dest.writeTypedObject(mUtcModel, flags);
+ dest.writeTypedObject(mLeapSecondsModel, flags);
+ dest.writeTypedList(mTimeModels);
+ dest.writeTypedList(mSatelliteEphemeris);
+ dest.writeTypedList(mRealTimeIntegrityModels);
+ dest.writeTypedList(mSatelliteCorrections);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GnssAssistance[");
+ builder.append("almanac = ").append(mAlmanac);
+ builder.append(", ionosphericModel = ").append(mIonosphericModel);
+ builder.append(", utcModel = ").append(mUtcModel);
+ builder.append(", leapSecondsModel = ").append(mLeapSecondsModel);
+ builder.append(", timeModels = ").append(mTimeModels);
+ builder.append(", satelliteEphemeris = ").append(mSatelliteEphemeris);
+ builder.append(", realTimeIntegrityModels = ").append(mRealTimeIntegrityModels);
+ builder.append(", satelliteCorrections = ").append(mSatelliteCorrections);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GpsAssistance}. */
+ public static final class Builder {
+ private GnssAlmanac mAlmanac;
+ private KlobucharIonosphericModel mIonosphericModel;
+ private UtcModel mUtcModel;
+ private LeapSecondsModel mLeapSecondsModel;
+ private List<TimeModel> mTimeModels;
+ private List<GpsSatelliteEphemeris> mSatelliteEphemeris;
+ private List<RealTimeIntegrityModel> mRealTimeIntegrityModels;
+ private List<GnssSatelliteCorrections> mSatelliteCorrections;
+
+ /** Sets the GPS almanac. */
+ @NonNull
+ public Builder setAlmanac(
+ @Nullable @SuppressLint("NullableCollection") GnssAlmanac almanac) {
+ mAlmanac = almanac;
+ return this;
+ }
+
+ /** Sets the Klobuchar ionospheric model. */
+ @NonNull
+ public Builder setIonosphericModel(
+ @Nullable @SuppressLint("NullableCollection")
+ KlobucharIonosphericModel ionosphericModel) {
+ mIonosphericModel = ionosphericModel;
+ return this;
+ }
+
+ /** Sets the UTC model. */
+ @NonNull
+ public Builder setUtcModel(
+ @Nullable @SuppressLint("NullableCollection") UtcModel utcModel) {
+ mUtcModel = utcModel;
+ return this;
+ }
+
+ /** Sets the leap seconds model. */
+ @NonNull
+ public Builder setLeapSecondsModel(
+ @Nullable @SuppressLint("NullableCollection") LeapSecondsModel leapSecondsModel) {
+ mLeapSecondsModel = leapSecondsModel;
+ return this;
+ }
+
+ /** Sets the list of time models. */
+ @NonNull
+ public Builder setTimeModels(
+ @Nullable @SuppressLint("NullableCollection") List<TimeModel> timeModels) {
+ mTimeModels = timeModels;
+ return this;
+ }
+
+ /** Sets the list of GPS ephemeris. */
+ @NonNull
+ public Builder setSatelliteEphemeris(
+ @Nullable @SuppressLint("NullableCollection")
+ List<GpsSatelliteEphemeris> satelliteEphemeris) {
+ mSatelliteEphemeris = satelliteEphemeris;
+ return this;
+ }
+
+ /** Sets the list of real time integrity models. */
+ @NonNull
+ public Builder setRealTimeIntegrityModels(
+ @Nullable @SuppressLint("NullableCollection")
+ List<RealTimeIntegrityModel> realTimeIntegrityModels) {
+ mRealTimeIntegrityModels = realTimeIntegrityModels;
+ return this;
+ }
+
+ /** Sets the list of GPS satellite corrections. */
+ @NonNull
+ public Builder setSatelliteCorrections(
+ @Nullable @SuppressLint("NullableCollection")
+ List<GnssSatelliteCorrections> satelliteCorrections) {
+ mSatelliteCorrections = satelliteCorrections;
+ return this;
+ }
+
+ /** Builds a {@link GpsAssistance} instance as specified by this builder. */
+ @NonNull
+ public GpsAssistance build() {
+ return new GpsAssistance(this);
+ }
+ }
+}
diff --git a/location/java/android/location/GpsSatelliteEphemeris.java b/location/java/android/location/GpsSatelliteEphemeris.java
new file mode 100644
index 000000000000..ec6bc59dc69c
--- /dev/null
+++ b/location/java/android/location/GpsSatelliteEphemeris.java
@@ -0,0 +1,632 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * This class contains ephemeris parameters specific to GPS satellites.
+ *
+ * <p>This is defined in IS-GPS-200 section 20.3.3.3.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class GpsSatelliteEphemeris implements Parcelable {
+ /** Satellite PRN */
+ private final int mPrn;
+
+ /** L2 parameters. */
+ @NonNull private final GpsL2Params mGpsL2Params;
+
+ /** Clock model. */
+ @NonNull private final GpsSatelliteClockModel mSatelliteClockModel;
+
+ /** Orbit model. */
+ @NonNull private final KeplerianOrbitModel mSatelliteOrbitModel;
+
+ /** Satellite health. */
+ @NonNull private final GpsSatelliteHealth mSatelliteHealth;
+
+ /** Ephemeris time. */
+ @NonNull private final SatelliteEphemerisTime mSatelliteEphemerisTime;
+
+ private GpsSatelliteEphemeris(Builder builder) {
+ // Allow PRN beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(builder.mPrn >= 1);
+ Preconditions.checkNotNull(builder.mGpsL2Params, "GPSL2Params cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteClockModel,
+ "SatelliteClockModel cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteOrbitModel,
+ "SatelliteOrbitModel cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteHealth,
+ "SatelliteHealth cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteEphemerisTime,
+ "SatelliteEphemerisTime cannot be null");
+ mPrn = builder.mPrn;
+ mGpsL2Params = builder.mGpsL2Params;
+ mSatelliteClockModel = builder.mSatelliteClockModel;
+ mSatelliteOrbitModel = builder.mSatelliteOrbitModel;
+ mSatelliteHealth = builder.mSatelliteHealth;
+ mSatelliteEphemerisTime = builder.mSatelliteEphemerisTime;
+ }
+
+ /** Returns the PRN of the satellite. */
+ @IntRange(from = 1, to = 32)
+ public int getPrn() {
+ return mPrn;
+ }
+
+ /** Returns the L2 parameters of the satellite. */
+ @NonNull
+ public GpsL2Params getGpsL2Params() {
+ return mGpsL2Params;
+ }
+
+ /** Returns the clock model of the satellite. */
+ @NonNull
+ public GpsSatelliteClockModel getSatelliteClockModel() {
+ return mSatelliteClockModel;
+ }
+
+ /** Returns the orbit model of the satellite. */
+ @NonNull
+ public KeplerianOrbitModel getSatelliteOrbitModel() {
+ return mSatelliteOrbitModel;
+ }
+
+ /** Returns the satellite health. */
+ @NonNull
+ public GpsSatelliteHealth getSatelliteHealth() {
+ return mSatelliteHealth;
+ }
+
+ /** Returns the ephemeris time. */
+ @NonNull
+ public SatelliteEphemerisTime getSatelliteEphemerisTime() {
+ return mSatelliteEphemerisTime;
+ }
+
+ public static final @NonNull Creator<GpsSatelliteEphemeris> CREATOR =
+ new Creator<GpsSatelliteEphemeris>() {
+ @Override
+ @NonNull
+ public GpsSatelliteEphemeris createFromParcel(Parcel in) {
+ final GpsSatelliteEphemeris.Builder gpsSatelliteEphemeris =
+ new Builder()
+ .setPrn(in.readInt())
+ .setGpsL2Params(in.readTypedObject(GpsL2Params.CREATOR))
+ .setSatelliteClockModel(
+ in.readTypedObject(GpsSatelliteClockModel.CREATOR))
+ .setSatelliteOrbitModel(
+ in.readTypedObject(KeplerianOrbitModel.CREATOR))
+ .setSatelliteHealth(
+ in.readTypedObject(GpsSatelliteHealth.CREATOR))
+ .setSatelliteEphemerisTime(
+ in.readTypedObject(SatelliteEphemerisTime.CREATOR));
+ return gpsSatelliteEphemeris.build();
+ }
+
+ @Override
+ public GpsSatelliteEphemeris[] newArray(int size) {
+ return new GpsSatelliteEphemeris[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mPrn);
+ parcel.writeTypedObject(mGpsL2Params, flags);
+ parcel.writeTypedObject(mSatelliteClockModel, flags);
+ parcel.writeTypedObject(mSatelliteOrbitModel, flags);
+ parcel.writeTypedObject(mSatelliteHealth, flags);
+ parcel.writeTypedObject(mSatelliteEphemerisTime, flags);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GpsSatelliteEphemeris[");
+ builder.append("prn = ").append(mPrn);
+ builder.append(", gpsL2Params = ").append(mGpsL2Params);
+ builder.append(", satelliteClockModel = ").append(mSatelliteClockModel);
+ builder.append(", satelliteOrbitModel = ").append(mSatelliteOrbitModel);
+ builder.append(", satelliteHealth = ").append(mSatelliteHealth);
+ builder.append(", satelliteEphemerisTime = ").append(mSatelliteEphemerisTime);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GpsSatelliteEphemeris} */
+ public static final class Builder {
+ private int mPrn = 0;
+ private GpsL2Params mGpsL2Params;
+ private GpsSatelliteClockModel mSatelliteClockModel;
+ private KeplerianOrbitModel mSatelliteOrbitModel;
+ private GpsSatelliteHealth mSatelliteHealth;
+ private SatelliteEphemerisTime mSatelliteEphemerisTime;
+
+ /** Sets the PRN of the satellite. */
+ @NonNull
+ public Builder setPrn(@IntRange(from = 1, to = 32) int prn) {
+ mPrn = prn;
+ return this;
+ }
+
+ /** Sets the L2 parameters of the satellite. */
+ @NonNull
+ public Builder setGpsL2Params(@NonNull GpsL2Params gpsL2Params) {
+ mGpsL2Params = gpsL2Params;
+ return this;
+ }
+
+ /** Sets the clock model of the satellite. */
+ @NonNull
+ public Builder setSatelliteClockModel(@NonNull GpsSatelliteClockModel satelliteClockModel) {
+ mSatelliteClockModel = satelliteClockModel;
+ return this;
+ }
+
+ /** Sets the orbit model of the satellite. */
+ @NonNull
+ public Builder setSatelliteOrbitModel(@NonNull KeplerianOrbitModel satelliteOrbitModel) {
+ mSatelliteOrbitModel = satelliteOrbitModel;
+ return this;
+ }
+
+ /** Sets the satellite health. */
+ @NonNull
+ public Builder setSatelliteHealth(@NonNull GpsSatelliteHealth satelliteHealth) {
+ mSatelliteHealth = satelliteHealth;
+ return this;
+ }
+
+ /** Sets the ephemeris time. */
+ @NonNull
+ public Builder setSatelliteEphemerisTime(
+ @NonNull SatelliteEphemerisTime satelliteEphemerisTime) {
+ mSatelliteEphemerisTime = satelliteEphemerisTime;
+ return this;
+ }
+
+ /** Builds a {@link GpsSatelliteEphemeris} instance as specified by this builder. */
+ @NonNull
+ public GpsSatelliteEphemeris build() {
+ return new GpsSatelliteEphemeris(this);
+ }
+ }
+
+ /**
+ * A class contains information about GPS health. The information is tied to Legacy Navigation
+ * (LNAV) data, not Civil Navigation (CNAV) data.
+ */
+ public static final class GpsSatelliteHealth implements Parcelable {
+ /**
+ * Represents "SV health" in the "BROADCAST ORBIT - 6" record of RINEX 3.05. Table A6,
+ * pp.68.
+ */
+ private final int mSvHealth;
+
+ /**
+ * Represents "SV accuracy" in meters in the "BROADCAST ORBIT - 6" record of RINEX 3.05.
+ * Table A6, pp.68.
+ */
+ private final double mSvAccur;
+
+ /**
+ * Represents the "Fit Interval" in hours in the "BROADCAST ORBIT - 7" record of RINEX 3.05.
+ * Table A6, pp.69.
+ */
+ private final double mFitInt;
+
+ /** Returns the SV health. */
+ @IntRange(from = 0, to = 63)
+ public int getSvHealth() {
+ return mSvHealth;
+ }
+
+ /** Returns the SV accuracy in meters. */
+ @FloatRange(from = 0.0f, to = 8192.0f)
+ public double getSvAccur() {
+ return mSvAccur;
+ }
+
+ /** Returns the fit interval in hours. */
+ @FloatRange(from = 0.0f)
+ public double getFitInt() {
+ return mFitInt;
+ }
+
+ private GpsSatelliteHealth(Builder builder) {
+ // Allow SV health beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(builder.mSvHealth >= 0);
+ Preconditions.checkArgumentInRange(builder.mSvAccur, 0.0f, 8192.0f, "SvAccur");
+ Preconditions.checkArgument(builder.mFitInt >= 0.0f);
+ mSvHealth = builder.mSvHealth;
+ mSvAccur = builder.mSvAccur;
+ mFitInt = builder.mFitInt;
+ }
+
+ public static final @NonNull Creator<GpsSatelliteHealth> CREATOR =
+ new Creator<GpsSatelliteHealth>() {
+ @Override
+ @NonNull
+ public GpsSatelliteHealth createFromParcel(Parcel in) {
+ final GpsSatelliteHealth.Builder gpsSatelliteHealth =
+ new Builder()
+ .setSvHealth(in.readInt())
+ .setSvAccur(in.readDouble())
+ .setFitInt(in.readDouble());
+ return gpsSatelliteHealth.build();
+ }
+
+ @Override
+ public GpsSatelliteHealth[] newArray(int size) {
+ return new GpsSatelliteHealth[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mSvHealth);
+ parcel.writeDouble(mSvAccur);
+ parcel.writeDouble(mFitInt);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GpsSatelliteHealth[");
+ builder.append("svHealth = ").append(mSvHealth);
+ builder.append(", svAccur = ").append(mSvAccur);
+ builder.append(", fitInt = ").append(mFitInt);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GpsSatelliteHealth}. */
+ public static final class Builder {
+ private int mSvHealth;
+ private double mSvAccur;
+ private double mFitInt;
+
+ /** Sets the SV health. */
+ @NonNull
+ public Builder setSvHealth(@IntRange(from = 0, to = 63) int svHealth) {
+ mSvHealth = svHealth;
+ return this;
+ }
+
+ /** Sets the SV accuracy in meters. */
+ @NonNull
+ public Builder setSvAccur(@FloatRange(from = 0.0f, to = 8192.0f) double svAccur) {
+ mSvAccur = svAccur;
+ return this;
+ }
+
+ /** Sets the fit interval in hours. */
+ @NonNull
+ public Builder setFitInt(@FloatRange(from = 0.0f) double fitInt) {
+ mFitInt = fitInt;
+ return this;
+ }
+
+ /** Builds a {@link GpsSatelliteHealth} instance as specified by this builder. */
+ @NonNull
+ public GpsSatelliteHealth build() {
+ return new GpsSatelliteHealth(this);
+ }
+ }
+ }
+
+ /** A class contains L2 parameters specific to GPS satellites. */
+ public static final class GpsL2Params implements Parcelable {
+ /** Code(s) on L2 Channel. */
+ private final int mL2Code;
+
+ /** Data Flag for L2 P-Code. */
+ private final int mL2Flag;
+
+ /** Returns the code(s) on L2 channel. */
+ @IntRange(from = 0, to = 3)
+ public int getL2Code() {
+ return mL2Code;
+ }
+
+ /** Returns the data flag for L2 P-code. */
+ @IntRange(from = 0, to = 1)
+ public int getL2Flag() {
+ return mL2Flag;
+ }
+
+ private GpsL2Params(Builder builder) {
+ Preconditions.checkArgumentInRange(builder.mL2Code, 0, 3, "L2 code");
+ Preconditions.checkArgumentInRange(builder.mL2Flag, 0, 1, "L2 flag");
+ mL2Code = builder.mL2Code;
+ mL2Flag = builder.mL2Flag;
+ }
+
+ public static final @NonNull Creator<GpsL2Params> CREATOR =
+ new Creator<GpsL2Params>() {
+ @Override
+ @NonNull
+ public GpsL2Params createFromParcel(Parcel in) {
+ final GpsL2Params.Builder gpsL2Params =
+ new Builder().setL2Code(in.readInt()).setL2Flag(in.readInt());
+ return gpsL2Params.build();
+ }
+
+ @Override
+ public GpsL2Params[] newArray(int size) {
+ return new GpsL2Params[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mL2Code);
+ parcel.writeInt(mL2Flag);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GpsL2Params[");
+ builder.append("l2Code = ").append(mL2Code);
+ builder.append(", l2Flag = ").append(mL2Flag);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GpsL2Params}. */
+ public static final class Builder {
+ private int mL2Code = 0;
+ private int mL2Flag = 0;
+
+ /** Sets the code(s) on L2 channel. */
+ @NonNull
+ public Builder setL2Code(@IntRange(from = 0, to = 3) int l2Code) {
+ mL2Code = l2Code;
+ return this;
+ }
+
+ /** Sets the data flag for L2 P-code. */
+ @NonNull
+ public Builder setL2Flag(@IntRange(from = 0, to = 1) int l2Flag) {
+ mL2Flag = l2Flag;
+ return this;
+ }
+
+ /** Builds a {@link GpsL2Params} instance as specified by this builder. */
+ @NonNull
+ public GpsL2Params build() {
+ return new GpsL2Params(this);
+ }
+ }
+ }
+
+ /** A class contains the set of parameters needed for GPS satellite clock correction. */
+ public static final class GpsSatelliteClockModel implements Parcelable {
+ /**
+ * Time of the clock in seconds since GPS epoch.
+ *
+ * <p>Corresponds to the 'Epoch' field within the 'SV/EPOCH/SV CLK' record of GPS
+ * navigation message in RINEX 3.05 Table A6.
+ */
+ private final long mTimeOfClockSeconds;
+
+ /** SV clock bias in seconds. */
+ private final double mAf0;
+
+ /** SV clock drift in seconds per second. */
+ private final double mAf1;
+
+ /** Clock drift rate in seconds per second squared. */
+ private final double mAf2;
+
+ /** Group delay differential in seconds. */
+ private final double mTgd;
+
+ /** Issue of data, clock. */
+ private final int mIodc;
+
+ private GpsSatelliteClockModel(Builder builder) {
+ Preconditions.checkArgument(builder.mTimeOfClockSeconds >= 0);
+ Preconditions.checkArgumentInRange(builder.mAf0, -9.77e-3f, 9.77e-3f, "Af0");
+ Preconditions.checkArgumentInRange(builder.mAf1, -3.73e-9f, 3.73e-9f, "Af1");
+ Preconditions.checkArgumentInRange(builder.mAf2, -3.56e-15f, 3.56e-15f, "Af2");
+ Preconditions.checkArgumentInRange(builder.mTgd, -5.97e-8f, 5.97e-8f, "Tgd");
+ Preconditions.checkArgumentInRange(builder.mIodc, 0, 1023, "Iodc");
+ mTimeOfClockSeconds = builder.mTimeOfClockSeconds;
+ mAf0 = builder.mAf0;
+ mAf1 = builder.mAf1;
+ mAf2 = builder.mAf2;
+ mTgd = builder.mTgd;
+ mIodc = builder.mIodc;
+ }
+
+ /** Returns the time of the clock in seconds since GPS epoch. */
+ @IntRange(from = 0)
+ public long getTimeOfClockSeconds() {
+ return mTimeOfClockSeconds;
+ }
+
+ /** Returns the SV clock bias in seconds. */
+ @FloatRange(from = -9.77e-3f, to = 9.77e-3f)
+ public double getAf0() {
+ return mAf0;
+ }
+
+ /** Returns the SV clock drift in seconds per second. */
+ @FloatRange(from = -3.73e-9f, to = 3.73e-9f)
+ public double getAf1() {
+ return mAf1;
+ }
+
+ /** Returns the clock drift rate in seconds per second squared. */
+ @FloatRange(from = -3.56e-15f, to = 3.56e-15f)
+ public double getAf2() {
+ return mAf2;
+ }
+
+ /** Returns the group delay differential in seconds. */
+ @FloatRange(from = -5.97e-8f, to = 5.97e-8f)
+ public double getTgd() {
+ return mTgd;
+ }
+
+ /** Returns the issue of data, clock. */
+ @IntRange(from = 0, to = 1023)
+ public int getIodc() {
+ return mIodc;
+ }
+
+ public static final @NonNull Creator<GpsSatelliteClockModel> CREATOR =
+ new Creator<GpsSatelliteClockModel>() {
+ @Override
+ @NonNull
+ public GpsSatelliteClockModel createFromParcel(Parcel in) {
+ final GpsSatelliteClockModel.Builder gpsSatelliteClockModel =
+ new Builder()
+ .setTimeOfClockSeconds(in.readLong())
+ .setAf0(in.readDouble())
+ .setAf1(in.readDouble())
+ .setAf2(in.readDouble())
+ .setTgd(in.readDouble())
+ .setIodc(in.readInt());
+ return gpsSatelliteClockModel.build();
+ }
+
+ @Override
+ public GpsSatelliteClockModel[] newArray(int size) {
+ return new GpsSatelliteClockModel[size];
+ }
+ };
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeLong(mTimeOfClockSeconds);
+ parcel.writeDouble(mAf0);
+ parcel.writeDouble(mAf1);
+ parcel.writeDouble(mAf2);
+ parcel.writeDouble(mTgd);
+ parcel.writeInt(mIodc);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("GpsSatelliteClockModel[");
+ builder.append("timeOfClockSeconds = ").append(mTimeOfClockSeconds);
+ builder.append(", af0 = ").append(mAf0);
+ builder.append(", af1 = ").append(mAf1);
+ builder.append(", af2 = ").append(mAf2);
+ builder.append(", tgd = ").append(mTgd);
+ builder.append(", iodc = ").append(mIodc);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link GpsSatelliteClockModel}. */
+ public static final class Builder {
+ private long mTimeOfClockSeconds;
+ private double mAf0;
+ private double mAf1;
+ private double mAf2;
+ private double mTgd;
+ private int mIodc;
+
+ /** Sets the time of the clock in seconds since GPS epoch. */
+ @NonNull
+ public Builder setTimeOfClockSeconds(@IntRange(from = 0) long timeOfClockSeconds) {
+ mTimeOfClockSeconds = timeOfClockSeconds;
+ return this;
+ }
+
+ /** Sets the SV clock bias in seconds. */
+ @NonNull
+ public Builder setAf0(@FloatRange(from = -9.77e-3f, to = 9.77e-3f) double af0) {
+ mAf0 = af0;
+ return this;
+ }
+
+ /** Sets the SV clock drift in seconds per second. */
+ @NonNull
+ public Builder setAf1(@FloatRange(from = -3.73e-9f, to = 3.73e-9f) double af1) {
+ mAf1 = af1;
+ return this;
+ }
+
+ /** Sets the clock drift rate in seconds per second squared. */
+ @NonNull
+ public Builder setAf2(@FloatRange(from = -3.56e-15f, to = 3.56e-15f) double af2) {
+ mAf2 = af2;
+ return this;
+ }
+
+ /** Sets the group delay differential in seconds. */
+ @NonNull
+ public Builder setTgd(@FloatRange(from = -5.97e-8f, to = 5.97e-8f) double tgd) {
+ mTgd = tgd;
+ return this;
+ }
+
+ /** Sets the issue of data, clock. */
+ @NonNull
+ public Builder setIodc(@IntRange(from = 0, to = 1023) int iodc) {
+ mIodc = iodc;
+ return this;
+ }
+
+ /** Builds a {@link GpsSatelliteClockModel} instance as specified by this builder. */
+ @NonNull
+ public GpsSatelliteClockModel build() {
+ return new GpsSatelliteClockModel(this);
+ }
+ }
+ }
+}
diff --git a/location/java/android/location/IonosphericCorrection.java b/location/java/android/location/IonosphericCorrection.java
new file mode 100644
index 000000000000..aafcf8301add
--- /dev/null
+++ b/location/java/android/location/IonosphericCorrection.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A class contains ionospheric correction.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class IonosphericCorrection implements Parcelable {
+
+ /** Carrier frequency in Hz to differentiate signals from the same satellite. e.g. GPS L1/L5 */
+ private final long mCarrierFrequencyHz;
+
+ /** Ionospheric correction. */
+ @NonNull private final GnssCorrectionComponent mIonosphericCorrection;
+
+ /**
+ * Creates a new {@link IonosphericCorrection} instance.
+ *
+ * @param carrierFrequencyHz Carrier frequency in Hz to differentiate signals from the
+ * samesatellite. e.g. GPS L1/L5
+ * @param ionosphericCorrection Ionospheric correction.
+ */
+ public IonosphericCorrection(
+ @IntRange(from = 0) long carrierFrequencyHz,
+ @NonNull GnssCorrectionComponent ionosphericCorrection) {
+ Preconditions.checkArgument(carrierFrequencyHz > 0);
+ Preconditions.checkNotNull(ionosphericCorrection, "IonosphericCorrection cannot be null");
+ mCarrierFrequencyHz = carrierFrequencyHz;
+ mIonosphericCorrection = ionosphericCorrection;
+ }
+
+ /**
+ * Returns the carrier frequency in Hz to differentiate signals from the same satellite. e.g.
+ * GPS L1/L5
+ */
+ @IntRange(from = 0)
+ public long getCarrierFrequencyHz() {
+ return mCarrierFrequencyHz;
+ }
+
+ /** Returns the Ionospheric correction. */
+ @NonNull
+ public GnssCorrectionComponent getIonosphericCorrection() {
+ return mIonosphericCorrection;
+ }
+
+ public static final @NonNull Creator<IonosphericCorrection> CREATOR =
+ new Creator<IonosphericCorrection>() {
+ @Override
+ @NonNull
+ public IonosphericCorrection createFromParcel(Parcel in) {
+ long carrierFrequencyHz = in.readLong();
+ GnssCorrectionComponent ionosphericCorrection =
+ in.readTypedObject(GnssCorrectionComponent.CREATOR);
+ return new IonosphericCorrection(carrierFrequencyHz, ionosphericCorrection);
+ }
+
+ @Override
+ public IonosphericCorrection[] newArray(int size) {
+ return new IonosphericCorrection[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeLong(mCarrierFrequencyHz);
+ dest.writeTypedObject(mIonosphericCorrection, flags);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("IonosphericCorrection[");
+ builder.append("carrierFrequencyHz = ").append(mCarrierFrequencyHz);
+ builder.append(", ionosphericCorrection = ").append(mIonosphericCorrection);
+ builder.append("]");
+ return builder.toString();
+ }
+}
diff --git a/location/java/android/location/KeplerianOrbitModel.java b/location/java/android/location/KeplerianOrbitModel.java
new file mode 100644
index 000000000000..a118274dc9a3
--- /dev/null
+++ b/location/java/android/location/KeplerianOrbitModel.java
@@ -0,0 +1,518 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * Contains Keplerian orbit model parameters for GPS/Galileo/QZSS/Beidou.
+ * <p>For GPS, this is defined in IS-GPS-200 Table 20-II.
+ * <p>For Galileo, this is defined in Galileo-OS-SIS-ICD-v2.1 section 5.1.1.
+ * <p>For QZSS, this is defined in IS-QZSS-PNT section 4.1.2.
+ * <p>For Baidou, this is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.12.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class KeplerianOrbitModel implements Parcelable {
+ /** Square root of the semi-major axis in square root of meters. */
+ private final double mRootA;
+
+ /** Eccentricity. */
+ private final double mEccentricity;
+
+ /** Inclination angle at reference time in radians. */
+ private final double mI0;
+
+ /** Rate of change of inclination angle in radians per second. */
+ private final double mIDot;
+
+ /** Argument of perigee in radians. */
+ private final double mOmega;
+
+ /** Longitude of ascending node of orbit plane at beginning of week in radians. */
+ private final double mOmega0;
+
+ /** Rate of right ascension in radians per second. */
+ private final double mOmegaDot;
+
+ /** Mean anomaly at reference time in radians. */
+ private final double mM0;
+
+ /** Mean motion difference from computed value in radians per second. */
+ private final double mDeltaN;
+
+ /** Second-order harmonic perturbations. */
+ SecondOrderHarmonicPerturbation mSecondOrderHarmonicPerturbation;
+
+ private KeplerianOrbitModel(Builder builder) {
+ Preconditions.checkArgumentInRange(builder.mRootA, 0.0f, 8192.0f, "RootA");
+ Preconditions.checkArgumentInRange(builder.mEccentricity, 0.0f, 0.5f, "Eccentricity");
+ Preconditions.checkArgumentInRange(builder.mI0, -3.15f, 3.15f, "I0");
+ Preconditions.checkArgumentInRange(builder.mIDot, -2.94e-9f, 2.94e-9f, "IDot");
+ Preconditions.checkArgumentInRange(builder.mOmega, -3.15f, 3.15f, "Omega");
+ Preconditions.checkArgumentInRange(builder.mOmega0, -3.15f, 3.15f, "Omega0");
+ Preconditions.checkArgumentInRange(builder.mOmegaDot, -3.1e-6f, 3.1e-6f, "OmegaDot");
+ Preconditions.checkArgumentInRange(builder.mM0, -3.15f, 3.15f, "M0");
+ Preconditions.checkArgumentInRange(builder.mDeltaN, -1.18e-8f, 1.18e-8f, "DeltaN");
+ mRootA = builder.mRootA;
+ mEccentricity = builder.mEccentricity;
+ mI0 = builder.mI0;
+ mIDot = builder.mIDot;
+ mOmega = builder.mOmega;
+ mOmega0 = builder.mOmega0;
+ mOmegaDot = builder.mOmegaDot;
+ mM0 = builder.mM0;
+ mDeltaN = builder.mDeltaN;
+ mSecondOrderHarmonicPerturbation = builder.mSecondOrderHarmonicPerturbation;
+ }
+
+ /** Get the square root of the semi-major axis in square root of meters. */
+ @FloatRange(from = 0.0f, to = 8192.0f)
+ public double getRootA() {
+ return mRootA;
+ }
+
+ /** Get the eccentricity. */
+ @FloatRange(from = 0.0f, to = 0.5f)
+ public double getEccentricity() {
+ return mEccentricity;
+ }
+
+ /** Get the inclination angle at reference time in radians. */
+ @FloatRange(from = -3.15f, to = 3.15f)
+ public double getI0() {
+ return mI0;
+ }
+
+ /** Get the rate of change of inclination angle in radians per second. */
+ @FloatRange(from = -2.94e-9f, to = 2.94e-9f)
+ public double getIDot() {
+ return mIDot;
+ }
+
+ /** Get the argument of perigee in radians. */
+ @FloatRange(from = -3.15f, to = 3.15f)
+ public double getOmega() {
+ return mOmega;
+ }
+
+ /** Get the longitude of ascending node of orbit plane at beginning of week in radians. */
+ @FloatRange(from = -3.15f, to = 3.15f)
+ public double getOmega0() {
+ return mOmega0;
+ }
+
+ /** Get the rate of right ascension in radians per second. */
+ @FloatRange(from = -3.1e-6f, to = 3.1e-6f)
+ public double getOmegaDot() {
+ return mOmegaDot;
+ }
+
+ /** Get the mean anomaly at reference time in radians. */
+ @FloatRange(from = -3.15f, to = 3.15f)
+ public double getM0() {
+ return mM0;
+ }
+
+ /** Get the mean motion difference from computed value in radians per second. */
+ @FloatRange(from = -1.18e-8f, to = 1.18e-8f)
+ public double getDeltaN() {
+ return mDeltaN;
+ }
+
+ /** Get the second-order harmonic perturbations. */
+ @NonNull
+ public SecondOrderHarmonicPerturbation getSecondOrderHarmonicPerturbation() {
+ return mSecondOrderHarmonicPerturbation;
+ }
+
+ public static final @NonNull Creator<KeplerianOrbitModel> CREATOR =
+ new Creator<KeplerianOrbitModel>() {
+ @Override
+ @NonNull
+ public KeplerianOrbitModel createFromParcel(Parcel in) {
+ final KeplerianOrbitModel.Builder keplerianOrbitModel =
+ new Builder()
+ .setRootA(in.readDouble())
+ .setEccentricity(in.readDouble())
+ .setI0(in.readDouble())
+ .setIDot(in.readDouble())
+ .setOmega(in.readDouble())
+ .setOmega0(in.readDouble())
+ .setOmegaDot(in.readDouble())
+ .setM0(in.readDouble())
+ .setDeltaN(in.readDouble())
+ .setSecondOrderHarmonicPerturbation(
+ in.readTypedObject(
+ SecondOrderHarmonicPerturbation.CREATOR));
+ return keplerianOrbitModel.build();
+ }
+
+ @Override
+ public KeplerianOrbitModel[] newArray(int size) {
+ return new KeplerianOrbitModel[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeDouble(mRootA);
+ parcel.writeDouble(mEccentricity);
+ parcel.writeDouble(mI0);
+ parcel.writeDouble(mIDot);
+ parcel.writeDouble(mOmega);
+ parcel.writeDouble(mOmega0);
+ parcel.writeDouble(mOmegaDot);
+ parcel.writeDouble(mM0);
+ parcel.writeDouble(mDeltaN);
+ parcel.writeTypedObject(mSecondOrderHarmonicPerturbation, flags);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("KeplerianOrbitModel[");
+ builder.append("rootA = ").append(mRootA);
+ builder.append(", eccentricity = ").append(mEccentricity);
+ builder.append(", i0 = ").append(mI0);
+ builder.append(", iDot = ").append(mIDot);
+ builder.append(", omega = ").append(mOmega);
+ builder.append(", omega0 = ").append(mOmega0);
+ builder.append(", omegaDot = ").append(mOmegaDot);
+ builder.append(", m0 = ").append(mM0);
+ builder.append(", deltaN = ").append(mDeltaN);
+ builder.append(", secondOrderHarmonicPerturbation = ")
+ .append(mSecondOrderHarmonicPerturbation);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link KeplerianOrbitModel} */
+ public static final class Builder {
+ private double mRootA;
+ private double mEccentricity;
+ private double mI0;
+ private double mIDot;
+ private double mOmega;
+ private double mOmega0;
+ private double mOmegaDot;
+ private double mM0;
+ private double mDeltaN;
+ private SecondOrderHarmonicPerturbation mSecondOrderHarmonicPerturbation;
+
+ /** Sets the square root of the semi-major axis in square root of meters. */
+ @NonNull
+ public Builder setRootA(@FloatRange(from = 0.0f, to = 8192.0f) double rootA) {
+ mRootA = rootA;
+ return this;
+ }
+
+ /** Sets the eccentricity. */
+ @NonNull
+ public Builder setEccentricity(@FloatRange(from = 0.0f, to = 0.5f) double eccentricity) {
+ mEccentricity = eccentricity;
+ return this;
+ }
+
+ /** Sets the inclination angle at reference time in radians. */
+ @NonNull
+ public Builder setI0(@FloatRange(from = -3.15f, to = 3.15f) double i0) {
+ mI0 = i0;
+ return this;
+ }
+
+ /** Sets the rate of change of inclination angle in radians per second. */
+ @NonNull
+ public Builder setIDot(@FloatRange(from = -2.94e-9f, to = 2.94e-9f) double iDot) {
+ mIDot = iDot;
+ return this;
+ }
+
+ /** Sets the argument of perigee in radians. */
+ @NonNull
+ public Builder setOmega(@FloatRange(from = -3.15f, to = 3.15f) double omega) {
+ mOmega = omega;
+ return this;
+ }
+
+ /**
+ * Sets the longitude of ascending node of orbit plane at beginning of week in radians.
+ */
+ @NonNull
+ public Builder setOmega0(@FloatRange(from = -3.15f, to = 3.15f) double omega0) {
+ mOmega0 = omega0;
+ return this;
+ }
+
+ /** Sets the rate of right ascension in radians per second. */
+ @NonNull
+ public Builder setOmegaDot(@FloatRange(from = -3.1e-6f, to = 3.1e-6f) double omegaDot) {
+ mOmegaDot = omegaDot;
+ return this;
+ }
+
+ /** Sets the mean anomaly at reference time in radians. */
+ @NonNull
+ public Builder setM0(@FloatRange(from = -3.15f, to = 3.15f) double m0) {
+ mM0 = m0;
+ return this;
+ }
+
+ /** Sets the mean motion difference from computed value in radians per second. */
+ @NonNull
+ public Builder setDeltaN(@FloatRange(from = -1.18e-8f, to = 1.18e-8f) double deltaN) {
+ mDeltaN = deltaN;
+ return this;
+ }
+
+ /** Sets the second-order harmonic perturbations. */
+ @NonNull
+ public Builder setSecondOrderHarmonicPerturbation(
+ @NonNull SecondOrderHarmonicPerturbation secondOrderHarmonicPerturbation) {
+ mSecondOrderHarmonicPerturbation = secondOrderHarmonicPerturbation;
+ return this;
+ }
+
+ /** Builds a {@link KeplerianOrbitModel} instance as specified by this builder. */
+ @NonNull
+ public KeplerianOrbitModel build() {
+ return new KeplerianOrbitModel(this);
+ }
+ }
+
+ /** A class contains second-order harmonic perturbations. */
+ public static final class SecondOrderHarmonicPerturbation implements Parcelable {
+ /** Amplitude of cosine harmonic correction term to angle of inclination in radians. */
+ private final double mCic;
+
+ /** Amplitude of sine harmonic correction term to angle of inclination in radians. */
+ private final double mCis;
+
+ /** Amplitude of cosine harmonic correction term to the orbit in meters. */
+ private final double mCrc;
+
+ /** Amplitude of sine harmonic correction term to the orbit in meters. */
+ private final double mCrs;
+
+ /** Amplitude of cosine harmonic correction term to the argument of latitude in radians. */
+ private final double mCuc;
+
+ /** Amplitude of sine harmonic correction term to the argument of latitude in radians. */
+ private final double mCus;
+
+ private SecondOrderHarmonicPerturbation(Builder builder) {
+ Preconditions.checkArgumentInRange(builder.mCic, -6.11e-5f, 6.11e-5f, "Cic");
+ Preconditions.checkArgumentInRange(builder.mCis, -6.11e-5f, 6.11e-5f, "Cis");
+ Preconditions.checkArgumentInRange(builder.mCrc, -2048.0f, 2048.0f, "Crc");
+ Preconditions.checkArgumentInRange(builder.mCrs, -2048.0f, 2048.0f, "Crs");
+ Preconditions.checkArgumentInRange(builder.mCuc, -6.11e-5f, 6.11e-5f, "Cuc");
+ Preconditions.checkArgumentInRange(builder.mCus, -6.11e-5f, 6.11e-5f, "Cus");
+ mCic = builder.mCic;
+ mCrc = builder.mCrc;
+ mCis = builder.mCis;
+ mCrs = builder.mCrs;
+ mCuc = builder.mCuc;
+ mCus = builder.mCus;
+ }
+
+ /**
+ * Get the amplitude of cosine harmonic correction term to angle of inclination in radians.
+ */
+ @FloatRange(from = -6.11e-5f, to = 6.11e-5f)
+ public double getCic() {
+ return mCic;
+ }
+
+ /**
+ * Get the amplitude of sine harmonic correction term to angle of inclination in radians.
+ */
+ @FloatRange(from = -6.11e-5f, to = 6.11e-5f)
+ public double getCis() {
+ return mCis;
+ }
+
+ /** Get the amplitude of cosine harmonic correction term to the orbit in meters. */
+ @FloatRange(from = -2048.0f, to = 2048.0f)
+ public double getCrc() {
+ return mCrc;
+ }
+
+ /** Get the amplitude of sine harmonic correction term to the orbit in meters. */
+ @FloatRange(from = -2048.0f, to = 2048.0f)
+ public double getCrs() {
+ return mCrs;
+ }
+
+ /**
+ * Get the amplitude of cosine harmonic correction term to the argument of latitude in
+ * radians.
+ */
+ @FloatRange(from = -6.11e-5f, to = 6.11e-5f)
+ public double getCuc() {
+ return mCuc;
+ }
+
+ /**
+ * Get the amplitude of sine harmonic correction term to the argument of latitude in
+ * radians.
+ */
+ @FloatRange(from = -6.11e-5f, to = 6.11e-5f)
+ public double getCus() {
+ return mCus;
+ }
+
+ public static final @NonNull Creator<SecondOrderHarmonicPerturbation> CREATOR =
+ new Creator<SecondOrderHarmonicPerturbation>() {
+ @Override
+ @NonNull
+ public SecondOrderHarmonicPerturbation createFromParcel(Parcel in) {
+ final SecondOrderHarmonicPerturbation.Builder
+ secondOrderHarmonicPerturbation =
+ new Builder()
+ .setCic(in.readDouble())
+ .setCis(in.readDouble())
+ .setCrc(in.readDouble())
+ .setCrs(in.readDouble())
+ .setCuc(in.readDouble())
+ .setCus(in.readDouble());
+ return secondOrderHarmonicPerturbation.build();
+ }
+
+ @Override
+ public SecondOrderHarmonicPerturbation[] newArray(int size) {
+ return new SecondOrderHarmonicPerturbation[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeDouble(mCic);
+ parcel.writeDouble(mCis);
+ parcel.writeDouble(mCrc);
+ parcel.writeDouble(mCrs);
+ parcel.writeDouble(mCuc);
+ parcel.writeDouble(mCus);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("SecondOrderHarmonicPerturbation[");
+ builder.append("cic = ").append(mCic);
+ builder.append(", cis = ").append(mCis);
+ builder.append(", crc = ").append(mCrc);
+ builder.append(", crs = ").append(mCrs);
+ builder.append(", cuc = ").append(mCuc);
+ builder.append(", cus = ").append(mCus);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link SecondOrderHarmonicPerturbation} */
+ public static final class Builder {
+ private double mCic;
+ private double mCis;
+ private double mCrc;
+ private double mCrs;
+ private double mCuc;
+ private double mCus;
+
+ /**
+ * Sets the amplitude of cosine harmonic correction term to angle of inclination in
+ * radians.
+ */
+ @NonNull
+ public Builder setCic(@FloatRange(from = -6.11e-5f, to = 6.11e-5f) double cic) {
+ mCic = cic;
+ return this;
+ }
+
+ /**
+ * Sets the amplitude of sine harmonic correction term to angle of inclination in
+ * radians.
+ */
+ @NonNull
+ public Builder setCis(@FloatRange(from = -6.11e-5f, to = 6.11e-5f) double cis) {
+ mCis = cis;
+ return this;
+ }
+
+ /** Sets the amplitude of cosine harmonic correction term to the orbit in meters. */
+ @NonNull
+ public Builder setCrc(@FloatRange(from = -2048.0f, to = 2048.0f) double crc) {
+ mCrc = crc;
+ return this;
+ }
+
+ /** Sets the amplitude of sine harmonic correction term to the orbit in meters. */
+ @NonNull
+ public Builder setCrs(@FloatRange(from = -2048.0f, to = 2048.0f) double crs) {
+ mCrs = crs;
+ return this;
+ }
+
+ /**
+ * Sets the amplitude of cosine harmonic correction term to the argument of latitude in
+ * radians.
+ */
+ @NonNull
+ public Builder setCuc(@FloatRange(from = -6.11e-5f, to = 6.11e-5f) double cuc) {
+ mCuc = cuc;
+ return this;
+ }
+
+ /**
+ * Sets the amplitude of sine harmonic correction term to the argument of latitude in
+ * radians.
+ */
+ @NonNull
+ public Builder setCus(@FloatRange(from = -6.11e-5f, to = 6.11e-5f) double cus) {
+ mCus = cus;
+ return this;
+ }
+
+ /**
+ * Builds a {@link SecondOrderHarmonicPerturbation} instance as specified by this
+ * builder.
+ */
+ @NonNull
+ public SecondOrderHarmonicPerturbation build() {
+ return new SecondOrderHarmonicPerturbation(this);
+ }
+ }
+ }
+}
diff --git a/location/java/android/location/KlobucharIonosphericModel.java b/location/java/android/location/KlobucharIonosphericModel.java
new file mode 100644
index 000000000000..d239c876f702
--- /dev/null
+++ b/location/java/android/location/KlobucharIonosphericModel.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A class contains Klobuchar ionospheric model coefficients used by GPS, BDS, QZSS.
+ *
+ * <p>This is defined in IS-GPS-200 section 20.3.3.5.1.7.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class KlobucharIonosphericModel implements Parcelable {
+ /** Alpha0 coefficientin seconds. */
+ double mAlpha0;
+ /** Alpha1 coefficient in seconds per semi-circle. */
+ double mAlpha1;
+ /** Alpha2 coefficient in seconds per semi-circle squared. */
+ double mAlpha2;
+ /** Alpha3 coefficient in seconds per semi-circle cubed. */
+ double mAlpha3;
+ /** Beta0 coefficient in seconds. */
+ double mBeta0;
+ /** Beta1 coefficient in seconds per semi-circle. */
+ double mBeta1;
+ /** Beta2 coefficient in seconds per semi-circle squared. */
+ double mBeta2;
+ /** Beta3 coefficient in seconds per semi-circle cubed. */
+ double mBeta3;
+
+ private KlobucharIonosphericModel(Builder builder) {
+ Preconditions.checkArgumentInRange(builder.mAlpha0, -1.193e-7f, 1.193e-7f, "Alpha0");
+ Preconditions.checkArgumentInRange(builder.mAlpha1, -9.54e-7f, 9.54e-7f, "Alpha1");
+ Preconditions.checkArgumentInRange(builder.mAlpha2, -7.63e-6f, 7.63e-6f, "Alpha2");
+ Preconditions.checkArgumentInRange(builder.mAlpha3, -7.63e-6f, 7.63e-6f, "Alpha3");
+ Preconditions.checkArgumentInRange(builder.mBeta0, -262144.0f, 262144.0f, "Beta0");
+ Preconditions.checkArgumentInRange(builder.mBeta1, -2097152.0f, 2097152.0f, "Beta1");
+ Preconditions.checkArgumentInRange(builder.mBeta2, -8388608.0f, 8388608.0f, "Beta2");
+ Preconditions.checkArgumentInRange(builder.mBeta3, -8388608.0f, 8388608.0f, "Beta3");
+ mAlpha0 = builder.mAlpha0;
+ mAlpha1 = builder.mAlpha1;
+ mAlpha2 = builder.mAlpha2;
+ mAlpha3 = builder.mAlpha3;
+ mBeta0 = builder.mBeta0;
+ mBeta1 = builder.mBeta1;
+ mBeta2 = builder.mBeta2;
+ mBeta3 = builder.mBeta3;
+ }
+
+ /** Returns the alpha0 coefficient in seconds. */
+ @FloatRange(from = -1.193e-7f, to = 1.193e-7f)
+ public double getAlpha0() {
+ return mAlpha0;
+ }
+
+ /** Returns the alpha1 coefficient in seconds per semi-circle. */
+ @FloatRange(from = -9.54e-7f, to = 9.54e-7f)
+ public double getAlpha1() {
+ return mAlpha1;
+ }
+
+ /** Returns the alpha2 coefficient in seconds per semi-circle squared. */
+ @FloatRange(from = -7.63e-6f, to = 7.63e-6f)
+ public double getAlpha2() {
+ return mAlpha2;
+ }
+
+ /** Returns the alpha3 coefficient in seconds per semi-circle cubed. */
+ @FloatRange(from = -7.63e-6f, to = 7.63e-6f)
+ public double getAlpha3() {
+ return mAlpha3;
+ }
+
+ /** Returns the beta0 coefficient in seconds. */
+ @FloatRange(from = -262144.0f, to = 262144.0f)
+ public double getBeta0() {
+ return mBeta0;
+ }
+
+ /** Returns the beta1 coefficient in seconds per semi-circle. */
+ @FloatRange(from = -2097152.0f, to = 2097152.0f)
+ public double getBeta1() {
+ return mBeta1;
+ }
+
+ /** Returns the beta2 coefficient in seconds per semi-circle squared. */
+ @FloatRange(from = -8388608.0f, to = 8388608.0f)
+ public double getBeta2() {
+ return mBeta2;
+ }
+
+ /** Returns the beta3 coefficient in seconds per semi-circle cubed. */
+ @FloatRange(from = -8388608.0f, to = 8388608.0f)
+ public double getBeta3() {
+ return mBeta3;
+ }
+
+ public static final @NonNull Creator<KlobucharIonosphericModel> CREATOR =
+ new Creator<KlobucharIonosphericModel>() {
+ @Override
+ @NonNull
+ public KlobucharIonosphericModel createFromParcel(Parcel in) {
+ return new KlobucharIonosphericModel.Builder()
+ .setAlpha0(in.readDouble())
+ .setAlpha1(in.readDouble())
+ .setAlpha2(in.readDouble())
+ .setAlpha3(in.readDouble())
+ .setBeta0(in.readDouble())
+ .setBeta1(in.readDouble())
+ .setBeta2(in.readDouble())
+ .setBeta3(in.readDouble())
+ .build();
+ }
+ @Override
+ public KlobucharIonosphericModel[] newArray(int size) {
+ return new KlobucharIonosphericModel[size];
+ }
+ };
+
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeDouble(mAlpha0);
+ parcel.writeDouble(mAlpha1);
+ parcel.writeDouble(mAlpha2);
+ parcel.writeDouble(mAlpha3);
+ parcel.writeDouble(mBeta0);
+ parcel.writeDouble(mBeta1);
+ parcel.writeDouble(mBeta2);
+ parcel.writeDouble(mBeta3);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("KlobucharIonosphericModel[");
+ builder.append("alpha0 = ").append(mAlpha0);
+ builder.append(", alpha1 = ").append(mAlpha1);
+ builder.append(", alpha2 = ").append(mAlpha2);
+ builder.append(", alpha3 = ").append(mAlpha3);
+ builder.append(", beta0 = ").append(mBeta0);
+ builder.append(", beta1 = ").append(mBeta1);
+ builder.append(", beta2 = ").append(mBeta2);
+ builder.append(", beta3 = ").append(mBeta3);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link KlobucharIonosphericModel} */
+ public static final class Builder {
+ private double mAlpha0;
+ private double mAlpha1;
+ private double mAlpha2;
+ private double mAlpha3;
+ private double mBeta0;
+ private double mBeta1;
+ private double mBeta2;
+ private double mBeta3;
+
+ /** Sets the alpha0 coefficient in seconds. */
+ @NonNull
+ public Builder setAlpha0(@FloatRange(from = -1.193e-7f, to = 1.193e-7f) double alpha0) {
+ mAlpha0 = alpha0;
+ return this;
+ }
+
+ /** Sets the alpha1 coefficient in seconds per semi-circle. */
+ @NonNull
+ public Builder setAlpha1(@FloatRange(from = -9.54e-7f, to = 9.54e-7f) double alpha1) {
+ mAlpha1 = alpha1;
+ return this;
+ }
+
+ /** Sets the alpha2 coefficient in seconds per semi-circle squared. */
+ @NonNull
+ public Builder setAlpha2(@FloatRange(from = -7.63e-6f, to = 7.63e-6f) double alpha2) {
+ mAlpha2 = alpha2;
+ return this;
+ }
+
+ /** Sets the alpha3 coefficient in seconds per semi-circle cubed. */
+ @NonNull
+ public Builder setAlpha3(@FloatRange(from = -7.63e-6f, to = 7.63e-6f) double alpha3) {
+ mAlpha3 = alpha3;
+ return this;
+ }
+
+ /** Sets the beta0 coefficient in seconds. */
+ @NonNull
+ public Builder setBeta0(@FloatRange(from = -262144.0f, to = 262144.0f) double beta0) {
+ mBeta0 = beta0;
+ return this;
+ }
+
+ /** Sets the beta1 coefficient in seconds per semi-circle. */
+ @NonNull
+ public Builder setBeta1(@FloatRange(from = -2097152.0f, to = 2097152.0f) double beta1) {
+ mBeta1 = beta1;
+ return this;
+ }
+
+ /** Sets the beta2 coefficient in seconds per semi-circle squared. */
+ @NonNull
+ public Builder setBeta2(@FloatRange(from = -8388608.0f, to = 8388608.0f) double beta2) {
+ mBeta2 = beta2;
+ return this;
+ }
+
+ /** Sets the beta3 coefficient in seconds per semi-circle cubed. */
+ @NonNull
+ public Builder setBeta3(@FloatRange(from = -8388608.0f, to = 8388608.0f) double beta3) {
+ mBeta3 = beta3;
+ return this;
+ }
+
+ /** Builds a {@link KlobucharIonosphericModel} instance as specified by this builder. */
+ @NonNull
+ public KlobucharIonosphericModel build() {
+ return new KlobucharIonosphericModel(this);
+ }
+ }
+}
diff --git a/location/java/android/location/LeapSecondsModel.java b/location/java/android/location/LeapSecondsModel.java
new file mode 100644
index 000000000000..bc132addb06a
--- /dev/null
+++ b/location/java/android/location/LeapSecondsModel.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * Contains the leap seconds set of parameters needed for GNSS time.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class LeapSecondsModel implements Parcelable {
+ /** Time difference due to leap seconds before the event in seconds. (UTC) */
+ private final int mLeapSeconds;
+
+ /** Time difference due to leap seconds after the event in seconds. (UTC) */
+ private final int mLeapSecondsFuture;
+
+ /** GNSS week number in which the leap second event will occur. (UTC) */
+ private final int mWeekNumberLeapSecondsFuture;
+
+ /** Day number when the next leap second will occur. */
+ private final int mDayNumberLeapSecondsFuture;
+
+ private LeapSecondsModel(Builder builder) {
+ Preconditions.checkArgument(builder.mLeapSeconds >= 0);
+ Preconditions.checkArgument(builder.mLeapSecondsFuture >= 0);
+ Preconditions.checkArgument(builder.mWeekNumberLeapSecondsFuture >= 0);
+ Preconditions.checkArgument(builder.mDayNumberLeapSecondsFuture >= 0);
+ mLeapSeconds = builder.mLeapSeconds;
+ mLeapSecondsFuture = builder.mLeapSecondsFuture;
+ mWeekNumberLeapSecondsFuture = builder.mWeekNumberLeapSecondsFuture;
+ mDayNumberLeapSecondsFuture = builder.mDayNumberLeapSecondsFuture;
+ }
+
+ /** Returns the time difference due to leap seconds before the event in seconds. (UTC) */
+ @IntRange(from = 0)
+ public int getLeapSeconds() {
+ return mLeapSeconds;
+ }
+
+ /** Returns the time difference due to leap seconds after the event in seconds. (UTC) */
+ @IntRange(from = 0)
+ public int getLeapSecondsFuture() {
+ return mLeapSecondsFuture;
+ }
+
+ /** Returns the GNSS week number in which the leap second event will occur. (UTC) */
+ @IntRange(from = 0)
+ public int getWeekNumberLeapSecondsFuture() {
+ return mWeekNumberLeapSecondsFuture;
+ }
+
+ /** Returns the day number when the next leap second will occur. */
+ @IntRange(from = 0)
+ public int getDayNumberLeapSecondsFuture() {
+ return mDayNumberLeapSecondsFuture;
+ }
+
+ public static final @NonNull Creator<LeapSecondsModel> CREATOR =
+ new Creator<LeapSecondsModel>() {
+ @Override
+ @NonNull
+ public LeapSecondsModel createFromParcel(Parcel in) {
+ final LeapSecondsModel.Builder leapSecondsModel = new Builder();
+ leapSecondsModel.setLeapSeconds(in.readInt());
+ leapSecondsModel.setLeapSecondsFuture(in.readInt());
+ leapSecondsModel.setWeekNumberLeapSecondsFuture(in.readInt());
+ leapSecondsModel.setDayNumberLeapSecondsFuture(in.readInt());
+ return leapSecondsModel.build();
+ }
+
+ @Override
+ public LeapSecondsModel[] newArray(int size) {
+ return new LeapSecondsModel[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mLeapSeconds);
+ parcel.writeInt(mLeapSecondsFuture);
+ parcel.writeInt(mWeekNumberLeapSecondsFuture);
+ parcel.writeInt(mDayNumberLeapSecondsFuture);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("LeapSecondsModel[");
+ builder.append("leapSeconds = ").append(mLeapSeconds);
+ builder.append(", leapSecondsFuture = ").append(mLeapSecondsFuture);
+ builder.append(", weekNumberLeapSecondsFuture = ").append(mWeekNumberLeapSecondsFuture);
+ builder.append(", dayNumberLeapSecondsFuture = ").append(mDayNumberLeapSecondsFuture);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link LeapSecondsModel} */
+ public static final class Builder {
+ private int mLeapSeconds;
+ private int mLeapSecondsFuture;
+ private int mWeekNumberLeapSecondsFuture;
+ private int mDayNumberLeapSecondsFuture;
+
+ /** Sets the time difference due to leap seconds before the event in seconds. (UTC) */
+ @NonNull
+ public Builder setLeapSeconds(@IntRange(from = 0) int leapSeconds) {
+ mLeapSeconds = leapSeconds;
+ return this;
+ }
+
+ /** Sets the time difference due to leap seconds after the event in seconds. (UTC) */
+ @NonNull
+ public Builder setLeapSecondsFuture(@IntRange(from = 0) int leapSecondsFuture) {
+ mLeapSecondsFuture = leapSecondsFuture;
+ return this;
+ }
+
+ /** Sets the GNSS week number in which the leap second event will occur. (UTC) */
+ @NonNull
+ public Builder setWeekNumberLeapSecondsFuture(
+ @IntRange(from = 0) int weekNumberLeapSecondsFuture) {
+ mWeekNumberLeapSecondsFuture = weekNumberLeapSecondsFuture;
+ return this;
+ }
+
+ /** Sets the day number when the next leap second will occur. */
+ @NonNull
+ public Builder setDayNumberLeapSecondsFuture(
+ @IntRange(from = 0) int dayNumberLeapSecondsFuture) {
+ mDayNumberLeapSecondsFuture = dayNumberLeapSecondsFuture;
+ return this;
+ }
+
+ /** Builds a {@link LeapSecondsModel} instance as specified by this builder. */
+ @NonNull
+ public LeapSecondsModel build() {
+ return new LeapSecondsModel(this);
+ }
+ }
+}
diff --git a/location/java/android/location/QzssAssistance.java b/location/java/android/location/QzssAssistance.java
new file mode 100644
index 000000000000..9383ce3c63b5
--- /dev/null
+++ b/location/java/android/location/QzssAssistance.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
+import android.location.GnssAssistance.GnssSatelliteCorrections;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A class contains QZSS assistance.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class QzssAssistance implements Parcelable {
+
+ /** The QZSS almanac. */
+ @Nullable private final GnssAlmanac mAlmanac;
+
+ /** The Klobuchar ionospheric model. */
+ @Nullable private final KlobucharIonosphericModel mIonosphericModel;
+
+ /** The UTC model. */
+ @Nullable private final UtcModel mUtcModel;
+
+ /** The leap seconds model. */
+ @Nullable private final LeapSecondsModel mLeapSecondsModel;
+
+ /** The list of time models. */
+ @NonNull private final List<TimeModel> mTimeModels;
+
+ /** The list of QZSS ephemeris. */
+ @NonNull private final List<QzssSatelliteEphemeris> mSatelliteEphemeris;
+
+ /** The list of real time integrity models. */
+ @NonNull private final List<RealTimeIntegrityModel> mRealTimeIntegrityModels;
+
+ /** The list of QZSS satellite corrections. */
+ @NonNull private final List<GnssSatelliteCorrections> mSatelliteCorrections;
+
+ private QzssAssistance(Builder builder) {
+ mAlmanac = builder.mAlmanac;
+ mIonosphericModel = builder.mIonosphericModel;
+ mUtcModel = builder.mUtcModel;
+ mLeapSecondsModel = builder.mLeapSecondsModel;
+ if (builder.mTimeModels != null) {
+ mTimeModels = Collections.unmodifiableList(new ArrayList<>(builder.mTimeModels));
+ } else {
+ mTimeModels = new ArrayList<>();
+ }
+ if (builder.mSatelliteEphemeris != null) {
+ mSatelliteEphemeris =
+ Collections.unmodifiableList(new ArrayList<>(builder.mSatelliteEphemeris));
+ } else {
+ mSatelliteEphemeris = new ArrayList<>();
+ }
+ if (builder.mRealTimeIntegrityModels != null) {
+ mRealTimeIntegrityModels =
+ Collections.unmodifiableList(new ArrayList<>(builder.mRealTimeIntegrityModels));
+ } else {
+ mRealTimeIntegrityModels = new ArrayList<>();
+ }
+ if (builder.mSatelliteCorrections != null) {
+ mSatelliteCorrections =
+ Collections.unmodifiableList(new ArrayList<>(builder.mSatelliteCorrections));
+ } else {
+ mSatelliteCorrections = new ArrayList<>();
+ }
+ }
+
+ /** Returns the QZSS almanac. */
+ @Nullable
+ public GnssAlmanac getAlmanac() {
+ return mAlmanac;
+ }
+
+ /** Returns the Klobuchar ionospheric model. */
+ @Nullable
+ public KlobucharIonosphericModel getIonosphericModel() {
+ return mIonosphericModel;
+ }
+
+ /** Returns the UTC model. */
+ @Nullable
+ public UtcModel getUtcModel() {
+ return mUtcModel;
+ }
+
+ /** Returns the leap seconds model. */
+ @Nullable
+ public LeapSecondsModel getLeapSecondsModel() {
+ return mLeapSecondsModel;
+ }
+
+ /** Returns the list of time models. */
+ @NonNull
+ public List<TimeModel> getTimeModels() {
+ return mTimeModels;
+ }
+
+ /** Returns the list of QZSS ephemeris. */
+ @NonNull
+ public List<QzssSatelliteEphemeris> getSatelliteEphemeris() {
+ return mSatelliteEphemeris;
+ }
+
+ /** Returns the list of real time integrity models. */
+ @NonNull
+ public List<RealTimeIntegrityModel> getRealTimeIntegrityModels() {
+ return mRealTimeIntegrityModels;
+ }
+
+ /** Returns the list of QZSS satellite corrections. */
+ @NonNull
+ public List<GnssSatelliteCorrections> getSatelliteCorrections() {
+ return mSatelliteCorrections;
+ }
+
+ public static final @NonNull Creator<QzssAssistance> CREATOR =
+ new Creator<QzssAssistance>() {
+ @Override
+ @NonNull
+ public QzssAssistance createFromParcel(Parcel in) {
+ return new QzssAssistance.Builder()
+ .setAlmanac(in.readTypedObject(GnssAlmanac.CREATOR))
+ .setIonosphericModel(in.readTypedObject(KlobucharIonosphericModel.CREATOR))
+ .setUtcModel(in.readTypedObject(UtcModel.CREATOR))
+ .setLeapSecondsModel(in.readTypedObject(LeapSecondsModel.CREATOR))
+ .setTimeModels(in.createTypedArrayList(TimeModel.CREATOR))
+ .setSatelliteEphemeris(
+ in.createTypedArrayList(QzssSatelliteEphemeris.CREATOR))
+ .setRealTimeIntegrityModels(
+ in.createTypedArrayList(RealTimeIntegrityModel.CREATOR))
+ .setSatelliteCorrections(
+ in.createTypedArrayList(GnssSatelliteCorrections.CREATOR))
+ .build();
+ }
+ @Override
+ public QzssAssistance[] newArray(int size) {
+ return new QzssAssistance[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeTypedObject(mAlmanac, flags);
+ dest.writeTypedObject(mIonosphericModel, flags);
+ dest.writeTypedObject(mUtcModel, flags);
+ dest.writeTypedObject(mLeapSecondsModel, flags);
+ dest.writeTypedList(mTimeModels);
+ dest.writeTypedList(mSatelliteEphemeris);
+ dest.writeTypedList(mRealTimeIntegrityModels);
+ dest.writeTypedList(mSatelliteCorrections);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("QzssAssistance[");
+ builder.append("almanac = ").append(mAlmanac);
+ builder.append(", ionosphericModel = ").append(mIonosphericModel);
+ builder.append(", utcModel = ").append(mUtcModel);
+ builder.append(", leapSecondsModel = ").append(mLeapSecondsModel);
+ builder.append(", timeModels = ").append(mTimeModels);
+ builder.append(", satelliteEphemeris = ").append(mSatelliteEphemeris);
+ builder.append(", realTimeIntegrityModels = ").append(mRealTimeIntegrityModels);
+ builder.append(", satelliteCorrections = ").append(mSatelliteCorrections);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link QzssAssistance}. */
+ public static final class Builder {
+ private GnssAlmanac mAlmanac;
+ private KlobucharIonosphericModel mIonosphericModel;
+ private UtcModel mUtcModel;
+ private LeapSecondsModel mLeapSecondsModel;
+ private List<TimeModel> mTimeModels;
+ private List<QzssSatelliteEphemeris> mSatelliteEphemeris;
+ private List<RealTimeIntegrityModel> mRealTimeIntegrityModels;
+ private List<GnssSatelliteCorrections> mSatelliteCorrections;
+
+ /** Sets the QZSS almanac. */
+ @NonNull
+ public Builder setAlmanac(@Nullable GnssAlmanac almanac) {
+ mAlmanac = almanac;
+ return this;
+ }
+
+ /** Sets the Klobuchar ionospheric model. */
+ @NonNull
+ public Builder setIonosphericModel(@Nullable KlobucharIonosphericModel ionosphericModel) {
+ mIonosphericModel = ionosphericModel;
+ return this;
+ }
+
+ /** Sets the UTC model. */
+ @NonNull
+ public Builder setUtcModel(@Nullable UtcModel utcModel) {
+ mUtcModel = utcModel;
+ return this;
+ }
+
+ /** Sets the leap seconds model. */
+ @NonNull
+ public Builder setLeapSecondsModel(@Nullable LeapSecondsModel leapSecondsModel) {
+ mLeapSecondsModel = leapSecondsModel;
+ return this;
+ }
+
+ /** Sets the list of time models. */
+ @NonNull
+ public Builder setTimeModels(
+ @Nullable @SuppressLint("NullableCollection") List<TimeModel> timeModels) {
+ mTimeModels = timeModels;
+ return this;
+ }
+
+ /** Sets the list of QZSS ephemeris. */
+ @NonNull
+ public Builder setSatelliteEphemeris(
+ @Nullable @SuppressLint("NullableCollection")
+ List<QzssSatelliteEphemeris> satelliteEphemeris) {
+ mSatelliteEphemeris = satelliteEphemeris;
+ return this;
+ }
+
+ /** Sets the list of real time integrity model. */
+ @NonNull
+ public Builder setRealTimeIntegrityModels(
+ @Nullable @SuppressLint("NullableCollection")
+ List<RealTimeIntegrityModel> realTimeIntegrityModels) {
+ mRealTimeIntegrityModels = realTimeIntegrityModels;
+ return this;
+ }
+
+ /** Sets the list of QZSS satellite correction. */
+ @NonNull
+ public Builder setSatelliteCorrections(
+ @Nullable @SuppressLint("NullableCollection")
+ List<GnssSatelliteCorrections> satelliteCorrections) {
+ mSatelliteCorrections = satelliteCorrections;
+ return this;
+ }
+
+ /** Builds a {@link QzssAssistance} instance as specified by this builder. */
+ @NonNull
+ public QzssAssistance build() {
+ return new QzssAssistance(this);
+ }
+ }
+}
diff --git a/location/java/android/location/QzssSatelliteEphemeris.java b/location/java/android/location/QzssSatelliteEphemeris.java
new file mode 100644
index 000000000000..96203d9588c8
--- /dev/null
+++ b/location/java/android/location/QzssSatelliteEphemeris.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.GpsSatelliteEphemeris.GpsL2Params;
+import android.location.GpsSatelliteEphemeris.GpsSatelliteClockModel;
+import android.location.GpsSatelliteEphemeris.GpsSatelliteHealth;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A class contains ephemeris parameters specific to QZSS satellites.
+ *
+ * <p>This is defined in IS-QZSS-PNT section 4.1.2.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class QzssSatelliteEphemeris implements Parcelable {
+ /** Satellite PRN. */
+ private final int mPrn;
+
+ /** L2 parameters. */
+ @NonNull private final GpsL2Params mGpsL2Params;
+
+ /** Clock model. */
+ @NonNull private final GpsSatelliteClockModel mSatelliteClockModel;
+
+ /** Orbit model. */
+ @NonNull private final KeplerianOrbitModel mSatelliteOrbitModel;
+
+ /** Satellite health. */
+ @NonNull private final GpsSatelliteHealth mSatelliteHealth;
+
+ /** Ephemeris time. */
+ @NonNull private final SatelliteEphemerisTime mSatelliteEphemerisTime;
+
+ /** Returns the PRN of the satellite. */
+ @IntRange(from = 183, to = 206)
+ public int getPrn() {
+ return mPrn;
+ }
+
+ /** Returns the L2 parameters of the satellite. */
+ @NonNull
+ public GpsL2Params getGpsL2Params() {
+ return mGpsL2Params;
+ }
+
+ /** Returns the clock model of the satellite. */
+ @NonNull
+ public GpsSatelliteClockModel getSatelliteClockModel() {
+ return mSatelliteClockModel;
+ }
+
+ /** Returns the orbit model of the satellite. */
+ @NonNull
+ public KeplerianOrbitModel getSatelliteOrbitModel() {
+ return mSatelliteOrbitModel;
+ }
+
+ /** Returns the satellite health. */
+ @NonNull
+ public GpsSatelliteHealth getSatelliteHealth() {
+ return mSatelliteHealth;
+ }
+
+ /** Returns the ephemeris time. */
+ @NonNull
+ public SatelliteEphemerisTime getSatelliteEphemerisTime() {
+ return mSatelliteEphemerisTime;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mPrn);
+ parcel.writeTypedObject(mGpsL2Params, flags);
+ parcel.writeTypedObject(mSatelliteClockModel, flags);
+ parcel.writeTypedObject(mSatelliteOrbitModel, flags);
+ parcel.writeTypedObject(mSatelliteHealth, flags);
+ parcel.writeTypedObject(mSatelliteEphemerisTime, flags);
+ }
+
+ private QzssSatelliteEphemeris(Builder builder) {
+ // Allow PRN beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(builder.mPrn >= 1);
+ Preconditions.checkNotNull(builder.mGpsL2Params, "GpsL2Params cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteClockModel,
+ "SatelliteClockModel cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteOrbitModel,
+ "SatelliteOrbitModel cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteHealth,
+ "SatelliteHealth cannot be null");
+ Preconditions.checkNotNull(builder.mSatelliteEphemerisTime,
+ "SatelliteEphemerisTime cannot be null");
+ mPrn = builder.mPrn;
+ mGpsL2Params = builder.mGpsL2Params;
+ mSatelliteClockModel = builder.mSatelliteClockModel;
+ mSatelliteOrbitModel = builder.mSatelliteOrbitModel;
+ mSatelliteHealth = builder.mSatelliteHealth;
+ mSatelliteEphemerisTime = builder.mSatelliteEphemerisTime;
+ }
+
+ public static final @NonNull Creator<QzssSatelliteEphemeris> CREATOR =
+ new Creator<QzssSatelliteEphemeris>() {
+ @Override
+ @NonNull
+ public QzssSatelliteEphemeris createFromParcel(Parcel in) {
+ final QzssSatelliteEphemeris.Builder qzssSatelliteEphemeris =
+ new Builder()
+ .setPrn(in.readInt())
+ .setGpsL2Params(in.readTypedObject(GpsL2Params.CREATOR))
+ .setSatelliteClockModel(
+ in.readTypedObject(GpsSatelliteClockModel.CREATOR))
+ .setSatelliteOrbitModel(
+ in.readTypedObject(KeplerianOrbitModel.CREATOR))
+ .setSatelliteHealth(
+ in.readTypedObject(GpsSatelliteHealth.CREATOR))
+ .setSatelliteEphemerisTime(
+ in.readTypedObject(SatelliteEphemerisTime.CREATOR));
+ return qzssSatelliteEphemeris.build();
+ }
+
+ @Override
+ public QzssSatelliteEphemeris[] newArray(int size) {
+ return new QzssSatelliteEphemeris[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("QzssSatelliteEphemeris[");
+ builder.append("prn=").append(mPrn);
+ builder.append(", gpsL2Params=").append(mGpsL2Params);
+ builder.append(", satelliteClockModel=").append(mSatelliteClockModel);
+ builder.append(", satelliteOrbitModel=").append(mSatelliteOrbitModel);
+ builder.append(", satelliteHealth=").append(mSatelliteHealth);
+ builder.append(", satelliteEphemerisTime=").append(mSatelliteEphemerisTime);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link QzssSatelliteEphemeris}. */
+ public static final class Builder {
+ private int mPrn;
+ private GpsL2Params mGpsL2Params;
+ private GpsSatelliteClockModel mSatelliteClockModel;
+ private KeplerianOrbitModel mSatelliteOrbitModel;
+ private GpsSatelliteHealth mSatelliteHealth;
+ private SatelliteEphemerisTime mSatelliteEphemerisTime;
+
+ /** Sets the PRN of the satellite. */
+ @NonNull
+ public Builder setPrn(@IntRange(from = 183, to = 206) int prn) {
+ mPrn = prn;
+ return this;
+ }
+
+ /** Sets the L2 parameters of the satellite. */
+ @NonNull
+ public Builder setGpsL2Params(@NonNull GpsL2Params gpsL2Params) {
+ mGpsL2Params = gpsL2Params;
+ return this;
+ }
+
+ /** Sets the clock model of the satellite. */
+ @NonNull
+ public Builder setSatelliteClockModel(@NonNull GpsSatelliteClockModel satelliteClockModel) {
+ mSatelliteClockModel = satelliteClockModel;
+ return this;
+ }
+
+ /** Sets the orbit model of the satellite. */
+ @NonNull
+ public Builder setSatelliteOrbitModel(@NonNull KeplerianOrbitModel satelliteOrbitModel) {
+ mSatelliteOrbitModel = satelliteOrbitModel;
+ return this;
+ }
+
+ /** Sets the satellite health. */
+ @NonNull
+ public Builder setSatelliteHealth(@NonNull GpsSatelliteHealth satelliteHealth) {
+ mSatelliteHealth = satelliteHealth;
+ return this;
+ }
+
+ /** Sets the ephemeris time. */
+ @NonNull
+ public Builder setSatelliteEphemerisTime(
+ @NonNull SatelliteEphemerisTime satelliteEphemerisTime) {
+ mSatelliteEphemerisTime = satelliteEphemerisTime;
+ return this;
+ }
+
+ /** Builds a {@link QzssSatelliteEphemeris} instance as specified by this builder. */
+ @NonNull
+ public QzssSatelliteEphemeris build() {
+ return new QzssSatelliteEphemeris(this);
+ }
+ }
+}
diff --git a/location/java/android/location/RealTimeIntegrityModel.java b/location/java/android/location/RealTimeIntegrityModel.java
new file mode 100644
index 000000000000..d268926e56e2
--- /dev/null
+++ b/location/java/android/location/RealTimeIntegrityModel.java
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A class contains the real time integrity status of a GNSS satellite based on notice advisory.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class RealTimeIntegrityModel implements Parcelable {
+ /**
+ * Pseudo-random or satellite ID number for the satellite,
+ * a.k.a. Space Vehicle (SV), or OSN number for Glonass.
+ *
+ * <p>The distinction is made by looking at the constellation field. Values
+ * must be in the range of:
+ *
+ * <p> - GPS: 1-32
+ * <p> - GLONASS: 1-25
+ * <p> - QZSS: 183-206
+ * <p> - Galileo: 1-36
+ * <p> - Beidou: 1-63
+ */
+ private final int mSvid;
+
+ /** Indicates whether the satellite is currently usable for navigation. */
+ private final boolean mUsable;
+
+ /** UTC timestamp (in seconds) when the advisory was published. */
+ private final long mPublishDateSeconds;
+
+ /** UTC timestamp (in seconds) for the start of the event. */
+ private final long mStartDateSeconds;
+
+ /** UTC timestamp (in seconds) for the end of the event. */
+ private final long mEndDateSeconds;
+
+ /**
+ * Abbreviated type of the advisory, providing a concise summary of the event.
+ *
+ * <p>This field follows different definitions depending on the GNSS constellation:
+ * <p> - GPS: See NANU type definitions(https://www.navcen.uscg.gov/nanu-abbreviations-and-descriptions)
+ * <p> - Galileo: See NAGU type definitions(https://www.gsc-europa.eu/system-service-status/nagu-information)
+ * <p> - QZSS: See NAQU type definitions](https://sys.qzss.go.jp/dod/en/naqu/type.html)
+ * <p> - BeiDou: Not used; set to an empty string.
+ */
+ @NonNull private final String mAdvisoryType;
+
+ /**
+ * Unique identifier for the advisory within its constellation's system.
+ *
+ * <p>For BeiDou, this is not used and should be an empty string.
+ */
+ @NonNull private final String mAdvisoryNumber;
+
+ private RealTimeIntegrityModel(Builder builder) {
+ // Allow SV ID beyond the range to support potential future extensibility.
+ Preconditions.checkArgument(builder.mSvid >= 1);
+ Preconditions.checkArgument(builder.mPublishDateSeconds > 0);
+ Preconditions.checkArgument(builder.mStartDateSeconds > 0);
+ Preconditions.checkArgument(builder.mEndDateSeconds > 0);
+ Preconditions.checkNotNull(builder.mAdvisoryType, "AdvisoryType cannot be null");
+ Preconditions.checkNotNull(builder.mAdvisoryNumber, "AdvisoryNumber cannot be null");
+ mSvid = builder.mSvid;
+ mUsable = builder.mUsable;
+ mPublishDateSeconds = builder.mPublishDateSeconds;
+ mStartDateSeconds = builder.mStartDateSeconds;
+ mEndDateSeconds = builder.mEndDateSeconds;
+ mAdvisoryType = builder.mAdvisoryType;
+ mAdvisoryNumber = builder.mAdvisoryNumber;
+ }
+
+ /**
+ * Returns the Pseudo-random or satellite ID number for the satellite,
+ * a.k.a. Space Vehicle (SV), or OSN number for Glonass.
+ *
+ * <p>The distinction is made by looking at the constellation field. Values
+ * must be in the range of:
+ *
+ * <p> - GPS: 1-32
+ * <p> - GLONASS: 1-25
+ * <p> - QZSS: 183-206
+ * <p> - Galileo: 1-36
+ * <p> - Beidou: 1-63
+ */
+ @IntRange(from = 1, to = 206)
+ public int getSvid() {
+ return mSvid;
+ }
+
+ /** Returns whether the satellite is usable or not. */
+ public boolean isUsable() {
+ return mUsable;
+ }
+
+ /** Returns the UTC timestamp (in seconds) when the advisory was published */
+ @IntRange(from = 0)
+ public long getPublishDateSeconds() {
+ return mPublishDateSeconds;
+ }
+
+ /** Returns UTC timestamp (in seconds) for the start of the event. */
+ @IntRange(from = 0)
+ public long getStartDateSeconds() {
+ return mStartDateSeconds;
+ }
+
+ /** Returns UTC timestamp (in seconds) for the end of the event. */
+ @IntRange(from = 0)
+ public long getEndDateSeconds() {
+ return mEndDateSeconds;
+ }
+
+ /** Returns the abbreviated type of notice advisory. */
+ @NonNull
+ public String getAdvisoryType() {
+ return mAdvisoryType;
+ }
+
+ /** Returns the unique identifier for the advisory. */
+ @NonNull
+ public String getAdvisoryNumber() {
+ return mAdvisoryNumber;
+ }
+
+ public static final @NonNull Creator<RealTimeIntegrityModel> CREATOR =
+ new Creator<RealTimeIntegrityModel>() {
+ @Override
+ @NonNull
+ public RealTimeIntegrityModel createFromParcel(Parcel in) {
+ RealTimeIntegrityModel realTimeIntegrityModel =
+ new RealTimeIntegrityModel.Builder()
+ .setSvid(in.readInt())
+ .setUsable(in.readBoolean())
+ .setPublishDateSeconds(in.readLong())
+ .setStartDateSeconds(in.readLong())
+ .setEndDateSeconds(in.readLong())
+ .setAdvisoryType(in.readString8())
+ .setAdvisoryNumber(in.readString8())
+ .build();
+ return realTimeIntegrityModel;
+ }
+
+ @Override
+ public RealTimeIntegrityModel[] newArray(int size) {
+ return new RealTimeIntegrityModel[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mSvid);
+ parcel.writeBoolean(mUsable);
+ parcel.writeLong(mPublishDateSeconds);
+ parcel.writeLong(mStartDateSeconds);
+ parcel.writeLong(mEndDateSeconds);
+ parcel.writeString8(mAdvisoryType);
+ parcel.writeString8(mAdvisoryNumber);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("RealTimeIntegrityModel[");
+ builder.append("svid = ").append(mSvid);
+ builder.append(", usable = ").append(mUsable);
+ builder.append(", publishDateSeconds = ").append(mPublishDateSeconds);
+ builder.append(", startDateSeconds = ").append(mStartDateSeconds);
+ builder.append(", endDateSeconds = ").append(mEndDateSeconds);
+ builder.append(", advisoryType = ").append(mAdvisoryType);
+ builder.append(", advisoryNumber = ").append(mAdvisoryNumber);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link RealTimeIntegrityModel} */
+ public static final class Builder {
+ private int mSvid;
+ private boolean mUsable;
+ private long mPublishDateSeconds;
+ private long mStartDateSeconds;
+ private long mEndDateSeconds;
+ private String mAdvisoryType;
+ private String mAdvisoryNumber;
+
+ /**
+ * Sets the Pseudo-random or satellite ID number for the satellite,
+ * a.k.a. Space Vehicle (SV), or OSN number for Glonass.
+ *
+ * <p>The distinction is made by looking at the constellation field. Values
+ * must be in the range of:
+ *
+ * <p> - GPS: 1-32
+ * <p> - GLONASS: 1-25
+ * <p> - QZSS: 183-206
+ * <p> - Galileo: 1-36
+ * <p> - Beidou: 1-63
+ */
+ @NonNull
+ public Builder setSvid(@IntRange(from = 1, to = 206) int svid) {
+ mSvid = svid;
+ return this;
+ }
+
+ /** Sets whether the satellite is usable or not. */
+ @NonNull
+ public Builder setUsable(boolean usable) {
+ mUsable = usable;
+ return this;
+ }
+
+ /** Sets the UTC timestamp (in seconds) when the advisory was published. */
+ @NonNull
+ public Builder setPublishDateSeconds(@IntRange(from = 0) long publishDateSeconds) {
+ mPublishDateSeconds = publishDateSeconds;
+ return this;
+ }
+
+ /** Sets the UTC timestamp (in seconds) for the start of the event. */
+ @NonNull
+ public Builder setStartDateSeconds(@IntRange(from = 0) long startDateSeconds) {
+ mStartDateSeconds = startDateSeconds;
+ return this;
+ }
+
+ /** Sets the UTC timestamp (in seconds) for the end of the event. */
+ @NonNull
+ public Builder setEndDateSeconds(@IntRange(from = 0) long endDateSeconds) {
+ mEndDateSeconds = endDateSeconds;
+ return this;
+ }
+
+ /** Sets the abbreviated type of notice advisory. */
+ @NonNull
+ public Builder setAdvisoryType(@NonNull String advisoryType) {
+ mAdvisoryType = advisoryType;
+ return this;
+ }
+
+ /** Sets the unique identifier for the advisory. */
+ @NonNull
+ public Builder setAdvisoryNumber(@NonNull String advisoryNumber) {
+ mAdvisoryNumber = advisoryNumber;
+ return this;
+ }
+
+ /** Builds a {@link RealTimeIntegrityModel} instance as specified by this builder. */
+ @NonNull
+ public RealTimeIntegrityModel build() {
+ return new RealTimeIntegrityModel(this);
+ }
+ }
+}
diff --git a/location/java/android/location/SatelliteEphemerisTime.java b/location/java/android/location/SatelliteEphemerisTime.java
new file mode 100644
index 000000000000..0ab3acfe3147
--- /dev/null
+++ b/location/java/android/location/SatelliteEphemerisTime.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A class contains time of ephemeris for GPS, Galileo, and QZSS.
+ *
+ * <p>For GPS, this is defined in IS-GPS-200, section 20.3.3.4.1.
+ * <p>For Galileo, this is defined in Galileo-OS-SIS-ICD, section 5.1.2, 5.1.9.2.
+ * <p>For QZSS, this is defined in IS-QZSS-200, section 4.1.2.4.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class SatelliteEphemerisTime implements Parcelable {
+ /** The issue of ephemeris data. */
+ private final int mIode;
+
+ /** The satellite week number without rollover. */
+ private final int mWeekNumber;
+
+ /** The broadcast time of ephemeris in GNSS time of week in seconds. */
+ private final int mToeSeconds;
+
+ private SatelliteEphemerisTime(Builder builder) {
+ Preconditions.checkArgumentInRange(builder.mIode, 0, 1023, "Iode");
+ Preconditions.checkArgument(builder.mWeekNumber >= 0);
+ Preconditions.checkArgumentInRange(builder.mToeSeconds, 0, 604799, "ToeSeconds");
+ mIode = builder.mIode;
+ mWeekNumber = builder.mWeekNumber;
+ mToeSeconds = builder.mToeSeconds;
+ }
+
+ /** Returns the issue of ephemeris data. */
+ @IntRange(from = 0, to = 1023)
+ public int getIode() {
+ return mIode;
+ }
+
+ /** Returns the satellite week number without rollover. */
+ @IntRange(from = 0)
+ public int getWeekNumber() {
+ return mWeekNumber;
+ }
+
+ /** Returns the broadcast time of ephemeris in GNSS time of week in seconds. */
+ @IntRange(from = 0, to = 604799)
+ public int getToeSeconds() {
+ return mToeSeconds;
+ }
+
+ public static final @NonNull Creator<SatelliteEphemerisTime> CREATOR =
+ new Creator<SatelliteEphemerisTime>() {
+ @Override
+ public SatelliteEphemerisTime createFromParcel(Parcel in) {
+ final SatelliteEphemerisTime.Builder satelliteEphemerisTime =
+ new Builder()
+ .setIode(in.readInt())
+ .setWeekNumber(in.readInt())
+ .setToeSeconds(in.readInt());
+ return satelliteEphemerisTime.build();
+ }
+
+ @Override
+ public SatelliteEphemerisTime[] newArray(int size) {
+ return new SatelliteEphemerisTime[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mIode);
+ parcel.writeInt(mWeekNumber);
+ parcel.writeInt(mToeSeconds);
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("SatelliteEphemerisTime[");
+ builder.append("iode = ").append(mIode);
+ builder.append(", weekNumber = ").append(mWeekNumber);
+ builder.append(", toeSeconds = ").append(mToeSeconds);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /** Builder for {@link SatelliteEphemerisTime}. */
+ public static final class Builder {
+ private int mIode;
+ private int mWeekNumber;
+ private int mToeSeconds;
+
+ /** Sets the issue of ephemeris data. */
+ @NonNull
+ public Builder setIode(@IntRange(from = 0, to = 1023) int iode) {
+ mIode = iode;
+ return this;
+ }
+
+ /** Sets the satellite week number without rollover. */
+ @NonNull
+ public Builder setWeekNumber(@IntRange(from = 0) int weekNumber) {
+ mWeekNumber = weekNumber;
+ return this;
+ }
+
+ /** Sets the broadcast time of ephemeris in GNSS time of week in seconds. */
+ @NonNull
+ public Builder setToeSeconds(@IntRange(from = 0, to = 604799) int toeSeconds) {
+ mToeSeconds = toeSeconds;
+ return this;
+ }
+
+ /** Builds a {@link SatelliteEphemerisTime} instance as specified by this builder. */
+ @NonNull
+ public SatelliteEphemerisTime build() {
+ return new SatelliteEphemerisTime(this);
+ }
+ }
+}
diff --git a/location/java/android/location/TimeModel.java b/location/java/android/location/TimeModel.java
new file mode 100644
index 000000000000..380f7b87d8f6
--- /dev/null
+++ b/location/java/android/location/TimeModel.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.GnssStatus.ConstellationType;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A class contains the GNSS-GNSS system time offset between the GNSS system time.
+ *
+ * <p>This is defined in IS-GPS-200 section 30.3.3.8.2.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class TimeModel implements Parcelable {
+ /*
+ * Model represents parameters to convert from current GNSS to GNSS system
+ * time indicated by toGnss.
+ */
+ private final @ConstellationType int mToGnss;
+
+ /** Bias coefficient of GNSS time scale relative to GNSS time scale in seconds. */
+ private final double mA0;
+
+ /** Drift coefficient of GNSS time scale relative to GNSS time scale in seconds per second. */
+ private final double mA1;
+
+ /** GNSS time of week in seconds. */
+ private final int mTimeOfWeek;
+
+ /** Week number of the GNSS time. */
+ private final int mWeekNumber;
+
+ private TimeModel(Builder builder) {
+ Preconditions.checkArgumentInRange(
+ builder.mToGnss,
+ GnssStatus.CONSTELLATION_UNKNOWN,
+ GnssStatus.CONSTELLATION_COUNT,
+ "ToGnss");
+ Preconditions.checkArgumentInRange(builder.mA0, -1.0f, 1.0f, "A0");
+ Preconditions.checkArgumentInRange(builder.mA1, -3.28e-6f, 3.28e-6f, "A1");
+ Preconditions.checkArgumentInRange(builder.mTimeOfWeek, 0, 604800, "TimeOfWeek");
+ Preconditions.checkArgument(builder.mWeekNumber >= 0);
+ mToGnss = builder.mToGnss;
+ mA0 = builder.mA0;
+ mA1 = builder.mA1;
+ mTimeOfWeek = builder.mTimeOfWeek;
+ mWeekNumber = builder.mWeekNumber;
+ }
+
+ /** Returns the constellation type to convert from current GNSS system time. */
+ @ConstellationType
+ public int getToGnss() {
+ return mToGnss;
+ }
+
+ /** Returns the bias coefficient of GNSS time scale relative to GNSS time scale in seconds. */
+ @FloatRange(from = -1.0f, to = 1.0f)
+ public double getA0() {
+ return mA0;
+ }
+
+ /**
+ * Returns the drift coefficient of GNSS time scale relative to GNSS time scale in seconds per
+ * second.
+ */
+ @FloatRange(from = -3.28e-6f, to = 3.28e-6f)
+ public double getA1() {
+ return mA1;
+ }
+
+ /** Returns the GNSS time of week in seconds. */
+ @IntRange(from = 0, to = 604800)
+ public int getTimeOfWeek() {
+ return mTimeOfWeek;
+ }
+
+ /** Returns the week number of the GNSS time. */
+ @IntRange(from = 0)
+ public int getWeekNumber() {
+ return mWeekNumber;
+ }
+
+ public static final @NonNull Creator<TimeModel> CREATOR =
+ new Creator<TimeModel>() {
+ @Override
+ public TimeModel createFromParcel(@NonNull Parcel source) {
+ return new TimeModel.Builder()
+ .setToGnss(source.readInt())
+ .setA0(source.readDouble())
+ .setA1(source.readDouble())
+ .setTimeOfWeek(source.readInt())
+ .setWeekNumber(source.readInt())
+ .build();
+ }
+
+ @Override
+ public TimeModel[] newArray(int size) {
+ return new TimeModel[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("TimeModel[");
+ builder.append("toGnss = ").append(mToGnss);
+ builder.append(", a0 = ").append(mA0);
+ builder.append(", a1 = ").append(mA1);
+ builder.append(", timeOfWeek = ").append(mTimeOfWeek);
+ builder.append(", weekNumber = ").append(mWeekNumber);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(mToGnss);
+ dest.writeDouble(mA0);
+ dest.writeDouble(mA1);
+ dest.writeInt(mTimeOfWeek);
+ dest.writeInt(mWeekNumber);
+ }
+
+ /** Builder for {@link TimeModel} */
+ public static final class Builder {
+
+ private @ConstellationType int mToGnss;
+ private double mA0;
+ private double mA1;
+ private int mTimeOfWeek;
+ private int mWeekNumber;
+
+ /** Sets the constellation type to convert from current GNSS system time. */
+ @NonNull
+ public Builder setToGnss(@ConstellationType int toGnss) {
+ mToGnss = toGnss;
+ return this;
+ }
+
+ /** Sets the bias coefficient of GNSS time scale relative to GNSS time scale in seconds. */
+ @NonNull
+ public Builder setA0(@FloatRange(from = -1.0f, to = 1.0f) double a0) {
+ mA0 = a0;
+ return this;
+ }
+
+ /**
+ * Sets the drift coefficient of GNSS time scale relative to GNSS time scale in seconds per
+ * second.
+ */
+ @NonNull
+ public Builder setA1(@FloatRange(from = -3.28e-6f, to = 3.28e-6f) double a1) {
+ mA1 = a1;
+ return this;
+ }
+
+ /** Sets the GNSS time of week in seconds. */
+ @NonNull
+ public Builder setTimeOfWeek(@IntRange(from = 0, to = 604800) int timeOfWeek) {
+ mTimeOfWeek = timeOfWeek;
+ return this;
+ }
+
+ /** Sets the week number of the GNSS time. */
+ @NonNull
+ public Builder setWeekNumber(@IntRange(from = 0) int weekNumber) {
+ mWeekNumber = weekNumber;
+ return this;
+ }
+
+ /** Builds the {@link TimeModel} object. */
+ @NonNull
+ public TimeModel build() {
+ return new TimeModel(this);
+ }
+ }
+}
diff --git a/location/java/android/location/UtcModel.java b/location/java/android/location/UtcModel.java
new file mode 100644
index 000000000000..6dc633de3fcb
--- /dev/null
+++ b/location/java/android/location/UtcModel.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2024 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 android.location;
+
+import android.annotation.FlaggedApi;
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.location.flags.Flags;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A class contains parameters to convert from current GNSS time to UTC time.
+ *
+ * <p>This is defined in RINEX 3.05 "TIME SYSTEM CORR" in table A5.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
+@SystemApi
+public final class UtcModel implements Parcelable {
+ /** Bias coefficient of GNSS time scale relative to UTC time scale in seconds. */
+ private final double mA0;
+
+ /** Drift coefficient of GNSS time scale relative to UTC time scale in seconds per second. */
+ private final double mA1;
+
+ /** Reference GNSS time of week in seconds. */
+ private final int mTimeOfWeek;
+
+ /** Reference GNSS week number. */
+ private final int mWeekNumber;
+
+ private UtcModel(Builder builder) {
+ Preconditions.checkArgumentInRange(builder.mA0, -2.0f, 2.0f, "A0");
+ Preconditions.checkArgumentInRange(builder.mA1, -7.45e-9f, 7.45e-9f, "A1");
+ Preconditions.checkArgumentInRange(builder.mTimeOfWeek, 0, 604800, "TimeOfWeek");
+ Preconditions.checkArgument(builder.mWeekNumber >= 0);
+ mA0 = builder.mA0;
+ mA1 = builder.mA1;
+ mTimeOfWeek = builder.mTimeOfWeek;
+ mWeekNumber = builder.mWeekNumber;
+ }
+
+ /** Returns the bias coefficient of GNSS time scale relative to UTC time scale in seconds. */
+ @FloatRange(from = -2.0f, to = 2.0f)
+ public double getA0() {
+ return mA0;
+ }
+
+ /**
+ * Returns the drift coefficient of GNSS time scale relative to UTC time scale in seconds per
+ * second.
+ */
+ @FloatRange(from = -7.45e-9f, to = 7.45e-9f)
+ public double getA1() {
+ return mA1;
+ }
+
+ /** Returns the reference GNSS time of week in seconds. */
+ @IntRange(from = 0, to = 604800)
+ public int getTimeOfWeek() {
+ return mTimeOfWeek;
+ }
+
+ /** Returns the reference GNSS week number. */
+ @IntRange(from = 0)
+ public int getWeekNumber() {
+ return mWeekNumber;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+ @Override
+ @NonNull
+ public String toString() {
+ StringBuilder builder = new StringBuilder("UtcModel[");
+ builder.append("a0 = ").append(mA0);
+ builder.append(", a1 = ").append(mA1);
+ builder.append(", timeOfWeek = ").append(mTimeOfWeek);
+ builder.append(", weekNumber = ").append(mWeekNumber);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeDouble(mA0);
+ dest.writeDouble(mA1);
+ dest.writeInt(mTimeOfWeek);
+ dest.writeInt(mWeekNumber);
+ }
+
+ public static final @NonNull Creator<UtcModel> CREATOR =
+ new Creator<UtcModel>() {
+ @Override
+ public UtcModel createFromParcel(@NonNull Parcel source) {
+ return new UtcModel.Builder()
+ .setA0(source.readDouble())
+ .setA1(source.readDouble())
+ .setTimeOfWeek(source.readInt())
+ .setWeekNumber(source.readInt())
+ .build();
+ }
+
+ @Override
+ public UtcModel[] newArray(int size) {
+ return new UtcModel[size];
+ }
+ };
+
+ /** Builder for {@link UtcModel}. */
+ public static final class Builder {
+ private double mA0;
+ private double mA1;
+ private int mTimeOfWeek;
+ private int mWeekNumber;
+
+ /** Sets the bias coefficient of GNSS time scale relative to UTC time scale in seconds. */
+ @NonNull
+ public Builder setA0(@FloatRange(from = -2.0f, to = 2.0f) double a0) {
+ mA0 = a0;
+ return this;
+ }
+
+ /**
+ * Sets the drift coefficient of GNSS time scale relative to UTC time scale in seconds per
+ * second.
+ */
+ @NonNull
+ public Builder setA1(@FloatRange(from = -7.45e-9f, to = 7.45e-9f) double a1) {
+ mA1 = a1;
+ return this;
+ }
+
+ /** Sets the reference GNSS time of week in seconds. */
+ @NonNull
+ public Builder setTimeOfWeek(@IntRange(from = 0, to = 604800) int timeOfWeek) {
+ mTimeOfWeek = timeOfWeek;
+ return this;
+ }
+
+ /** Sets the reference GNSS week number. */
+ @NonNull
+ public Builder setWeekNumber(@IntRange(from = 0) int weekNumber) {
+ mWeekNumber = weekNumber;
+ return this;
+ }
+
+ /** Builds a {@link UtcModel} instance as specified by this builder. */
+ @NonNull
+ public UtcModel build() {
+ return new UtcModel(this);
+ }
+ }
+}
diff --git a/location/java/android/location/flags/location.aconfig b/location/java/android/location/flags/location.aconfig
index 24e1d32164d0..8cee2679c20c 100644
--- a/location/java/android/location/flags/location.aconfig
+++ b/location/java/android/location/flags/location.aconfig
@@ -155,3 +155,10 @@ flag {
description: "Flag for gating the density-based coarse locations"
bug: "376198890"
}
+
+flag {
+ name: "gnss_assistance_interface"
+ namespace: "location"
+ description: "Flag for GNSS assistance interface"
+ bug: "209078566"
+} \ No newline at end of file