Loading services/core/jni/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ cc_defaults { "android.hardware.gnss@1.0", "android.hardware.gnss@1.1", "android.hardware.gnss@2.0", "android.hardware.gnss@2.1", "android.hardware.gnss.measurement_corrections@1.0", "android.hardware.gnss.visibility_control@1.0", "android.hardware.input.classifier@1.0", Loading services/core/jni/com_android_server_location_GnssLocationProvider.cpp +88 −17 Original line number Diff line number Diff line Loading @@ -21,10 +21,12 @@ #include <android/hardware/gnss/1.0/IGnss.h> #include <android/hardware/gnss/1.1/IGnss.h> #include <android/hardware/gnss/2.0/IGnss.h> #include <android/hardware/gnss/2.1/IGnss.h> #include <android/hardware/gnss/1.0/IGnssMeasurement.h> #include <android/hardware/gnss/1.1/IGnssMeasurement.h> #include <android/hardware/gnss/2.0/IGnssMeasurement.h> #include <android/hardware/gnss/2.1/IGnssMeasurement.h> #include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h> #include <android/hardware/gnss/visibility_control/1.0/IGnssVisibilityControl.h> #include <nativehelper/JNIHelp.h> Loading Loading @@ -140,7 +142,6 @@ using android::hardware::gnss::V1_0::IGnssXtra; using android::hardware::gnss::V1_0::IGnssXtraCallback; using android::hardware::gnss::V2_0::ElapsedRealtimeFlags; using android::hardware::gnss::V2_0::IGnssCallback; using android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections; using android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection; Loading @@ -153,7 +154,10 @@ using GnssLocation_V2_0 = android::hardware::gnss::V2_0::GnssLocation; using IGnss_V1_0 = android::hardware::gnss::V1_0::IGnss; using IGnss_V1_1 = android::hardware::gnss::V1_1::IGnss; using IGnss_V2_0 = android::hardware::gnss::V2_0::IGnss; using IGnss_V2_1 = android::hardware::gnss::V2_1::IGnss; using IGnssCallback_V1_0 = android::hardware::gnss::V1_0::IGnssCallback; using IGnssCallback_V2_0 = android::hardware::gnss::V2_0::IGnssCallback; using IGnssCallback_V2_1 = android::hardware::gnss::V2_1::IGnssCallback; using IGnssConfiguration_V1_0 = android::hardware::gnss::V1_0::IGnssConfiguration; using IGnssConfiguration_V1_1 = android::hardware::gnss::V1_1::IGnssConfiguration; using IGnssConfiguration_V2_0 = android::hardware::gnss::V2_0::IGnssConfiguration; Loading @@ -162,9 +166,11 @@ using IGnssDebug_V2_0 = android::hardware::gnss::V2_0::IGnssDebug; using IGnssMeasurement_V1_0 = android::hardware::gnss::V1_0::IGnssMeasurement; using IGnssMeasurement_V1_1 = android::hardware::gnss::V1_1::IGnssMeasurement; using IGnssMeasurement_V2_0 = android::hardware::gnss::V2_0::IGnssMeasurement; using IGnssMeasurement_V2_1 = android::hardware::gnss::V2_1::IGnssMeasurement; using IGnssMeasurementCallback_V1_0 = android::hardware::gnss::V1_0::IGnssMeasurementCallback; using IGnssMeasurementCallback_V1_1 = android::hardware::gnss::V1_1::IGnssMeasurementCallback; using IGnssMeasurementCallback_V2_0 = android::hardware::gnss::V2_0::IGnssMeasurementCallback; using IGnssMeasurementCallback_V2_1 = android::hardware::gnss::V2_1::IGnssMeasurementCallback; using IAGnssRil_V1_0 = android::hardware::gnss::V1_0::IAGnssRil; using IAGnssRil_V2_0 = android::hardware::gnss::V2_0::IAGnssRil; using IAGnss_V1_0 = android::hardware::gnss::V1_0::IAGnss; Loading Loading @@ -201,6 +207,7 @@ sp<GnssDeathRecipient> gnssHalDeathRecipient = nullptr; sp<IGnss_V1_0> gnssHal = nullptr; sp<IGnss_V1_1> gnssHal_V1_1 = nullptr; sp<IGnss_V2_0> gnssHal_V2_0 = nullptr; sp<IGnss_V2_1> gnssHal_V2_1 = nullptr; sp<IGnssXtra> gnssXtraIface = nullptr; sp<IAGnssRil_V1_0> agnssRilIface = nullptr; sp<IAGnssRil_V2_0> agnssRilIface_V2_0 = nullptr; Loading @@ -218,6 +225,7 @@ sp<IGnssNi> gnssNiIface = nullptr; sp<IGnssMeasurement_V1_0> gnssMeasurementIface = nullptr; sp<IGnssMeasurement_V1_1> gnssMeasurementIface_V1_1 = nullptr; sp<IGnssMeasurement_V2_0> gnssMeasurementIface_V2_0 = nullptr; sp<IGnssMeasurement_V2_1> gnssMeasurementIface_V2_1 = nullptr; sp<IGnssNavigationMessage> gnssNavigationMessageIface = nullptr; sp<IMeasurementCorrections> gnssCorrectionsIface = nullptr; sp<IGnssVisibilityControl> gnssVisibilityControlIface = nullptr; Loading Loading @@ -582,9 +590,9 @@ static GnssLocation_V2_0 createGnssLocation_V2_0( /* * GnssCallback class implements the callback methods for IGnss interface. */ struct GnssCallback : public IGnssCallback { struct GnssCallback : public IGnssCallback_V2_1 { Return<void> gnssLocationCb(const GnssLocation_V1_0& location) override; Return<void> gnssStatusCb(const IGnssCallback::GnssStatusValue status) override; Return<void> gnssStatusCb(const IGnssCallback_V1_0::GnssStatusValue status) override; Return<void> gnssSvStatusCb(const IGnssCallback_V1_0::GnssSvStatus& svStatus) override { return gnssSvStatusCbImpl(svStatus); } Loading @@ -595,7 +603,7 @@ struct GnssCallback : public IGnssCallback { Return<void> gnssRequestTimeCb() override; Return<void> gnssRequestLocationCb(const bool independentFromGnss) override; Return<void> gnssSetSystemInfoCb(const IGnssCallback::GnssSystemInfo& info) override; Return<void> gnssSetSystemInfoCb(const IGnssCallback_V1_0::GnssSystemInfo& info) override; // New in 1.1 Return<void> gnssNameCb(const android::hardware::hidl_string& name) override; Loading @@ -605,10 +613,12 @@ struct GnssCallback : public IGnssCallback { override; Return<void> gnssSetCapabilitiesCb_2_0(uint32_t capabilities) override; Return<void> gnssLocationCb_2_0(const GnssLocation_V2_0& location) override; Return<void> gnssSvStatusCb_2_0(const hidl_vec<IGnssCallback::GnssSvInfo>& svInfoList) override { Return<void> gnssSvStatusCb_2_0(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList) override { return gnssSvStatusCbImpl(svInfoList); } Return<void> gnssSvStatusCb_2_1(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList) override { return gnssSvStatusCbImpl(svInfoList); } Return<void> gnssSetCapabilitesCbImpl(uint32_t capabilities, bool hasSubHalCapabilityFlags); // TODO: Reconsider allocation cost vs threadsafety on these statics Loading @@ -625,7 +635,11 @@ private: return svStatus.numSvs; } uint32_t getGnssSvInfoListSize(const hidl_vec<IGnssCallback::GnssSvInfo>& svInfoList) { uint32_t getGnssSvInfoListSize(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList) { return svInfoList.size(); } uint32_t getGnssSvInfoListSize(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList) { return svInfoList.size(); } Loading @@ -635,17 +649,28 @@ private: } const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex( const hidl_vec<IGnssCallback::GnssSvInfo>& svInfoList, size_t i) { const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList, size_t i) { return svInfoList[i].v1_0; } const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex( const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList, size_t i) { // TODO(b/144850155): fill baseband CN0 after it's available in Java object. ALOGD("getGnssSvInfoOfIndex %d: baseband C/N0: %f", (int) i, svInfoList[i].basebandCN0DbHz); return svInfoList[i].v2_0.v1_0; } uint32_t getConstellationType(const IGnssCallback_V1_0::GnssSvStatus& svStatus, size_t i) { return static_cast<uint32_t>(svStatus.gnssSvList.data()[i].constellation); } uint32_t getConstellationType(const hidl_vec<IGnssCallback::GnssSvInfo>& svInfoList, size_t i) { uint32_t getConstellationType(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList, size_t i) { return static_cast<uint32_t>(svInfoList[i].constellation); } uint32_t getConstellationType(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList, size_t i) { return static_cast<uint32_t>(svInfoList[i].v2_0.constellation); } }; Return<void> GnssCallback::gnssNameCb(const android::hardware::hidl_string& name) { Loading Loading @@ -686,7 +711,7 @@ GnssCallback::gnssLocationCb_2_0(const GnssLocation_V2_0& location) { return gnssLocationCbImpl<GnssLocation_V2_0>(location); } Return<void> GnssCallback::gnssStatusCb(const IGnssCallback::GnssStatusValue status) { Return<void> GnssCallback::gnssStatusCb(const IGnssCallback_V2_0::GnssStatusValue status) { JNIEnv* env = getJniEnv(); env->CallVoidMethod(mCallbacksObj, method_reportStatus, status); checkAndClearExceptionFromCallback(env, __FUNCTION__); Loading Loading @@ -808,7 +833,7 @@ Return<void> GnssCallback::gnssRequestLocationCb_2_0(const bool independentFromG return Void(); } Return<void> GnssCallback::gnssSetSystemInfoCb(const IGnssCallback::GnssSystemInfo& info) { Return<void> GnssCallback::gnssSetSystemInfoCb(const IGnssCallback_V2_0::GnssSystemInfo& info) { ALOGD("%s: yearOfHw=%d\n", __func__, info.yearOfHw); JNIEnv* env = getJniEnv(); Loading Loading @@ -997,7 +1022,9 @@ Return<void> GnssNavigationMessageCallback::gnssNavigationMessageCb( * GnssMeasurementCallback implements the callback methods required for the * GnssMeasurement interface. */ struct GnssMeasurementCallback : public IGnssMeasurementCallback_V2_0 { struct GnssMeasurementCallback : public IGnssMeasurementCallback_V2_1 { Return<void> gnssMeasurementCb_2_1(const IGnssMeasurementCallback_V2_1::GnssData& data) override; Return<void> gnssMeasurementCb_2_0(const IGnssMeasurementCallback_V2_0::GnssData& data) override; Return<void> gnssMeasurementCb(const IGnssMeasurementCallback_V1_1::GnssData& data) override; Loading @@ -1021,6 +1048,12 @@ struct GnssMeasurementCallback : public IGnssMeasurementCallback_V2_0 { void setMeasurementData(JNIEnv* env, jobject clock, jobjectArray measurementArray); }; Return<void> GnssMeasurementCallback::gnssMeasurementCb_2_1( const IGnssMeasurementCallback_V2_1::GnssData& data) { translateAndSetGnssData(data); return Void(); } Return<void> GnssMeasurementCallback::gnssMeasurementCb_2_0( const IGnssMeasurementCallback_V2_0::GnssData& data) { translateAndSetGnssData(data); Loading Loading @@ -1142,6 +1175,17 @@ void GnssMeasurementCallback::translateSingleGnssMeasurement SET(ConstellationType, static_cast<int32_t>(measurement_V2_0->constellation)); } // Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement"); template<> void GnssMeasurementCallback::translateSingleGnssMeasurement <IGnssMeasurementCallback_V2_1::GnssMeasurement>( const IGnssMeasurementCallback_V2_1::GnssMeasurement* measurement_V2_1, JavaObject& object) { translateSingleGnssMeasurement(&(measurement_V2_1->v2_0), object); // TODO(b/144850155): fill baseband CN0 after it's available in Java object ALOGD("baseband CN0DbHz = %f\n", measurement_V2_1->basebandCN0DbHz); } template<class T> void GnssMeasurementCallback::translateGnssClock(JavaObject& object, const T& data) { translateGnssClock(object, data.clock); Loading Loading @@ -1523,6 +1567,17 @@ struct GnssBatchingCallback_V2_0 : public IGnssBatchingCallback_V2_0 { /* Initializes the GNSS service handle. */ static void android_location_GnssLocationProvider_set_gps_service_handle() { ALOGD("Trying IGnss_V2_1::getService()"); gnssHal_V2_1 = IGnss_V2_1::getService(); if (gnssHal_V2_1 != nullptr) { gnssHal = gnssHal_V2_1; gnssHal_V2_0 = gnssHal_V2_1; gnssHal_V1_1 = gnssHal_V2_1; gnssHal = gnssHal_V2_1; return; } ALOGD("gnssHal 2.1 was null, trying 2.0"); gnssHal_V2_0 = IGnss_V2_0::getService(); if (gnssHal_V2_0 != nullptr) { gnssHal = gnssHal_V2_0; Loading Loading @@ -1751,18 +1806,30 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass } // Allow all causal combinations between IGnss.hal and IGnssMeasurement.hal. That means, // 2.1@IGnss can be paired with {1.0, 1,1, 2.0, 2.1}@IGnssMeasurement // 2.0@IGnss can be paired with {1.0, 1,1, 2.0}@IGnssMeasurement // 1.1@IGnss can be paired {1.0, 1.1}@IGnssMeasurement // 1.0@IGnss is paired with 1.0@IGnssMeasurement gnssMeasurementIface = nullptr; if (gnssHal_V2_0 != nullptr) { if (gnssHal_V2_1 != nullptr) { auto gnssMeasurement = gnssHal_V2_1->getExtensionGnssMeasurement_2_1(); if (!gnssMeasurement.isOk()) { ALOGD("Unable to get a handle to GnssMeasurement_V2_1"); } else { gnssMeasurementIface_V2_1 = gnssMeasurement; gnssMeasurementIface_V2_0 = gnssMeasurementIface_V2_1; gnssMeasurementIface_V1_1 = gnssMeasurementIface_V2_0; gnssMeasurementIface = gnssMeasurementIface_V1_1; } } if (gnssHal_V2_0 != nullptr && gnssMeasurementIface == nullptr) { auto gnssMeasurement = gnssHal_V2_0->getExtensionGnssMeasurement_2_0(); if (!gnssMeasurement.isOk()) { ALOGD("Unable to get a handle to GnssMeasurement_V2_0"); } else { gnssMeasurementIface_V2_0 = gnssMeasurement; gnssMeasurementIface_V1_1 = gnssMeasurementIface_V2_0; gnssMeasurementIface = gnssMeasurementIface_V2_0; gnssMeasurementIface = gnssMeasurementIface_V1_1; } } if (gnssHal_V1_1 != nullptr && gnssMeasurementIface == nullptr) { Loading Loading @@ -1930,8 +1997,10 @@ static jboolean android_location_GnssLocationProvider_init(JNIEnv* env, jobject Return<bool> result = false; // Set top level IGnss.hal callback. sp<IGnssCallback> gnssCbIface = new GnssCallback(); if (gnssHal_V2_0 != nullptr) { sp<IGnssCallback_V2_1> gnssCbIface = new GnssCallback(); if (gnssHal_V2_1 != nullptr) { result = gnssHal_V2_1->setCallback_2_1(gnssCbIface); } else if (gnssHal_V2_0 != nullptr) { result = gnssHal_V2_0->setCallback_2_0(gnssCbIface); } else if (gnssHal_V1_1 != nullptr) { result = gnssHal_V1_1->setCallback_1_1(gnssCbIface); Loading Loading @@ -2564,7 +2633,9 @@ static jboolean android_location_GnssMeasurementsProvider_start_measurement_coll sp<GnssMeasurementCallback> cbIface = new GnssMeasurementCallback(); Return<IGnssMeasurement_V1_0::GnssMeasurementStatus> result = IGnssMeasurement_V1_0::GnssMeasurementStatus::ERROR_GENERIC; if (gnssMeasurementIface_V2_0 != nullptr) { if (gnssMeasurementIface_V2_1 != nullptr) { result = gnssMeasurementIface_V2_1->setCallback_2_1(cbIface, enableFullTracking); } else if (gnssMeasurementIface_V2_0 != nullptr) { result = gnssMeasurementIface_V2_0->setCallback_2_0(cbIface, enableFullTracking); } else if (gnssMeasurementIface_V1_1 != nullptr) { result = gnssMeasurementIface_V1_1->setCallback_1_1(cbIface, enableFullTracking); Loading Loading
services/core/jni/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ cc_defaults { "android.hardware.gnss@1.0", "android.hardware.gnss@1.1", "android.hardware.gnss@2.0", "android.hardware.gnss@2.1", "android.hardware.gnss.measurement_corrections@1.0", "android.hardware.gnss.visibility_control@1.0", "android.hardware.input.classifier@1.0", Loading
services/core/jni/com_android_server_location_GnssLocationProvider.cpp +88 −17 Original line number Diff line number Diff line Loading @@ -21,10 +21,12 @@ #include <android/hardware/gnss/1.0/IGnss.h> #include <android/hardware/gnss/1.1/IGnss.h> #include <android/hardware/gnss/2.0/IGnss.h> #include <android/hardware/gnss/2.1/IGnss.h> #include <android/hardware/gnss/1.0/IGnssMeasurement.h> #include <android/hardware/gnss/1.1/IGnssMeasurement.h> #include <android/hardware/gnss/2.0/IGnssMeasurement.h> #include <android/hardware/gnss/2.1/IGnssMeasurement.h> #include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h> #include <android/hardware/gnss/visibility_control/1.0/IGnssVisibilityControl.h> #include <nativehelper/JNIHelp.h> Loading Loading @@ -140,7 +142,6 @@ using android::hardware::gnss::V1_0::IGnssXtra; using android::hardware::gnss::V1_0::IGnssXtraCallback; using android::hardware::gnss::V2_0::ElapsedRealtimeFlags; using android::hardware::gnss::V2_0::IGnssCallback; using android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections; using android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection; Loading @@ -153,7 +154,10 @@ using GnssLocation_V2_0 = android::hardware::gnss::V2_0::GnssLocation; using IGnss_V1_0 = android::hardware::gnss::V1_0::IGnss; using IGnss_V1_1 = android::hardware::gnss::V1_1::IGnss; using IGnss_V2_0 = android::hardware::gnss::V2_0::IGnss; using IGnss_V2_1 = android::hardware::gnss::V2_1::IGnss; using IGnssCallback_V1_0 = android::hardware::gnss::V1_0::IGnssCallback; using IGnssCallback_V2_0 = android::hardware::gnss::V2_0::IGnssCallback; using IGnssCallback_V2_1 = android::hardware::gnss::V2_1::IGnssCallback; using IGnssConfiguration_V1_0 = android::hardware::gnss::V1_0::IGnssConfiguration; using IGnssConfiguration_V1_1 = android::hardware::gnss::V1_1::IGnssConfiguration; using IGnssConfiguration_V2_0 = android::hardware::gnss::V2_0::IGnssConfiguration; Loading @@ -162,9 +166,11 @@ using IGnssDebug_V2_0 = android::hardware::gnss::V2_0::IGnssDebug; using IGnssMeasurement_V1_0 = android::hardware::gnss::V1_0::IGnssMeasurement; using IGnssMeasurement_V1_1 = android::hardware::gnss::V1_1::IGnssMeasurement; using IGnssMeasurement_V2_0 = android::hardware::gnss::V2_0::IGnssMeasurement; using IGnssMeasurement_V2_1 = android::hardware::gnss::V2_1::IGnssMeasurement; using IGnssMeasurementCallback_V1_0 = android::hardware::gnss::V1_0::IGnssMeasurementCallback; using IGnssMeasurementCallback_V1_1 = android::hardware::gnss::V1_1::IGnssMeasurementCallback; using IGnssMeasurementCallback_V2_0 = android::hardware::gnss::V2_0::IGnssMeasurementCallback; using IGnssMeasurementCallback_V2_1 = android::hardware::gnss::V2_1::IGnssMeasurementCallback; using IAGnssRil_V1_0 = android::hardware::gnss::V1_0::IAGnssRil; using IAGnssRil_V2_0 = android::hardware::gnss::V2_0::IAGnssRil; using IAGnss_V1_0 = android::hardware::gnss::V1_0::IAGnss; Loading Loading @@ -201,6 +207,7 @@ sp<GnssDeathRecipient> gnssHalDeathRecipient = nullptr; sp<IGnss_V1_0> gnssHal = nullptr; sp<IGnss_V1_1> gnssHal_V1_1 = nullptr; sp<IGnss_V2_0> gnssHal_V2_0 = nullptr; sp<IGnss_V2_1> gnssHal_V2_1 = nullptr; sp<IGnssXtra> gnssXtraIface = nullptr; sp<IAGnssRil_V1_0> agnssRilIface = nullptr; sp<IAGnssRil_V2_0> agnssRilIface_V2_0 = nullptr; Loading @@ -218,6 +225,7 @@ sp<IGnssNi> gnssNiIface = nullptr; sp<IGnssMeasurement_V1_0> gnssMeasurementIface = nullptr; sp<IGnssMeasurement_V1_1> gnssMeasurementIface_V1_1 = nullptr; sp<IGnssMeasurement_V2_0> gnssMeasurementIface_V2_0 = nullptr; sp<IGnssMeasurement_V2_1> gnssMeasurementIface_V2_1 = nullptr; sp<IGnssNavigationMessage> gnssNavigationMessageIface = nullptr; sp<IMeasurementCorrections> gnssCorrectionsIface = nullptr; sp<IGnssVisibilityControl> gnssVisibilityControlIface = nullptr; Loading Loading @@ -582,9 +590,9 @@ static GnssLocation_V2_0 createGnssLocation_V2_0( /* * GnssCallback class implements the callback methods for IGnss interface. */ struct GnssCallback : public IGnssCallback { struct GnssCallback : public IGnssCallback_V2_1 { Return<void> gnssLocationCb(const GnssLocation_V1_0& location) override; Return<void> gnssStatusCb(const IGnssCallback::GnssStatusValue status) override; Return<void> gnssStatusCb(const IGnssCallback_V1_0::GnssStatusValue status) override; Return<void> gnssSvStatusCb(const IGnssCallback_V1_0::GnssSvStatus& svStatus) override { return gnssSvStatusCbImpl(svStatus); } Loading @@ -595,7 +603,7 @@ struct GnssCallback : public IGnssCallback { Return<void> gnssRequestTimeCb() override; Return<void> gnssRequestLocationCb(const bool independentFromGnss) override; Return<void> gnssSetSystemInfoCb(const IGnssCallback::GnssSystemInfo& info) override; Return<void> gnssSetSystemInfoCb(const IGnssCallback_V1_0::GnssSystemInfo& info) override; // New in 1.1 Return<void> gnssNameCb(const android::hardware::hidl_string& name) override; Loading @@ -605,10 +613,12 @@ struct GnssCallback : public IGnssCallback { override; Return<void> gnssSetCapabilitiesCb_2_0(uint32_t capabilities) override; Return<void> gnssLocationCb_2_0(const GnssLocation_V2_0& location) override; Return<void> gnssSvStatusCb_2_0(const hidl_vec<IGnssCallback::GnssSvInfo>& svInfoList) override { Return<void> gnssSvStatusCb_2_0(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList) override { return gnssSvStatusCbImpl(svInfoList); } Return<void> gnssSvStatusCb_2_1(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList) override { return gnssSvStatusCbImpl(svInfoList); } Return<void> gnssSetCapabilitesCbImpl(uint32_t capabilities, bool hasSubHalCapabilityFlags); // TODO: Reconsider allocation cost vs threadsafety on these statics Loading @@ -625,7 +635,11 @@ private: return svStatus.numSvs; } uint32_t getGnssSvInfoListSize(const hidl_vec<IGnssCallback::GnssSvInfo>& svInfoList) { uint32_t getGnssSvInfoListSize(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList) { return svInfoList.size(); } uint32_t getGnssSvInfoListSize(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList) { return svInfoList.size(); } Loading @@ -635,17 +649,28 @@ private: } const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex( const hidl_vec<IGnssCallback::GnssSvInfo>& svInfoList, size_t i) { const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList, size_t i) { return svInfoList[i].v1_0; } const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex( const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList, size_t i) { // TODO(b/144850155): fill baseband CN0 after it's available in Java object. ALOGD("getGnssSvInfoOfIndex %d: baseband C/N0: %f", (int) i, svInfoList[i].basebandCN0DbHz); return svInfoList[i].v2_0.v1_0; } uint32_t getConstellationType(const IGnssCallback_V1_0::GnssSvStatus& svStatus, size_t i) { return static_cast<uint32_t>(svStatus.gnssSvList.data()[i].constellation); } uint32_t getConstellationType(const hidl_vec<IGnssCallback::GnssSvInfo>& svInfoList, size_t i) { uint32_t getConstellationType(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList, size_t i) { return static_cast<uint32_t>(svInfoList[i].constellation); } uint32_t getConstellationType(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList, size_t i) { return static_cast<uint32_t>(svInfoList[i].v2_0.constellation); } }; Return<void> GnssCallback::gnssNameCb(const android::hardware::hidl_string& name) { Loading Loading @@ -686,7 +711,7 @@ GnssCallback::gnssLocationCb_2_0(const GnssLocation_V2_0& location) { return gnssLocationCbImpl<GnssLocation_V2_0>(location); } Return<void> GnssCallback::gnssStatusCb(const IGnssCallback::GnssStatusValue status) { Return<void> GnssCallback::gnssStatusCb(const IGnssCallback_V2_0::GnssStatusValue status) { JNIEnv* env = getJniEnv(); env->CallVoidMethod(mCallbacksObj, method_reportStatus, status); checkAndClearExceptionFromCallback(env, __FUNCTION__); Loading Loading @@ -808,7 +833,7 @@ Return<void> GnssCallback::gnssRequestLocationCb_2_0(const bool independentFromG return Void(); } Return<void> GnssCallback::gnssSetSystemInfoCb(const IGnssCallback::GnssSystemInfo& info) { Return<void> GnssCallback::gnssSetSystemInfoCb(const IGnssCallback_V2_0::GnssSystemInfo& info) { ALOGD("%s: yearOfHw=%d\n", __func__, info.yearOfHw); JNIEnv* env = getJniEnv(); Loading Loading @@ -997,7 +1022,9 @@ Return<void> GnssNavigationMessageCallback::gnssNavigationMessageCb( * GnssMeasurementCallback implements the callback methods required for the * GnssMeasurement interface. */ struct GnssMeasurementCallback : public IGnssMeasurementCallback_V2_0 { struct GnssMeasurementCallback : public IGnssMeasurementCallback_V2_1 { Return<void> gnssMeasurementCb_2_1(const IGnssMeasurementCallback_V2_1::GnssData& data) override; Return<void> gnssMeasurementCb_2_0(const IGnssMeasurementCallback_V2_0::GnssData& data) override; Return<void> gnssMeasurementCb(const IGnssMeasurementCallback_V1_1::GnssData& data) override; Loading @@ -1021,6 +1048,12 @@ struct GnssMeasurementCallback : public IGnssMeasurementCallback_V2_0 { void setMeasurementData(JNIEnv* env, jobject clock, jobjectArray measurementArray); }; Return<void> GnssMeasurementCallback::gnssMeasurementCb_2_1( const IGnssMeasurementCallback_V2_1::GnssData& data) { translateAndSetGnssData(data); return Void(); } Return<void> GnssMeasurementCallback::gnssMeasurementCb_2_0( const IGnssMeasurementCallback_V2_0::GnssData& data) { translateAndSetGnssData(data); Loading Loading @@ -1142,6 +1175,17 @@ void GnssMeasurementCallback::translateSingleGnssMeasurement SET(ConstellationType, static_cast<int32_t>(measurement_V2_0->constellation)); } // Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement"); template<> void GnssMeasurementCallback::translateSingleGnssMeasurement <IGnssMeasurementCallback_V2_1::GnssMeasurement>( const IGnssMeasurementCallback_V2_1::GnssMeasurement* measurement_V2_1, JavaObject& object) { translateSingleGnssMeasurement(&(measurement_V2_1->v2_0), object); // TODO(b/144850155): fill baseband CN0 after it's available in Java object ALOGD("baseband CN0DbHz = %f\n", measurement_V2_1->basebandCN0DbHz); } template<class T> void GnssMeasurementCallback::translateGnssClock(JavaObject& object, const T& data) { translateGnssClock(object, data.clock); Loading Loading @@ -1523,6 +1567,17 @@ struct GnssBatchingCallback_V2_0 : public IGnssBatchingCallback_V2_0 { /* Initializes the GNSS service handle. */ static void android_location_GnssLocationProvider_set_gps_service_handle() { ALOGD("Trying IGnss_V2_1::getService()"); gnssHal_V2_1 = IGnss_V2_1::getService(); if (gnssHal_V2_1 != nullptr) { gnssHal = gnssHal_V2_1; gnssHal_V2_0 = gnssHal_V2_1; gnssHal_V1_1 = gnssHal_V2_1; gnssHal = gnssHal_V2_1; return; } ALOGD("gnssHal 2.1 was null, trying 2.0"); gnssHal_V2_0 = IGnss_V2_0::getService(); if (gnssHal_V2_0 != nullptr) { gnssHal = gnssHal_V2_0; Loading Loading @@ -1751,18 +1806,30 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass } // Allow all causal combinations between IGnss.hal and IGnssMeasurement.hal. That means, // 2.1@IGnss can be paired with {1.0, 1,1, 2.0, 2.1}@IGnssMeasurement // 2.0@IGnss can be paired with {1.0, 1,1, 2.0}@IGnssMeasurement // 1.1@IGnss can be paired {1.0, 1.1}@IGnssMeasurement // 1.0@IGnss is paired with 1.0@IGnssMeasurement gnssMeasurementIface = nullptr; if (gnssHal_V2_0 != nullptr) { if (gnssHal_V2_1 != nullptr) { auto gnssMeasurement = gnssHal_V2_1->getExtensionGnssMeasurement_2_1(); if (!gnssMeasurement.isOk()) { ALOGD("Unable to get a handle to GnssMeasurement_V2_1"); } else { gnssMeasurementIface_V2_1 = gnssMeasurement; gnssMeasurementIface_V2_0 = gnssMeasurementIface_V2_1; gnssMeasurementIface_V1_1 = gnssMeasurementIface_V2_0; gnssMeasurementIface = gnssMeasurementIface_V1_1; } } if (gnssHal_V2_0 != nullptr && gnssMeasurementIface == nullptr) { auto gnssMeasurement = gnssHal_V2_0->getExtensionGnssMeasurement_2_0(); if (!gnssMeasurement.isOk()) { ALOGD("Unable to get a handle to GnssMeasurement_V2_0"); } else { gnssMeasurementIface_V2_0 = gnssMeasurement; gnssMeasurementIface_V1_1 = gnssMeasurementIface_V2_0; gnssMeasurementIface = gnssMeasurementIface_V2_0; gnssMeasurementIface = gnssMeasurementIface_V1_1; } } if (gnssHal_V1_1 != nullptr && gnssMeasurementIface == nullptr) { Loading Loading @@ -1930,8 +1997,10 @@ static jboolean android_location_GnssLocationProvider_init(JNIEnv* env, jobject Return<bool> result = false; // Set top level IGnss.hal callback. sp<IGnssCallback> gnssCbIface = new GnssCallback(); if (gnssHal_V2_0 != nullptr) { sp<IGnssCallback_V2_1> gnssCbIface = new GnssCallback(); if (gnssHal_V2_1 != nullptr) { result = gnssHal_V2_1->setCallback_2_1(gnssCbIface); } else if (gnssHal_V2_0 != nullptr) { result = gnssHal_V2_0->setCallback_2_0(gnssCbIface); } else if (gnssHal_V1_1 != nullptr) { result = gnssHal_V1_1->setCallback_1_1(gnssCbIface); Loading Loading @@ -2564,7 +2633,9 @@ static jboolean android_location_GnssMeasurementsProvider_start_measurement_coll sp<GnssMeasurementCallback> cbIface = new GnssMeasurementCallback(); Return<IGnssMeasurement_V1_0::GnssMeasurementStatus> result = IGnssMeasurement_V1_0::GnssMeasurementStatus::ERROR_GENERIC; if (gnssMeasurementIface_V2_0 != nullptr) { if (gnssMeasurementIface_V2_1 != nullptr) { result = gnssMeasurementIface_V2_1->setCallback_2_1(cbIface, enableFullTracking); } else if (gnssMeasurementIface_V2_0 != nullptr) { result = gnssMeasurementIface_V2_0->setCallback_2_0(cbIface, enableFullTracking); } else if (gnssMeasurementIface_V1_1 != nullptr) { result = gnssMeasurementIface_V1_1->setCallback_1_1(cbIface, enableFullTracking); Loading