diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 4d0556c7507aa..0e349b7893e7c 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 @@ struct GnssMeasurementCallback : public IGnssMeasurementCallback_V2_0 { Return gnssMeasurementCb(const IGnssMeasurementCallback_V1_1::GnssData& data) override; Return 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 + void translateSingleGnssMeasurement(const T* measurement, JavaObject& object); + + template + jobjectArray translateAllGnssMeasurements(JNIEnv* env, const T* measurements, size_t count); + + template + void translateAndSetGnssData(const T& data); + + template + 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 GnssMeasurementCallback::gnssMeasurementCb_2_0( Return 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 GnssMeasurementCallback::GnssMeasurementCb( const IGnssMeasurementCallback_V1_0::GnssData& data) { + translateAndSetGnssData(data); + return Void(); +} + +template +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 + (const IGnssMeasurementCallback_V1_0::GnssData& data) { + return data.measurementCount; +} + +template<> +size_t GnssMeasurementCallback::getMeasurementCount + (const IGnssMeasurementCallback_V1_1::GnssData& data) { + return data.measurements.size(); +} + +// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement"); +template<> +void GnssMeasurementCallback::translateSingleGnssMeasurement + ( const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurement, JavaObject& object) { uint32_t flags = static_cast(measurement->flags); @@ -852,6 +863,20 @@ void GnssMeasurementCallback::translateGnssMeasurement_V1_0( } } +// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement"); +template<> +void GnssMeasurementCallback::translateSingleGnssMeasurement + ( + 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(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 @@ jobject GnssMeasurementCallback::translateGnssClock( 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 +jobjectArray GnssMeasurementCallback::translateAllGnssMeasurements(JNIEnv* env, + const T* measurements, + size_t count) { if (count == 0) { return nullptr; } @@ -907,17 +932,7 @@ jobjectArray GnssMeasurementCallback::translateGnssMeasurements(JNIEnv* env, 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(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()); }