diff options
| -rw-r--r-- | services/core/jni/com_android_server_location_GnssLocationProvider.cpp | 88 |
1 files changed, 60 insertions, 28 deletions
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index a6e9fdde7735..65a7eec60f63 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -117,8 +117,6 @@ using android::hardware::hidl_death_recipient; using android::hardware::gnss::V1_0::GnssConstellationType; using android::hardware::gnss::V1_0::GnssLocationFlags; using android::hardware::gnss::V1_0::IAGnssRilCallback; -using android::hardware::gnss::V1_0::IGnssBatching; -using android::hardware::gnss::V1_0::IGnssBatchingCallback; using android::hardware::gnss::V1_0::IGnssGeofenceCallback; using android::hardware::gnss::V1_0::IGnssGeofencing; using android::hardware::gnss::V1_0::IGnssNavigationMessage; @@ -160,6 +158,10 @@ using IAGnss_V1_0 = android::hardware::gnss::V1_0::IAGnss; using IAGnss_V2_0 = android::hardware::gnss::V2_0::IAGnss; using IAGnssCallback_V1_0 = android::hardware::gnss::V1_0::IAGnssCallback; using IAGnssCallback_V2_0 = android::hardware::gnss::V2_0::IAGnssCallback; +using IGnssBatching_V1_0 = android::hardware::gnss::V1_0::IGnssBatching; +using IGnssBatching_V2_0 = android::hardware::gnss::V2_0::IGnssBatching; +using IGnssBatchingCallback_V1_0 = android::hardware::gnss::V1_0::IGnssBatchingCallback; +using IGnssBatchingCallback_V2_0 = android::hardware::gnss::V2_0::IGnssBatchingCallback; using android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections; using android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrectionsCallback; @@ -192,7 +194,8 @@ sp<IAGnssRil_V2_0> agnssRilIface_V2_0 = nullptr; sp<IGnssGeofencing> gnssGeofencingIface = nullptr; sp<IAGnss_V1_0> agnssIface = nullptr; sp<IAGnss_V2_0> agnssIface_V2_0 = nullptr; -sp<IGnssBatching> gnssBatchingIface = nullptr; +sp<IGnssBatching_V1_0> gnssBatchingIface = nullptr; +sp<IGnssBatching_V2_0> gnssBatchingIface_V2_0 = nullptr; sp<IGnssDebug_V1_0> gnssDebugIface = nullptr; sp<IGnssDebug_V2_0> gnssDebugIface_V2_0 = nullptr; sp<IGnssConfiguration_V1_0> gnssConfigurationIface = nullptr; @@ -1445,20 +1448,15 @@ Return<void> AGnssRilCallback::requestRefLocCb() { return Void(); } -/* - * GnssBatchingCallback interface implements the callback methods - * required by the IGnssBatching interface. - */ -struct GnssBatchingCallback : public IGnssBatchingCallback { - /* - * Methods from ::android::hardware::gps::V1_0::IGnssBatchingCallback - * follow. - */ - Return<void> gnssLocationBatchCb(const hidl_vec<GnssLocation_V1_0>& locations) override; +struct GnssBatchingCallbackUtil { + template<class T> + static Return<void> gnssLocationBatchCbImpl(const hidl_vec<T>& locations); +private: + GnssBatchingCallbackUtil() = delete; }; -Return<void> GnssBatchingCallback::gnssLocationBatchCb( - const hidl_vec<GnssLocation_V1_0>& locations) { +template<class T> +Return<void> GnssBatchingCallbackUtil::gnssLocationBatchCbImpl(const hidl_vec<T>& locations) { JNIEnv* env = getJniEnv(); jobjectArray jLocations = env->NewObjectArray(locations.size(), @@ -1478,6 +1476,28 @@ Return<void> GnssBatchingCallback::gnssLocationBatchCb( return Void(); } +/* + * GnssBatchingCallback_V1_0 class implements the callback methods required by the + * IGnssBatching 1.0 interface. + */ +struct GnssBatchingCallback_V1_0 : public IGnssBatchingCallback_V1_0 { + /** Methods from ::android::hardware::gps::V1_0::IGnssBatchingCallback follow. */ + Return<void> gnssLocationBatchCb(const hidl_vec<GnssLocation_V1_0>& locations) override { + return GnssBatchingCallbackUtil::gnssLocationBatchCbImpl(locations); + } +}; + +/* + * GnssBatchingCallback_V2_0 class implements the callback methods required by the + * IGnssBatching 2.0 interface. + */ +struct GnssBatchingCallback_V2_0 : public IGnssBatchingCallback_V2_0 { + /** Methods from ::android::hardware::gps::V2_0::IGnssBatchingCallback follow. */ + Return<void> gnssLocationBatchCb(const hidl_vec<GnssLocation_V2_0>& locations) override { + return GnssBatchingCallbackUtil::gnssLocationBatchCbImpl(locations); + } +}; + static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env, jclass clazz) { gnssHal_V2_0 = IGnss_V2_0::getService(); if (gnssHal_V2_0 != nullptr) { @@ -1753,11 +1773,22 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass gnssGeofencingIface = gnssGeofencing; } - auto gnssBatching = gnssHal->getExtensionGnssBatching(); - if (!gnssBatching.isOk()) { - ALOGD("Unable to get a handle to gnssBatching"); - } else { - gnssBatchingIface = gnssBatching; + // If IGnssBatching.hal@2.0 is not supported, use IGnssBatching.hal@1.0 + if (gnssHal_V2_0 != nullptr) { + auto gnssBatching_V2_0 = gnssHal_V2_0->getExtensionGnssBatching_2_0(); + if (!gnssBatching_V2_0.isOk()) { + ALOGD("Unable to get a handle to GnssBatching_V2_0"); + } else { + gnssBatchingIface_V2_0 = gnssBatching_V2_0; + } + } + if (gnssBatchingIface_V2_0 == nullptr ) { + auto gnssBatching_V1_0 = gnssHal->getExtensionGnssBatching(); + if (!gnssBatching_V1_0.isOk()) { + ALOGD("Unable to get a handle to GnssBatching"); + } else { + gnssBatchingIface = gnssBatching_V1_0; + } } if (gnssHal_V2_0 != nullptr) { @@ -2123,8 +2154,6 @@ struct AGnssDispatcher { private: AGnssDispatcher() = delete; - AGnssDispatcher(const AGnssDispatcher&) = delete; - AGnssDispatcher& operator=(const AGnssDispatcher&) = delete; }; void AGnssDispatcher::dataConnOpen(sp<IAGnss_V1_0> agnssIface, JNIEnv* env, jstring apn, @@ -2848,12 +2877,15 @@ static jint android_location_GnssBatchingProvider_get_batch_size(JNIEnv*, jclass } static jboolean android_location_GnssBatchingProvider_init_batching(JNIEnv*, jclass) { - if (gnssBatchingIface == nullptr) { + if (gnssBatchingIface_V2_0 != nullptr) { + sp<IGnssBatchingCallback_V2_0> gnssBatchingCbIface_V2_0 = new GnssBatchingCallback_V2_0(); + return static_cast<jboolean>(gnssBatchingIface_V2_0->init_2_0(gnssBatchingCbIface_V2_0)); + } else if (gnssBatchingIface != nullptr) { + sp<IGnssBatchingCallback_V1_0> gnssBatchingCbIface_V1_0 = new GnssBatchingCallback_V1_0(); + return static_cast<jboolean>(gnssBatchingIface->init(gnssBatchingCbIface_V1_0)); + } else { return JNI_FALSE; // batching not supported } - sp<IGnssBatchingCallback> gnssBatchingCbIface = new GnssBatchingCallback(); - - return static_cast<jboolean>(gnssBatchingIface->init(gnssBatchingCbIface)); } static void android_location_GnssBatchingProvider_cleanup_batching(JNIEnv*, jclass) { @@ -2869,10 +2901,10 @@ static jboolean android_location_GnssBatchingProvider_start_batch(JNIEnv*, jclas return JNI_FALSE; // batching not supported } - IGnssBatching::Options options; + IGnssBatching_V1_0::Options options; options.periodNanos = periodNanos; if (wakeOnFifoFull) { - options.flags = static_cast<uint8_t>(IGnssBatching::Flag::WAKEUP_ON_FIFO_FULL); + options.flags = static_cast<uint8_t>(IGnssBatching_V1_0::Flag::WAKEUP_ON_FIFO_FULL); } else { options.flags = 0; } |