• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 // Define LOG_TAG and LOG_NDEBUG before <log/log.h> to overwrite the default values.
18 #define LOG_TAG "GnssLocationProviderJni"
19 #define LOG_NDEBUG 0
20 
21 #include <android/hardware/gnss/1.0/IGnss.h>
22 #include <android/hardware/gnss/1.0/IGnssMeasurement.h>
23 #include <android/hardware/gnss/1.1/IGnss.h>
24 #include <android/hardware/gnss/1.1/IGnssMeasurement.h>
25 #include <android/hardware/gnss/2.0/IGnss.h>
26 #include <android/hardware/gnss/2.0/IGnssMeasurement.h>
27 #include <android/hardware/gnss/2.1/IGnss.h>
28 #include <android/hardware/gnss/2.1/IGnssAntennaInfo.h>
29 #include <android/hardware/gnss/2.1/IGnssMeasurement.h>
30 #include <android/hardware/gnss/BnGnss.h>
31 #include <android/hardware/gnss/BnGnssAntennaInfo.h>
32 #include <android/hardware/gnss/BnGnssCallback.h>
33 #include <android/hardware/gnss/BnGnssDebug.h>
34 #include <android/hardware/gnss/BnGnssGeofence.h>
35 #include <android/hardware/gnss/BnGnssGeofenceCallback.h>
36 #include <android/hardware/gnss/BnGnssMeasurementCallback.h>
37 #include <android/hardware/gnss/BnGnssPowerIndicationCallback.h>
38 #include <android/hardware/gnss/BnGnssPsdsCallback.h>
39 #include <android_location_flags.h>
40 #include <binder/IServiceManager.h>
41 #include <nativehelper/JNIHelp.h>
42 #include <pthread.h>
43 #include <string.h>
44 #include <utils/SystemClock.h>
45 
46 #include <cinttypes>
47 #include <iomanip>
48 #include <limits>
49 
50 #include "android_runtime/AndroidRuntime.h"
51 #include "android_runtime/Log.h"
52 #include "gnss/AGnss.h"
53 #include "gnss/AGnssRil.h"
54 #include "gnss/Gnss.h"
55 #include "gnss/GnssAntennaInfo.h"
56 #include "gnss/GnssAntennaInfoCallback.h"
57 #include "gnss/GnssAssistance.h"
58 #include "gnss/GnssAssistanceCallback.h"
59 #include "gnss/GnssBatching.h"
60 #include "gnss/GnssConfiguration.h"
61 #include "gnss/GnssDebug.h"
62 #include "gnss/GnssGeofence.h"
63 #include "gnss/GnssMeasurement.h"
64 #include "gnss/GnssNavigationMessage.h"
65 #include "gnss/GnssVisibilityControl.h"
66 #include "gnss/MeasurementCorrections.h"
67 #include "gnss/Utils.h"
68 #include "hardware_legacy/power.h"
69 #include "jni.h"
70 #include "utils/Log.h"
71 #include "utils/misc.h"
72 
73 static jclass class_gnssPowerStats;
74 
75 static jmethodID method_reportGnssPowerStats;
76 static jmethodID method_reportNfwNotification;
77 static jmethodID method_isInEmergencySession;
78 static jmethodID method_gnssPowerStatsCtor;
79 static jmethodID method_setSubHalPowerIndicationCapabilities;
80 
81 using android::OK;
82 using android::sp;
83 using android::status_t;
84 using android::String16;
85 using android::wp;
86 using android::binder::Status;
87 
88 using android::hardware::Return;
89 using android::hardware::Void;
90 using android::hardware::hidl_vec;
91 using android::hardware::hidl_string;
92 using android::hardware::hidl_death_recipient;
93 
94 using android::hardware::gnss::V1_0::GnssLocationFlags;
95 using android::hardware::gnss::V1_0::IGnssNavigationMessage;
96 using android::hardware::gnss::V1_0::IGnssNavigationMessageCallback;
97 using android::hardware::gnss::V1_0::IGnssXtra;
98 using android::hardware::gnss::V1_0::IGnssXtraCallback;
99 using android::hardware::gnss::V2_0::ElapsedRealtimeFlags;
100 
101 using android::hidl::base::V1_0::IBase;
102 
103 using GnssConstellationType_V1_0 = android::hardware::gnss::V1_0::GnssConstellationType;
104 using GnssConstellationType_V2_0 = android::hardware::gnss::V2_0::GnssConstellationType;
105 using GnssLocation_V1_0 = android::hardware::gnss::V1_0::GnssLocation;
106 using GnssLocation_V2_0 = android::hardware::gnss::V2_0::GnssLocation;
107 using IGnss_V1_0 = android::hardware::gnss::V1_0::IGnss;
108 using IGnss_V1_1 = android::hardware::gnss::V1_1::IGnss;
109 using IGnss_V2_0 = android::hardware::gnss::V2_0::IGnss;
110 using IGnss_V2_1 = android::hardware::gnss::V2_1::IGnss;
111 using IGnssCallback_V1_0 = android::hardware::gnss::V1_0::IGnssCallback;
112 using IGnssCallback_V2_0 = android::hardware::gnss::V2_0::IGnssCallback;
113 using IGnssCallback_V2_1 = android::hardware::gnss::V2_1::IGnssCallback;
114 
115 using android::hardware::gnss::BlocklistedSource;
116 using android::hardware::gnss::GnssConstellationType;
117 using android::hardware::gnss::GnssPowerStats;
118 using android::hardware::gnss::IGnssPowerIndication;
119 using android::hardware::gnss::IGnssPowerIndicationCallback;
120 using android::hardware::gnss::gnss_assistance::IGnssAssistanceCallback;
121 
122 using IGnssAidl = android::hardware::gnss::IGnss;
123 using IGnssBatchingAidl = android::hardware::gnss::IGnssBatching;
124 using IGnssDebugAidl = android::hardware::gnss::IGnssDebug;
125 using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds;
126 using IGnssPsdsCallbackAidl = android::hardware::gnss::IGnssPsdsCallback;
127 using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration;
128 using GnssLocationAidl = android::hardware::gnss::GnssLocation;
129 using IGnssAntennaInfoAidl = android::hardware::gnss::IGnssAntennaInfo;
130 
131 sp<IGnssPowerIndication> gnssPowerIndicationIface = nullptr;
132 
133 std::unique_ptr<android::gnss::GnssHal> gnssHal = nullptr;
134 std::unique_ptr<android::gnss::AGnssInterface> agnssIface = nullptr;
135 std::unique_ptr<android::gnss::AGnssRilInterface> agnssRilIface = nullptr;
136 std::unique_ptr<android::gnss::GnssAntennaInfoInterface> gnssAntennaInfoIface = nullptr;
137 std::unique_ptr<android::gnss::GnssConfigurationInterface> gnssConfigurationIface = nullptr;
138 std::unique_ptr<android::gnss::GnssMeasurementInterface> gnssMeasurementIface = nullptr;
139 std::unique_ptr<android::gnss::GnssNavigationMessageInterface> gnssNavigationMessageIface = nullptr;
140 std::unique_ptr<android::gnss::GnssBatchingInterface> gnssBatchingIface = nullptr;
141 std::unique_ptr<android::gnss::GnssDebugInterface> gnssDebugIface = nullptr;
142 std::unique_ptr<android::gnss::GnssGeofenceInterface> gnssGeofencingIface = nullptr;
143 std::unique_ptr<android::gnss::GnssPsdsInterface> gnssPsdsIface = nullptr;
144 std::unique_ptr<android::gnss::GnssVisibilityControlInterface> gnssVisibilityControlIface = nullptr;
145 std::unique_ptr<android::gnss::MeasurementCorrectionsInterface> gnssMeasurementCorrectionsIface =
146         nullptr;
147 std::unique_ptr<android::gnss::GnssAssistanceInterface> gnssAssistanceIface = nullptr;
148 
149 namespace location_flags = android::location::flags;
150 
151 namespace android {
152 
153 namespace {
154 
155 }  // namespace
156 
157 /*
158  * GnssPowerIndicationCallback class implements the callback methods for the IGnssPowerIndication
159  * interface.
160  */
161 struct GnssPowerIndicationCallback : public android::hardware::gnss::BnGnssPowerIndicationCallback {
162 public:
163     Status setCapabilitiesCb(const int capabilities) override;
164     Status gnssPowerStatsCb(const GnssPowerStats& data) override;
165 };
166 
setCapabilitiesCb(const int capabilities)167 Status GnssPowerIndicationCallback::setCapabilitiesCb(const int capabilities) {
168     ALOGD("GnssPowerIndicationCallback::%s: %du\n", __func__, capabilities);
169     JNIEnv* env = getJniEnv();
170     env->CallVoidMethod(mCallbacksObj, method_setSubHalPowerIndicationCapabilities, capabilities);
171     checkAndClearExceptionFromCallback(env, __FUNCTION__);
172     return Status::ok();
173 }
174 
gnssPowerStatsCb(const GnssPowerStats & data)175 Status GnssPowerIndicationCallback::gnssPowerStatsCb(const GnssPowerStats& data) {
176     JNIEnv* env = getJniEnv();
177 
178     int size = data.otherModesEnergyMilliJoule.size();
179     jdoubleArray otherModesEnergy = env->NewDoubleArray(size);
180     if (size > 0) {
181         env->SetDoubleArrayRegion(otherModesEnergy, (jsize)0, size,
182                                   &(data.otherModesEnergyMilliJoule[0]));
183     }
184     jobject gnssPowerStats =
185             env->NewObject(class_gnssPowerStats, method_gnssPowerStatsCtor,
186                            data.elapsedRealtime.flags, data.elapsedRealtime.timestampNs,
187                            data.elapsedRealtime.timeUncertaintyNs, data.totalEnergyMilliJoule,
188                            data.singlebandTrackingModeEnergyMilliJoule,
189                            data.multibandTrackingModeEnergyMilliJoule,
190                            data.singlebandAcquisitionModeEnergyMilliJoule,
191                            data.multibandAcquisitionModeEnergyMilliJoule, otherModesEnergy);
192 
193     env->CallVoidMethod(mCallbacksObj, method_reportGnssPowerStats, gnssPowerStats);
194 
195     checkAndClearExceptionFromCallback(env, __FUNCTION__);
196     env->DeleteLocalRef(gnssPowerStats);
197     env->DeleteLocalRef(otherModesEnergy);
198     return Status::ok();
199 }
200 
201 /* Initializes the GNSS service handle. */
android_location_gnss_hal_GnssNative_set_gps_service_handle()202 static void android_location_gnss_hal_GnssNative_set_gps_service_handle() {
203     gnssHal = std::make_unique<gnss::GnssHal>();
204 }
205 
206 /* One time initialization at system boot */
android_location_gnss_hal_GnssNative_class_init_once(JNIEnv * env,jclass clazz)207 static void android_location_gnss_hal_GnssNative_class_init_once(JNIEnv* env, jclass clazz) {
208     // Initialize the top level gnss HAL handle.
209     android_location_gnss_hal_GnssNative_set_gps_service_handle();
210 
211     // Cache methodIDs and class IDs.
212     method_reportNfwNotification = env->GetMethodID(clazz, "reportNfwNotification",
213             "(Ljava/lang/String;BLjava/lang/String;BLjava/lang/String;BZZ)V");
214     method_reportGnssPowerStats =
215             env->GetMethodID(clazz, "reportGnssPowerStats",
216                              "(Lcom/android/server/location/gnss/GnssPowerStats;)V");
217     method_isInEmergencySession = env->GetMethodID(clazz, "isInEmergencySession", "()Z");
218 
219     method_setSubHalPowerIndicationCapabilities =
220             env->GetMethodID(clazz, "setSubHalPowerIndicationCapabilities", "(I)V");
221 
222     jclass gnssPowerStatsClass = env->FindClass("com/android/server/location/gnss/GnssPowerStats");
223     class_gnssPowerStats = (jclass)env->NewGlobalRef(gnssPowerStatsClass);
224     method_gnssPowerStatsCtor = env->GetMethodID(class_gnssPowerStats, "<init>", "(IJDDDDDD[D)V");
225 
226     gnss::AGnss_class_init_once(env, clazz);
227     gnss::AGnssRil_class_init_once(env, clazz);
228     gnss::Gnss_class_init_once(env, clazz);
229     gnss::GnssAntennaInfo_class_init_once(env, clazz);
230     gnss::GnssBatching_class_init_once(env, clazz);
231     gnss::GnssConfiguration_class_init_once(env);
232     gnss::GnssGeofence_class_init_once(env, clazz);
233     gnss::GnssMeasurement_class_init_once(env, clazz);
234     gnss::GnssNavigationMessage_class_init_once(env, clazz);
235     gnss::GnssPsds_class_init_once(env, clazz);
236     gnss::GnssVisibilityControl_class_init_once(env, clazz);
237     gnss::MeasurementCorrections_class_init_once(env, clazz);
238     gnss::MeasurementCorrectionsCallback_class_init_once(env, clazz);
239     if (location_flags::gnss_assistance_interface_jni()) {
240         gnss::GnssAssistance_class_init_once(env, clazz);
241     }
242     gnss::Utils_class_init_once(env);
243 }
244 
245 /* Initialization needed at system boot and whenever GNSS service dies. */
android_location_gnss_hal_GnssNative_init_once(JNIEnv * env,jobject obj,jboolean reinitializeGnssServiceHandle)246 static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject obj,
247                                                            jboolean reinitializeGnssServiceHandle) {
248     /*
249      * Save a pointer to JVM.
250      */
251     jint jvmStatus = env->GetJavaVM(&android::ScopedJniThreadAttach::sJvm);
252     if (jvmStatus != JNI_OK) {
253         LOG_ALWAYS_FATAL("Unable to get Java VM. Error: %d", jvmStatus);
254     }
255 
256     if (reinitializeGnssServiceHandle) {
257         android_location_gnss_hal_GnssNative_set_gps_service_handle();
258     }
259 
260     if (gnssHal == nullptr || !gnssHal->isSupported()) {
261         ALOGE("Unable to get GPS service\n");
262         return;
263     }
264 
265     gnssHal->linkToDeath();
266     gnssPsdsIface = gnssHal->getGnssPsdsInterface();
267     agnssRilIface = gnssHal->getAGnssRilInterface();
268     agnssIface = gnssHal->getAGnssInterface();
269     gnssNavigationMessageIface = gnssHal->getGnssNavigationMessageInterface();
270     gnssMeasurementIface = gnssHal->getGnssMeasurementInterface();
271     gnssAntennaInfoIface = gnssHal->getGnssAntennaInfoInterface();
272     gnssMeasurementCorrectionsIface = gnssHal->getMeasurementCorrectionsInterface();
273     gnssDebugIface = gnssHal->getGnssDebugInterface();
274     gnssConfigurationIface = gnssHal->getGnssConfigurationInterface();
275     gnssGeofencingIface = gnssHal->getGnssGeofenceInterface();
276     gnssBatchingIface = gnssHal->getGnssBatchingInterface();
277     gnssVisibilityControlIface = gnssHal->getGnssVisibilityControlInterface();
278     gnssPowerIndicationIface = gnssHal->getGnssPowerIndicationInterface();
279     if (location_flags::gnss_assistance_interface_jni()) {
280         gnssAssistanceIface = gnssHal->getGnssAssistanceInterface();
281     }
282     if (mCallbacksObj) {
283         ALOGE("Callbacks already initialized");
284     } else {
285         mCallbacksObj = env->NewGlobalRef(obj);
286     }
287 }
288 
android_location_gnss_hal_GnssNative_is_supported(JNIEnv *,jclass)289 static jboolean android_location_gnss_hal_GnssNative_is_supported(JNIEnv* /* env */, jclass) {
290     return (gnssHal != nullptr && gnssHal->isSupported()) ? JNI_TRUE : JNI_FALSE;
291 }
292 
android_location_GnssNetworkConnectivityHandler_is_agps_ril_supported(JNIEnv *,jclass)293 static jboolean android_location_GnssNetworkConnectivityHandler_is_agps_ril_supported(
294         JNIEnv* /* env */, jclass /* clazz */) {
295     return (agnssRilIface != nullptr) ? JNI_TRUE : JNI_FALSE;
296 }
297 
android_location_GnssConfiguration_get_gnss_configuration_version(JNIEnv * env,jclass)298 static jobject android_location_GnssConfiguration_get_gnss_configuration_version(
299         JNIEnv* env, jclass /* jclazz */) {
300     if (gnssConfigurationIface == nullptr) {
301         return nullptr;
302     }
303     return gnssConfigurationIface->getVersion(env);
304 }
305 
306 /* Initialization needed each time the GPS service is shutdown. */
android_location_gnss_hal_GnssNative_init(JNIEnv *,jclass)307 static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jclass) {
308     /*
309      * This must be set before calling into the HAL library.
310      */
311     if (!mCallbacksObj) {
312         ALOGE("No callbacks set during GNSS HAL initialization.");
313         return JNI_FALSE;
314     }
315 
316     /*
317      * Fail if the main interface fails to initialize
318      */
319     if (!gnssHal->isSupported()) {
320         ALOGE("Unable to initialize GNSS HAL.");
321         return JNI_FALSE;
322     }
323 
324     // Set top level IGnss HAL callback.
325     gnssHal->setCallback();
326 
327     // Set IGnssPsds callback.
328     if (gnssPsdsIface == nullptr ||
329         !gnssPsdsIface->setCallback(std::make_unique<gnss::GnssPsdsCallback>())) {
330         ALOGI("Unable to initialize IGnssPsds interface.");
331     }
332 
333     // Set IAGnss callback.
334     if (agnssIface == nullptr ||
335         !agnssIface->setCallback(std::make_unique<gnss::AGnssCallback>())) {
336         ALOGI("Unable to initialize IAGnss interface.");
337     }
338 
339     // Set GnssGeofence callback.
340     if (gnssGeofencingIface != nullptr) {
341         gnssGeofencingIface->setCallback(std::make_unique<gnss::GnssGeofenceCallback>());
342     } else {
343         ALOGI("Unable to initialize IGnssGeofencing interface.");
344     }
345 
346     // Set IAGnssRil callback.
347     if (agnssRilIface == nullptr ||
348         !agnssRilIface->setCallback(std::make_unique<gnss::AGnssRilCallback>())) {
349         ALOGI("Unable to initialize IAGnssRil interface.");
350     }
351 
352     // Set IGnssVisibilityControl callback.
353     if (gnssVisibilityControlIface != nullptr) {
354         gnssVisibilityControlIface->setCallback(
355                 std::make_unique<gnss::GnssVisibilityControlCallback>());
356     } else {
357         ALOGI("Unable to initialize IGnssVisibilityControl interface.");
358     }
359 
360     // Set IMeasurementCorrection callback.
361     if (gnssMeasurementCorrectionsIface == nullptr ||
362         !gnssMeasurementCorrectionsIface->setCallback(
363                 std::make_unique<gnss::MeasurementCorrectionsCallback>())) {
364         ALOGI("Unable to initialize IGnssMeasurementCorrections interface.");
365     }
366 
367     // Set IGnssPowerIndication.hal callback.
368     if (gnssPowerIndicationIface != nullptr) {
369         sp<IGnssPowerIndicationCallback> gnssPowerIndicationCallback =
370                 sp<GnssPowerIndicationCallback>::make();
371         auto status = gnssPowerIndicationIface->setCallback(gnssPowerIndicationCallback);
372         if (!checkAidlStatus(status, "IGnssPowerIndication setCallback() failed.")) {
373             gnssPowerIndicationIface = nullptr;
374         }
375     }
376 
377     // Set IGnssAssistance callback.
378     if (gnssAssistanceIface != nullptr) {
379         sp<IGnssAssistanceCallback> gnssAssistanceCallback =
380                 sp<gnss::GnssAssistanceCallback>::make();
381         if (!gnssAssistanceIface->setCallback(gnssAssistanceCallback)) {
382             ALOGI("IGnssAssistanceInterface setCallback() failed");
383         }
384     }
385 
386     return JNI_TRUE;
387 }
388 
android_location_gnss_hal_GnssNative_cleanup(JNIEnv *,jclass)389 static void android_location_gnss_hal_GnssNative_cleanup(JNIEnv* /* env */, jclass) {
390     gnssHal->close();
391 }
392 
android_location_gnss_hal_GnssNative_set_position_mode(JNIEnv *,jclass,jint mode,jint recurrence,jint min_interval,jint preferred_accuracy,jint preferred_time,jboolean low_power_mode)393 static jboolean android_location_gnss_hal_GnssNative_set_position_mode(
394         JNIEnv* /* env */, jclass, jint mode, jint recurrence, jint min_interval,
395         jint preferred_accuracy, jint preferred_time, jboolean low_power_mode) {
396     return gnssHal->setPositionMode(mode, recurrence, min_interval, preferred_accuracy,
397                                     preferred_time, low_power_mode);
398 }
399 
android_location_gnss_hal_GnssNative_start(JNIEnv *,jclass)400 static jboolean android_location_gnss_hal_GnssNative_start(JNIEnv* /* env */, jclass) {
401     return gnssHal->start();
402 }
403 
android_location_gnss_hal_GnssNative_stop(JNIEnv *,jclass)404 static jboolean android_location_gnss_hal_GnssNative_stop(JNIEnv* /* env */, jclass) {
405     return gnssHal->stop();
406 }
407 
android_location_gnss_hal_GnssNative_start_sv_status_collection(JNIEnv *,jclass)408 static jboolean android_location_gnss_hal_GnssNative_start_sv_status_collection(JNIEnv* /* env */,
409                                                                                 jclass) {
410     return gnssHal->startSvStatus();
411 }
412 
android_location_gnss_hal_GnssNative_stop_sv_status_collection(JNIEnv *,jclass)413 static jboolean android_location_gnss_hal_GnssNative_stop_sv_status_collection(JNIEnv* /* env */,
414                                                                                jclass) {
415     return gnssHal->stopSvStatus();
416 }
417 
android_location_gnss_hal_GnssNative_start_nmea_message_collection(JNIEnv *,jclass)418 static jboolean android_location_gnss_hal_GnssNative_start_nmea_message_collection(
419         JNIEnv* /* env */, jclass) {
420     return gnssHal->startNmea();
421 }
422 
android_location_gnss_hal_GnssNative_stop_nmea_message_collection(JNIEnv *,jclass)423 static jboolean android_location_gnss_hal_GnssNative_stop_nmea_message_collection(JNIEnv* /* env */,
424                                                                                   jclass) {
425     return gnssHal->stopNmea();
426 }
427 
android_location_gnss_hal_GnssNative_delete_aiding_data(JNIEnv *,jclass,jint flags)428 static void android_location_gnss_hal_GnssNative_delete_aiding_data(JNIEnv* /* env */, jclass,
429                                                                     jint flags) {
430     gnssHal->deleteAidingData(flags);
431 }
432 
android_location_gnss_hal_GnssNative_agps_set_reference_location_cellid(JNIEnv *,jclass,jint type,jint mcc,jint mnc,jint lac,jlong cid,jint tac,jint pcid,jint arfcn)433 static void android_location_gnss_hal_GnssNative_agps_set_reference_location_cellid(
434         JNIEnv* /* env */, jclass, jint type, jint mcc, jint mnc, jint lac, jlong cid, jint tac,
435         jint pcid, jint arfcn) {
436     if (agnssRilIface == nullptr) {
437         ALOGE("%s: IAGnssRil interface not available.", __func__);
438         return;
439     }
440     agnssRilIface->setRefLocation(type, mcc, mnc, lac, cid, tac, pcid, arfcn);
441 }
442 
android_location_gnss_hal_GnssNative_agps_set_id(JNIEnv * env,jclass,jint type,jstring setid_string)443 static void android_location_gnss_hal_GnssNative_agps_set_id(JNIEnv* env, jclass, jint type,
444                                                              jstring setid_string) {
445     if (agnssRilIface == nullptr) {
446         ALOGE("%s: IAGnssRil interface not available.", __func__);
447         return;
448     }
449     agnssRilIface->setSetId(type, setid_string);
450 }
451 
android_location_gnss_hal_GnssNative_inject_ni_supl_message_data(JNIEnv * env,jclass,jbyteArray data,jint length,jint slotIndex)452 static void android_location_gnss_hal_GnssNative_inject_ni_supl_message_data(JNIEnv* env, jclass,
453                                                                              jbyteArray data,
454                                                                              jint length,
455                                                                              jint slotIndex) {
456     if (agnssRilIface == nullptr) {
457         ALOGE("%s: IAGnssRil interface not available.", __func__);
458         return;
459     }
460     agnssRilIface->injectNiSuplMessageData(data, length, slotIndex);
461 }
462 
android_location_gnss_hal_GnssNative_read_nmea(JNIEnv * env,jclass,jbyteArray nmeaArray,jint buffer_size)463 static jint android_location_gnss_hal_GnssNative_read_nmea(JNIEnv* env, jclass,
464                                                            jbyteArray nmeaArray, jint buffer_size) {
465     return gnssHal->readNmea(nmeaArray, buffer_size);
466 }
467 
android_location_gnss_hal_GnssNative_inject_time(JNIEnv *,jclass,jlong time,jlong timeReference,jint uncertainty)468 static void android_location_gnss_hal_GnssNative_inject_time(JNIEnv* /* env */, jclass, jlong time,
469                                                              jlong timeReference,
470                                                              jint uncertainty) {
471     gnssHal->injectTime(time, timeReference, uncertainty);
472 }
473 
android_location_gnss_hal_GnssNative_inject_best_location(JNIEnv *,jclass,jint gnssLocationFlags,jdouble latitudeDegrees,jdouble longitudeDegrees,jdouble altitudeMeters,jfloat speedMetersPerSec,jfloat bearingDegrees,jfloat horizontalAccuracyMeters,jfloat verticalAccuracyMeters,jfloat speedAccuracyMetersPerSecond,jfloat bearingAccuracyDegrees,jlong timestamp,jint elapsedRealtimeFlags,jlong elapsedRealtimeNanos,jdouble elapsedRealtimeUncertaintyNanos)474 static void android_location_gnss_hal_GnssNative_inject_best_location(
475         JNIEnv* /* env */, jclass, jint gnssLocationFlags, jdouble latitudeDegrees,
476         jdouble longitudeDegrees, jdouble altitudeMeters, jfloat speedMetersPerSec,
477         jfloat bearingDegrees, jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
478         jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees, jlong timestamp,
479         jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
480         jdouble elapsedRealtimeUncertaintyNanos) {
481     gnssHal->injectBestLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
482                                 altitudeMeters, speedMetersPerSec, bearingDegrees,
483                                 horizontalAccuracyMeters, verticalAccuracyMeters,
484                                 speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
485                                 elapsedRealtimeFlags, elapsedRealtimeNanos,
486                                 elapsedRealtimeUncertaintyNanos);
487 }
488 
android_location_gnss_hal_GnssNative_inject_location(JNIEnv *,jclass,jint gnssLocationFlags,jdouble latitudeDegrees,jdouble longitudeDegrees,jdouble altitudeMeters,jfloat speedMetersPerSec,jfloat bearingDegrees,jfloat horizontalAccuracyMeters,jfloat verticalAccuracyMeters,jfloat speedAccuracyMetersPerSecond,jfloat bearingAccuracyDegrees,jlong timestamp,jint elapsedRealtimeFlags,jlong elapsedRealtimeNanos,jdouble elapsedRealtimeUncertaintyNanos)489 static void android_location_gnss_hal_GnssNative_inject_location(
490         JNIEnv* /* env */, jclass, jint gnssLocationFlags, jdouble latitudeDegrees,
491         jdouble longitudeDegrees, jdouble altitudeMeters, jfloat speedMetersPerSec,
492         jfloat bearingDegrees, jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
493         jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees, jlong timestamp,
494         jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
495         jdouble elapsedRealtimeUncertaintyNanos) {
496     gnssHal->injectLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, altitudeMeters,
497                             speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters,
498                             verticalAccuracyMeters, speedAccuracyMetersPerSecond,
499                             bearingAccuracyDegrees, timestamp, elapsedRealtimeFlags,
500                             elapsedRealtimeNanos, elapsedRealtimeUncertaintyNanos);
501 }
502 
android_location_gnss_hal_GnssNative_supports_psds(JNIEnv *,jclass)503 static jboolean android_location_gnss_hal_GnssNative_supports_psds(JNIEnv* /* env */, jclass) {
504     return (gnssPsdsIface != nullptr) ? JNI_TRUE : JNI_FALSE;
505 }
506 
android_location_gnss_hal_GnssNative_inject_psds_data(JNIEnv * env,jclass,jbyteArray data,jint length,jint psdsType)507 static void android_location_gnss_hal_GnssNative_inject_psds_data(JNIEnv* env, jclass,
508                                                                   jbyteArray data, jint length,
509                                                                   jint psdsType) {
510     if (gnssPsdsIface == nullptr) {
511         ALOGE("%s: IGnssPsds or IGnssXtra interface not available.", __func__);
512         return;
513     }
514     gnssPsdsIface->injectPsdsData(data, length, psdsType);
515 }
516 
android_location_gnss_hal_GnssNative_inject_gnss_assistance(JNIEnv * env,jclass,jobject gnssAssistanceObj)517 static void android_location_gnss_hal_GnssNative_inject_gnss_assistance(JNIEnv* env, jclass,
518                                                                         jobject gnssAssistanceObj) {
519     if (gnssAssistanceIface == nullptr) {
520         ALOGE("%s: IGnssAssistance interface not available.", __func__);
521         return;
522     }
523     gnssAssistanceIface->injectGnssAssistance(env, gnssAssistanceObj);
524 }
525 
android_location_GnssNetworkConnectivityHandler_agps_data_conn_open(JNIEnv * env,jobject,jlong networkHandle,jstring apn,jint apnIpType)526 static void android_location_GnssNetworkConnectivityHandler_agps_data_conn_open(
527         JNIEnv* env, jobject /* obj */, jlong networkHandle, jstring apn, jint apnIpType) {
528     if (apn == nullptr) {
529         jniThrowException(env, "java/lang/IllegalArgumentException", nullptr);
530         return;
531     }
532 
533     if (agnssIface != nullptr) {
534         agnssIface->dataConnOpen(env, networkHandle, apn, apnIpType);
535     } else {
536         ALOGE("%s: IAGnss interface not available.", __func__);
537         return;
538     }
539 }
540 
android_location_GnssNetworkConnectivityHandler_agps_data_conn_closed(JNIEnv *,jobject)541 static void android_location_GnssNetworkConnectivityHandler_agps_data_conn_closed(JNIEnv* /* env */,
542                                                                        jobject /* obj */) {
543     if (agnssIface != nullptr) {
544         agnssIface->dataConnClosed();
545     } else {
546         ALOGE("%s: IAGnss interface not available.", __func__);
547         return;
548     }
549 }
550 
android_location_GnssNetworkConnectivityHandler_agps_data_conn_failed(JNIEnv *,jobject)551 static void android_location_GnssNetworkConnectivityHandler_agps_data_conn_failed(JNIEnv* /* env */,
552                                                                        jobject /* obj */) {
553     if (agnssIface != nullptr) {
554         agnssIface->dataConnFailed();
555     } else {
556         ALOGE("%s: IAGnss interface not available.", __func__);
557         return;
558     }
559 }
560 
android_location_gnss_hal_GnssNative_set_agps_server(JNIEnv * env,jclass,jint type,jstring hostname,jint port)561 static void android_location_gnss_hal_GnssNative_set_agps_server(JNIEnv* env, jclass, jint type,
562                                                                  jstring hostname, jint port) {
563     if (agnssIface != nullptr) {
564         agnssIface->setServer(env, type, hostname, port);
565     } else {
566         ALOGE("%s: IAGnss interface not available.", __func__);
567         return;
568     }
569 }
570 
android_location_gnss_hal_GnssNative_get_internal_state(JNIEnv * env,jclass)571 static jstring android_location_gnss_hal_GnssNative_get_internal_state(JNIEnv* env, jclass) {
572     /*
573      * TODO: Create a jobject to represent GnssDebug.
574      */
575 
576     if (gnssDebugIface == nullptr) {
577         ALOGE("%s: IGnssDebug interface not available.", __func__);
578         return nullptr;
579     }
580     return gnssDebugIface->getDebugData(env);
581 }
582 
android_location_gnss_hal_GnssNative_request_power_stats(JNIEnv * env)583 static void android_location_gnss_hal_GnssNative_request_power_stats(JNIEnv* env) {
584     if (gnssPowerIndicationIface == nullptr) {
585         return;
586     }
587     auto status = gnssPowerIndicationIface->requestGnssPowerStats();
588     checkAidlStatus(status, "IGnssPowerIndication requestGnssPowerStats() failed.");
589 }
590 
android_location_gnss_hal_GnssNative_is_gnss_visibility_control_supported(JNIEnv *,jclass)591 static jboolean android_location_gnss_hal_GnssNative_is_gnss_visibility_control_supported(
592         JNIEnv* /* env */, jclass) {
593     return (gnssVisibilityControlIface != nullptr) ?  JNI_TRUE : JNI_FALSE;
594 }
595 
android_location_GnssNetworkConnectivityHandler_update_network_state(JNIEnv * env,jobject,jboolean connected,jint type,jboolean roaming,jboolean available,jstring apn,jlong networkHandle,jshort capabilities)596 static void android_location_GnssNetworkConnectivityHandler_update_network_state(JNIEnv* env,
597                                                                        jobject /* obj */,
598                                                                        jboolean connected,
599                                                                        jint type,
600                                                                        jboolean roaming,
601                                                                        jboolean available,
602                                                                        jstring apn,
603                                                                        jlong networkHandle,
604                                                                        jshort capabilities) {
605     if (agnssRilIface == nullptr) {
606         ALOGE("%s: IAGnssRil interface not available.", __func__);
607         return;
608     }
609     agnssRilIface->updateNetworkState(connected, type, roaming, available, apn, networkHandle,
610                                       capabilities);
611 }
612 
android_location_gnss_hal_GnssNative_is_geofence_supported(JNIEnv *,jclass)613 static jboolean android_location_gnss_hal_GnssNative_is_geofence_supported(JNIEnv* /* env */,
614                                                                            jclass) {
615     if (gnssGeofencingIface == nullptr) {
616         return JNI_FALSE;
617     }
618     return JNI_TRUE;
619 }
620 
android_location_gnss_hal_GnssNative_add_geofence(JNIEnv *,jclass,jint geofenceId,jdouble latitude,jdouble longitude,jdouble radius,jint last_transition,jint monitor_transition,jint notification_responsiveness,jint unknown_timer)621 static jboolean android_location_gnss_hal_GnssNative_add_geofence(
622         JNIEnv* /* env */, jclass, jint geofenceId, jdouble latitude, jdouble longitude,
623         jdouble radius, jint last_transition, jint monitor_transition,
624         jint notification_responsiveness, jint unknown_timer) {
625     if (gnssGeofencingIface == nullptr) {
626         ALOGE("%s: IGnssGeofencing interface not available.", __func__);
627         return JNI_FALSE;
628     }
629     return gnssGeofencingIface->addGeofence(geofenceId, latitude, longitude, radius,
630                                             last_transition, monitor_transition,
631                                             notification_responsiveness, unknown_timer);
632 }
633 
android_location_gnss_hal_GnssNative_remove_geofence(JNIEnv *,jclass,jint geofenceId)634 static jboolean android_location_gnss_hal_GnssNative_remove_geofence(JNIEnv* /* env */, jclass,
635                                                                      jint geofenceId) {
636     if (gnssGeofencingIface == nullptr) {
637         ALOGE("%s: IGnssGeofencing interface not available.", __func__);
638         return JNI_FALSE;
639     }
640     return gnssGeofencingIface->removeGeofence(geofenceId);
641 }
642 
android_location_gnss_hal_GnssNative_pause_geofence(JNIEnv *,jclass,jint geofenceId)643 static jboolean android_location_gnss_hal_GnssNative_pause_geofence(JNIEnv* /* env */, jclass,
644                                                                     jint geofenceId) {
645     if (gnssGeofencingIface == nullptr) {
646         ALOGE("%s: IGnssGeofencing interface not available.", __func__);
647         return JNI_FALSE;
648     }
649     return gnssGeofencingIface->pauseGeofence(geofenceId);
650 }
651 
android_location_gnss_hal_GnssNative_resume_geofence(JNIEnv *,jclass,jint geofenceId,jint monitor_transition)652 static jboolean android_location_gnss_hal_GnssNative_resume_geofence(JNIEnv* /* env */, jclass,
653                                                                      jint geofenceId,
654                                                                      jint monitor_transition) {
655     if (gnssGeofencingIface == nullptr) {
656         ALOGE("%s: IGnssGeofencing interface not available.", __func__);
657         return JNI_FALSE;
658     }
659     return gnssGeofencingIface->resumeGeofence(geofenceId, monitor_transition);
660 }
661 
android_location_gnss_hal_GnssNative_is_antenna_info_supported(JNIEnv * env,jclass)662 static jboolean android_location_gnss_hal_GnssNative_is_antenna_info_supported(JNIEnv* env,
663                                                                                jclass) {
664     if (gnssAntennaInfoIface != nullptr) {
665         return JNI_TRUE;
666     }
667     return JNI_FALSE;
668 }
669 
android_location_gnss_hal_GnssNative_start_antenna_info_listening(JNIEnv *,jclass)670 static jboolean android_location_gnss_hal_GnssNative_start_antenna_info_listening(JNIEnv* /* env */,
671                                                                                   jclass) {
672     if (gnssAntennaInfoIface == nullptr) {
673         ALOGE("%s: IGnssAntennaInfo interface not available.", __func__);
674         return JNI_FALSE;
675     }
676     return gnssAntennaInfoIface->setCallback(std::make_unique<gnss::GnssAntennaInfoCallback>());
677 }
678 
android_location_gnss_hal_GnssNative_stop_antenna_info_listening(JNIEnv *,jclass)679 static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening(JNIEnv* /* env */,
680                                                                                  jclass) {
681     if (gnssAntennaInfoIface == nullptr) {
682         ALOGE("%s: IGnssAntennaInfo interface not available.", __func__);
683         return JNI_FALSE;
684     }
685     return gnssAntennaInfoIface->close();
686 }
687 
android_location_gnss_hal_GnssNative_is_measurement_supported(JNIEnv * env,jclass)688 static jboolean android_location_gnss_hal_GnssNative_is_measurement_supported(JNIEnv* env, jclass) {
689     if (gnssMeasurementIface != nullptr) {
690         return JNI_TRUE;
691     }
692 
693     return JNI_FALSE;
694 }
695 
android_location_gnss_hal_GnssNative_start_measurement_collection(JNIEnv *,jclass,jboolean enableFullTracking,jboolean enableCorrVecOutputs,jint intervalMs)696 static jboolean android_location_gnss_hal_GnssNative_start_measurement_collection(
697         JNIEnv* /* env */, jclass, jboolean enableFullTracking, jboolean enableCorrVecOutputs,
698         jint intervalMs) {
699     if (gnssMeasurementIface == nullptr) {
700         ALOGE("%s: IGnssMeasurement interface not available.", __func__);
701         return JNI_FALSE;
702     }
703     hardware::gnss::IGnssMeasurementInterface::Options options;
704     options.enableFullTracking = enableFullTracking;
705     options.enableCorrVecOutputs = enableCorrVecOutputs;
706     options.intervalMs = intervalMs;
707 
708     return gnssMeasurementIface->setCallback(std::make_unique<gnss::GnssMeasurementCallback>(
709                                                      gnssMeasurementIface->getInterfaceVersion()),
710                                              options);
711 }
712 
android_location_gnss_hal_GnssNative_stop_measurement_collection(JNIEnv * env,jclass)713 static jboolean android_location_gnss_hal_GnssNative_stop_measurement_collection(JNIEnv* env,
714                                                                                  jclass) {
715     if (gnssMeasurementIface == nullptr) {
716         ALOGE("%s: IGnssMeasurement interface not available.", __func__);
717         return JNI_FALSE;
718     }
719 
720     return gnssMeasurementIface->close();
721 }
722 
android_location_gnss_hal_GnssNative_is_measurement_corrections_supported(JNIEnv * env,jclass)723 static jboolean android_location_gnss_hal_GnssNative_is_measurement_corrections_supported(
724         JNIEnv* env, jclass) {
725     if (gnssMeasurementCorrectionsIface != nullptr) {
726         return JNI_TRUE;
727     }
728 
729     return JNI_FALSE;
730 }
731 
android_location_gnss_hal_GnssNative_inject_measurement_corrections(JNIEnv * env,jclass,jobject correctionsObj)732 static jboolean android_location_gnss_hal_GnssNative_inject_measurement_corrections(
733         JNIEnv* env, jclass, jobject correctionsObj) {
734     if (gnssMeasurementCorrectionsIface == nullptr) {
735         ALOGW("Trying to inject GNSS measurement corrections on a chipset that does not"
736             " support them.");
737         return JNI_FALSE;
738     }
739     return gnssMeasurementCorrectionsIface->setCorrections(env, correctionsObj);
740 }
741 
android_location_gnss_hal_GnssNative_is_navigation_message_supported(JNIEnv * env,jclass)742 static jboolean android_location_gnss_hal_GnssNative_is_navigation_message_supported(JNIEnv* env,
743                                                                                      jclass) {
744     if (gnssNavigationMessageIface != nullptr) {
745         return JNI_TRUE;
746     }
747     return JNI_FALSE;
748 }
749 
android_location_gnss_hal_GnssNative_start_navigation_message_collection(JNIEnv * env,jclass)750 static jboolean android_location_gnss_hal_GnssNative_start_navigation_message_collection(
751         JNIEnv* env, jclass) {
752     if (gnssNavigationMessageIface == nullptr) {
753         ALOGE("%s: IGnssNavigationMessage interface not available.", __func__);
754         return JNI_FALSE;
755     }
756 
757     return gnssNavigationMessageIface->setCallback(
758             std::make_unique<gnss::GnssNavigationMessageCallback>());
759 }
760 
android_location_gnss_hal_GnssNative_stop_navigation_message_collection(JNIEnv * env,jclass)761 static jboolean android_location_gnss_hal_GnssNative_stop_navigation_message_collection(JNIEnv* env,
762                                                                                         jclass) {
763     if (gnssNavigationMessageIface == nullptr) {
764         ALOGE("%s: IGnssNavigationMessage interface not available.", __func__);
765         return JNI_FALSE;
766     }
767     return gnssNavigationMessageIface->close();
768 }
769 
android_location_GnssConfiguration_set_emergency_supl_pdn(JNIEnv *,jobject,jint emergencySuplPdn)770 static jboolean android_location_GnssConfiguration_set_emergency_supl_pdn(JNIEnv*,
771                                                                           jobject,
772                                                                           jint emergencySuplPdn) {
773     if (gnssConfigurationIface == nullptr) {
774         ALOGE("%s: IGnssConfiguration interface not available.", __func__);
775         return JNI_FALSE;
776     }
777     return gnssConfigurationIface->setEmergencySuplPdn(emergencySuplPdn);
778 }
779 
android_location_GnssConfiguration_set_supl_version(JNIEnv *,jobject,jint version)780 static jboolean android_location_GnssConfiguration_set_supl_version(JNIEnv*,
781                                                                     jobject,
782                                                                     jint version) {
783     if (gnssConfigurationIface == nullptr) {
784         ALOGE("%s: IGnssConfiguration interface not available.", __func__);
785         return JNI_FALSE;
786     }
787     return gnssConfigurationIface->setSuplVersion(version);
788 }
789 
android_location_GnssConfiguration_set_supl_es(JNIEnv *,jobject,jint suplEs)790 static jboolean android_location_GnssConfiguration_set_supl_es(JNIEnv*,
791                                                                jobject,
792                                                                jint suplEs) {
793     if (gnssConfigurationIface == nullptr) {
794         ALOGE("%s: IGnssConfiguration interface not available.", __func__);
795         return JNI_FALSE;
796     }
797     return gnssConfigurationIface->setSuplEs(suplEs);
798 }
799 
android_location_GnssConfiguration_set_supl_mode(JNIEnv *,jobject,jint mode)800 static jboolean android_location_GnssConfiguration_set_supl_mode(JNIEnv*,
801                                                                  jobject,
802                                                                  jint mode) {
803     if (gnssConfigurationIface == nullptr) {
804         ALOGE("%s: IGnssConfiguration interface not available.", __func__);
805         return JNI_FALSE;
806     }
807     return gnssConfigurationIface->setSuplMode(mode);
808 }
809 
android_location_GnssConfiguration_set_gps_lock(JNIEnv *,jobject,jint gpsLock)810 static jboolean android_location_GnssConfiguration_set_gps_lock(JNIEnv*,
811                                                                 jobject,
812                                                                 jint gpsLock) {
813     if (gnssConfigurationIface == nullptr) {
814         ALOGE("%s: IGnssConfiguration interface not available.", __func__);
815         return JNI_FALSE;
816     }
817     return gnssConfigurationIface->setGpsLock(gpsLock);
818 }
819 
android_location_GnssConfiguration_set_lpp_profile(JNIEnv *,jobject,jint lppProfile)820 static jboolean android_location_GnssConfiguration_set_lpp_profile(JNIEnv*,
821                                                                    jobject,
822                                                                    jint lppProfile) {
823     if (gnssConfigurationIface == nullptr) {
824         ALOGE("%s: IGnssConfiguration interface not available.", __func__);
825         return JNI_FALSE;
826     }
827     return gnssConfigurationIface->setLppProfile(lppProfile);
828 }
829 
android_location_GnssConfiguration_set_gnss_pos_protocol_select(JNIEnv *,jobject,jint gnssPosProtocol)830 static jboolean android_location_GnssConfiguration_set_gnss_pos_protocol_select(JNIEnv*,
831                                                                             jobject,
832                                                                             jint gnssPosProtocol) {
833     if (gnssConfigurationIface == nullptr) {
834         ALOGE("%s: IGnssConfiguration interface not available.", __func__);
835         return JNI_FALSE;
836     }
837     return gnssConfigurationIface->setGlonassPositioningProtocol(gnssPosProtocol);
838 }
839 
android_location_GnssConfiguration_set_satellite_blocklist(JNIEnv * env,jobject,jintArray constellations,jintArray sv_ids)840 static jboolean android_location_GnssConfiguration_set_satellite_blocklist(JNIEnv* env, jobject,
841                                                                            jintArray constellations,
842                                                                            jintArray sv_ids) {
843     if (gnssConfigurationIface == nullptr) {
844         ALOGI("IGnssConfiguration interface does not support satellite blocklist.");
845         return JNI_FALSE;
846     }
847     return gnssConfigurationIface->setBlocklist(env, constellations, sv_ids);
848 }
849 
android_location_GnssConfiguration_set_es_extension_sec(JNIEnv *,jobject,jint emergencyExtensionSeconds)850 static jboolean android_location_GnssConfiguration_set_es_extension_sec(
851         JNIEnv*, jobject, jint emergencyExtensionSeconds) {
852     if (gnssConfigurationIface == nullptr) {
853         ALOGE("%s: IGnssConfiguration interface not available.", __func__);
854         return JNI_FALSE;
855     }
856     return gnssConfigurationIface->setEsExtensionSec(emergencyExtensionSeconds);
857 }
858 
android_location_gnss_hal_GnssNative_get_batch_size(JNIEnv *)859 static jint android_location_gnss_hal_GnssNative_get_batch_size(JNIEnv*) {
860     if (gnssBatchingIface == nullptr) {
861         return 0; // batching not supported, size = 0
862     }
863     return gnssBatchingIface->getBatchSize();
864 }
865 
android_location_gnss_hal_GnssNative_init_batching(JNIEnv *,jclass)866 static jboolean android_location_gnss_hal_GnssNative_init_batching(JNIEnv*, jclass) {
867     if (gnssBatchingIface == nullptr) {
868         return JNI_FALSE; // batching not supported
869     }
870     return gnssBatchingIface->init(std::make_unique<gnss::GnssBatchingCallback>());
871 }
872 
android_location_gnss_hal_GnssNative_cleanup_batching(JNIEnv *,jclass)873 static void android_location_gnss_hal_GnssNative_cleanup_batching(JNIEnv*, jclass) {
874     if (gnssBatchingIface == nullptr) {
875         return; // batching not supported
876     }
877     gnssBatchingIface->cleanup();
878 }
879 
android_location_gnss_hal_GnssNative_start_batch(JNIEnv *,jclass,jlong periodNanos,jfloat minUpdateDistanceMeters,jboolean wakeOnFifoFull)880 static jboolean android_location_gnss_hal_GnssNative_start_batch(JNIEnv*, jclass, jlong periodNanos,
881                                                                  jfloat minUpdateDistanceMeters,
882                                                                  jboolean wakeOnFifoFull) {
883     if (gnssBatchingIface == nullptr) {
884         return JNI_FALSE; // batching not supported
885     }
886     return gnssBatchingIface->start(periodNanos, minUpdateDistanceMeters, wakeOnFifoFull);
887 }
888 
android_location_gnss_hal_GnssNative_flush_batch(JNIEnv *,jclass)889 static void android_location_gnss_hal_GnssNative_flush_batch(JNIEnv*, jclass) {
890     if (gnssBatchingIface == nullptr) {
891         return; // batching not supported
892     }
893     gnssBatchingIface->flush();
894 }
895 
android_location_gnss_hal_GnssNative_stop_batch(JNIEnv *,jclass)896 static jboolean android_location_gnss_hal_GnssNative_stop_batch(JNIEnv*, jclass) {
897     if (gnssBatchingIface == nullptr) {
898         return JNI_FALSE; // batching not supported
899     }
900     return gnssBatchingIface->stop();
901 }
902 
android_location_GnssVisibilityControl_enable_nfw_location_access(JNIEnv * env,jobject,jobjectArray proxyApps)903 static jboolean android_location_GnssVisibilityControl_enable_nfw_location_access(
904         JNIEnv* env, jobject, jobjectArray proxyApps) {
905     if (gnssVisibilityControlIface == nullptr) {
906         ALOGI("IGnssVisibilityControl interface not available.");
907         return JNI_FALSE;
908     }
909     return gnssVisibilityControlIface->enableNfwLocationAccess(env, proxyApps);
910 }
911 
912 static const JNINativeMethod sCoreMethods[] = {
913         /* name, signature, funcPtr */
native_class_init_once()914         {"native_class_init_once", "()V",
915          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_class_init_once)},
native_is_supported()916         {"native_is_supported", "()Z",
917          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_is_supported)},
native_init_once(Z)918         {"native_init_once", "(Z)V",
919          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_init_once)},
920 };
921 
922 static const JNINativeMethod sLocationProviderMethods[] = {
923         /* name, signature, funcPtr */
native_init()924         {"native_init", "()Z", reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_init)},
native_cleanup()925         {"native_cleanup", "()V",
926          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_cleanup)},
native_set_position_mode(IIIIIZ)927         {"native_set_position_mode", "(IIIIIZ)Z",
928          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_set_position_mode)},
native_start()929         {"native_start", "()Z",
930          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_start)},
native_stop()931         {"native_stop", "()Z", reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_stop)},
native_delete_aiding_data(I)932         {"native_delete_aiding_data", "(I)V",
933          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_delete_aiding_data)},
native_read_nmea([BI)934         {"native_read_nmea", "([BI)I",
935          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_read_nmea)},
native_inject_time(JJI)936         {"native_inject_time", "(JJI)V",
937          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_time)},
native_inject_best_location(IDDDFFFFFFJIJD)938         {"native_inject_best_location", "(IDDDFFFFFFJIJD)V",
939          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_best_location)},
native_inject_location(IDDDFFFFFFJIJD)940         {"native_inject_location", "(IDDDFFFFFFJIJD)V",
941          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_location)},
native_supports_psds()942         {"native_supports_psds", "()Z",
943          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_supports_psds)},
native_inject_psds_data([BII)944         {"native_inject_psds_data", "([BII)V",
945          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_psds_data)},
native_agps_set_id(ILjava/lang/String;)946         {"native_agps_set_id", "(ILjava/lang/String;)V",
947          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_agps_set_id)},
native_agps_set_ref_location_cellid(IIIIJIII)948         {"native_agps_set_ref_location_cellid", "(IIIIJIII)V",
949          reinterpret_cast<void*>(
950                  android_location_gnss_hal_GnssNative_agps_set_reference_location_cellid)},
native_set_agps_server(ILjava/lang/String;I)951         {"native_set_agps_server", "(ILjava/lang/String;I)V",
952          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_set_agps_server)},
native_inject_ni_supl_message_data([BII)953         {"native_inject_ni_supl_message_data", "([BII)V",
954          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_ni_supl_message_data)},
native_get_internal_state()955         {"native_get_internal_state", "()Ljava/lang/String;",
956          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_get_internal_state)},
native_is_gnss_visibility_control_supported()957         {"native_is_gnss_visibility_control_supported", "()Z",
958          reinterpret_cast<void*>(
959                  android_location_gnss_hal_GnssNative_is_gnss_visibility_control_supported)},
native_start_sv_status_collection()960         {"native_start_sv_status_collection", "()Z",
961          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_start_sv_status_collection)},
native_stop_sv_status_collection()962         {"native_stop_sv_status_collection", "()Z",
963          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_stop_sv_status_collection)},
native_start_nmea_message_collection()964         {"native_start_nmea_message_collection", "()Z",
965          reinterpret_cast<void*>(
966                  android_location_gnss_hal_GnssNative_start_nmea_message_collection)},
native_stop_nmea_message_collection()967         {"native_stop_nmea_message_collection", "()Z",
968          reinterpret_cast<void*>(
969                  android_location_gnss_hal_GnssNative_stop_nmea_message_collection)},
native_inject_gnss_assistance(Landroid/location/GnssAssistance;)970         {"native_inject_gnss_assistance", "(Landroid/location/GnssAssistance;)V",
971          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_gnss_assistance)},
972 };
973 
974 static const JNINativeMethod sBatchingMethods[] = {
975         /* name, signature, funcPtr */
native_get_batch_size()976         {"native_get_batch_size", "()I",
977          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_get_batch_size)},
native_start_batch(JFZ)978         {"native_start_batch", "(JFZ)Z",
979          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_start_batch)},
native_flush_batch()980         {"native_flush_batch", "()V",
981          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_flush_batch)},
native_stop_batch()982         {"native_stop_batch", "()Z",
983          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_stop_batch)},
native_init_batching()984         {"native_init_batching", "()Z",
985          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_init_batching)},
native_cleanup_batching()986         {"native_cleanup_batching", "()V",
987          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_cleanup_batching)},
988 };
989 
990 static const JNINativeMethod sAntennaInfoMethods[] = {
991         /* name, signature, funcPtr */
native_is_antenna_info_supported()992         {"native_is_antenna_info_supported", "()Z",
993          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_is_antenna_info_supported)},
native_start_antenna_info_listening()994         {"native_start_antenna_info_listening", "()Z",
995          reinterpret_cast<void*>(
996                  android_location_gnss_hal_GnssNative_start_antenna_info_listening)},
native_stop_antenna_info_listening()997         {"native_stop_antenna_info_listening", "()Z",
998          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_stop_antenna_info_listening)},
999 };
1000 
1001 static const JNINativeMethod sGeofenceMethods[] = {
1002         /* name, signature, funcPtr */
native_is_geofence_supported()1003         {"native_is_geofence_supported", "()Z",
1004          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_is_geofence_supported)},
native_add_geofence(IDDDIIII)1005         {"native_add_geofence", "(IDDDIIII)Z",
1006          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_add_geofence)},
native_remove_geofence(I)1007         {"native_remove_geofence", "(I)Z",
1008          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_remove_geofence)},
native_pause_geofence(I)1009         {"native_pause_geofence", "(I)Z",
1010          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_pause_geofence)},
native_resume_geofence(II)1011         {"native_resume_geofence", "(II)Z",
1012          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_resume_geofence)},
1013 };
1014 
1015 static const JNINativeMethod sMeasurementMethods[] = {
1016         /* name, signature, funcPtr */
native_is_measurement_supported()1017         {"native_is_measurement_supported", "()Z",
1018          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_is_measurement_supported)},
native_start_measurement_collection(ZZI)1019         {"native_start_measurement_collection", "(ZZI)Z",
1020          reinterpret_cast<void*>(
1021                  android_location_gnss_hal_GnssNative_start_measurement_collection)},
native_stop_measurement_collection()1022         {"native_stop_measurement_collection", "()Z",
1023          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_stop_measurement_collection)},
1024 };
1025 
1026 static const JNINativeMethod sMeasurementCorrectionsMethods[] = {
1027         /* name, signature, funcPtr */
native_is_measurement_corrections_supported()1028         {"native_is_measurement_corrections_supported", "()Z",
1029          reinterpret_cast<void*>(
1030                  android_location_gnss_hal_GnssNative_is_measurement_corrections_supported)},
native_inject_measurement_corrections(Landroid/location/GnssMeasurementCorrections;)1031         {"native_inject_measurement_corrections",
1032          "(Landroid/location/GnssMeasurementCorrections;)Z",
1033          reinterpret_cast<void*>(
1034                  android_location_gnss_hal_GnssNative_inject_measurement_corrections)},
1035 };
1036 
1037 static const JNINativeMethod sNavigationMessageMethods[] = {
1038         /* name, signature, funcPtr */
native_is_navigation_message_supported()1039         {"native_is_navigation_message_supported", "()Z",
1040          reinterpret_cast<void*>(
1041                  android_location_gnss_hal_GnssNative_is_navigation_message_supported)},
native_start_navigation_message_collection()1042         {"native_start_navigation_message_collection", "()Z",
1043          reinterpret_cast<void*>(
1044                  android_location_gnss_hal_GnssNative_start_navigation_message_collection)},
native_stop_navigation_message_collection()1045         {"native_stop_navigation_message_collection", "()Z",
1046          reinterpret_cast<void*>(
1047                  android_location_gnss_hal_GnssNative_stop_navigation_message_collection)},
1048 };
1049 
1050 static const JNINativeMethod sNetworkConnectivityMethods[] = {
1051         /* name, signature, funcPtr */
native_is_agps_ril_supported()1052         {"native_is_agps_ril_supported", "()Z",
1053          reinterpret_cast<void*>(
1054                  android_location_GnssNetworkConnectivityHandler_is_agps_ril_supported)},
native_update_network_state(ZIZZLjava/lang/String;JS)1055         {"native_update_network_state", "(ZIZZLjava/lang/String;JS)V",
1056          reinterpret_cast<void*>(
1057                  android_location_GnssNetworkConnectivityHandler_update_network_state)},
native_agps_data_conn_open(JLjava/lang/String;I)1058         {"native_agps_data_conn_open", "(JLjava/lang/String;I)V",
1059          reinterpret_cast<void*>(
1060                  android_location_GnssNetworkConnectivityHandler_agps_data_conn_open)},
native_agps_data_conn_closed()1061         {"native_agps_data_conn_closed", "()V",
1062          reinterpret_cast<void*>(
1063                  android_location_GnssNetworkConnectivityHandler_agps_data_conn_closed)},
native_agps_data_conn_failed()1064         {"native_agps_data_conn_failed", "()V",
1065          reinterpret_cast<void*>(
1066                  android_location_GnssNetworkConnectivityHandler_agps_data_conn_failed)},
1067 };
1068 
1069 static const JNINativeMethod sConfigurationMethods[] = {
1070         /* name, signature, funcPtr */
native_get_gnss_configuration_version()1071         {"native_get_gnss_configuration_version",
1072          "()Lcom/android/server/location/gnss/GnssConfiguration$HalInterfaceVersion;",
1073          reinterpret_cast<void*>(
1074                  android_location_GnssConfiguration_get_gnss_configuration_version)},
native_set_supl_es(I)1075         {"native_set_supl_es", "(I)Z",
1076          reinterpret_cast<void*>(android_location_GnssConfiguration_set_supl_es)},
native_set_supl_version(I)1077         {"native_set_supl_version", "(I)Z",
1078          reinterpret_cast<void*>(android_location_GnssConfiguration_set_supl_version)},
native_set_supl_mode(I)1079         {"native_set_supl_mode", "(I)Z",
1080          reinterpret_cast<void*>(android_location_GnssConfiguration_set_supl_mode)},
native_set_lpp_profile(I)1081         {"native_set_lpp_profile", "(I)Z",
1082          reinterpret_cast<void*>(android_location_GnssConfiguration_set_lpp_profile)},
native_set_gnss_pos_protocol_select(I)1083         {"native_set_gnss_pos_protocol_select", "(I)Z",
1084          reinterpret_cast<void*>(android_location_GnssConfiguration_set_gnss_pos_protocol_select)},
native_set_gps_lock(I)1085         {"native_set_gps_lock", "(I)Z",
1086          reinterpret_cast<void*>(android_location_GnssConfiguration_set_gps_lock)},
native_set_emergency_supl_pdn(I)1087         {"native_set_emergency_supl_pdn", "(I)Z",
1088          reinterpret_cast<void*>(android_location_GnssConfiguration_set_emergency_supl_pdn)},
native_set_satellite_blocklist([I[I)1089         {"native_set_satellite_blocklist", "([I[I)Z",
1090          reinterpret_cast<void*>(android_location_GnssConfiguration_set_satellite_blocklist)},
native_set_es_extension_sec(I)1091         {"native_set_es_extension_sec", "(I)Z",
1092          reinterpret_cast<void*>(android_location_GnssConfiguration_set_es_extension_sec)},
1093 };
1094 
1095 static const JNINativeMethod sVisibilityControlMethods[] = {
1096         /* name, signature, funcPtr */
native_enable_nfw_location_access([Ljava/lang/String;)1097         {"native_enable_nfw_location_access", "([Ljava/lang/String;)Z",
1098          reinterpret_cast<void*>(
1099                  android_location_GnssVisibilityControl_enable_nfw_location_access)},
1100 };
1101 
1102 static const JNINativeMethod sPowerIndicationMethods[] = {
1103         /* name, signature, funcPtr */
native_request_power_stats()1104         {"native_request_power_stats", "()V",
1105          reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_request_power_stats)},
1106 };
1107 
register_android_server_location_GnssLocationProvider(JNIEnv * env)1108 int register_android_server_location_GnssLocationProvider(JNIEnv* env) {
1109     int res;
1110 
1111     res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
1112                                    sAntennaInfoMethods, NELEM(sAntennaInfoMethods));
1113     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1114 
1115     res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
1116                                    sBatchingMethods, NELEM(sBatchingMethods));
1117     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1118 
1119     res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
1120                                    sGeofenceMethods, NELEM(sGeofenceMethods));
1121     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1122 
1123     res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
1124                                    sMeasurementMethods, NELEM(sMeasurementMethods));
1125     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1126 
1127     res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
1128                                    sMeasurementCorrectionsMethods,
1129                                    NELEM(sMeasurementCorrectionsMethods));
1130     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1131 
1132     res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
1133                                    sNavigationMessageMethods, NELEM(sNavigationMessageMethods));
1134     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1135 
1136     res = jniRegisterNativeMethods(env,
1137                                    "com/android/server/location/gnss/"
1138                                    "GnssNetworkConnectivityHandler",
1139                                    sNetworkConnectivityMethods, NELEM(sNetworkConnectivityMethods));
1140     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1141 
1142     res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/GnssConfiguration",
1143                                    sConfigurationMethods, NELEM(sConfigurationMethods));
1144     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1145 
1146     res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/GnssVisibilityControl",
1147                                    sVisibilityControlMethods, NELEM(sVisibilityControlMethods));
1148     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1149 
1150     res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
1151                                    sPowerIndicationMethods, NELEM(sPowerIndicationMethods));
1152     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1153 
1154     res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
1155                                    sLocationProviderMethods, NELEM(sLocationProviderMethods));
1156     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1157 
1158     res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
1159                                    sCoreMethods, NELEM(sCoreMethods));
1160     LOG_FATAL_IF(res < 0, "Unable to register native methods.");
1161 
1162     return 0;
1163 }
1164 
1165 } /* namespace android */
1166