Refactor GnssMeasurementCallback class in JNI
Bug: 119571122
Test: Tested on device that GNSS measurements still pipe to Java API.
Change-Id: I89ab91169c7dd65a8ffd54099aa46ad34788d7cb
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 4d0556c..0e349b7 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -756,14 +756,18 @@
Return<void> gnssMeasurementCb(const IGnssMeasurementCallback_V1_1::GnssData& data) override;
Return<void> GnssMeasurementCb(const IGnssMeasurementCallback_V1_0::GnssData& data) override;
private:
- void translateGnssMeasurement_V1_0(
- const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurement,
- JavaObject& object);
- jobjectArray translateGnssMeasurements(
- JNIEnv* env,
- const IGnssMeasurementCallback_V1_1::GnssMeasurement* measurements_v1_1,
- const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurements_v1_0,
- size_t count);
+ template<class T>
+ void translateSingleGnssMeasurement(const T* measurement, JavaObject& object);
+
+ template<class T>
+ jobjectArray translateAllGnssMeasurements(JNIEnv* env, const T* measurements, size_t count);
+
+ template<class T>
+ void translateAndSetGnssData(const T& data);
+
+ template<class T>
+ size_t getMeasurementCount(const T& data);
+
jobject translateGnssClock(
JNIEnv* env, const IGnssMeasurementCallback_V1_0::GnssClock* clock);
void setMeasurementData(JNIEnv* env, jobject clock, jobjectArray measurementArray);
@@ -777,41 +781,48 @@
Return<void> GnssMeasurementCallback::gnssMeasurementCb(
const IGnssMeasurementCallback_V1_1::GnssData& data) {
- JNIEnv* env = getJniEnv();
-
- jobject clock;
- jobjectArray measurementArray;
-
- clock = translateGnssClock(env, &data.clock);
-
- measurementArray = translateGnssMeasurements(
- env, data.measurements.data(), nullptr, data.measurements.size());
- setMeasurementData(env, clock, measurementArray);
-
- env->DeleteLocalRef(clock);
- env->DeleteLocalRef(measurementArray);
+ translateAndSetGnssData(data);
return Void();
}
Return<void> GnssMeasurementCallback::GnssMeasurementCb(
const IGnssMeasurementCallback_V1_0::GnssData& data) {
+ translateAndSetGnssData(data);
+ return Void();
+}
+
+template<class T>
+void GnssMeasurementCallback::translateAndSetGnssData(const T& data) {
JNIEnv* env = getJniEnv();
jobject clock;
jobjectArray measurementArray;
clock = translateGnssClock(env, &data.clock);
- measurementArray = translateGnssMeasurements(
- env, nullptr, data.measurements.data(), data.measurementCount);
+ size_t count = getMeasurementCount(data);
+ measurementArray = translateAllGnssMeasurements(env, data.measurements.data(), count);
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(
+template<>
+size_t GnssMeasurementCallback::getMeasurementCount<IGnssMeasurementCallback_V1_0::GnssData>
+ (const IGnssMeasurementCallback_V1_0::GnssData& data) {
+ return data.measurementCount;
+}
+
+template<>
+size_t GnssMeasurementCallback::getMeasurementCount<IGnssMeasurementCallback_V1_1::GnssData>
+ (const IGnssMeasurementCallback_V1_1::GnssData& data) {
+ return data.measurements.size();
+}
+
+// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
+template<>
+void GnssMeasurementCallback::translateSingleGnssMeasurement
+ <IGnssMeasurementCallback_V1_0::GnssMeasurement>(
const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurement,
JavaObject& object) {
uint32_t flags = static_cast<uint32_t>(measurement->flags);
@@ -852,6 +863,20 @@
}
}
+// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
+template<>
+void GnssMeasurementCallback::translateSingleGnssMeasurement
+ <IGnssMeasurementCallback_V1_1::GnssMeasurement>(
+ const IGnssMeasurementCallback_V1_1::GnssMeasurement* measurement_V1_1,
+ JavaObject& object) {
+ translateSingleGnssMeasurement(&(measurement_V1_1->v1_0), object);
+
+ // Set the V1_1 flag, and mark that new field has valid information for Java Layer
+ SET(AccumulatedDeltaRangeState,
+ (static_cast<int32_t>(measurement_V1_1->accumulatedDeltaRangeState) |
+ ADR_STATE_HALF_CYCLE_REPORTED));
+}
+
jobject GnssMeasurementCallback::translateGnssClock(
JNIEnv* env, const IGnssMeasurementCallback_V1_0::GnssClock* clock) {
JavaObject object(env, "android/location/GnssClock");
@@ -891,10 +916,10 @@
return object.get();
}
-jobjectArray GnssMeasurementCallback::translateGnssMeasurements(JNIEnv* env,
- const IGnssMeasurementCallback_V1_1::GnssMeasurement* measurements_v1_1,
- const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurements_v1_0,
- size_t count) {
+template<class T>
+jobjectArray GnssMeasurementCallback::translateAllGnssMeasurements(JNIEnv* env,
+ const T* measurements,
+ size_t count) {
if (count == 0) {
return nullptr;
}
@@ -907,17 +932,7 @@
for (uint16_t i = 0; i < count; ++i) {
JavaObject object(env, "android/location/GnssMeasurement");
- if (measurements_v1_1 != nullptr) {
- translateGnssMeasurement_V1_0(&(measurements_v1_1[i].v1_0), object);
-
- // Set the V1_1 flag, and mark that new field has valid information for Java Layer
- SET(AccumulatedDeltaRangeState,
- (static_cast<int32_t>(measurements_v1_1[i].accumulatedDeltaRangeState) |
- ADR_STATE_HALF_CYCLE_REPORTED));
- } else {
- translateGnssMeasurement_V1_0(&(measurements_v1_0[i]), object);
- }
-
+ translateSingleGnssMeasurement(&(measurements[i]), object);
env->SetObjectArrayElement(gnssMeasurementArray, i, object.get());
}