diff options
-rw-r--r-- | core/api/system-current.txt | 11 | ||||
-rw-r--r-- | location/java/android/location/SatellitePvt.java | 111 | ||||
-rw-r--r-- | services/core/jni/gnss/GnssMeasurementCallback.cpp | 41 |
3 files changed, 127 insertions, 36 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index d30d59f70736..34ea8aa3b18e 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -4996,11 +4996,15 @@ package android.location { public final class SatellitePvt implements android.os.Parcelable { method public int describeContents(); - method @NonNull public android.location.SatellitePvt.ClockInfo getClockInfo(); + method @Nullable public android.location.SatellitePvt.ClockInfo getClockInfo(); + method public int getFlags(); method @FloatRange public double getIonoDelayMeters(); - method @NonNull public android.location.SatellitePvt.PositionEcef getPositionEcef(); + method @Nullable public android.location.SatellitePvt.PositionEcef getPositionEcef(); method @FloatRange public double getTropoDelayMeters(); - method @NonNull public android.location.SatellitePvt.VelocityEcef getVelocityEcef(); + method @Nullable public android.location.SatellitePvt.VelocityEcef getVelocityEcef(); + method public boolean hasIono(); + method public boolean hasPositionVelocityClockInfo(); + method public boolean hasTropo(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.location.SatellitePvt> CREATOR; } @@ -5009,6 +5013,7 @@ package android.location { ctor public SatellitePvt.Builder(); method @NonNull public android.location.SatellitePvt build(); method @NonNull public android.location.SatellitePvt.Builder setClockInfo(@NonNull android.location.SatellitePvt.ClockInfo); + method @NonNull public android.location.SatellitePvt.Builder setFlags(int); method @NonNull public android.location.SatellitePvt.Builder setIonoDelayMeters(@FloatRange double); method @NonNull public android.location.SatellitePvt.Builder setPositionEcef(@NonNull android.location.SatellitePvt.PositionEcef); method @NonNull public android.location.SatellitePvt.Builder setTropoDelayMeters(@FloatRange double); diff --git a/location/java/android/location/SatellitePvt.java b/location/java/android/location/SatellitePvt.java index 1456f74ef6d4..bb9ae6e661ef 100644 --- a/location/java/android/location/SatellitePvt.java +++ b/location/java/android/location/SatellitePvt.java @@ -45,8 +45,41 @@ import android.os.Parcelable; */ @SystemApi public final class SatellitePvt implements Parcelable { + /** + * Bit mask for {@link #mFlags} indicating valid satellite position, velocity and clock info + * fields are stored in the SatellitePvt. + */ + private static final int HAS_POSITION_VELOCITY_CLOCK_INFO = 1 << 0; + + /** + * Bit mask for {@link #mFlags} indicating a valid iono delay field is stored in the + * SatellitePvt. + */ + private static final int HAS_IONO = 1 << 1; + + /** + * Bit mask for {@link #mFlags} indicating a valid tropo delay field is stored in the + * SatellitePvt. + */ + private static final int HAS_TROPO = 1 << 2; + + /** + * A bitfield of flags indicating the validity of the fields in this SatellitePvt. + * The bit masks are defined in the constants with prefix HAS_* + * + * <p>Fields for which there is no corresponding flag must be filled in with a valid value. + * For convenience, these are marked as mandatory. + * + * <p>Others fields may have invalid information in them, if not marked as valid by the + * corresponding bit in flags. + */ + private final int mFlags; + + @Nullable private final PositionEcef mPositionEcef; + @Nullable private final VelocityEcef mVelocityEcef; + @Nullable private final ClockInfo mClockInfo; private final double mIonoDelayMeters; private final double mTropoDelayMeters; @@ -351,20 +384,13 @@ public final class SatellitePvt implements Parcelable { } private SatellitePvt( - @NonNull PositionEcef positionEcef, - @NonNull VelocityEcef velocityEcef, - @NonNull ClockInfo clockInfo, + int flags, + @Nullable PositionEcef positionEcef, + @Nullable VelocityEcef velocityEcef, + @Nullable ClockInfo clockInfo, double ionoDelayMeters, double tropoDelayMeters) { - if (positionEcef == null) { - throw new IllegalArgumentException("Position Ecef cannot be null."); - } - if (velocityEcef == null) { - throw new IllegalArgumentException("Velocity Ecef cannot be null."); - } - if (clockInfo == null) { - throw new IllegalArgumentException("Clock Info cannot be null."); - } + mFlags = flags; mPositionEcef = positionEcef; mVelocityEcef = velocityEcef; mClockInfo = clockInfo; @@ -373,10 +399,17 @@ public final class SatellitePvt implements Parcelable { } /** + * Gets a bitmask of fields present in this object + */ + public int getFlags() { + return mFlags; + } + + /** * Returns a {@link PositionEcef} object that contains estimates of the satellite * position fields in ECEF coordinate frame. */ - @NonNull + @Nullable public PositionEcef getPositionEcef() { return mPositionEcef; } @@ -385,7 +418,7 @@ public final class SatellitePvt implements Parcelable { * Returns a {@link VelocityEcef} object that contains estimates of the satellite * velocity fields in the ECEF coordinate frame. */ - @NonNull + @Nullable public VelocityEcef getVelocityEcef() { return mVelocityEcef; } @@ -394,7 +427,7 @@ public final class SatellitePvt implements Parcelable { * Returns a {@link ClockInfo} object that contains estimates of the satellite * clock info. */ - @NonNull + @Nullable public ClockInfo getClockInfo() { return mClockInfo; } @@ -415,11 +448,29 @@ public final class SatellitePvt implements Parcelable { return mTropoDelayMeters; } + /** Returns {@code true} if {@link #getPositionEcef()}, {@link #getVelocityEcef()}, + * and {@link #getClockInfo()} are valid. + */ + public boolean hasPositionVelocityClockInfo() { + return (mFlags & HAS_POSITION_VELOCITY_CLOCK_INFO) != 0; + } + + /** Returns {@code true} if {@link #getIonoDelayMeters()} is valid. */ + public boolean hasIono() { + return (mFlags & HAS_IONO) != 0; + } + + /** Returns {@code true} if {@link #getTropoDelayMeters()} is valid. */ + public boolean hasTropo() { + return (mFlags & HAS_TROPO) != 0; + } + public static final @android.annotation.NonNull Creator<SatellitePvt> CREATOR = new Creator<SatellitePvt>() { @Override @Nullable public SatellitePvt createFromParcel(Parcel in) { + int flags = in.readInt(); ClassLoader classLoader = getClass().getClassLoader(); PositionEcef positionEcef = in.readParcelable(classLoader); VelocityEcef velocityEcef = in.readParcelable(classLoader); @@ -428,6 +479,7 @@ public final class SatellitePvt implements Parcelable { double tropoDelayMeters = in.readDouble(); return new SatellitePvt( + flags, positionEcef, velocityEcef, clockInfo, @@ -448,6 +500,7 @@ public final class SatellitePvt implements Parcelable { @Override public void writeToParcel(@NonNull Parcel parcel, int flags) { + parcel.writeInt(mFlags); parcel.writeParcelable(mPositionEcef, flags); parcel.writeParcelable(mVelocityEcef, flags); parcel.writeParcelable(mClockInfo, flags); @@ -458,7 +511,8 @@ public final class SatellitePvt implements Parcelable { @Override public String toString() { return "SatellitePvt{" - + "PositionEcef=" + mPositionEcef + + "Flags=" + mFlags + + ", PositionEcef=" + mPositionEcef + ", VelocityEcef=" + mVelocityEcef + ", ClockInfo=" + mClockInfo + ", IonoDelayMeters=" + mIonoDelayMeters @@ -470,13 +524,30 @@ public final class SatellitePvt implements Parcelable { * Builder class for SatellitePvt. */ public static final class Builder { - private PositionEcef mPositionEcef; - private VelocityEcef mVelocityEcef; - private ClockInfo mClockInfo; + /** + * For documentation of below fields, see corresponding fields in {@link + * SatellitePvt}. + */ + private int mFlags; + @Nullable private PositionEcef mPositionEcef; + @Nullable private VelocityEcef mVelocityEcef; + @Nullable private ClockInfo mClockInfo; private double mIonoDelayMeters; private double mTropoDelayMeters; /** + * Sets a bitmask of fields present in this object + * + * @param flags int flags + * @return Builder builder object + */ + @NonNull + public Builder setFlags(int flags) { + mFlags = flags; + return this; + } + + /** * Set position ECEF. * * @param positionEcef position ECEF object @@ -546,7 +617,7 @@ public final class SatellitePvt implements Parcelable { */ @NonNull public SatellitePvt build() { - return new SatellitePvt(mPositionEcef, mVelocityEcef, mClockInfo, + return new SatellitePvt(mFlags, mPositionEcef, mVelocityEcef, mClockInfo, mIonoDelayMeters, mTropoDelayMeters); } } diff --git a/services/core/jni/gnss/GnssMeasurementCallback.cpp b/services/core/jni/gnss/GnssMeasurementCallback.cpp index 646aabd79e55..dd9a52578477 100644 --- a/services/core/jni/gnss/GnssMeasurementCallback.cpp +++ b/services/core/jni/gnss/GnssMeasurementCallback.cpp @@ -54,6 +54,7 @@ jmethodID method_gnssMeasurementCtor; jmethodID method_reportMeasurementData; jmethodID method_satellitePvtBuilderBuild; jmethodID method_satellitePvtBuilderCtor; +jmethodID method_satellitePvtBuilderSetFlags; jmethodID method_satellitePvtBuilderSetPositionEcef; jmethodID method_satellitePvtBuilderSetVelocityEcef; jmethodID method_satellitePvtBuilderSetClockInfo; @@ -89,6 +90,9 @@ void GnssMeasurement_class_init_once(JNIEnv* env, jclass& clazz) { jclass satellitePvtBuilder = env->FindClass("android/location/SatellitePvt$Builder"); class_satellitePvtBuilder = (jclass)env->NewGlobalRef(satellitePvtBuilder); method_satellitePvtBuilderCtor = env->GetMethodID(class_satellitePvtBuilder, "<init>", "()V"); + method_satellitePvtBuilderSetFlags = + env->GetMethodID(class_satellitePvtBuilder, "setFlags", + "(I)Landroid/location/SatellitePvt$Builder;"); method_satellitePvtBuilderSetPositionEcef = env->GetMethodID(class_satellitePvtBuilder, "setPositionEcef", "(Landroid/location/SatellitePvt$PositionEcef;)" @@ -313,22 +317,33 @@ void GnssMeasurementCallbackAidl::translateSingleGnssMeasurement(JNIEnv* env, if (measurement.flags & static_cast<uint32_t>(GnssMeasurement::HAS_SATELLITE_PVT)) { const SatellitePvt& satellitePvt = measurement.satellitePvt; - jobject positionEcef = env->NewObject(class_positionEcef, method_positionEcef, - satellitePvt.satPosEcef.posXMeters, - satellitePvt.satPosEcef.posYMeters, - satellitePvt.satPosEcef.posZMeters, - satellitePvt.satPosEcef.ureMeters); - jobject velocityEcef = - env->NewObject(class_velocityEcef, method_velocityEcef, - satellitePvt.satVelEcef.velXMps, satellitePvt.satVelEcef.velYMps, - satellitePvt.satVelEcef.velZMps, satellitePvt.satVelEcef.ureRateMps); - jobject clockInfo = env->NewObject(class_clockInfo, method_clockInfo, - satellitePvt.satClockInfo.satHardwareCodeBiasMeters, - satellitePvt.satClockInfo.satTimeCorrectionMeters, - satellitePvt.satClockInfo.satClkDriftMps); + uint16_t satFlags = static_cast<uint16_t>(satellitePvt.flags); + jobject positionEcef = nullptr; + jobject velocityEcef = nullptr; + jobject clockInfo = nullptr; + + if (satFlags & SatellitePvt::HAS_POSITION_VELOCITY_CLOCK_INFO) { + positionEcef = env->NewObject(class_positionEcef, method_positionEcef, + satellitePvt.satPosEcef.posXMeters, + satellitePvt.satPosEcef.posYMeters, + satellitePvt.satPosEcef.posZMeters, + satellitePvt.satPosEcef.ureMeters); + velocityEcef = + env->NewObject(class_velocityEcef, method_velocityEcef, + satellitePvt.satVelEcef.velXMps, satellitePvt.satVelEcef.velYMps, + satellitePvt.satVelEcef.velZMps, + satellitePvt.satVelEcef.ureRateMps); + clockInfo = env->NewObject(class_clockInfo, method_clockInfo, + satellitePvt.satClockInfo.satHardwareCodeBiasMeters, + satellitePvt.satClockInfo.satTimeCorrectionMeters, + satellitePvt.satClockInfo.satClkDriftMps); + } + jobject satellitePvtBuilderObject = env->NewObject(class_satellitePvtBuilder, method_satellitePvtBuilderCtor); + env->CallObjectMethod(satellitePvtBuilderObject, method_satellitePvtBuilderSetFlags, + satellitePvt.flags); env->CallObjectMethod(satellitePvtBuilderObject, method_satellitePvtBuilderSetPositionEcef, positionEcef); env->CallObjectMethod(satellitePvtBuilderObject, method_satellitePvtBuilderSetVelocityEcef, |