diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 54cb79adb7415..c7f1367256cab 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,7 @@ #include "android_runtime/Log.h" #include "gnss/AGnss.h" #include "gnss/AGnssRil.h" +#include "gnss/GnssAntennaInfo.h" #include "gnss/GnssAntennaInfoCallback.h" #include "gnss/GnssBatching.h" #include "gnss/GnssConfiguration.h" @@ -155,7 +157,6 @@ 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 IGnssAntennaInfo = android::hardware::gnss::V2_1::IGnssAntennaInfo; using IMeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections; using IMeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::IMeasurementCorrections; @@ -179,6 +180,7 @@ using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds; using IGnssPsdsCallbackAidl = android::hardware::gnss::IGnssPsdsCallback; using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration; using GnssLocationAidl = android::hardware::gnss::GnssLocation; +using IGnssAntennaInfoAidl = android::hardware::gnss::IGnssAntennaInfo; struct GnssDeathRecipient : virtual public hidl_death_recipient { @@ -207,7 +209,6 @@ sp gnssNiIface = nullptr; sp gnssPowerIndicationIface = nullptr; sp gnssCorrectionsIface_V1_0 = nullptr; sp gnssCorrectionsIface_V1_1 = nullptr; -sp gnssAntennaInfoIface = nullptr; std::unique_ptr gnssConfigurationIface = nullptr; std::unique_ptr gnssMeasurementIface = nullptr; @@ -218,6 +219,7 @@ std::unique_ptr agnssIface = nullptr; std::unique_ptr gnssDebugIface = nullptr; std::unique_ptr agnssRilIface = nullptr; std::unique_ptr gnssVisibilityControlIface = nullptr; +std::unique_ptr gnssAntennaInfoIface = nullptr; #define WAKE_LOCK_NAME "GPS" @@ -1163,12 +1165,18 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject } } - if (gnssHal_V2_1 != nullptr) { - auto gnssAntennaInfo = gnssHal_V2_1->getExtensionGnssAntennaInfo(); - if (!gnssAntennaInfo.isOk()) { - ALOGD("Unable to get a handle to GnssAntennaInfo"); - } else { - gnssAntennaInfoIface = gnssAntennaInfo; + if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { + sp gnssAntennaInfoAidl; + auto status = gnssHalAidl->getExtensionGnssAntennaInfo(&gnssAntennaInfoAidl); + if (checkAidlStatus(status, "Unable to get a handle to GnssAntennaInfo interface.")) { + gnssAntennaInfoIface = std::make_unique(gnssAntennaInfoAidl); + } + } else if (gnssHal_V2_1 != nullptr) { + auto gnssAntennaInfo_V2_1 = gnssHal_V2_1->getExtensionGnssAntennaInfo(); + if (checkHidlReturn(gnssAntennaInfo_V2_1, + "Unable to get a handle to GnssAntennaInfo_V2_1")) { + gnssAntennaInfoIface = + std::make_unique(gnssAntennaInfo_V2_1); } } @@ -1933,25 +1941,7 @@ static jboolean android_location_gnss_hal_GnssNative_start_antenna_info_listenin ALOGE("%s: IGnssAntennaInfo interface not available.", __func__); return JNI_FALSE; } - - sp cbIface = new gnss::GnssAntennaInfoCallback(mCallbacksObj); - - auto result = gnssAntennaInfoIface->setCallback(cbIface); - - if (!checkHidlReturn(result, "IGnssAntennaInfo setCallback() failed.")) { - return JNI_FALSE; - } - - IGnssAntennaInfo::GnssAntennaInfoStatus initRet = result; - if (initRet != IGnssAntennaInfo::GnssAntennaInfoStatus::SUCCESS) { - ALOGE("An error has been found on GnssAntennaInfoInterface::init, status=%d", - static_cast(initRet)); - return JNI_FALSE; - } else { - ALOGD("gnss antenna info has been enabled"); - } - - return JNI_TRUE; + return gnssAntennaInfoIface->setCallback(std::make_unique()); } static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening(JNIEnv* /* env */, @@ -1960,9 +1950,7 @@ static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening ALOGE("%s: IGnssAntennaInfo interface not available.", __func__); return JNI_FALSE; } - - auto result = gnssAntennaInfoIface->close(); - return checkHidlReturn(result, "IGnssAntennaInfo close() failed."); + return gnssAntennaInfoIface->close(); } static jboolean android_location_gnss_hal_GnssNative_is_measurement_supported(JNIEnv* env, jclass) { diff --git a/services/core/jni/gnss/Android.bp b/services/core/jni/gnss/Android.bp index bed72a8aa87cf..252f0e8bad89a 100644 --- a/services/core/jni/gnss/Android.bp +++ b/services/core/jni/gnss/Android.bp @@ -27,6 +27,7 @@ cc_library_shared { "AGnssCallback.cpp", "AGnssRil.cpp", "AGnssRilCallback.cpp", + "GnssAntennaInfo.cpp", "GnssAntennaInfoCallback.cpp", "GnssBatching.cpp", "GnssBatchingCallback.cpp", diff --git a/services/core/jni/gnss/GnssAntennaInfo.cpp b/services/core/jni/gnss/GnssAntennaInfo.cpp new file mode 100644 index 0000000000000..0f41b0f4e8693 --- /dev/null +++ b/services/core/jni/gnss/GnssAntennaInfo.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Define LOG_TAG before to overwrite the default value. +#define LOG_TAG "GnssAntennaInfoJni" + +#include "GnssAntennaInfo.h" + +#include "Utils.h" + +using IGnssAntennaInfoAidl = android::hardware::gnss::IGnssAntennaInfo; +using IGnssAntennaInfo_V2_1 = android::hardware::gnss::V2_1::IGnssAntennaInfo; + +namespace android::gnss { + +// Implementation of GnssAntennaInfo (AIDL HAL) + +GnssAntennaInfoAidl::GnssAntennaInfoAidl(const sp& iGnssAntennaInfo) + : mIGnssAntennaInfoAidl(iGnssAntennaInfo) { + assert(mIGnssAntennaInfoAidl != nullptr); +} + +jboolean GnssAntennaInfoAidl::setCallback( + const std::unique_ptr& callback) { + auto status = mIGnssAntennaInfoAidl->setCallback(callback->getAidl()); + return checkAidlStatus(status, "IGnssAntennaInfoAidl setCallback() failed."); +} + +jboolean GnssAntennaInfoAidl::close() { + auto status = mIGnssAntennaInfoAidl->close(); + return checkAidlStatus(status, "IGnssAntennaInfoAidl close() failed"); +} + +// Implementation of GnssAntennaInfo_V2_1 + +GnssAntennaInfo_V2_1::GnssAntennaInfo_V2_1(const sp& iGnssAntennaInfo) + : mIGnssAntennaInfo_V2_1(iGnssAntennaInfo) { + assert(mIGnssAntennaInfo_V2_1 != nullptr); +} + +jboolean GnssAntennaInfo_V2_1::setCallback( + const std::unique_ptr& callback) { + auto result = mIGnssAntennaInfo_V2_1->setCallback(callback->getV2_1()); + if (!checkHidlReturn(result, "IGnssAntennaInfo_V2_1 setCallback() failed.")) { + return JNI_FALSE; + } + + IGnssAntennaInfo_V2_1::GnssAntennaInfoStatus initRet = result; + if (initRet != IGnssAntennaInfo_V2_1::GnssAntennaInfoStatus::SUCCESS) { + ALOGE("An error has been found on GnssAntennaInfoInterface::init, status=%d", + static_cast(initRet)); + return JNI_FALSE; + } else { + ALOGD("gnss antenna info v2_1 has been enabled"); + } + return JNI_TRUE; +} + +jboolean GnssAntennaInfo_V2_1::close() { + auto result = mIGnssAntennaInfo_V2_1->close(); + return checkHidlReturn(result, "IGnssAntennaInfo_V2_1 close() failed."); +} + +} // namespace android::gnss diff --git a/services/core/jni/gnss/GnssAntennaInfo.h b/services/core/jni/gnss/GnssAntennaInfo.h new file mode 100644 index 0000000000000..9a9dc2a333168 --- /dev/null +++ b/services/core/jni/gnss/GnssAntennaInfo.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H +#define _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H + +#pragma once + +#ifndef LOG_TAG +#error LOG_TAG must be defined before including this file. +#endif + +#include +#include +#include + +#include "GnssAntennaInfoCallback.h" +#include "jni.h" + +namespace android::gnss { + +class GnssAntennaInfoInterface { +public: + virtual ~GnssAntennaInfoInterface() {} + virtual jboolean setCallback(const std::unique_ptr& callback) = 0; + virtual jboolean close() = 0; +}; + +class GnssAntennaInfoAidl : public GnssAntennaInfoInterface { +public: + GnssAntennaInfoAidl(const sp& iGnssAntennaInfo); + jboolean setCallback(const std::unique_ptr& callback) override; + jboolean close() override; + +private: + const sp mIGnssAntennaInfoAidl; +}; + +class GnssAntennaInfo_V2_1 : public GnssAntennaInfoInterface { +public: + GnssAntennaInfo_V2_1( + const sp& iGnssAntennaInfo); + jboolean setCallback(const std::unique_ptr& callback) override; + jboolean close() override; + +private: + const sp mIGnssAntennaInfo_V2_1; +}; + +} // namespace android::gnss + +#endif // _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H diff --git a/services/core/jni/gnss/GnssAntennaInfoCallback.cpp b/services/core/jni/gnss/GnssAntennaInfoCallback.cpp index 99d06eb062da9..2e99b2b79d370 100644 --- a/services/core/jni/gnss/GnssAntennaInfoCallback.cpp +++ b/services/core/jni/gnss/GnssAntennaInfoCallback.cpp @@ -25,8 +25,10 @@ namespace android::gnss { using android::hardware::hidl_vec; using android::hardware::Return; using android::hardware::Void; +using binder::Status; -using IGnssAntennaInfoCallback = android::hardware::gnss::V2_1::IGnssAntennaInfoCallback; +using IGnssAntennaInfoCallbackAidl = android::hardware::gnss::IGnssAntennaInfoCallback; +using IGnssAntennaInfoCallback_V2_1 = android::hardware::gnss::V2_1::IGnssAntennaInfoCallback; namespace { jclass class_gnssAntennaInfoBuilder; @@ -92,14 +94,21 @@ void GnssAntennaInfo_class_init_once(JNIEnv* env, jclass& clazz) { class_doubleArray = (jclass)env->NewGlobalRef(doubleArrayClass); } -Return GnssAntennaInfoCallback::gnssAntennaInfoCb( - const hidl_vec& gnssAntennaInfos) { - translateAndReportGnssAntennaInfo(gnssAntennaInfos); +binder::Status GnssAntennaInfoCallbackAidl::gnssAntennaInfoCb( + const std::vector& gnssAntennaInfos) { + GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(gnssAntennaInfos); + return Status::ok(); +} + +Return GnssAntennaInfoCallback_V2_1::gnssAntennaInfoCb( + const hidl_vec& gnssAntennaInfos) { + GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(gnssAntennaInfos); return Void(); } -jobjectArray GnssAntennaInfoCallback::translate2dDoubleArray( - JNIEnv* env, const hidl_vec& array) { +template