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