Handling additional enum for carrier half cycle
Working with both 1.0 and 1.1 IGnssMeasurementCallback's
Also formally deprecating the Carrier Phase fields
Bug: 71908529
Test: Gnss & Measurements still run on device (w/1.0 HAL)
Change-Id: I229350217a6fb61ca403e0515e1fd9d8fed2cc1b
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index c2771e4..266f89b 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -99,14 +99,16 @@
using android::hardware::gnss::V1_0::IGnssDebug;
using android::hardware::gnss::V1_0::IGnssGeofenceCallback;
using android::hardware::gnss::V1_0::IGnssGeofencing;
-using android::hardware::gnss::V1_0::IGnssMeasurementCallback;
+using IGnssMeasurementCallback_V1_0 = android::hardware::gnss::V1_0::IGnssMeasurementCallback;
using android::hardware::gnss::V1_0::IGnssNavigationMessage;
using android::hardware::gnss::V1_0::IGnssNavigationMessageCallback;
using android::hardware::gnss::V1_0::IGnssNi;
using android::hardware::gnss::V1_0::IGnssNiCallback;
using android::hardware::gnss::V1_0::IGnssXtra;
using android::hardware::gnss::V1_0::IGnssXtraCallback;
+
using android::hardware::gnss::V1_1::IGnssCallback;
+using android::hardware::gnss::V1_1::IGnssMeasurementCallback;
struct GnssDeathRecipient : virtual public hidl_death_recipient
{
@@ -699,21 +701,24 @@
* GnssMeasurement interface.
*/
struct GnssMeasurementCallback : public IGnssMeasurementCallback {
- Return<void> GnssMeasurementCb(const IGnssMeasurementCallback::GnssData& data);
+ Return<void> gnssMeasurementCb(const IGnssMeasurementCallback::GnssData& data) override;
+ Return<void> GnssMeasurementCb(const IGnssMeasurementCallback_V1_0::GnssData& data) override;
private:
- jobject translateGnssMeasurement(
- JNIEnv* env, const IGnssMeasurementCallback::GnssMeasurement* measurement);
- jobject translateGnssClock(
- JNIEnv* env, const IGnssMeasurementCallback::GnssClock* clock);
+ void translateGnssMeasurement_V1_0(
+ JNIEnv* env, const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurement,
+ JavaObject object);
jobjectArray translateGnssMeasurements(
JNIEnv* env,
const IGnssMeasurementCallback::GnssMeasurement* measurements,
+ const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurements_v1_0,
size_t count);
+ jobject translateGnssClock(
+ JNIEnv* env, const IGnssMeasurementCallback::GnssClock* clock);
void setMeasurementData(JNIEnv* env, jobject clock, jobjectArray measurementArray);
};
-Return<void> GnssMeasurementCallback::GnssMeasurementCb(
+Return<void> GnssMeasurementCallback::gnssMeasurementCb(
const IGnssMeasurementCallback::GnssData& data) {
JNIEnv* env = getJniEnv();
@@ -722,7 +727,7 @@
clock = translateGnssClock(env, &data.clock);
measurementArray = translateGnssMeasurements(
- env, data.measurements.data(), data.measurementCount);
+ env, data.measurements.data(), NULL, data.measurements.size());
setMeasurementData(env, clock, measurementArray);
env->DeleteLocalRef(clock);
@@ -730,10 +735,27 @@
return Void();
}
-jobject GnssMeasurementCallback::translateGnssMeasurement(
- JNIEnv* env, const IGnssMeasurementCallback::GnssMeasurement* measurement) {
- JavaObject object(env, "android/location/GnssMeasurement");
+Return<void> GnssMeasurementCallback::GnssMeasurementCb(
+ const IGnssMeasurementCallback_V1_0::GnssData& data) {
+ JNIEnv* env = getJniEnv();
+ jobject clock;
+ jobjectArray measurementArray;
+
+ clock = translateGnssClock(env, &data.clock);
+ measurementArray = translateGnssMeasurements(
+ env, NULL, data.measurements.data(), data.measurementCount);
+ setMeasurementData(env, clock, measurementArray);
+
+ env->DeleteLocalRef(clock);
+ env->DeleteLocalRef(measurementArray);
+ return Void();
+}
+
+// preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
+void GnssMeasurementCallback::translateGnssMeasurement_V1_0(
+ JNIEnv* env, const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurement,
+ JavaObject object) {
uint32_t flags = static_cast<uint32_t>(measurement->flags);
SET(Svid, static_cast<int32_t>(measurement->svid));
@@ -757,13 +779,8 @@
SET(CarrierFrequencyHz, measurement->carrierFrequencyHz);
}
- if (flags & static_cast<uint32_t>(GnssMeasurementFlags::HAS_CARRIER_PHASE)) {
- SET(CarrierPhase, measurement->carrierPhase);
- }
-
- if (flags & static_cast<uint32_t>(GnssMeasurementFlags::HAS_CARRIER_PHASE_UNCERTAINTY)) {
- SET(CarrierPhaseUncertainty, measurement->carrierPhaseUncertainty);
- }
+ // Intentionally not copying deprecated fields of carrierCycles,
+ // carrierPhase, carrierPhaseUncertainty
SET(MultipathIndicator, static_cast<int32_t>(measurement->multipathIndicator));
@@ -774,8 +791,6 @@
if (flags & static_cast<uint32_t>(GnssMeasurementFlags::HAS_AUTOMATIC_GAIN_CONTROL)) {
SET(AutomaticGainControlLevelInDb, measurement->agcLevelDb);
}
-
- return object.get();
}
jobject GnssMeasurementCallback::translateGnssClock(
@@ -818,8 +833,9 @@
}
jobjectArray GnssMeasurementCallback::translateGnssMeasurements(JNIEnv* env,
- const IGnssMeasurementCallback::GnssMeasurement*
- measurements, size_t count) {
+ const IGnssMeasurementCallback::GnssMeasurement* measurements,
+ const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurements_v1_0,
+ size_t count) {
if (count == 0) {
return NULL;
}
@@ -831,11 +847,18 @@
NULL /* initialElement */);
for (uint16_t i = 0; i < count; ++i) {
- jobject gnssMeasurement = translateGnssMeasurement(
- env,
- &measurements[i]);
- env->SetObjectArrayElement(gnssMeasurementArray, i, gnssMeasurement);
- env->DeleteLocalRef(gnssMeasurement);
+ JavaObject object(env, "android/location/GnssMeasurement");
+ if (measurements != NULL) {
+ translateGnssMeasurement_V1_0(env, &(measurements[i].v1_0), object);
+
+ // Set the V1_1 flag
+ SET(AccumulatedDeltaRangeState,
+ static_cast<int32_t>(measurements[i].accumulatedDeltaRangeState));
+ } else {
+ translateGnssMeasurement_V1_0(env, &(measurements_v1_0[i]), object);
+ }
+
+ env->SetObjectArrayElement(gnssMeasurementArray, i, object.get());
}
env->DeleteLocalRef(gnssMeasurementClass);