Loading services/core/jni/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -155,7 +155,6 @@ cc_defaults { "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.graphics.bufferqueue@1.0", "android.hardware.graphics.bufferqueue@2.0", "android.hardware.graphics.common@1.2", Loading services/core/jni/com_android_server_location_GnssLocationProvider.cpp +24 −75 Original line number Diff line number Diff line Loading @@ -37,7 +37,6 @@ #include <android/hardware/gnss/BnGnssPsdsCallback.h> #include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h> #include <android/hardware/gnss/measurement_corrections/1.1/IMeasurementCorrections.h> #include <android/hardware/gnss/visibility_control/1.0/IGnssVisibilityControl.h> #include <binder/IServiceManager.h> #include <nativehelper/JNIHelp.h> #include <pthread.h> Loading @@ -59,6 +58,7 @@ #include "gnss/GnssGeofence.h" #include "gnss/GnssMeasurement.h" #include "gnss/GnssNavigationMessage.h" #include "gnss/GnssVisibilityControl.h" #include "gnss/Utils.h" #include "hardware_legacy/power.h" #include "jni.h" Loading Loading @@ -162,9 +162,6 @@ using IMeasurementCorrections_V1_1 = android::hardware::gnss::measurement_correc using android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrectionsCallback; using android::hardware::gnss::measurement_corrections::V1_0::GnssSingleSatCorrectionFlags; using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl; using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControlCallback; using android::hardware::gnss::BlocklistedSource; using android::hardware::gnss::GnssConstellationType; using android::hardware::gnss::GnssPowerStats; Loading Loading @@ -210,7 +207,6 @@ sp<IGnssNi> gnssNiIface = nullptr; sp<IGnssPowerIndication> gnssPowerIndicationIface = nullptr; sp<IMeasurementCorrections_V1_0> gnssCorrectionsIface_V1_0 = nullptr; sp<IMeasurementCorrections_V1_1> gnssCorrectionsIface_V1_1 = nullptr; sp<IGnssVisibilityControl> gnssVisibilityControlIface = nullptr; sp<IGnssAntennaInfo> gnssAntennaInfoIface = nullptr; std::unique_ptr<GnssConfigurationInterface> gnssConfigurationIface = nullptr; Loading @@ -221,6 +217,7 @@ std::unique_ptr<android::gnss::GnssGeofenceInterface> gnssGeofencingIface = null std::unique_ptr<android::gnss::AGnssInterface> agnssIface = nullptr; std::unique_ptr<android::gnss::GnssDebugInterface> gnssDebugIface = nullptr; std::unique_ptr<android::gnss::AGnssRilInterface> agnssRilIface = nullptr; std::unique_ptr<android::gnss::GnssVisibilityControlInterface> gnssVisibilityControlIface = nullptr; #define WAKE_LOCK_NAME "GPS" Loading Loading @@ -878,54 +875,6 @@ Return<void> GnssNiCallback::niNotifyCb( return Void(); } /* * GnssVisibilityControlCallback implements callback methods of IGnssVisibilityControlCallback.hal. */ struct GnssVisibilityControlCallback : public IGnssVisibilityControlCallback { Return<void> nfwNotifyCb(const IGnssVisibilityControlCallback::NfwNotification& notification) override; Return<bool> isInEmergencySession() override; }; Return<void> GnssVisibilityControlCallback::nfwNotifyCb( const IGnssVisibilityControlCallback::NfwNotification& notification) { JNIEnv* env = getJniEnv(); jstring proxyAppPackageName = env->NewStringUTF(notification.proxyAppPackageName.c_str()); jstring otherProtocolStackName = env->NewStringUTF(notification.otherProtocolStackName.c_str()); jstring requestorId = env->NewStringUTF(notification.requestorId.c_str()); if (proxyAppPackageName && otherProtocolStackName && requestorId) { env->CallVoidMethod(mCallbacksObj, method_reportNfwNotification, proxyAppPackageName, notification.protocolStack, otherProtocolStackName, notification.requestor, requestorId, notification.responseType, notification.inEmergencyMode, notification.isCachedLocation); } else { ALOGE("%s: OOM Error\n", __func__); } if (requestorId) { env->DeleteLocalRef(requestorId); } if (otherProtocolStackName) { env->DeleteLocalRef(otherProtocolStackName); } if (proxyAppPackageName) { env->DeleteLocalRef(proxyAppPackageName); } checkAndClearExceptionFromCallback(env, __FUNCTION__); return Void(); } Return<bool> GnssVisibilityControlCallback::isInEmergencySession() { JNIEnv* env = getJniEnv(); auto result = env->CallBooleanMethod(mCallbacksObj, method_isInEmergencySession); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } /* Initializes the GNSS service handle. */ static void android_location_gnss_hal_GnssNative_set_gps_service_handle() { gnssHalAidl = waitForVintfService<IGnssAidl>(); Loading Loading @@ -1060,6 +1009,7 @@ static void android_location_gnss_hal_GnssNative_class_init_once(JNIEnv* env, jc gnss::GnssGeofence_class_init_once(env, clazz); gnss::GnssMeasurement_class_init_once(env, clazz); gnss::GnssNavigationMessage_class_init_once(env, clazz); gnss::GnssVisibilityControl_class_init_once(env, clazz); gnss::AGnss_class_init_once(env, clazz); gnss::AGnssRil_class_init_once(env, clazz); gnss::Utils_class_init_once(env); Loading Loading @@ -1342,12 +1292,21 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject } } if (gnssHal_V2_0 != nullptr) { auto gnssVisibilityControl = gnssHal_V2_0->getExtensionVisibilityControl(); if (!gnssVisibilityControl.isOk()) { ALOGD("Unable to get a handle to GnssVisibilityControl interface"); } else { gnssVisibilityControlIface = gnssVisibilityControl; if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl> gnssVisibilityControlAidl; auto status = gnssHalAidl->getExtensionGnssVisibilityControl(&gnssVisibilityControlAidl); if (checkAidlStatus(status, "Unable to get a handle to GnssVisibilityControl AIDL interface.")) { gnssVisibilityControlIface = std::make_unique<gnss::GnssVisibilityControlAidl>(gnssVisibilityControlAidl); } } else if (gnssHal_V2_0 != nullptr) { auto gnssVisibilityControlHidl = gnssHal_V2_0->getExtensionVisibilityControl(); if (checkHidlReturn(gnssVisibilityControlHidl, "Unable to get a handle to GnssVisibilityControl HIDL interface")) { gnssVisibilityControlIface = std::make_unique<gnss::GnssVisibilityControlHidl>(gnssVisibilityControlHidl); } } Loading Loading @@ -1472,12 +1431,12 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl ALOGI("Unable to initialize IAGnssRil interface."); } // Set IGnssVisibilityControl.hal callback. // Set IGnssVisibilityControl callback. if (gnssVisibilityControlIface != nullptr) { sp<IGnssVisibilityControlCallback> gnssVisibilityControlCbIface = new GnssVisibilityControlCallback(); auto result = gnssVisibilityControlIface->setCallback(gnssVisibilityControlCbIface); checkHidlReturn(result, "IGnssVisibilityControl setCallback() failed."); gnssVisibilityControlIface->setCallback( std::make_unique<gnss::GnssVisibilityControlCallback>()); } else { ALOGI("Unable to initialize IGnssVisibilityControl interface."); } // Set IMeasurementCorrections.hal callback. Loading Loading @@ -2380,17 +2339,7 @@ static jboolean android_location_GnssVisibilityControl_enable_nfw_location_acces ALOGI("IGnssVisibilityControl interface not available."); return JNI_FALSE; } const jsize length = env->GetArrayLength(proxyApps); hidl_vec<hidl_string> hidlProxyApps(length); for (int i = 0; i < length; ++i) { jstring proxyApp = (jstring) (env->GetObjectArrayElement(proxyApps, i)); ScopedJniString jniProxyApp(env, proxyApp); hidlProxyApps[i] = jniProxyApp; } auto result = gnssVisibilityControlIface->enableNfwLocationAccess(hidlProxyApps); return checkHidlReturn(result, "IGnssVisibilityControl enableNfwLocationAccess() failed."); return gnssVisibilityControlIface->enableNfwLocationAccess(env, proxyApps); } static const JNINativeMethod sCoreMethods[] = { Loading services/core/jni/gnss/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ cc_library_shared { "GnssMeasurementCallback.cpp", "GnssNavigationMessage.cpp", "GnssNavigationMessageCallback.cpp", "GnssVisibilityControl.cpp", "GnssVisibilityControlCallback.cpp", "Utils.cpp", ], } Loading services/core/jni/gnss/GnssVisibilityControl.cpp 0 → 100644 +84 −0 Original line number Diff line number Diff line /* * 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 <log/log.h> to overwrite the default value. #define LOG_TAG "GnssVisibilityControlJni" #include "GnssVisibilityControl.h" #include "Utils.h" using IGnssVisibilityControlAidl = android::hardware::gnss::visibility_control::IGnssVisibilityControl; using IGnssVisibilityControlHidl = android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl; namespace android::gnss { // Implementation of GnssVisibilityControl (AIDL HAL) GnssVisibilityControlAidl::GnssVisibilityControlAidl( const sp<IGnssVisibilityControlAidl>& iGnssVisibilityControl) : mIGnssVisibilityControlAidl(iGnssVisibilityControl) { assert(mIGnssVisibilityControlAidl != nullptr); } jboolean GnssVisibilityControlAidl::setCallback( const std::unique_ptr<GnssVisibilityControlCallback>& callback) { auto status = mIGnssVisibilityControlAidl->setCallback(callback->getAidl()); return checkAidlStatus(status, "IGnssVisibilityControlAidl setCallback() failed."); } jboolean GnssVisibilityControlAidl::enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) { int length = env->GetArrayLength(proxyApps); std::vector<std::string> aidlProxyApps(length); for (int i = 0; i < length; ++i) { jstring proxyApp = (jstring)(env->GetObjectArrayElement(proxyApps, i)); ScopedJniString jniProxyApp(env, proxyApp); aidlProxyApps[i] = std::string(jniProxyApp.c_str()); } auto status = mIGnssVisibilityControlAidl->enableNfwLocationAccess(aidlProxyApps); return checkAidlStatus(status, "IGnssVisibilityControlAidl enableNfwLocationAccess() failed"); } // Implementation of GnssVisibilityControlHidl GnssVisibilityControlHidl::GnssVisibilityControlHidl( const sp<IGnssVisibilityControlHidl>& iGnssVisibilityControl) : mIGnssVisibilityControlHidl(iGnssVisibilityControl) { assert(mIGnssVisibilityControlHidl != nullptr); } jboolean GnssVisibilityControlHidl::setCallback( const std::unique_ptr<GnssVisibilityControlCallback>& callback) { auto result = mIGnssVisibilityControlHidl->setCallback(callback->getHidl()); return checkHidlReturn(result, "IGnssVisibilityControlHidl setCallback() failed."); } jboolean GnssVisibilityControlHidl::enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) { const jsize length = env->GetArrayLength(proxyApps); hardware::hidl_vec<hardware::hidl_string> hidlProxyApps(length); for (int i = 0; i < length; ++i) { jstring proxyApp = (jstring)(env->GetObjectArrayElement(proxyApps, i)); ScopedJniString jniProxyApp(env, proxyApp); hidlProxyApps[i] = jniProxyApp; } auto result = mIGnssVisibilityControlHidl->enableNfwLocationAccess(hidlProxyApps); return checkHidlReturn(result, "IGnssVisibilityControlHidl enableNfwLocationAccess() failed."); } } // namespace android::gnss services/core/jni/gnss/GnssVisibilityControl.h 0 → 100644 +70 −0 Original line number Diff line number Diff line /* * 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_VISIBILITYCONTROL_H #define _ANDROID_SERVER_GNSS_VISIBILITYCONTROL_H #pragma once #ifndef LOG_TAG #error LOG_TAG must be defined before including this file. #endif #include <android/hardware/gnss/visibility_control/BnGnssVisibilityControl.h> #include <log/log.h> #include "GnssVisibilityControlCallback.h" #include "jni.h" namespace android::gnss { class GnssVisibilityControlInterface { public: virtual ~GnssVisibilityControlInterface() {} virtual jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) = 0; virtual jboolean setCallback( const std::unique_ptr<GnssVisibilityControlCallback>& callback) = 0; }; class GnssVisibilityControlAidl : public GnssVisibilityControlInterface { public: GnssVisibilityControlAidl( const sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl>& iGnssVisibilityControl); jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) override; jboolean setCallback(const std::unique_ptr<GnssVisibilityControlCallback>& callback) override; private: const sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl> mIGnssVisibilityControlAidl; }; class GnssVisibilityControlHidl : public GnssVisibilityControlInterface { public: GnssVisibilityControlHidl( const sp<android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl>& iGnssVisibilityControl); jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) override; jboolean setCallback(const std::unique_ptr<GnssVisibilityControlCallback>& callback) override; private: const sp<android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl> mIGnssVisibilityControlHidl; }; } // namespace android::gnss #endif // _ANDROID_SERVER_GNSS_VISIBILITYCONTROL_H Loading
services/core/jni/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -155,7 +155,6 @@ cc_defaults { "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.graphics.bufferqueue@1.0", "android.hardware.graphics.bufferqueue@2.0", "android.hardware.graphics.common@1.2", Loading
services/core/jni/com_android_server_location_GnssLocationProvider.cpp +24 −75 Original line number Diff line number Diff line Loading @@ -37,7 +37,6 @@ #include <android/hardware/gnss/BnGnssPsdsCallback.h> #include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h> #include <android/hardware/gnss/measurement_corrections/1.1/IMeasurementCorrections.h> #include <android/hardware/gnss/visibility_control/1.0/IGnssVisibilityControl.h> #include <binder/IServiceManager.h> #include <nativehelper/JNIHelp.h> #include <pthread.h> Loading @@ -59,6 +58,7 @@ #include "gnss/GnssGeofence.h" #include "gnss/GnssMeasurement.h" #include "gnss/GnssNavigationMessage.h" #include "gnss/GnssVisibilityControl.h" #include "gnss/Utils.h" #include "hardware_legacy/power.h" #include "jni.h" Loading Loading @@ -162,9 +162,6 @@ using IMeasurementCorrections_V1_1 = android::hardware::gnss::measurement_correc using android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrectionsCallback; using android::hardware::gnss::measurement_corrections::V1_0::GnssSingleSatCorrectionFlags; using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl; using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControlCallback; using android::hardware::gnss::BlocklistedSource; using android::hardware::gnss::GnssConstellationType; using android::hardware::gnss::GnssPowerStats; Loading Loading @@ -210,7 +207,6 @@ sp<IGnssNi> gnssNiIface = nullptr; sp<IGnssPowerIndication> gnssPowerIndicationIface = nullptr; sp<IMeasurementCorrections_V1_0> gnssCorrectionsIface_V1_0 = nullptr; sp<IMeasurementCorrections_V1_1> gnssCorrectionsIface_V1_1 = nullptr; sp<IGnssVisibilityControl> gnssVisibilityControlIface = nullptr; sp<IGnssAntennaInfo> gnssAntennaInfoIface = nullptr; std::unique_ptr<GnssConfigurationInterface> gnssConfigurationIface = nullptr; Loading @@ -221,6 +217,7 @@ std::unique_ptr<android::gnss::GnssGeofenceInterface> gnssGeofencingIface = null std::unique_ptr<android::gnss::AGnssInterface> agnssIface = nullptr; std::unique_ptr<android::gnss::GnssDebugInterface> gnssDebugIface = nullptr; std::unique_ptr<android::gnss::AGnssRilInterface> agnssRilIface = nullptr; std::unique_ptr<android::gnss::GnssVisibilityControlInterface> gnssVisibilityControlIface = nullptr; #define WAKE_LOCK_NAME "GPS" Loading Loading @@ -878,54 +875,6 @@ Return<void> GnssNiCallback::niNotifyCb( return Void(); } /* * GnssVisibilityControlCallback implements callback methods of IGnssVisibilityControlCallback.hal. */ struct GnssVisibilityControlCallback : public IGnssVisibilityControlCallback { Return<void> nfwNotifyCb(const IGnssVisibilityControlCallback::NfwNotification& notification) override; Return<bool> isInEmergencySession() override; }; Return<void> GnssVisibilityControlCallback::nfwNotifyCb( const IGnssVisibilityControlCallback::NfwNotification& notification) { JNIEnv* env = getJniEnv(); jstring proxyAppPackageName = env->NewStringUTF(notification.proxyAppPackageName.c_str()); jstring otherProtocolStackName = env->NewStringUTF(notification.otherProtocolStackName.c_str()); jstring requestorId = env->NewStringUTF(notification.requestorId.c_str()); if (proxyAppPackageName && otherProtocolStackName && requestorId) { env->CallVoidMethod(mCallbacksObj, method_reportNfwNotification, proxyAppPackageName, notification.protocolStack, otherProtocolStackName, notification.requestor, requestorId, notification.responseType, notification.inEmergencyMode, notification.isCachedLocation); } else { ALOGE("%s: OOM Error\n", __func__); } if (requestorId) { env->DeleteLocalRef(requestorId); } if (otherProtocolStackName) { env->DeleteLocalRef(otherProtocolStackName); } if (proxyAppPackageName) { env->DeleteLocalRef(proxyAppPackageName); } checkAndClearExceptionFromCallback(env, __FUNCTION__); return Void(); } Return<bool> GnssVisibilityControlCallback::isInEmergencySession() { JNIEnv* env = getJniEnv(); auto result = env->CallBooleanMethod(mCallbacksObj, method_isInEmergencySession); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } /* Initializes the GNSS service handle. */ static void android_location_gnss_hal_GnssNative_set_gps_service_handle() { gnssHalAidl = waitForVintfService<IGnssAidl>(); Loading Loading @@ -1060,6 +1009,7 @@ static void android_location_gnss_hal_GnssNative_class_init_once(JNIEnv* env, jc gnss::GnssGeofence_class_init_once(env, clazz); gnss::GnssMeasurement_class_init_once(env, clazz); gnss::GnssNavigationMessage_class_init_once(env, clazz); gnss::GnssVisibilityControl_class_init_once(env, clazz); gnss::AGnss_class_init_once(env, clazz); gnss::AGnssRil_class_init_once(env, clazz); gnss::Utils_class_init_once(env); Loading Loading @@ -1342,12 +1292,21 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject } } if (gnssHal_V2_0 != nullptr) { auto gnssVisibilityControl = gnssHal_V2_0->getExtensionVisibilityControl(); if (!gnssVisibilityControl.isOk()) { ALOGD("Unable to get a handle to GnssVisibilityControl interface"); } else { gnssVisibilityControlIface = gnssVisibilityControl; if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl> gnssVisibilityControlAidl; auto status = gnssHalAidl->getExtensionGnssVisibilityControl(&gnssVisibilityControlAidl); if (checkAidlStatus(status, "Unable to get a handle to GnssVisibilityControl AIDL interface.")) { gnssVisibilityControlIface = std::make_unique<gnss::GnssVisibilityControlAidl>(gnssVisibilityControlAidl); } } else if (gnssHal_V2_0 != nullptr) { auto gnssVisibilityControlHidl = gnssHal_V2_0->getExtensionVisibilityControl(); if (checkHidlReturn(gnssVisibilityControlHidl, "Unable to get a handle to GnssVisibilityControl HIDL interface")) { gnssVisibilityControlIface = std::make_unique<gnss::GnssVisibilityControlHidl>(gnssVisibilityControlHidl); } } Loading Loading @@ -1472,12 +1431,12 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl ALOGI("Unable to initialize IAGnssRil interface."); } // Set IGnssVisibilityControl.hal callback. // Set IGnssVisibilityControl callback. if (gnssVisibilityControlIface != nullptr) { sp<IGnssVisibilityControlCallback> gnssVisibilityControlCbIface = new GnssVisibilityControlCallback(); auto result = gnssVisibilityControlIface->setCallback(gnssVisibilityControlCbIface); checkHidlReturn(result, "IGnssVisibilityControl setCallback() failed."); gnssVisibilityControlIface->setCallback( std::make_unique<gnss::GnssVisibilityControlCallback>()); } else { ALOGI("Unable to initialize IGnssVisibilityControl interface."); } // Set IMeasurementCorrections.hal callback. Loading Loading @@ -2380,17 +2339,7 @@ static jboolean android_location_GnssVisibilityControl_enable_nfw_location_acces ALOGI("IGnssVisibilityControl interface not available."); return JNI_FALSE; } const jsize length = env->GetArrayLength(proxyApps); hidl_vec<hidl_string> hidlProxyApps(length); for (int i = 0; i < length; ++i) { jstring proxyApp = (jstring) (env->GetObjectArrayElement(proxyApps, i)); ScopedJniString jniProxyApp(env, proxyApp); hidlProxyApps[i] = jniProxyApp; } auto result = gnssVisibilityControlIface->enableNfwLocationAccess(hidlProxyApps); return checkHidlReturn(result, "IGnssVisibilityControl enableNfwLocationAccess() failed."); return gnssVisibilityControlIface->enableNfwLocationAccess(env, proxyApps); } static const JNINativeMethod sCoreMethods[] = { Loading
services/core/jni/gnss/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ cc_library_shared { "GnssMeasurementCallback.cpp", "GnssNavigationMessage.cpp", "GnssNavigationMessageCallback.cpp", "GnssVisibilityControl.cpp", "GnssVisibilityControlCallback.cpp", "Utils.cpp", ], } Loading
services/core/jni/gnss/GnssVisibilityControl.cpp 0 → 100644 +84 −0 Original line number Diff line number Diff line /* * 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 <log/log.h> to overwrite the default value. #define LOG_TAG "GnssVisibilityControlJni" #include "GnssVisibilityControl.h" #include "Utils.h" using IGnssVisibilityControlAidl = android::hardware::gnss::visibility_control::IGnssVisibilityControl; using IGnssVisibilityControlHidl = android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl; namespace android::gnss { // Implementation of GnssVisibilityControl (AIDL HAL) GnssVisibilityControlAidl::GnssVisibilityControlAidl( const sp<IGnssVisibilityControlAidl>& iGnssVisibilityControl) : mIGnssVisibilityControlAidl(iGnssVisibilityControl) { assert(mIGnssVisibilityControlAidl != nullptr); } jboolean GnssVisibilityControlAidl::setCallback( const std::unique_ptr<GnssVisibilityControlCallback>& callback) { auto status = mIGnssVisibilityControlAidl->setCallback(callback->getAidl()); return checkAidlStatus(status, "IGnssVisibilityControlAidl setCallback() failed."); } jboolean GnssVisibilityControlAidl::enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) { int length = env->GetArrayLength(proxyApps); std::vector<std::string> aidlProxyApps(length); for (int i = 0; i < length; ++i) { jstring proxyApp = (jstring)(env->GetObjectArrayElement(proxyApps, i)); ScopedJniString jniProxyApp(env, proxyApp); aidlProxyApps[i] = std::string(jniProxyApp.c_str()); } auto status = mIGnssVisibilityControlAidl->enableNfwLocationAccess(aidlProxyApps); return checkAidlStatus(status, "IGnssVisibilityControlAidl enableNfwLocationAccess() failed"); } // Implementation of GnssVisibilityControlHidl GnssVisibilityControlHidl::GnssVisibilityControlHidl( const sp<IGnssVisibilityControlHidl>& iGnssVisibilityControl) : mIGnssVisibilityControlHidl(iGnssVisibilityControl) { assert(mIGnssVisibilityControlHidl != nullptr); } jboolean GnssVisibilityControlHidl::setCallback( const std::unique_ptr<GnssVisibilityControlCallback>& callback) { auto result = mIGnssVisibilityControlHidl->setCallback(callback->getHidl()); return checkHidlReturn(result, "IGnssVisibilityControlHidl setCallback() failed."); } jboolean GnssVisibilityControlHidl::enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) { const jsize length = env->GetArrayLength(proxyApps); hardware::hidl_vec<hardware::hidl_string> hidlProxyApps(length); for (int i = 0; i < length; ++i) { jstring proxyApp = (jstring)(env->GetObjectArrayElement(proxyApps, i)); ScopedJniString jniProxyApp(env, proxyApp); hidlProxyApps[i] = jniProxyApp; } auto result = mIGnssVisibilityControlHidl->enableNfwLocationAccess(hidlProxyApps); return checkHidlReturn(result, "IGnssVisibilityControlHidl enableNfwLocationAccess() failed."); } } // namespace android::gnss
services/core/jni/gnss/GnssVisibilityControl.h 0 → 100644 +70 −0 Original line number Diff line number Diff line /* * 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_VISIBILITYCONTROL_H #define _ANDROID_SERVER_GNSS_VISIBILITYCONTROL_H #pragma once #ifndef LOG_TAG #error LOG_TAG must be defined before including this file. #endif #include <android/hardware/gnss/visibility_control/BnGnssVisibilityControl.h> #include <log/log.h> #include "GnssVisibilityControlCallback.h" #include "jni.h" namespace android::gnss { class GnssVisibilityControlInterface { public: virtual ~GnssVisibilityControlInterface() {} virtual jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) = 0; virtual jboolean setCallback( const std::unique_ptr<GnssVisibilityControlCallback>& callback) = 0; }; class GnssVisibilityControlAidl : public GnssVisibilityControlInterface { public: GnssVisibilityControlAidl( const sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl>& iGnssVisibilityControl); jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) override; jboolean setCallback(const std::unique_ptr<GnssVisibilityControlCallback>& callback) override; private: const sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl> mIGnssVisibilityControlAidl; }; class GnssVisibilityControlHidl : public GnssVisibilityControlInterface { public: GnssVisibilityControlHidl( const sp<android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl>& iGnssVisibilityControl); jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) override; jboolean setCallback(const std::unique_ptr<GnssVisibilityControlCallback>& callback) override; private: const sp<android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl> mIGnssVisibilityControlHidl; }; } // namespace android::gnss #endif // _ANDROID_SERVER_GNSS_VISIBILITYCONTROL_H