Framework support to read newly added fields
Change-Id: Ie43395addd102656a4dbf9c25111ac50ec9afe41
diff --git a/api/current.txt b/api/current.txt
index fa94cc8..568fa1d 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -18896,6 +18896,7 @@
method public long getFullBiasInNs();
method public short getLeapSecond();
method public long getTimeInNs();
+ method public long getTimeOfLastHwClockDiscontinuityInNs();
method public double getTimeUncertaintyInNs();
method public byte getType();
method public boolean hasBiasInNs();
@@ -18921,6 +18922,7 @@
method public void setFullBiasInNs(long);
method public void setLeapSecond(short);
method public void setTimeInNs(long);
+ method public void setTimeOfLastHwClockDiscontinuityInNs(long);
method public void setTimeUncertaintyInNs(double);
method public void setType(byte);
method public void writeToParcel(android.os.Parcel, int);
@@ -18956,6 +18958,8 @@
method public byte getMultipathIndicator();
method public byte getPrn();
method public double getPseudorangeInMeters();
+ method public double getPseudorangeRateCarrierInMetersPerSec();
+ method public double getPseudorangeRateCarrierUncertaintyInMetersPerSec();
method public double getPseudorangeRateInMetersPerSec();
method public double getPseudorangeRateUncertaintyInMetersPerSec();
method public double getPseudorangeUncertaintyInMeters();
@@ -19024,6 +19028,8 @@
method public void setMultipathIndicator(byte);
method public void setPrn(byte);
method public void setPseudorangeInMeters(double);
+ method public void setPseudorangeRateCarrierInMetersPerSec(double);
+ method public void setPseudorangeRateCarrierUncertaintyInMetersPerSec(double);
method public void setPseudorangeRateInMetersPerSec(double);
method public void setPseudorangeRateUncertaintyInMetersPerSec(double);
method public void setPseudorangeUncertaintyInMeters(double);
diff --git a/api/system-current.txt b/api/system-current.txt
index acdae7a..8a9b376 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -19883,6 +19883,7 @@
method public long getFullBiasInNs();
method public short getLeapSecond();
method public long getTimeInNs();
+ method public long getTimeOfLastHwClockDiscontinuityInNs();
method public double getTimeUncertaintyInNs();
method public byte getType();
method public boolean hasBiasInNs();
@@ -19908,6 +19909,7 @@
method public void setFullBiasInNs(long);
method public void setLeapSecond(short);
method public void setTimeInNs(long);
+ method public void setTimeOfLastHwClockDiscontinuityInNs(long);
method public void setTimeUncertaintyInNs(double);
method public void setType(byte);
method public void writeToParcel(android.os.Parcel, int);
@@ -19943,6 +19945,8 @@
method public byte getMultipathIndicator();
method public byte getPrn();
method public double getPseudorangeInMeters();
+ method public double getPseudorangeRateCarrierInMetersPerSec();
+ method public double getPseudorangeRateCarrierUncertaintyInMetersPerSec();
method public double getPseudorangeRateInMetersPerSec();
method public double getPseudorangeRateUncertaintyInMetersPerSec();
method public double getPseudorangeUncertaintyInMeters();
@@ -20011,6 +20015,8 @@
method public void setMultipathIndicator(byte);
method public void setPrn(byte);
method public void setPseudorangeInMeters(double);
+ method public void setPseudorangeRateCarrierInMetersPerSec(double);
+ method public void setPseudorangeRateCarrierUncertaintyInMetersPerSec(double);
method public void setPseudorangeRateInMetersPerSec(double);
method public void setPseudorangeRateUncertaintyInMetersPerSec(double);
method public void setPseudorangeUncertaintyInMeters(double);
diff --git a/api/test-current.txt b/api/test-current.txt
index 5927e62..e08f82f 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -18896,6 +18896,7 @@
method public long getFullBiasInNs();
method public short getLeapSecond();
method public long getTimeInNs();
+ method public long getTimeOfLastHwClockDiscontinuityInNs();
method public double getTimeUncertaintyInNs();
method public byte getType();
method public boolean hasBiasInNs();
@@ -18921,6 +18922,7 @@
method public void setFullBiasInNs(long);
method public void setLeapSecond(short);
method public void setTimeInNs(long);
+ method public void setTimeOfLastHwClockDiscontinuityInNs(long);
method public void setTimeUncertaintyInNs(double);
method public void setType(byte);
method public void writeToParcel(android.os.Parcel, int);
@@ -18956,6 +18958,8 @@
method public byte getMultipathIndicator();
method public byte getPrn();
method public double getPseudorangeInMeters();
+ method public double getPseudorangeRateCarrierInMetersPerSec();
+ method public double getPseudorangeRateCarrierUncertaintyInMetersPerSec();
method public double getPseudorangeRateInMetersPerSec();
method public double getPseudorangeRateUncertaintyInMetersPerSec();
method public double getPseudorangeUncertaintyInMeters();
@@ -19024,6 +19028,8 @@
method public void setMultipathIndicator(byte);
method public void setPrn(byte);
method public void setPseudorangeInMeters(double);
+ method public void setPseudorangeRateCarrierInMetersPerSec(double);
+ method public void setPseudorangeRateCarrierUncertaintyInMetersPerSec(double);
method public void setPseudorangeRateInMetersPerSec(double);
method public void setPseudorangeRateUncertaintyInMetersPerSec(double);
method public void setPseudorangeUncertaintyInMeters(double);
diff --git a/location/java/android/location/GpsClock.java b/location/java/android/location/GpsClock.java
index f8640e6..719e56f 100644
--- a/location/java/android/location/GpsClock.java
+++ b/location/java/android/location/GpsClock.java
@@ -73,6 +73,7 @@
private double mBiasUncertaintyInNs;
private double mDriftInNsPerSec;
private double mDriftUncertaintyInNsPerSec;
+ private long mTimeOfLastHwClockDiscontinuityInNs;
GpsClock() {
initialize();
@@ -92,6 +93,7 @@
mBiasUncertaintyInNs = clock.mBiasUncertaintyInNs;
mDriftInNsPerSec = clock.mDriftInNsPerSec;
mDriftUncertaintyInNsPerSec = clock.mDriftUncertaintyInNsPerSec;
+ mTimeOfLastHwClockDiscontinuityInNs = clock.mTimeOfLastHwClockDiscontinuityInNs;
}
/**
@@ -393,6 +395,20 @@
}
/**
+ * Gets time of last hardware clock discontinuity.
+ */
+ public long getTimeOfLastHwClockDiscontinuityInNs() {
+ return mTimeOfLastHwClockDiscontinuityInNs;
+ }
+
+ /**
+ * Sets time of last hardware clock discontinuity.
+ */
+ public void setTimeOfLastHwClockDiscontinuityInNs(long timeOfLastHwClockDiscontinuityInNs) {
+ mTimeOfLastHwClockDiscontinuityInNs = timeOfLastHwClockDiscontinuityInNs;
+ }
+
+ /**
* Resets the clock's Drift Uncertainty (1-Sigma) in nanoseconds per second.
*/
public void resetDriftUncertaintyInNsPerSec() {
@@ -415,6 +431,7 @@
gpsClock.mBiasUncertaintyInNs = parcel.readDouble();
gpsClock.mDriftInNsPerSec = parcel.readDouble();
gpsClock.mDriftUncertaintyInNsPerSec = parcel.readDouble();
+ gpsClock.mTimeOfLastHwClockDiscontinuityInNs = parcel.readLong();
return gpsClock;
}
@@ -436,6 +453,7 @@
parcel.writeDouble(mBiasUncertaintyInNs);
parcel.writeDouble(mDriftInNsPerSec);
parcel.writeDouble(mDriftUncertaintyInNsPerSec);
+ parcel.writeLong(mTimeOfLastHwClockDiscontinuityInNs);
}
@Override
@@ -479,6 +497,10 @@
"DriftUncertaintyInNsPerSec",
hasDriftUncertaintyInNsPerSec() ? mDriftUncertaintyInNsPerSec : null));
+ builder.append(String.format(format, "TimeOfLastHwClockDiscontinuityInNs",
+ getType() == CLOCK_TYPE_LOCAL_HW_TIME
+ ? mTimeOfLastHwClockDiscontinuityInNs : null));
+
return builder.toString();
}
@@ -493,6 +515,7 @@
resetBiasUncertaintyInNs();
resetDriftInNsPerSec();
resetDriftUncertaintyInNsPerSec();
+ setTimeOfLastHwClockDiscontinuityInNs(Long.MIN_VALUE);
}
private void setFlag(short flag) {
diff --git a/location/java/android/location/GpsMeasurement.java b/location/java/android/location/GpsMeasurement.java
index 0d91c79..366ad61 100644
--- a/location/java/android/location/GpsMeasurement.java
+++ b/location/java/android/location/GpsMeasurement.java
@@ -59,6 +59,8 @@
private double mAzimuthInDeg;
private double mAzimuthUncertaintyInDeg;
private boolean mUsedInFix;
+ private double mPseudorangeRateCarrierInMetersPerSec;
+ private double mPseudorangeRateCarrierUncertaintyInMetersPerSec;
// The following enumerations must be in sync with the values declared in gps.h
@@ -229,6 +231,10 @@
mAzimuthInDeg = measurement.mAzimuthInDeg;
mAzimuthUncertaintyInDeg = measurement.mAzimuthUncertaintyInDeg;
mUsedInFix = measurement.mUsedInFix;
+ mPseudorangeRateCarrierInMetersPerSec =
+ measurement.mPseudorangeRateCarrierInMetersPerSec;
+ mPseudorangeRateCarrierUncertaintyInMetersPerSec =
+ measurement.mPseudorangeRateCarrierUncertaintyInMetersPerSec;
}
/**
@@ -1170,6 +1176,34 @@
mUsedInFix = value;
}
+ /**
+ * Gets pseudorange rate (based on carrier phase changes) at the timestamp in m/s.
+ */
+ public double getPseudorangeRateCarrierInMetersPerSec() {
+ return mPseudorangeRateCarrierInMetersPerSec;
+ }
+
+ /**
+ * Sets pseudorange rate (based on carrier phase changes) at the timestamp in m/s.
+ */
+ public void setPseudorangeRateCarrierInMetersPerSec(double value) {
+ mPseudorangeRateCarrierInMetersPerSec = value;
+ }
+
+ /**
+ * Gets 1-Sigma uncertainty of the pseudorange rate carrier.
+ */
+ public double getPseudorangeRateCarrierUncertaintyInMetersPerSec() {
+ return mPseudorangeRateCarrierUncertaintyInMetersPerSec;
+ }
+
+ /**
+ * Sets 1-Sigma uncertainty of the pseudorange rate carrier.
+ */
+ public void setPseudorangeRateCarrierUncertaintyInMetersPerSec(double value) {
+ mPseudorangeRateCarrierUncertaintyInMetersPerSec = value;
+ }
+
public static final Creator<GpsMeasurement> CREATOR = new Creator<GpsMeasurement>() {
@Override
public GpsMeasurement createFromParcel(Parcel parcel) {
@@ -1207,6 +1241,8 @@
gpsMeasurement.mAzimuthInDeg = parcel.readDouble();
gpsMeasurement.mAzimuthUncertaintyInDeg = parcel.readDouble();
gpsMeasurement.mUsedInFix = parcel.readInt() != 0;
+ gpsMeasurement.mPseudorangeRateCarrierInMetersPerSec = parcel.readDouble();
+ gpsMeasurement.mPseudorangeRateCarrierUncertaintyInMetersPerSec = parcel.readDouble();
return gpsMeasurement;
}
@@ -1250,6 +1286,8 @@
parcel.writeDouble(mAzimuthInDeg);
parcel.writeDouble(mAzimuthUncertaintyInDeg);
parcel.writeInt(mUsedInFix ? 1 : 0);
+ parcel.writeDouble(mPseudorangeRateCarrierInMetersPerSec);
+ parcel.writeDouble(mPseudorangeRateCarrierUncertaintyInMetersPerSec);
}
@Override
@@ -1374,6 +1412,11 @@
builder.append(String.format(format, "UsedInFix", mUsedInFix));
+ builder.append(String.format(format, "PseudorangeRateCarrierInMetersPerSec",
+ mPseudorangeRateCarrierInMetersPerSec));
+ builder.append(String.format(format, "PseudorangeRateCarrierUncertaintyInMetersPerSec",
+ mPseudorangeRateCarrierUncertaintyInMetersPerSec));
+
return builder.toString();
}
@@ -1410,6 +1453,8 @@
resetAzimuthInDeg();
resetAzimuthUncertaintyInDeg();
setUsedInFix(false);
+ setPseudorangeRateCarrierInMetersPerSec(Double.MIN_VALUE);
+ setPseudorangeRateCarrierUncertaintyInMetersPerSec(Double.MIN_VALUE);
}
private void setFlag(int flag) {
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 7878bc0..0c85a15 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -968,10 +968,12 @@
return JNI_FALSE;
}
-static jobject translate_gps_clock(JNIEnv* env, GpsClock* clock) {
+static jobject translate_gps_clock(JNIEnv* env, void* data, size_t size) {
const char* doubleSignature = "(D)V";
const char* longSignature = "(J)V";
+ GpsClock* clock = reinterpret_cast<GpsClock*>(data);
+
jclass gpsClockClass = env->FindClass("android/location/GpsClock");
jmethodID gpsClockCtor = env->GetMethodID(gpsClockClass, "<init>", "()V");
@@ -1023,11 +1025,23 @@
env->CallVoidMethod(gpsClockObject, setterMethod, clock->drift_uncertainty_nsps);
}
+ if (flags & GPS_CLOCK_TYPE_LOCAL_HW_TIME) {
+ if (size == sizeof(GpsClock)) {
+ jmethodID setterMethod =
+ env->GetMethodID(gpsClockClass,
+ "setTimeOfLastHwClockDiscontinuityInNs",
+ longSignature);
+ env->CallVoidMethod(gpsClockObject,
+ setterMethod,
+ clock->time_of_last_hw_clock_discontinuity_ns);
+ }
+ }
+
env->DeleteLocalRef(gpsClockClass);
return gpsClockObject;
}
-static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measurement) {
+static jobject translate_gps_measurement(JNIEnv* env, void* data, size_t size) {
const char* byteSignature = "(B)V";
const char* shortSignature = "(S)V";
const char* intSignature = "(I)V";
@@ -1037,6 +1051,7 @@
jclass gpsMeasurementClass = env->FindClass("android/location/GpsMeasurement");
jmethodID gpsMeasurementCtor = env->GetMethodID(gpsMeasurementClass, "<init>", "()V");
+ GpsMeasurement* measurement = reinterpret_cast<GpsMeasurement*>(data);
jobject gpsMeasurementObject = env->NewObject(gpsMeasurementClass, gpsMeasurementCtor);
GpsMeasurementFlags flags = measurement->flags;
@@ -1270,12 +1285,38 @@
usedInFixSetterMethod,
(flags & GPS_MEASUREMENT_HAS_USED_IN_FIX) && measurement->used_in_fix);
+ if (size == sizeof(GpsMeasurement)) {
+ jmethodID setterMethod =
+ env->GetMethodID(gpsMeasurementClass,
+ "setPseudorangeRateCarrierInMetersPerSec",
+ doubleSignature);
+ env->CallVoidMethod(
+ gpsMeasurementObject,
+ setterMethod,
+ measurement->pseudorange_rate_carrier_mps);
+
+ setterMethod =
+ env->GetMethodID(gpsMeasurementClass,
+ "setPseudorangeRateCarrierUncertaintyInMetersPerSec",
+ doubleSignature);
+ env->CallVoidMethod(
+ gpsMeasurementObject,
+ setterMethod,
+ measurement->pseudorange_rate_carrier_uncertainty_mps);
+ }
+
env->DeleteLocalRef(gpsMeasurementClass);
return gpsMeasurementObject;
}
-static jobjectArray translate_gps_measurements(JNIEnv* env, GpsData* data) {
- size_t measurementCount = data->measurement_count;
+/**
+ * <T> can only be GpsData or GpsData_v1. Must rewrite this function if more
+ * types are introduced in the future releases.
+ */
+template<class T>
+static jobjectArray translate_gps_measurements(JNIEnv* env, void* data) {
+ T* gps_data = reinterpret_cast<T*>(data);
+ size_t measurementCount = gps_data->measurement_count;
if (measurementCount == 0) {
return NULL;
}
@@ -1286,9 +1327,11 @@
gpsMeasurementClass,
NULL /* initialElement */);
- GpsMeasurement* gpsMeasurements = data->measurements;
for (uint16_t i = 0; i < measurementCount; ++i) {
- jobject gpsMeasurement = translate_gps_measurement(env, &gpsMeasurements[i]);
+ jobject gpsMeasurement = translate_gps_measurement(
+ env,
+ &(gps_data->measurements[i]),
+ sizeof(gps_data->measurements[0]));
env->SetObjectArrayElement(gpsMeasurementArray, i, gpsMeasurement);
env->DeleteLocalRef(gpsMeasurement);
}
@@ -1303,33 +1346,39 @@
ALOGE("Invalid data provided to gps_measurement_callback");
return;
}
-
- if (data->size == sizeof(GpsData)) {
- jobject gpsClock = translate_gps_clock(env, &data->clock);
- jobjectArray measurementArray = translate_gps_measurements(env, data);
-
- jclass gpsMeasurementsEventClass = env->FindClass("android/location/GpsMeasurementsEvent");
- jmethodID gpsMeasurementsEventCtor = env->GetMethodID(
- gpsMeasurementsEventClass,
- "<init>",
- "(Landroid/location/GpsClock;[Landroid/location/GpsMeasurement;)V");
-
- jobject gpsMeasurementsEvent = env->NewObject(
- gpsMeasurementsEventClass,
- gpsMeasurementsEventCtor,
- gpsClock,
- measurementArray);
-
- env->CallVoidMethod(mCallbacksObj, method_reportMeasurementData, gpsMeasurementsEvent);
- checkAndClearExceptionFromCallback(env, __FUNCTION__);
-
- env->DeleteLocalRef(gpsClock);
- env->DeleteLocalRef(measurementArray);
- env->DeleteLocalRef(gpsMeasurementsEventClass);
- env->DeleteLocalRef(gpsMeasurementsEvent);
- } else {
+ if (data->size != sizeof(GpsData) && data->size != sizeof(GpsData_v1)) {
ALOGE("Invalid GpsData size found in gps_measurement_callback, size=%zd", data->size);
+ return;
}
+
+ jobject gpsClock;
+ jobjectArray measurementArray;
+ if (data->size == sizeof(GpsData)) {
+ gpsClock = translate_gps_clock(env, &data->clock, sizeof(GpsClock));
+ measurementArray = translate_gps_measurements<GpsData>(env, data);
+ } else {
+ gpsClock = translate_gps_clock(env, &data->clock, sizeof(GpsClock_v1));
+ measurementArray = translate_gps_measurements<GpsData_v1>(env, data);
+ }
+ jclass gpsMeasurementsEventClass = env->FindClass("android/location/GpsMeasurementsEvent");
+ jmethodID gpsMeasurementsEventCtor = env->GetMethodID(
+ gpsMeasurementsEventClass,
+ "<init>",
+ "(Landroid/location/GpsClock;[Landroid/location/GpsMeasurement;)V");
+
+ jobject gpsMeasurementsEvent = env->NewObject(
+ gpsMeasurementsEventClass,
+ gpsMeasurementsEventCtor,
+ gpsClock,
+ measurementArray);
+
+ env->CallVoidMethod(mCallbacksObj, method_reportMeasurementData, gpsMeasurementsEvent);
+ checkAndClearExceptionFromCallback(env, __FUNCTION__);
+
+ env->DeleteLocalRef(gpsClock);
+ env->DeleteLocalRef(measurementArray);
+ env->DeleteLocalRef(gpsMeasurementsEventClass);
+ env->DeleteLocalRef(gpsMeasurementsEvent);
}
GpsMeasurementCallbacks sGpsMeasurementCallbacks = {