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());
     }