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.1/IGnss.h>
23 #include <android/hardware/gnss/2.0/IGnss.h>
24 #include <android/hardware/gnss/2.1/IGnss.h>
25
26 #include <android/hardware/gnss/1.0/IGnssMeasurement.h>
27 #include <android/hardware/gnss/1.1/IGnssMeasurement.h>
28 #include <android/hardware/gnss/2.0/IGnssMeasurement.h>
29 #include <android/hardware/gnss/2.1/IGnssAntennaInfo.h>
30 #include <android/hardware/gnss/2.1/IGnssMeasurement.h>
31 #include <android/hardware/gnss/BnGnss.h>
32 #include <android/hardware/gnss/BnGnssCallback.h>
33 #include <android/hardware/gnss/BnGnssMeasurementCallback.h>
34 #include <android/hardware/gnss/BnGnssPowerIndicationCallback.h>
35 #include <android/hardware/gnss/BnGnssPsdsCallback.h>
36 #include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h>
37 #include <android/hardware/gnss/measurement_corrections/1.1/IMeasurementCorrections.h>
38 #include <android/hardware/gnss/visibility_control/1.0/IGnssVisibilityControl.h>
39 #include <binder/IServiceManager.h>
40 #include <nativehelper/JNIHelp.h>
41 #include "android_runtime/AndroidRuntime.h"
42 #include "android_runtime/Log.h"
43 #include "gnss/GnssConfiguration.h"
44 #include "gnss/GnssMeasurement.h"
45 #include "gnss/Utils.h"
46 #include "hardware_legacy/power.h"
47 #include "jni.h"
48 #include "utils/Log.h"
49 #include "utils/misc.h"
50
51 #include <arpa/inet.h>
52 #include <cinttypes>
53 #include <iomanip>
54 #include <limits>
55 #include <linux/in.h>
56 #include <linux/in6.h>
57 #include <pthread.h>
58 #include <string.h>
59 #include <utils/SystemClock.h>
60
61 static jclass class_location;
62 static jclass class_gnssNavigationMessage;
63 static jclass class_gnssAntennaInfoBuilder;
64 static jclass class_gnssPowerStats;
65 static jclass class_phaseCenterOffset;
66 static jclass class_sphericalCorrections;
67 static jclass class_arrayList;
68 static jclass class_doubleArray;
69
70 jobject android::mCallbacksObj = nullptr;
71
72 static jmethodID method_reportLocation;
73 static jmethodID method_reportStatus;
74 static jmethodID method_reportSvStatus;
75 static jmethodID method_reportAGpsStatus;
76 static jmethodID method_reportNmea;
77 static jmethodID method_setTopHalCapabilities;
78 static jmethodID method_setGnssYearOfHardware;
79 static jmethodID method_setGnssHardwareModelName;
80 static jmethodID method_psdsDownloadRequest;
81 static jmethodID method_reportNiNotification;
82 static jmethodID method_requestLocation;
83 static jmethodID method_requestRefLocation;
84 static jmethodID method_requestSetID;
85 static jmethodID method_requestUtcTime;
86 static jmethodID method_reportGeofenceTransition;
87 static jmethodID method_reportGeofenceStatus;
88 static jmethodID method_reportGeofenceAddStatus;
89 static jmethodID method_reportGeofenceRemoveStatus;
90 static jmethodID method_reportGeofencePauseStatus;
91 static jmethodID method_reportGeofenceResumeStatus;
92 static jmethodID method_reportAntennaInfo;
93 static jmethodID method_reportNavigationMessages;
94 static jmethodID method_reportLocationBatch;
95 static jmethodID method_reportGnssServiceDied;
96 static jmethodID method_reportGnssPowerStats;
97 static jmethodID method_setSubHalMeasurementCorrectionsCapabilities;
98 static jmethodID method_correctionsGetLatitudeDegrees;
99 static jmethodID method_correctionsGetLongitudeDegrees;
100 static jmethodID method_correctionsGetAltitudeMeters;
101 static jmethodID method_correctionsGetHorPosUncMeters;
102 static jmethodID method_correctionsGetVerPosUncMeters;
103 static jmethodID method_correctionsGetToaGpsNanosecondsOfWeek;
104 static jmethodID method_correctionsGetSingleSatCorrectionList;
105 static jmethodID method_correctionsHasEnvironmentBearing;
106 static jmethodID method_correctionsGetEnvironmentBearingDegrees;
107 static jmethodID method_correctionsGetEnvironmentBearingUncertaintyDegrees;
108 static jmethodID method_listSize;
109 static jmethodID method_correctionListGet;
110 static jmethodID method_correctionSatFlags;
111 static jmethodID method_correctionSatConstType;
112 static jmethodID method_correctionSatId;
113 static jmethodID method_correctionSatCarrierFreq;
114 static jmethodID method_correctionSatIsLosProb;
115 static jmethodID method_correctionSatEpl;
116 static jmethodID method_correctionSatEplUnc;
117 static jmethodID method_correctionSatRefPlane;
118 static jmethodID method_correctionPlaneLatDeg;
119 static jmethodID method_correctionPlaneLngDeg;
120 static jmethodID method_correctionPlaneAltDeg;
121 static jmethodID method_correctionPlaneAzimDeg;
122 static jmethodID method_reportNfwNotification;
123 static jmethodID method_isInEmergencySession;
124 static jmethodID method_locationCtor;
125 static jmethodID method_gnssNavigationMessageCtor;
126 static jmethodID method_gnssAntennaInfoBuilderCtor;
127 static jmethodID method_gnssPowerStatsCtor;
128 static jmethodID method_phaseCenterOffsetCtor;
129 static jmethodID method_sphericalCorrectionsCtor;
130 static jmethodID method_arrayListCtor;
131 static jmethodID method_arrayListAdd;
132 static jmethodID method_gnssAntennaInfoBuilderSetCarrierFrequencyMHz;
133 static jmethodID method_gnssAntennaInfoBuilderSetPhaseCenterOffset;
134 static jmethodID method_gnssAntennaInfoBuilderSetPhaseCenterVariationCorrections;
135 static jmethodID method_gnssAntennaInfoBuilderSetSignalGainCorrections;
136 static jmethodID method_gnssAntennaInfoBuilderBuild;
137 static jmethodID method_setSubHalPowerIndicationCapabilities;
138
139 /*
140 * Save a pointer to JavaVm to attach/detach threads executing
141 * callback methods that need to make JNI calls.
142 */
143 JavaVM* android::ScopedJniThreadAttach::sJvm;
144
145 using android::OK;
146 using android::sp;
147 using android::status_t;
148 using android::String16;
149 using android::wp;
150 using android::binder::Status;
151 using android::gnss::GnssConfigurationInterface;
152
153 using android::hardware::Return;
154 using android::hardware::Void;
155 using android::hardware::hidl_vec;
156 using android::hardware::hidl_string;
157 using android::hardware::hidl_death_recipient;
158
159 using android::hardware::gnss::V1_0::GnssLocationFlags;
160 using android::hardware::gnss::V1_0::IAGnssRilCallback;
161 using android::hardware::gnss::V1_0::IGnssGeofenceCallback;
162 using android::hardware::gnss::V1_0::IGnssGeofencing;
163 using android::hardware::gnss::V1_0::IGnssNavigationMessage;
164 using android::hardware::gnss::V1_0::IGnssNavigationMessageCallback;
165 using android::hardware::gnss::V1_0::IGnssNi;
166 using android::hardware::gnss::V1_0::IGnssNiCallback;
167 using android::hardware::gnss::V1_0::IGnssXtra;
168 using android::hardware::gnss::V1_0::IGnssXtraCallback;
169 using android::hardware::gnss::V2_0::ElapsedRealtimeFlags;
170
171 using MeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections;
172 using MeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::MeasurementCorrections;
173
174 using SingleSatCorrection_V1_0 =
175 android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection;
176 using SingleSatCorrection_V1_1 =
177 android::hardware::gnss::measurement_corrections::V1_1::SingleSatCorrection;
178 using android::hardware::gnss::measurement_corrections::V1_0::ReflectingPlane;
179
180 using android::hidl::base::V1_0::IBase;
181
182 using GnssConstellationType_V1_0 = android::hardware::gnss::V1_0::GnssConstellationType;
183 using GnssConstellationType_V2_0 = android::hardware::gnss::V2_0::GnssConstellationType;
184 using GnssLocation_V1_0 = android::hardware::gnss::V1_0::GnssLocation;
185 using GnssLocation_V2_0 = android::hardware::gnss::V2_0::GnssLocation;
186 using IGnss_V1_0 = android::hardware::gnss::V1_0::IGnss;
187 using IGnss_V1_1 = android::hardware::gnss::V1_1::IGnss;
188 using IGnss_V2_0 = android::hardware::gnss::V2_0::IGnss;
189 using IGnss_V2_1 = android::hardware::gnss::V2_1::IGnss;
190 using IGnssCallback_V1_0 = android::hardware::gnss::V1_0::IGnssCallback;
191 using IGnssCallback_V2_0 = android::hardware::gnss::V2_0::IGnssCallback;
192 using IGnssCallback_V2_1 = android::hardware::gnss::V2_1::IGnssCallback;
193 using IGnssDebug_V1_0 = android::hardware::gnss::V1_0::IGnssDebug;
194 using IGnssDebug_V2_0 = android::hardware::gnss::V2_0::IGnssDebug;
195 using IGnssAntennaInfo = android::hardware::gnss::V2_1::IGnssAntennaInfo;
196 using IGnssAntennaInfoCallback = android::hardware::gnss::V2_1::IGnssAntennaInfoCallback;
197 using IAGnssRil_V1_0 = android::hardware::gnss::V1_0::IAGnssRil;
198 using IAGnssRil_V2_0 = android::hardware::gnss::V2_0::IAGnssRil;
199 using IAGnss_V1_0 = android::hardware::gnss::V1_0::IAGnss;
200 using IAGnss_V2_0 = android::hardware::gnss::V2_0::IAGnss;
201 using IAGnssCallback_V1_0 = android::hardware::gnss::V1_0::IAGnssCallback;
202 using IAGnssCallback_V2_0 = android::hardware::gnss::V2_0::IAGnssCallback;
203 using IGnssBatching_V1_0 = android::hardware::gnss::V1_0::IGnssBatching;
204 using IGnssBatching_V2_0 = android::hardware::gnss::V2_0::IGnssBatching;
205 using IGnssBatchingCallback_V1_0 = android::hardware::gnss::V1_0::IGnssBatchingCallback;
206 using IGnssBatchingCallback_V2_0 = android::hardware::gnss::V2_0::IGnssBatchingCallback;
207
208 using IMeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections;
209 using IMeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::IMeasurementCorrections;
210 using android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrectionsCallback;
211 using android::hardware::gnss::measurement_corrections::V1_0::GnssSingleSatCorrectionFlags;
212
213 using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl;
214 using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControlCallback;
215
216 using android::hardware::gnss::BlocklistedSource;
217 using android::hardware::gnss::GnssConstellationType;
218 using android::hardware::gnss::GnssPowerStats;
219 using android::hardware::gnss::IGnssPowerIndication;
220 using android::hardware::gnss::IGnssPowerIndicationCallback;
221 using android::hardware::gnss::PsdsType;
222 using IGnssAidl = android::hardware::gnss::IGnss;
223 using IGnssCallbackAidl = android::hardware::gnss::IGnssCallback;
224 using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds;
225 using IGnssPsdsCallbackAidl = android::hardware::gnss::IGnssPsdsCallback;
226 using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration;
227
228 struct GnssDeathRecipient : virtual public hidl_death_recipient
229 {
230 // hidl_death_recipient interface
serviceDiedGnssDeathRecipient231 virtual void serviceDied(uint64_t cookie, const wp<IBase>& who) override {
232 ALOGE("IGNSS hidl service failed, trying to recover...");
233
234 JNIEnv* env = android::AndroidRuntime::getJNIEnv();
235 env->CallVoidMethod(android::mCallbacksObj, method_reportGnssServiceDied);
236 }
237 };
238
239 // Must match the value from GnssMeasurement.java
240 static const uint32_t SVID_FLAGS_HAS_BASEBAND_CN0 = (1<<4);
241
242 sp<GnssDeathRecipient> gnssHalDeathRecipient = nullptr;
243 sp<IGnss_V1_0> gnssHal = nullptr;
244 sp<IGnss_V1_1> gnssHal_V1_1 = nullptr;
245 sp<IGnss_V2_0> gnssHal_V2_0 = nullptr;
246 sp<IGnss_V2_1> gnssHal_V2_1 = nullptr;
247 sp<IGnssAidl> gnssHalAidl = nullptr;
248 sp<IGnssPsdsAidl> gnssPsdsAidlIface = nullptr;
249 sp<IGnssXtra> gnssXtraIface = nullptr;
250 sp<IAGnssRil_V1_0> agnssRilIface = nullptr;
251 sp<IAGnssRil_V2_0> agnssRilIface_V2_0 = nullptr;
252 sp<IGnssGeofencing> gnssGeofencingIface = nullptr;
253 sp<IAGnss_V1_0> agnssIface = nullptr;
254 sp<IAGnss_V2_0> agnssIface_V2_0 = nullptr;
255 sp<IGnssBatching_V1_0> gnssBatchingIface = nullptr;
256 sp<IGnssBatching_V2_0> gnssBatchingIface_V2_0 = nullptr;
257 sp<IGnssDebug_V1_0> gnssDebugIface = nullptr;
258 sp<IGnssDebug_V2_0> gnssDebugIface_V2_0 = nullptr;
259 sp<IGnssNi> gnssNiIface = nullptr;
260 sp<IGnssNavigationMessage> gnssNavigationMessageIface = nullptr;
261 sp<IGnssPowerIndication> gnssPowerIndicationIface = nullptr;
262 sp<IMeasurementCorrections_V1_0> gnssCorrectionsIface_V1_0 = nullptr;
263 sp<IMeasurementCorrections_V1_1> gnssCorrectionsIface_V1_1 = nullptr;
264 sp<IGnssVisibilityControl> gnssVisibilityControlIface = nullptr;
265 sp<IGnssAntennaInfo> gnssAntennaInfoIface = nullptr;
266
267 std::unique_ptr<GnssConfigurationInterface> gnssConfigurationIface = nullptr;
268 std::unique_ptr<android::gnss::GnssMeasurementInterface> gnssMeasurementIface = nullptr;
269
270 #define WAKE_LOCK_NAME "GPS"
271
272 namespace android {
273
274 namespace {
275
276 // Returns true if location has lat/long information.
hasLatLong(const GnssLocation_V1_0 & location)277 bool hasLatLong(const GnssLocation_V1_0& location) {
278 return (static_cast<uint32_t>(location.gnssLocationFlags) &
279 GnssLocationFlags::HAS_LAT_LONG) != 0;
280 }
281
282 // Returns true if location has lat/long information.
hasLatLong(const GnssLocation_V2_0 & location)283 bool hasLatLong(const GnssLocation_V2_0& location) {
284 return hasLatLong(location.v1_0);
285 }
286
287 } // namespace
288
boolToJbool(bool value)289 static inline jboolean boolToJbool(bool value) {
290 return value ? JNI_TRUE : JNI_FALSE;
291 }
292
293 struct ScopedJniString {
ScopedJniStringandroid::ScopedJniString294 ScopedJniString(JNIEnv* env, jstring javaString) : mEnv(env), mJavaString(javaString) {
295 mNativeString = mEnv->GetStringUTFChars(mJavaString, nullptr);
296 }
297
~ScopedJniStringandroid::ScopedJniString298 ~ScopedJniString() {
299 if (mNativeString != nullptr) {
300 mEnv->ReleaseStringUTFChars(mJavaString, mNativeString);
301 }
302 }
303
c_strandroid::ScopedJniString304 const char* c_str() const {
305 return mNativeString;
306 }
307
308 operator hidl_string() const {
309 return hidl_string(mNativeString);
310 }
311
312 private:
313 ScopedJniString(const ScopedJniString&) = delete;
314 ScopedJniString& operator=(const ScopedJniString&) = delete;
315
316 JNIEnv* mEnv;
317 jstring mJavaString;
318 const char* mNativeString;
319 };
320
translateGnssLocation(JNIEnv * env,const GnssLocation_V1_0 & location)321 static jobject translateGnssLocation(JNIEnv* env,
322 const GnssLocation_V1_0& location) {
323 JavaObject object(env, class_location, method_locationCtor, "gps");
324
325 uint16_t flags = static_cast<uint32_t>(location.gnssLocationFlags);
326 if (flags & GnssLocationFlags::HAS_LAT_LONG) {
327 SET(Latitude, location.latitudeDegrees);
328 SET(Longitude, location.longitudeDegrees);
329 }
330 if (flags & GnssLocationFlags::HAS_ALTITUDE) {
331 SET(Altitude, location.altitudeMeters);
332 }
333 if (flags & GnssLocationFlags::HAS_SPEED) {
334 SET(Speed, location.speedMetersPerSec);
335 }
336 if (flags & GnssLocationFlags::HAS_BEARING) {
337 SET(Bearing, location.bearingDegrees);
338 }
339 if (flags & GnssLocationFlags::HAS_HORIZONTAL_ACCURACY) {
340 SET(Accuracy, location.horizontalAccuracyMeters);
341 }
342 if (flags & GnssLocationFlags::HAS_VERTICAL_ACCURACY) {
343 SET(VerticalAccuracyMeters, location.verticalAccuracyMeters);
344 }
345 if (flags & GnssLocationFlags::HAS_SPEED_ACCURACY) {
346 SET(SpeedAccuracyMetersPerSecond, location.speedAccuracyMetersPerSecond);
347 }
348 if (flags & GnssLocationFlags::HAS_BEARING_ACCURACY) {
349 SET(BearingAccuracyDegrees, location.bearingAccuracyDegrees);
350 }
351 SET(Time, location.timestamp);
352 SET(ElapsedRealtimeNanos, android::elapsedRealtimeNano());
353
354 return object.get();
355 }
356
translateGnssLocation(JNIEnv * env,const GnssLocation_V2_0 & location)357 static jobject translateGnssLocation(JNIEnv* env,
358 const GnssLocation_V2_0& location) {
359 JavaObject object(env, class_location, translateGnssLocation(env, location.v1_0));
360
361 const uint16_t flags = static_cast<uint16_t>(location.elapsedRealtime.flags);
362
363 // Overwrite ElapsedRealtimeNanos when available from HAL.
364 if (flags & ElapsedRealtimeFlags::HAS_TIMESTAMP_NS) {
365 SET(ElapsedRealtimeNanos, location.elapsedRealtime.timestampNs);
366 }
367
368 if (flags & ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS) {
369 SET(ElapsedRealtimeUncertaintyNanos, static_cast<double>(location.elapsedRealtime.timeUncertaintyNs));
370 }
371
372 return object.get();
373 }
374
createGnssLocation_V1_0(jint gnssLocationFlags,jdouble latitudeDegrees,jdouble longitudeDegrees,jdouble altitudeMeters,jfloat speedMetersPerSec,jfloat bearingDegrees,jfloat horizontalAccuracyMeters,jfloat verticalAccuracyMeters,jfloat speedAccuracyMetersPerSecond,jfloat bearingAccuracyDegrees,jlong timestamp)375 static GnssLocation_V1_0 createGnssLocation_V1_0(
376 jint gnssLocationFlags, jdouble latitudeDegrees, jdouble longitudeDegrees,
377 jdouble altitudeMeters, jfloat speedMetersPerSec, jfloat bearingDegrees,
378 jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
379 jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees,
380 jlong timestamp) {
381 GnssLocation_V1_0 location;
382 location.gnssLocationFlags = static_cast<uint16_t>(gnssLocationFlags);
383 location.latitudeDegrees = static_cast<double>(latitudeDegrees);
384 location.longitudeDegrees = static_cast<double>(longitudeDegrees);
385 location.altitudeMeters = static_cast<double>(altitudeMeters);
386 location.speedMetersPerSec = static_cast<float>(speedMetersPerSec);
387 location.bearingDegrees = static_cast<float>(bearingDegrees);
388 location.horizontalAccuracyMeters = static_cast<float>(horizontalAccuracyMeters);
389 location.verticalAccuracyMeters = static_cast<float>(verticalAccuracyMeters);
390 location.speedAccuracyMetersPerSecond = static_cast<float>(speedAccuracyMetersPerSecond);
391 location.bearingAccuracyDegrees = static_cast<float>(bearingAccuracyDegrees);
392 location.timestamp = static_cast<uint64_t>(timestamp);
393
394 return location;
395 }
396
createGnssLocation_V2_0(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)397 static GnssLocation_V2_0 createGnssLocation_V2_0(
398 jint gnssLocationFlags, jdouble latitudeDegrees, jdouble longitudeDegrees,
399 jdouble altitudeMeters, jfloat speedMetersPerSec, jfloat bearingDegrees,
400 jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
401 jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees,
402 jlong timestamp, jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
403 jdouble elapsedRealtimeUncertaintyNanos) {
404 GnssLocation_V2_0 location;
405 location.v1_0 = createGnssLocation_V1_0(
406 gnssLocationFlags, latitudeDegrees, longitudeDegrees, altitudeMeters,
407 speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters,
408 verticalAccuracyMeters, speedAccuracyMetersPerSecond,
409 bearingAccuracyDegrees, timestamp);
410
411 location.elapsedRealtime.flags = static_cast<uint16_t>(elapsedRealtimeFlags);
412 location.elapsedRealtime.timestampNs = static_cast<uint64_t>(elapsedRealtimeNanos);
413 location.elapsedRealtime.timeUncertaintyNs = static_cast<uint64_t>(elapsedRealtimeUncertaintyNanos);
414
415 return location;
416 }
417
418 /*
419 * GnssCallback class implements the callback methods for IGnss interface.
420 */
421 struct GnssCallback : public IGnssCallback_V2_1 {
422 Return<void> gnssLocationCb(const GnssLocation_V1_0& location) override;
423 Return<void> gnssStatusCb(const IGnssCallback_V1_0::GnssStatusValue status) override;
gnssSvStatusCbandroid::GnssCallback424 Return<void> gnssSvStatusCb(const IGnssCallback_V1_0::GnssSvStatus& svStatus) override {
425 return gnssSvStatusCbImpl(svStatus);
426 }
427 Return<void> gnssNmeaCb(int64_t timestamp, const android::hardware::hidl_string& nmea) override;
428 Return<void> gnssSetCapabilitesCb(uint32_t capabilities) override;
429 Return<void> gnssAcquireWakelockCb() override;
430 Return<void> gnssReleaseWakelockCb() override;
431 Return<void> gnssRequestTimeCb() override;
432 Return<void> gnssRequestLocationCb(const bool independentFromGnss) override;
433
434 Return<void> gnssSetSystemInfoCb(const IGnssCallback_V1_0::GnssSystemInfo& info) override;
435
436 // New in 1.1
437 Return<void> gnssNameCb(const android::hardware::hidl_string& name) override;
438
439 // New in 2.0
440 Return<void> gnssRequestLocationCb_2_0(const bool independentFromGnss, const bool isUserEmergency)
441 override;
442 Return<void> gnssSetCapabilitiesCb_2_0(uint32_t capabilities) override;
443 Return<void> gnssLocationCb_2_0(const GnssLocation_V2_0& location) override;
gnssSvStatusCb_2_0android::GnssCallback444 Return<void> gnssSvStatusCb_2_0(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList) override {
445 return gnssSvStatusCbImpl(svInfoList);
446 }
447
448 // New in 2.1
gnssSvStatusCb_2_1android::GnssCallback449 Return<void> gnssSvStatusCb_2_1(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList) override {
450 return gnssSvStatusCbImpl(svInfoList);
451 }
452 Return<void> gnssSetCapabilitiesCb_2_1(uint32_t capabilities) override;
453
454 // TODO: Reconsider allocation cost vs threadsafety on these statics
455 static const char* sNmeaString;
456 static size_t sNmeaStringLength;
457 private:
458 template<class T>
459 Return<void> gnssLocationCbImpl(const T& location);
460
461 template<class T>
462 Return<void> gnssSvStatusCbImpl(const T& svStatus);
463
464 template<class T>
getHasBasebandCn0DbHzFlagandroid::GnssCallback465 uint32_t getHasBasebandCn0DbHzFlag(const T& svStatus) {
466 return 0;
467 }
468
469 template<class T>
getBasebandCn0DbHzandroid::GnssCallback470 double getBasebandCn0DbHz(const T& svStatus, size_t i) {
471 return 0.0;
472 }
473
getGnssSvInfoListSizeandroid::GnssCallback474 uint32_t getGnssSvInfoListSize(const IGnssCallback_V1_0::GnssSvStatus& svStatus) {
475 return svStatus.numSvs;
476 }
477
getGnssSvInfoListSizeandroid::GnssCallback478 uint32_t getGnssSvInfoListSize(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList) {
479 return svInfoList.size();
480 }
481
getGnssSvInfoListSizeandroid::GnssCallback482 uint32_t getGnssSvInfoListSize(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList) {
483 return svInfoList.size();
484 }
485
getGnssSvInfoOfIndexandroid::GnssCallback486 const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex(
487 const IGnssCallback_V1_0::GnssSvStatus& svStatus, size_t i) {
488 return svStatus.gnssSvList.data()[i];
489 }
490
getGnssSvInfoOfIndexandroid::GnssCallback491 const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex(
492 const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList, size_t i) {
493 return svInfoList[i].v1_0;
494 }
495
getGnssSvInfoOfIndexandroid::GnssCallback496 const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex(
497 const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList, size_t i) {
498 return svInfoList[i].v2_0.v1_0;
499 }
500
getConstellationTypeandroid::GnssCallback501 uint32_t getConstellationType(const IGnssCallback_V1_0::GnssSvStatus& svStatus, size_t i) {
502 return static_cast<uint32_t>(svStatus.gnssSvList.data()[i].constellation);
503 }
504
getConstellationTypeandroid::GnssCallback505 uint32_t getConstellationType(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList, size_t i) {
506 return static_cast<uint32_t>(svInfoList[i].constellation);
507 }
508
getConstellationTypeandroid::GnssCallback509 uint32_t getConstellationType(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList, size_t i) {
510 return static_cast<uint32_t>(svInfoList[i].v2_0.constellation);
511 }
512 };
513
gnssNameCb(const android::hardware::hidl_string & name)514 Return<void> GnssCallback::gnssNameCb(const android::hardware::hidl_string& name) {
515 ALOGD("%s: name=%s\n", __func__, name.c_str());
516
517 JNIEnv* env = getJniEnv();
518 jstring jstringName = env->NewStringUTF(name.c_str());
519 env->CallVoidMethod(mCallbacksObj, method_setGnssHardwareModelName, jstringName);
520 if (jstringName) {
521 env->DeleteLocalRef(jstringName);
522 }
523 checkAndClearExceptionFromCallback(env, __FUNCTION__);
524
525 return Void();
526 }
527
528 const char* GnssCallback::sNmeaString = nullptr;
529 size_t GnssCallback::sNmeaStringLength = 0;
530
531 template<class T>
gnssLocationCbImpl(const T & location)532 Return<void> GnssCallback::gnssLocationCbImpl(const T& location) {
533 JNIEnv* env = getJniEnv();
534
535 jobject jLocation = translateGnssLocation(env, location);
536
537 env->CallVoidMethod(mCallbacksObj,
538 method_reportLocation,
539 boolToJbool(hasLatLong(location)),
540 jLocation);
541 checkAndClearExceptionFromCallback(env, __FUNCTION__);
542 env->DeleteLocalRef(jLocation);
543 return Void();
544 }
545
gnssLocationCb(const GnssLocation_V1_0 & location)546 Return<void> GnssCallback::gnssLocationCb(const GnssLocation_V1_0& location) {
547 return gnssLocationCbImpl<GnssLocation_V1_0>(location);
548 }
549
550 Return<void>
gnssLocationCb_2_0(const GnssLocation_V2_0 & location)551 GnssCallback::gnssLocationCb_2_0(const GnssLocation_V2_0& location) {
552 return gnssLocationCbImpl<GnssLocation_V2_0>(location);
553 }
554
gnssStatusCb(const IGnssCallback_V2_0::GnssStatusValue status)555 Return<void> GnssCallback::gnssStatusCb(const IGnssCallback_V2_0::GnssStatusValue status) {
556 JNIEnv* env = getJniEnv();
557 env->CallVoidMethod(mCallbacksObj, method_reportStatus, status);
558 checkAndClearExceptionFromCallback(env, __FUNCTION__);
559 return Void();
560 }
561
562 template<>
getHasBasebandCn0DbHzFlag(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo> & svStatus)563 uint32_t GnssCallback::getHasBasebandCn0DbHzFlag(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>&
564 svStatus) {
565 return SVID_FLAGS_HAS_BASEBAND_CN0;
566 }
567
568 template<>
getBasebandCn0DbHz(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo> & svInfoList,size_t i)569 double GnssCallback::getBasebandCn0DbHz(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList,
570 size_t i) {
571 return svInfoList[i].basebandCN0DbHz;
572 }
573
574 template<class T>
gnssSvStatusCbImpl(const T & svStatus)575 Return<void> GnssCallback::gnssSvStatusCbImpl(const T& svStatus) {
576 JNIEnv* env = getJniEnv();
577
578 uint32_t listSize = getGnssSvInfoListSize(svStatus);
579
580 jintArray svidWithFlagArray = env->NewIntArray(listSize);
581 jfloatArray cn0Array = env->NewFloatArray(listSize);
582 jfloatArray elevArray = env->NewFloatArray(listSize);
583 jfloatArray azimArray = env->NewFloatArray(listSize);
584 jfloatArray carrierFreqArray = env->NewFloatArray(listSize);
585 jfloatArray basebandCn0Array = env->NewFloatArray(listSize);
586
587 jint* svidWithFlags = env->GetIntArrayElements(svidWithFlagArray, 0);
588 jfloat* cn0s = env->GetFloatArrayElements(cn0Array, 0);
589 jfloat* elev = env->GetFloatArrayElements(elevArray, 0);
590 jfloat* azim = env->GetFloatArrayElements(azimArray, 0);
591 jfloat* carrierFreq = env->GetFloatArrayElements(carrierFreqArray, 0);
592 jfloat* basebandCn0s = env->GetFloatArrayElements(basebandCn0Array, 0);
593
594 /*
595 * Read GNSS SV info.
596 */
597 for (size_t i = 0; i < listSize; ++i) {
598 enum ShiftWidth: uint8_t {
599 SVID_SHIFT_WIDTH = 12,
600 CONSTELLATION_TYPE_SHIFT_WIDTH = 8
601 };
602
603 const IGnssCallback_V1_0::GnssSvInfo& info = getGnssSvInfoOfIndex(svStatus, i);
604 svidWithFlags[i] = (info.svid << SVID_SHIFT_WIDTH) |
605 (getConstellationType(svStatus, i) << CONSTELLATION_TYPE_SHIFT_WIDTH) |
606 static_cast<uint32_t>(info.svFlag);
607 cn0s[i] = info.cN0Dbhz;
608 elev[i] = info.elevationDegrees;
609 azim[i] = info.azimuthDegrees;
610 carrierFreq[i] = info.carrierFrequencyHz;
611 svidWithFlags[i] |= getHasBasebandCn0DbHzFlag(svStatus);
612 basebandCn0s[i] = getBasebandCn0DbHz(svStatus, i);
613 }
614
615 env->ReleaseIntArrayElements(svidWithFlagArray, svidWithFlags, 0);
616 env->ReleaseFloatArrayElements(cn0Array, cn0s, 0);
617 env->ReleaseFloatArrayElements(elevArray, elev, 0);
618 env->ReleaseFloatArrayElements(azimArray, azim, 0);
619 env->ReleaseFloatArrayElements(carrierFreqArray, carrierFreq, 0);
620 env->ReleaseFloatArrayElements(basebandCn0Array, basebandCn0s, 0);
621
622 env->CallVoidMethod(mCallbacksObj, method_reportSvStatus,
623 static_cast<jint>(listSize), svidWithFlagArray, cn0Array, elevArray, azimArray,
624 carrierFreqArray, basebandCn0Array);
625
626 env->DeleteLocalRef(svidWithFlagArray);
627 env->DeleteLocalRef(cn0Array);
628 env->DeleteLocalRef(elevArray);
629 env->DeleteLocalRef(azimArray);
630 env->DeleteLocalRef(carrierFreqArray);
631 env->DeleteLocalRef(basebandCn0Array);
632
633 checkAndClearExceptionFromCallback(env, __FUNCTION__);
634 return Void();
635 }
636
gnssNmeaCb(int64_t timestamp,const::android::hardware::hidl_string & nmea)637 Return<void> GnssCallback::gnssNmeaCb(
638 int64_t timestamp, const ::android::hardware::hidl_string& nmea) {
639 JNIEnv* env = getJniEnv();
640 /*
641 * The Java code will call back to read these values.
642 * We do this to avoid creating unnecessary String objects.
643 */
644 sNmeaString = nmea.c_str();
645 sNmeaStringLength = nmea.size();
646
647 env->CallVoidMethod(mCallbacksObj, method_reportNmea, timestamp);
648 checkAndClearExceptionFromCallback(env, __FUNCTION__);
649 return Void();
650 }
651
gnssSetCapabilitesCb(uint32_t capabilities)652 Return<void> GnssCallback::gnssSetCapabilitesCb(uint32_t capabilities) {
653 ALOGD("%s: %du\n", __func__, capabilities);
654
655 JNIEnv* env = getJniEnv();
656 env->CallVoidMethod(mCallbacksObj, method_setTopHalCapabilities, capabilities);
657 checkAndClearExceptionFromCallback(env, __FUNCTION__);
658 return Void();
659 }
660
gnssSetCapabilitiesCb_2_0(uint32_t capabilities)661 Return<void> GnssCallback::gnssSetCapabilitiesCb_2_0(uint32_t capabilities) {
662 return GnssCallback::gnssSetCapabilitesCb(capabilities);
663 }
664
gnssSetCapabilitiesCb_2_1(uint32_t capabilities)665 Return<void> GnssCallback::gnssSetCapabilitiesCb_2_1(uint32_t capabilities) {
666 return GnssCallback::gnssSetCapabilitesCb(capabilities);
667 }
668
gnssAcquireWakelockCb()669 Return<void> GnssCallback::gnssAcquireWakelockCb() {
670 acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_NAME);
671 return Void();
672 }
673
gnssReleaseWakelockCb()674 Return<void> GnssCallback::gnssReleaseWakelockCb() {
675 release_wake_lock(WAKE_LOCK_NAME);
676 return Void();
677 }
678
gnssRequestTimeCb()679 Return<void> GnssCallback::gnssRequestTimeCb() {
680 JNIEnv* env = getJniEnv();
681 env->CallVoidMethod(mCallbacksObj, method_requestUtcTime);
682 checkAndClearExceptionFromCallback(env, __FUNCTION__);
683 return Void();
684 }
685
gnssRequestLocationCb(const bool independentFromGnss)686 Return<void> GnssCallback::gnssRequestLocationCb(const bool independentFromGnss) {
687 return GnssCallback::gnssRequestLocationCb_2_0(independentFromGnss, /* isUserEmergency= */
688 false);
689 }
690
gnssRequestLocationCb_2_0(const bool independentFromGnss,const bool isUserEmergency)691 Return<void> GnssCallback::gnssRequestLocationCb_2_0(const bool independentFromGnss, const bool
692 isUserEmergency) {
693 JNIEnv* env = getJniEnv();
694 env->CallVoidMethod(mCallbacksObj, method_requestLocation, boolToJbool(independentFromGnss),
695 boolToJbool(isUserEmergency));
696 checkAndClearExceptionFromCallback(env, __FUNCTION__);
697 return Void();
698 }
699
gnssSetSystemInfoCb(const IGnssCallback_V2_0::GnssSystemInfo & info)700 Return<void> GnssCallback::gnssSetSystemInfoCb(const IGnssCallback_V2_0::GnssSystemInfo& info) {
701 ALOGD("%s: yearOfHw=%d\n", __func__, info.yearOfHw);
702
703 JNIEnv* env = getJniEnv();
704 env->CallVoidMethod(mCallbacksObj, method_setGnssYearOfHardware,
705 info.yearOfHw);
706 checkAndClearExceptionFromCallback(env, __FUNCTION__);
707 return Void();
708 }
709
710 class GnssCallbackAidl : public android::hardware::gnss::BnGnssCallback {
711 public:
712 Status gnssSetCapabilitiesCb(const int capabilities) override;
713 };
714
gnssSetCapabilitiesCb(const int capabilities)715 Status GnssCallbackAidl::gnssSetCapabilitiesCb(const int capabilities) {
716 ALOGD("GnssCallbackAidl::%s: %du\n", __func__, capabilities);
717 JNIEnv* env = getJniEnv();
718 env->CallVoidMethod(mCallbacksObj, method_setTopHalCapabilities, capabilities);
719 checkAndClearExceptionFromCallback(env, __FUNCTION__);
720 return Status::ok();
721 }
722
723 /*
724 * GnssPowerIndicationCallback class implements the callback methods for the IGnssPowerIndication
725 * interface.
726 */
727 struct GnssPowerIndicationCallback : public android::hardware::gnss::BnGnssPowerIndicationCallback {
728 public:
729 Status setCapabilitiesCb(const int capabilities) override;
730 Status gnssPowerStatsCb(const GnssPowerStats& data) override;
731 };
732
setCapabilitiesCb(const int capabilities)733 Status GnssPowerIndicationCallback::setCapabilitiesCb(const int capabilities) {
734 ALOGD("GnssPowerIndicationCallback::%s: %du\n", __func__, capabilities);
735 JNIEnv* env = getJniEnv();
736 env->CallVoidMethod(mCallbacksObj, method_setSubHalPowerIndicationCapabilities, capabilities);
737 checkAndClearExceptionFromCallback(env, __FUNCTION__);
738 return Status::ok();
739 }
740
gnssPowerStatsCb(const GnssPowerStats & data)741 Status GnssPowerIndicationCallback::gnssPowerStatsCb(const GnssPowerStats& data) {
742 JNIEnv* env = getJniEnv();
743
744 int size = data.otherModesEnergyMilliJoule.size();
745 jdoubleArray otherModesEnergy = env->NewDoubleArray(size);
746 if (size > 0) {
747 env->SetDoubleArrayRegion(otherModesEnergy, (jsize)0, size,
748 &(data.otherModesEnergyMilliJoule[0]));
749 }
750 jobject gnssPowerStats =
751 env->NewObject(class_gnssPowerStats, method_gnssPowerStatsCtor,
752 data.elapsedRealtime.flags, data.elapsedRealtime.timestampNs,
753 data.elapsedRealtime.timeUncertaintyNs, data.totalEnergyMilliJoule,
754 data.singlebandTrackingModeEnergyMilliJoule,
755 data.multibandTrackingModeEnergyMilliJoule,
756 data.singlebandAcquisitionModeEnergyMilliJoule,
757 data.multibandAcquisitionModeEnergyMilliJoule, otherModesEnergy);
758
759 env->CallVoidMethod(mCallbacksObj, method_reportGnssPowerStats, gnssPowerStats);
760
761 checkAndClearExceptionFromCallback(env, __FUNCTION__);
762 env->DeleteLocalRef(gnssPowerStats);
763 env->DeleteLocalRef(otherModesEnergy);
764 return Status::ok();
765 }
766
767 /*
768 * GnssPsdsCallback class implements the callback methods for the IGnssPsds
769 * interface.
770 */
771 struct GnssPsdsCallbackAidl : public android::hardware::gnss::BnGnssPsdsCallback {
downloadRequestCbandroid::GnssPsdsCallbackAidl772 Status downloadRequestCb(PsdsType psdsType) override {
773 ALOGD("%s. psdsType: %d", __func__, static_cast<int32_t>(psdsType));
774 JNIEnv* env = getJniEnv();
775 env->CallVoidMethod(mCallbacksObj, method_psdsDownloadRequest, psdsType);
776 checkAndClearExceptionFromCallback(env, __FUNCTION__);
777 return Status::ok();
778 }
779 };
780
781 /**
782 * GnssXtraCallback class implements the callback methods for the IGnssXtra
783 * interface.
784 */
785 class GnssXtraCallback : public IGnssXtraCallback {
786 Return<void> downloadRequestCb() override;
787 };
788
downloadRequestCb()789 Return<void> GnssXtraCallback::downloadRequestCb() {
790 JNIEnv* env = getJniEnv();
791 env->CallVoidMethod(mCallbacksObj, method_psdsDownloadRequest, /* psdsType= */ 1);
792 checkAndClearExceptionFromCallback(env, __FUNCTION__);
793 return Void();
794 }
795
796 /*
797 * GnssGeofenceCallback class implements the callback methods for the
798 * IGnssGeofence interface.
799 */
800 struct GnssGeofenceCallback : public IGnssGeofenceCallback {
801 // Methods from ::android::hardware::gps::V1_0::IGnssGeofenceCallback follow.
802 Return<void> gnssGeofenceTransitionCb(
803 int32_t geofenceId,
804 const GnssLocation_V1_0& location,
805 GeofenceTransition transition,
806 hardware::gnss::V1_0::GnssUtcTime timestamp) override;
807 Return<void>
808 gnssGeofenceStatusCb(
809 GeofenceAvailability status,
810 const GnssLocation_V1_0& location) override;
811 Return<void> gnssGeofenceAddCb(int32_t geofenceId,
812 GeofenceStatus status) override;
813 Return<void> gnssGeofenceRemoveCb(int32_t geofenceId,
814 GeofenceStatus status) override;
815 Return<void> gnssGeofencePauseCb(int32_t geofenceId,
816 GeofenceStatus status) override;
817 Return<void> gnssGeofenceResumeCb(int32_t geofenceId,
818 GeofenceStatus status) override;
819 };
820
gnssGeofenceTransitionCb(int32_t geofenceId,const GnssLocation_V1_0 & location,GeofenceTransition transition,hardware::gnss::V1_0::GnssUtcTime timestamp)821 Return<void> GnssGeofenceCallback::gnssGeofenceTransitionCb(
822 int32_t geofenceId, const GnssLocation_V1_0& location,
823 GeofenceTransition transition,
824 hardware::gnss::V1_0::GnssUtcTime timestamp) {
825 JNIEnv* env = getJniEnv();
826
827 jobject jLocation = translateGnssLocation(env, location);
828
829 env->CallVoidMethod(mCallbacksObj,
830 method_reportGeofenceTransition,
831 geofenceId,
832 jLocation,
833 transition,
834 timestamp);
835
836 checkAndClearExceptionFromCallback(env, __FUNCTION__);
837 env->DeleteLocalRef(jLocation);
838 return Void();
839 }
840
841 Return<void>
gnssGeofenceStatusCb(GeofenceAvailability status,const GnssLocation_V1_0 & location)842 GnssGeofenceCallback::gnssGeofenceStatusCb(GeofenceAvailability status,
843 const GnssLocation_V1_0& location) {
844 JNIEnv* env = getJniEnv();
845
846 jobject jLocation = translateGnssLocation(env, location);
847
848 env->CallVoidMethod(mCallbacksObj, method_reportGeofenceStatus, status,
849 jLocation);
850 checkAndClearExceptionFromCallback(env, __FUNCTION__);
851 env->DeleteLocalRef(jLocation);
852 return Void();
853 }
854
gnssGeofenceAddCb(int32_t geofenceId,GeofenceStatus status)855 Return<void> GnssGeofenceCallback::gnssGeofenceAddCb(int32_t geofenceId,
856 GeofenceStatus status) {
857 JNIEnv* env = getJniEnv();
858 if (status != IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS) {
859 ALOGE("%s: Error in adding a Geofence: %d\n", __func__, status);
860 }
861
862 env->CallVoidMethod(mCallbacksObj,
863 method_reportGeofenceAddStatus,
864 geofenceId,
865 status);
866 checkAndClearExceptionFromCallback(env, __FUNCTION__);
867 return Void();
868 }
869
gnssGeofenceRemoveCb(int32_t geofenceId,GeofenceStatus status)870 Return<void> GnssGeofenceCallback::gnssGeofenceRemoveCb(int32_t geofenceId,
871 GeofenceStatus status) {
872 JNIEnv* env = getJniEnv();
873 if (status != IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS) {
874 ALOGE("%s: Error in removing a Geofence: %d\n", __func__, status);
875 }
876
877 env->CallVoidMethod(mCallbacksObj,
878 method_reportGeofenceRemoveStatus,
879 geofenceId, status);
880 checkAndClearExceptionFromCallback(env, __FUNCTION__);
881 return Void();
882 }
883
gnssGeofencePauseCb(int32_t geofenceId,GeofenceStatus status)884 Return<void> GnssGeofenceCallback::gnssGeofencePauseCb(int32_t geofenceId,
885 GeofenceStatus status) {
886 JNIEnv* env = getJniEnv();
887 if (status != IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS) {
888 ALOGE("%s: Error in pausing Geofence: %d\n", __func__, status);
889 }
890
891 env->CallVoidMethod(mCallbacksObj,
892 method_reportGeofencePauseStatus,
893 geofenceId, status);
894 checkAndClearExceptionFromCallback(env, __FUNCTION__);
895 return Void();
896 }
897
gnssGeofenceResumeCb(int32_t geofenceId,GeofenceStatus status)898 Return<void> GnssGeofenceCallback::gnssGeofenceResumeCb(int32_t geofenceId,
899 GeofenceStatus status) {
900 JNIEnv* env = getJniEnv();
901 if (status != IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS) {
902 ALOGE("%s: Error in resuming Geofence: %d\n", __func__, status);
903 }
904
905 env->CallVoidMethod(mCallbacksObj,
906 method_reportGeofenceResumeStatus,
907 geofenceId, status);
908 checkAndClearExceptionFromCallback(env, __FUNCTION__);
909 return Void();
910 }
911
912 /*
913 * GnssNavigationMessageCallback interface implements the callback methods
914 * required by the IGnssNavigationMessage interface.
915 */
916 struct GnssNavigationMessageCallback : public IGnssNavigationMessageCallback {
917 /*
918 * Methods from ::android::hardware::gps::V1_0::IGnssNavigationMessageCallback
919 * follow.
920 */
921 Return<void> gnssNavigationMessageCb(
922 const IGnssNavigationMessageCallback::GnssNavigationMessage& message) override;
923 };
924
gnssNavigationMessageCb(const IGnssNavigationMessageCallback::GnssNavigationMessage & message)925 Return<void> GnssNavigationMessageCallback::gnssNavigationMessageCb(
926 const IGnssNavigationMessageCallback::GnssNavigationMessage& message) {
927 JNIEnv* env = getJniEnv();
928
929 size_t dataLength = message.data.size();
930
931 std::vector<uint8_t> navigationData = message.data;
932 uint8_t* data = &(navigationData[0]);
933 if (dataLength == 0 || data == nullptr) {
934 ALOGE("Invalid Navigation Message found: data=%p, length=%zd", data,
935 dataLength);
936 return Void();
937 }
938
939 JavaObject object(env, class_gnssNavigationMessage, method_gnssNavigationMessageCtor);
940 SET(Type, static_cast<int32_t>(message.type));
941 SET(Svid, static_cast<int32_t>(message.svid));
942 SET(MessageId, static_cast<int32_t>(message.messageId));
943 SET(SubmessageId, static_cast<int32_t>(message.submessageId));
944 object.callSetter("setData", data, dataLength);
945 SET(Status, static_cast<int32_t>(message.status));
946
947 jobject navigationMessage = object.get();
948 env->CallVoidMethod(mCallbacksObj,
949 method_reportNavigationMessages,
950 navigationMessage);
951 checkAndClearExceptionFromCallback(env, __FUNCTION__);
952 env->DeleteLocalRef(navigationMessage);
953 return Void();
954 }
955
956 /*
957 * GnssAntennaInfoCallback implements the callback methods required for the
958 * GnssAntennaInfo interface.
959 */
960 struct GnssAntennaInfoCallback : public IGnssAntennaInfoCallback {
961 // Methods from V2_1::GnssAntennaInfoCallback follow.
962 Return<void> gnssAntennaInfoCb(
963 const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos);
964
965 private:
966 jobject translateAllGnssAntennaInfos(
967 JNIEnv* env,
968 const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos);
969 jobject translateSingleGnssAntennaInfo(
970 JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo);
971 jobject translatePhaseCenterOffset(
972 JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo);
973 jobject translatePhaseCenterVariationCorrections(
974 JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo);
975 jobject translateSignalGainCorrections(
976 JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo);
977 jobjectArray translate2dDoubleArray(JNIEnv* env,
978 const hidl_vec<IGnssAntennaInfoCallback::Row>& array);
979 void translateAndReportGnssAntennaInfo(
980 const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos);
981 void reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray);
982 };
983
gnssAntennaInfoCb(const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo> & gnssAntennaInfos)984 Return<void> GnssAntennaInfoCallback::gnssAntennaInfoCb(
985 const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) {
986 translateAndReportGnssAntennaInfo(gnssAntennaInfos);
987 return Void();
988 }
989
translate2dDoubleArray(JNIEnv * env,const hidl_vec<IGnssAntennaInfoCallback::Row> & array)990 jobjectArray GnssAntennaInfoCallback::translate2dDoubleArray(
991 JNIEnv* env, const hidl_vec<IGnssAntennaInfoCallback::Row>& array) {
992 jsize numRows = array.size();
993 if (numRows == 0) {
994 // Empty array
995 return NULL;
996 }
997 jsize numCols = array[0].row.size();
998 if (numCols <= 1) {
999 // phi angle separation is computed as 180.0 / (numColumns - 1), so can't be < 2.
1000 return NULL;
1001 }
1002
1003 // Allocate array of double arrays
1004 jobjectArray returnArray = env->NewObjectArray(numRows, class_doubleArray, NULL);
1005
1006 // Create each double array
1007 for (uint8_t i = 0; i < numRows; i++) {
1008 jdoubleArray doubleArray = env->NewDoubleArray(numCols);
1009 env->SetDoubleArrayRegion(doubleArray, (jsize)0, numCols, array[i].row.data());
1010 env->SetObjectArrayElement(returnArray, (jsize)i, doubleArray);
1011 env->DeleteLocalRef(doubleArray);
1012 }
1013 return returnArray;
1014 }
1015
translateAllGnssAntennaInfos(JNIEnv * env,const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo> & gnssAntennaInfos)1016 jobject GnssAntennaInfoCallback::translateAllGnssAntennaInfos(
1017 JNIEnv* env, const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) {
1018 jobject arrayList = env->NewObject(class_arrayList,
1019 method_arrayListCtor); // Create new ArrayList instance
1020
1021 for (auto gnssAntennaInfo : gnssAntennaInfos) {
1022 jobject gnssAntennaInfoObject = translateSingleGnssAntennaInfo(env, gnssAntennaInfo);
1023
1024 env->CallBooleanMethod(arrayList, method_arrayListAdd,
1025 gnssAntennaInfoObject); // Add the antennaInfo to the ArrayList
1026
1027 // Delete Local Refs
1028 env->DeleteLocalRef(gnssAntennaInfoObject);
1029 }
1030 return arrayList;
1031 }
1032
translatePhaseCenterOffset(JNIEnv * env,const IGnssAntennaInfoCallback::GnssAntennaInfo & gnssAntennaInfo)1033 jobject GnssAntennaInfoCallback::translatePhaseCenterOffset(
1034 JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
1035 jobject phaseCenterOffset =
1036 env->NewObject(class_phaseCenterOffset, method_phaseCenterOffsetCtor,
1037 gnssAntennaInfo.phaseCenterOffsetCoordinateMillimeters.x,
1038 gnssAntennaInfo.phaseCenterOffsetCoordinateMillimeters.xUncertainty,
1039 gnssAntennaInfo.phaseCenterOffsetCoordinateMillimeters.y,
1040 gnssAntennaInfo.phaseCenterOffsetCoordinateMillimeters.yUncertainty,
1041 gnssAntennaInfo.phaseCenterOffsetCoordinateMillimeters.z,
1042 gnssAntennaInfo.phaseCenterOffsetCoordinateMillimeters.zUncertainty);
1043
1044 return phaseCenterOffset;
1045 }
1046
translatePhaseCenterVariationCorrections(JNIEnv * env,const IGnssAntennaInfoCallback::GnssAntennaInfo & gnssAntennaInfo)1047 jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections(
1048 JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
1049 if (gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters == NULL ||
1050 gnssAntennaInfo.phaseCenterVariationCorrectionUncertaintyMillimeters == NULL) {
1051 return NULL;
1052 }
1053
1054 jobjectArray phaseCenterVariationCorrectionsArray =
1055 translate2dDoubleArray(env, gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters);
1056 jobjectArray phaseCenterVariationCorrectionsUncertaintiesArray =
1057 translate2dDoubleArray(env,
1058 gnssAntennaInfo
1059 .phaseCenterVariationCorrectionUncertaintyMillimeters);
1060
1061 if (phaseCenterVariationCorrectionsArray == NULL ||
1062 phaseCenterVariationCorrectionsUncertaintiesArray == NULL) {
1063 return NULL;
1064 }
1065
1066 jobject phaseCenterVariationCorrections =
1067 env->NewObject(class_sphericalCorrections, method_sphericalCorrectionsCtor,
1068 phaseCenterVariationCorrectionsArray,
1069 phaseCenterVariationCorrectionsUncertaintiesArray);
1070
1071 env->DeleteLocalRef(phaseCenterVariationCorrectionsArray);
1072 env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray);
1073
1074 return phaseCenterVariationCorrections;
1075 }
1076
translateSignalGainCorrections(JNIEnv * env,const IGnssAntennaInfoCallback::GnssAntennaInfo & gnssAntennaInfo)1077 jobject GnssAntennaInfoCallback::translateSignalGainCorrections(
1078 JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
1079 if (gnssAntennaInfo.signalGainCorrectionDbi == NULL ||
1080 gnssAntennaInfo.signalGainCorrectionUncertaintyDbi == NULL) {
1081 return NULL;
1082 }
1083 jobjectArray signalGainCorrectionsArray =
1084 translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionDbi);
1085 jobjectArray signalGainCorrectionsUncertaintiesArray =
1086 translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionUncertaintyDbi);
1087
1088 if (signalGainCorrectionsArray == NULL || signalGainCorrectionsUncertaintiesArray == NULL) {
1089 return NULL;
1090 }
1091
1092 jobject signalGainCorrections =
1093 env->NewObject(class_sphericalCorrections, method_sphericalCorrectionsCtor,
1094 signalGainCorrectionsArray, signalGainCorrectionsUncertaintiesArray);
1095
1096 env->DeleteLocalRef(signalGainCorrectionsArray);
1097 env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray);
1098
1099 return signalGainCorrections;
1100 }
1101
translateSingleGnssAntennaInfo(JNIEnv * env,const IGnssAntennaInfoCallback::GnssAntennaInfo & gnssAntennaInfo)1102 jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo(
1103 JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
1104 jobject phaseCenterOffset = translatePhaseCenterOffset(env, gnssAntennaInfo);
1105
1106 // Nullable
1107 jobject phaseCenterVariationCorrections =
1108 translatePhaseCenterVariationCorrections(env, gnssAntennaInfo);
1109
1110 // Nullable
1111 jobject signalGainCorrections = translateSignalGainCorrections(env, gnssAntennaInfo);
1112
1113 // Get builder
1114 jobject gnssAntennaInfoBuilderObject =
1115 env->NewObject(class_gnssAntennaInfoBuilder, method_gnssAntennaInfoBuilderCtor);
1116
1117 // Set fields
1118 env->CallObjectMethod(gnssAntennaInfoBuilderObject,
1119 method_gnssAntennaInfoBuilderSetCarrierFrequencyMHz,
1120 gnssAntennaInfo.carrierFrequencyMHz);
1121 env->CallObjectMethod(gnssAntennaInfoBuilderObject,
1122 method_gnssAntennaInfoBuilderSetPhaseCenterOffset, phaseCenterOffset);
1123 env->CallObjectMethod(gnssAntennaInfoBuilderObject,
1124 method_gnssAntennaInfoBuilderSetPhaseCenterVariationCorrections,
1125 phaseCenterVariationCorrections);
1126 env->CallObjectMethod(gnssAntennaInfoBuilderObject,
1127 method_gnssAntennaInfoBuilderSetSignalGainCorrections,
1128 signalGainCorrections);
1129
1130 // build
1131 jobject gnssAntennaInfoObject =
1132 env->CallObjectMethod(gnssAntennaInfoBuilderObject, method_gnssAntennaInfoBuilderBuild);
1133
1134 // Delete Local Refs
1135 env->DeleteLocalRef(phaseCenterOffset);
1136 env->DeleteLocalRef(phaseCenterVariationCorrections);
1137 env->DeleteLocalRef(signalGainCorrections);
1138
1139 return gnssAntennaInfoObject;
1140 }
1141
translateAndReportGnssAntennaInfo(const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo> & gnssAntennaInfos)1142 void GnssAntennaInfoCallback::translateAndReportGnssAntennaInfo(
1143 const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) {
1144 JNIEnv* env = getJniEnv();
1145
1146 jobject arrayList = translateAllGnssAntennaInfos(env, gnssAntennaInfos);
1147
1148 reportAntennaInfo(env, arrayList);
1149
1150 env->DeleteLocalRef(arrayList);
1151 }
1152
reportAntennaInfo(JNIEnv * env,const jobject antennaInfosArray)1153 void GnssAntennaInfoCallback::reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray) {
1154 env->CallVoidMethod(mCallbacksObj, method_reportAntennaInfo, antennaInfosArray);
1155 checkAndClearExceptionFromCallback(env, __FUNCTION__);
1156 }
1157
1158 /*
1159 * MeasurementCorrectionsCallback implements callback methods of interface
1160 * IMeasurementCorrectionsCallback.hal.
1161 */
1162 struct MeasurementCorrectionsCallback : public IMeasurementCorrectionsCallback {
1163 Return<void> setCapabilitiesCb(uint32_t capabilities) override;
1164 };
1165
setCapabilitiesCb(uint32_t capabilities)1166 Return<void> MeasurementCorrectionsCallback::setCapabilitiesCb(uint32_t capabilities) {
1167 ALOGD("%s: %du\n", __func__, capabilities);
1168 JNIEnv* env = getJniEnv();
1169 env->CallVoidMethod(mCallbacksObj, method_setSubHalMeasurementCorrectionsCapabilities,
1170 capabilities);
1171 checkAndClearExceptionFromCallback(env, __FUNCTION__);
1172 return Void();
1173 }
1174
1175 /*
1176 * GnssNiCallback implements callback methods required by the IGnssNi interface.
1177 */
1178 struct GnssNiCallback : public IGnssNiCallback {
1179 Return<void> niNotifyCb(const IGnssNiCallback::GnssNiNotification& notification)
1180 override;
1181 };
1182
niNotifyCb(const IGnssNiCallback::GnssNiNotification & notification)1183 Return<void> GnssNiCallback::niNotifyCb(
1184 const IGnssNiCallback::GnssNiNotification& notification) {
1185 JNIEnv* env = getJniEnv();
1186 jstring requestorId = env->NewStringUTF(notification.requestorId.c_str());
1187 jstring text = env->NewStringUTF(notification.notificationMessage.c_str());
1188
1189 if (requestorId && text) {
1190 env->CallVoidMethod(mCallbacksObj, method_reportNiNotification,
1191 notification.notificationId, notification.niType,
1192 notification.notifyFlags, notification.timeoutSec,
1193 notification.defaultResponse, requestorId, text,
1194 notification.requestorIdEncoding,
1195 notification.notificationIdEncoding);
1196 } else {
1197 ALOGE("%s: OOM Error\n", __func__);
1198 }
1199
1200 if (requestorId) {
1201 env->DeleteLocalRef(requestorId);
1202 }
1203
1204 if (text) {
1205 env->DeleteLocalRef(text);
1206 }
1207 checkAndClearExceptionFromCallback(env, __FUNCTION__);
1208 return Void();
1209 }
1210
1211 /*
1212 * GnssVisibilityControlCallback implements callback methods of IGnssVisibilityControlCallback.hal.
1213 */
1214 struct GnssVisibilityControlCallback : public IGnssVisibilityControlCallback {
1215 Return<void> nfwNotifyCb(const IGnssVisibilityControlCallback::NfwNotification& notification)
1216 override;
1217 Return<bool> isInEmergencySession() override;
1218 };
1219
nfwNotifyCb(const IGnssVisibilityControlCallback::NfwNotification & notification)1220 Return<void> GnssVisibilityControlCallback::nfwNotifyCb(
1221 const IGnssVisibilityControlCallback::NfwNotification& notification) {
1222 JNIEnv* env = getJniEnv();
1223 jstring proxyAppPackageName = env->NewStringUTF(notification.proxyAppPackageName.c_str());
1224 jstring otherProtocolStackName = env->NewStringUTF(notification.otherProtocolStackName.c_str());
1225 jstring requestorId = env->NewStringUTF(notification.requestorId.c_str());
1226
1227 if (proxyAppPackageName && otherProtocolStackName && requestorId) {
1228 env->CallVoidMethod(mCallbacksObj, method_reportNfwNotification, proxyAppPackageName,
1229 notification.protocolStack, otherProtocolStackName,
1230 notification.requestor, requestorId, notification.responseType,
1231 notification.inEmergencyMode, notification.isCachedLocation);
1232 } else {
1233 ALOGE("%s: OOM Error\n", __func__);
1234 }
1235
1236 if (requestorId) {
1237 env->DeleteLocalRef(requestorId);
1238 }
1239
1240 if (otherProtocolStackName) {
1241 env->DeleteLocalRef(otherProtocolStackName);
1242 }
1243
1244 if (proxyAppPackageName) {
1245 env->DeleteLocalRef(proxyAppPackageName);
1246 }
1247
1248 checkAndClearExceptionFromCallback(env, __FUNCTION__);
1249 return Void();
1250 }
1251
isInEmergencySession()1252 Return<bool> GnssVisibilityControlCallback::isInEmergencySession() {
1253 JNIEnv* env = getJniEnv();
1254 auto result = env->CallBooleanMethod(mCallbacksObj, method_isInEmergencySession);
1255 checkAndClearExceptionFromCallback(env, __FUNCTION__);
1256 return result;
1257 }
1258
1259 /*
1260 * AGnssCallback_V1_0 implements callback methods required by the IAGnssCallback 1.0 interface.
1261 */
1262 struct AGnssCallback_V1_0 : public IAGnssCallback_V1_0 {
1263 // Methods from ::android::hardware::gps::V1_0::IAGnssCallback follow.
1264 Return<void> agnssStatusIpV6Cb(
1265 const IAGnssCallback_V1_0::AGnssStatusIpV6& agps_status) override;
1266
1267 Return<void> agnssStatusIpV4Cb(
1268 const IAGnssCallback_V1_0::AGnssStatusIpV4& agps_status) override;
1269 private:
1270 jbyteArray convertToIpV4(uint32_t ip);
1271 };
1272
agnssStatusIpV6Cb(const IAGnssCallback_V1_0::AGnssStatusIpV6 & agps_status)1273 Return<void> AGnssCallback_V1_0::agnssStatusIpV6Cb(
1274 const IAGnssCallback_V1_0::AGnssStatusIpV6& agps_status) {
1275 JNIEnv* env = getJniEnv();
1276 jbyteArray byteArray = nullptr;
1277
1278 byteArray = env->NewByteArray(16);
1279 if (byteArray != nullptr) {
1280 env->SetByteArrayRegion(byteArray, 0, 16,
1281 (const jbyte*)(agps_status.ipV6Addr.data()));
1282 } else {
1283 ALOGE("Unable to allocate byte array for IPv6 address.");
1284 }
1285
1286 IF_ALOGD() {
1287 // log the IP for reference in case there is a bogus value pushed by HAL
1288 char str[INET6_ADDRSTRLEN];
1289 inet_ntop(AF_INET6, agps_status.ipV6Addr.data(), str, INET6_ADDRSTRLEN);
1290 ALOGD("AGPS IP is v6: %s", str);
1291 }
1292
1293 jsize byteArrayLength = byteArray != nullptr ? env->GetArrayLength(byteArray) : 0;
1294 ALOGV("Passing AGPS IP addr: size %d", byteArrayLength);
1295 env->CallVoidMethod(mCallbacksObj, method_reportAGpsStatus,
1296 agps_status.type, agps_status.status, byteArray);
1297
1298 checkAndClearExceptionFromCallback(env, __FUNCTION__);
1299
1300 if (byteArray) {
1301 env->DeleteLocalRef(byteArray);
1302 }
1303
1304 return Void();
1305 }
1306
agnssStatusIpV4Cb(const IAGnssCallback_V1_0::AGnssStatusIpV4 & agps_status)1307 Return<void> AGnssCallback_V1_0::agnssStatusIpV4Cb(
1308 const IAGnssCallback_V1_0::AGnssStatusIpV4& agps_status) {
1309 JNIEnv* env = getJniEnv();
1310 jbyteArray byteArray = nullptr;
1311
1312 uint32_t ipAddr = agps_status.ipV4Addr;
1313 byteArray = convertToIpV4(ipAddr);
1314
1315 IF_ALOGD() {
1316 /*
1317 * log the IP for reference in case there is a bogus value pushed by
1318 * HAL.
1319 */
1320 char str[INET_ADDRSTRLEN];
1321 inet_ntop(AF_INET, &ipAddr, str, INET_ADDRSTRLEN);
1322 ALOGD("AGPS IP is v4: %s", str);
1323 }
1324
1325 jsize byteArrayLength =
1326 byteArray != nullptr ? env->GetArrayLength(byteArray) : 0;
1327 ALOGV("Passing AGPS IP addr: size %d", byteArrayLength);
1328 env->CallVoidMethod(mCallbacksObj, method_reportAGpsStatus,
1329 agps_status.type, agps_status.status, byteArray);
1330
1331 checkAndClearExceptionFromCallback(env, __FUNCTION__);
1332
1333 if (byteArray) {
1334 env->DeleteLocalRef(byteArray);
1335 }
1336 return Void();
1337 }
1338
convertToIpV4(uint32_t ip)1339 jbyteArray AGnssCallback_V1_0::convertToIpV4(uint32_t ip) {
1340 if (INADDR_NONE == ip) {
1341 return nullptr;
1342 }
1343
1344 JNIEnv* env = getJniEnv();
1345 jbyteArray byteArray = env->NewByteArray(4);
1346 if (byteArray == nullptr) {
1347 ALOGE("Unable to allocate byte array for IPv4 address");
1348 return nullptr;
1349 }
1350
1351 jbyte ipv4[4];
1352 ALOGV("Converting IPv4 address byte array (net_order) %x", ip);
1353 memcpy(ipv4, &ip, sizeof(ipv4));
1354 env->SetByteArrayRegion(byteArray, 0, 4, (const jbyte*)ipv4);
1355 return byteArray;
1356 }
1357
1358 /*
1359 * AGnssCallback_V2_0 implements callback methods required by the IAGnssCallback 2.0 interface.
1360 */
1361 struct AGnssCallback_V2_0 : public IAGnssCallback_V2_0 {
1362 // Methods from ::android::hardware::gps::V2_0::IAGnssCallback follow.
1363 Return<void> agnssStatusCb(IAGnssCallback_V2_0::AGnssType type,
1364 IAGnssCallback_V2_0::AGnssStatusValue status) override;
1365 };
1366
agnssStatusCb(IAGnssCallback_V2_0::AGnssType type,IAGnssCallback_V2_0::AGnssStatusValue status)1367 Return<void> AGnssCallback_V2_0::agnssStatusCb(IAGnssCallback_V2_0::AGnssType type,
1368 IAGnssCallback_V2_0::AGnssStatusValue status) {
1369 JNIEnv* env = getJniEnv();
1370 env->CallVoidMethod(mCallbacksObj, method_reportAGpsStatus, type, status, nullptr);
1371 checkAndClearExceptionFromCallback(env, __FUNCTION__);
1372 return Void();
1373 }
1374
1375 /*
1376 * AGnssRilCallback implements the callback methods required by the AGnssRil
1377 * interface.
1378 */
1379 struct AGnssRilCallback : IAGnssRilCallback {
1380 Return<void> requestSetIdCb(uint32_t setIdFlag) override;
1381 Return<void> requestRefLocCb() override;
1382 };
1383
requestSetIdCb(uint32_t setIdFlag)1384 Return<void> AGnssRilCallback::requestSetIdCb(uint32_t setIdFlag) {
1385 JNIEnv* env = getJniEnv();
1386 env->CallVoidMethod(mCallbacksObj, method_requestSetID, setIdFlag);
1387 checkAndClearExceptionFromCallback(env, __FUNCTION__);
1388 return Void();
1389 }
1390
requestRefLocCb()1391 Return<void> AGnssRilCallback::requestRefLocCb() {
1392 JNIEnv* env = getJniEnv();
1393 env->CallVoidMethod(mCallbacksObj, method_requestRefLocation);
1394 checkAndClearExceptionFromCallback(env, __FUNCTION__);
1395 return Void();
1396 }
1397
1398 struct GnssBatchingCallbackUtil {
1399 template<class T>
1400 static Return<void> gnssLocationBatchCbImpl(const hidl_vec<T>& locations);
1401 private:
1402 GnssBatchingCallbackUtil() = delete;
1403 };
1404
1405 template<class T>
gnssLocationBatchCbImpl(const hidl_vec<T> & locations)1406 Return<void> GnssBatchingCallbackUtil::gnssLocationBatchCbImpl(const hidl_vec<T>& locations) {
1407 JNIEnv* env = getJniEnv();
1408
1409 jobjectArray jLocations = env->NewObjectArray(locations.size(), class_location, nullptr);
1410
1411 for (uint16_t i = 0; i < locations.size(); ++i) {
1412 jobject jLocation = translateGnssLocation(env, locations[i]);
1413 env->SetObjectArrayElement(jLocations, i, jLocation);
1414 env->DeleteLocalRef(jLocation);
1415 }
1416
1417 env->CallVoidMethod(mCallbacksObj, method_reportLocationBatch, jLocations);
1418 checkAndClearExceptionFromCallback(env, __FUNCTION__);
1419
1420 env->DeleteLocalRef(jLocations);
1421
1422 return Void();
1423 }
1424
1425 /*
1426 * GnssBatchingCallback_V1_0 class implements the callback methods required by the
1427 * IGnssBatching 1.0 interface.
1428 */
1429 struct GnssBatchingCallback_V1_0 : public IGnssBatchingCallback_V1_0 {
1430 /** Methods from ::android::hardware::gps::V1_0::IGnssBatchingCallback follow. */
gnssLocationBatchCbandroid::GnssBatchingCallback_V1_01431 Return<void> gnssLocationBatchCb(const hidl_vec<GnssLocation_V1_0>& locations) override {
1432 return GnssBatchingCallbackUtil::gnssLocationBatchCbImpl(locations);
1433 }
1434 };
1435
1436 /*
1437 * GnssBatchingCallback_V2_0 class implements the callback methods required by the
1438 * IGnssBatching 2.0 interface.
1439 */
1440 struct GnssBatchingCallback_V2_0 : public IGnssBatchingCallback_V2_0 {
1441 /** Methods from ::android::hardware::gps::V2_0::IGnssBatchingCallback follow. */
gnssLocationBatchCbandroid::GnssBatchingCallback_V2_01442 Return<void> gnssLocationBatchCb(const hidl_vec<GnssLocation_V2_0>& locations) override {
1443 return GnssBatchingCallbackUtil::gnssLocationBatchCbImpl(locations);
1444 }
1445 };
1446
1447 /* Initializes the GNSS service handle. */
android_location_gnss_hal_GnssNative_set_gps_service_handle()1448 static void android_location_gnss_hal_GnssNative_set_gps_service_handle() {
1449 gnssHalAidl = waitForVintfService<IGnssAidl>();
1450 if (gnssHalAidl != nullptr) {
1451 ALOGD("Successfully got GNSS AIDL handle.");
1452 }
1453
1454 ALOGD("Trying IGnss_V2_1::getService()");
1455 gnssHal_V2_1 = IGnss_V2_1::getService();
1456 if (gnssHal_V2_1 != nullptr) {
1457 gnssHal = gnssHal_V2_1;
1458 gnssHal_V2_0 = gnssHal_V2_1;
1459 gnssHal_V1_1 = gnssHal_V2_1;
1460 gnssHal = gnssHal_V2_1;
1461 return;
1462 }
1463
1464 ALOGD("gnssHal 2.1 was null, trying 2.0");
1465 gnssHal_V2_0 = IGnss_V2_0::getService();
1466 if (gnssHal_V2_0 != nullptr) {
1467 gnssHal = gnssHal_V2_0;
1468 gnssHal_V1_1 = gnssHal_V2_0;
1469 return;
1470 }
1471
1472 ALOGD("gnssHal 2.0 was null, trying 1.1");
1473 gnssHal_V1_1 = IGnss_V1_1::getService();
1474 if (gnssHal_V1_1 != nullptr) {
1475 gnssHal = gnssHal_V1_1;
1476 return;
1477 }
1478
1479 ALOGD("gnssHal 1.1 was null, trying 1.0");
1480 gnssHal = IGnss_V1_0::getService();
1481 }
1482
1483 /* One time initialization at system boot */
android_location_gnss_hal_GnssNative_class_init_once(JNIEnv * env,jclass clazz)1484 static void android_location_gnss_hal_GnssNative_class_init_once(JNIEnv* env, jclass clazz) {
1485 // Initialize the top level gnss HAL handle.
1486 android_location_gnss_hal_GnssNative_set_gps_service_handle();
1487
1488 // Cache methodIDs and class IDs.
1489 method_reportLocation = env->GetMethodID(clazz, "reportLocation",
1490 "(ZLandroid/location/Location;)V");
1491 method_reportStatus = env->GetMethodID(clazz, "reportStatus", "(I)V");
1492 method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "(I[I[F[F[F[F[F)V");
1493 method_reportAGpsStatus = env->GetMethodID(clazz, "reportAGpsStatus", "(II[B)V");
1494 method_reportNmea = env->GetMethodID(clazz, "reportNmea", "(J)V");
1495 method_setTopHalCapabilities = env->GetMethodID(clazz, "setTopHalCapabilities", "(I)V");
1496 method_setGnssYearOfHardware = env->GetMethodID(clazz, "setGnssYearOfHardware", "(I)V");
1497 method_setGnssHardwareModelName = env->GetMethodID(clazz, "setGnssHardwareModelName",
1498 "(Ljava/lang/String;)V");
1499 method_psdsDownloadRequest = env->GetMethodID(clazz, "psdsDownloadRequest", "(I)V");
1500 method_reportNiNotification = env->GetMethodID(clazz, "reportNiNotification",
1501 "(IIIIILjava/lang/String;Ljava/lang/String;II)V");
1502 method_requestLocation = env->GetMethodID(clazz, "requestLocation", "(ZZ)V");
1503 method_requestRefLocation = env->GetMethodID(clazz, "requestRefLocation", "()V");
1504 method_requestSetID = env->GetMethodID(clazz, "requestSetID", "(I)V");
1505 method_requestUtcTime = env->GetMethodID(clazz, "requestUtcTime", "()V");
1506 method_reportGeofenceTransition = env->GetMethodID(clazz, "reportGeofenceTransition",
1507 "(ILandroid/location/Location;IJ)V");
1508 method_reportGeofenceStatus = env->GetMethodID(clazz, "reportGeofenceStatus",
1509 "(ILandroid/location/Location;)V");
1510 method_reportGeofenceAddStatus = env->GetMethodID(clazz, "reportGeofenceAddStatus",
1511 "(II)V");
1512 method_reportGeofenceRemoveStatus = env->GetMethodID(clazz, "reportGeofenceRemoveStatus",
1513 "(II)V");
1514 method_reportGeofenceResumeStatus = env->GetMethodID(clazz, "reportGeofenceResumeStatus",
1515 "(II)V");
1516 method_reportGeofencePauseStatus = env->GetMethodID(clazz, "reportGeofencePauseStatus",
1517 "(II)V");
1518 method_reportAntennaInfo = env->GetMethodID(clazz, "reportAntennaInfo", "(Ljava/util/List;)V");
1519 method_reportNavigationMessages = env->GetMethodID(
1520 clazz,
1521 "reportNavigationMessage",
1522 "(Landroid/location/GnssNavigationMessage;)V");
1523 method_reportLocationBatch = env->GetMethodID(
1524 clazz,
1525 "reportLocationBatch",
1526 "([Landroid/location/Location;)V");
1527 method_reportGnssServiceDied = env->GetMethodID(clazz, "reportGnssServiceDied", "()V");
1528 method_reportNfwNotification = env->GetMethodID(clazz, "reportNfwNotification",
1529 "(Ljava/lang/String;BLjava/lang/String;BLjava/lang/String;BZZ)V");
1530 method_reportGnssPowerStats =
1531 env->GetMethodID(clazz, "reportGnssPowerStats",
1532 "(Lcom/android/server/location/gnss/GnssPowerStats;)V");
1533 method_isInEmergencySession = env->GetMethodID(clazz, "isInEmergencySession", "()Z");
1534
1535 method_setSubHalMeasurementCorrectionsCapabilities = env->GetMethodID(clazz,
1536 "setSubHalMeasurementCorrectionsCapabilities", "(I)V");
1537 method_setSubHalPowerIndicationCapabilities =
1538 env->GetMethodID(clazz, "setSubHalPowerIndicationCapabilities", "(I)V");
1539
1540 jclass measCorrClass = env->FindClass("android/location/GnssMeasurementCorrections");
1541 method_correctionsGetLatitudeDegrees = env->GetMethodID(
1542 measCorrClass,"getLatitudeDegrees", "()D");
1543 method_correctionsGetLongitudeDegrees = env->GetMethodID(
1544 measCorrClass, "getLongitudeDegrees", "()D");
1545 method_correctionsGetAltitudeMeters = env->GetMethodID(
1546 measCorrClass, "getAltitudeMeters", "()D");
1547 method_correctionsGetHorPosUncMeters = env->GetMethodID(
1548 measCorrClass, "getHorizontalPositionUncertaintyMeters", "()D");
1549 method_correctionsGetVerPosUncMeters = env->GetMethodID(
1550 measCorrClass, "getVerticalPositionUncertaintyMeters", "()D");
1551 method_correctionsGetToaGpsNanosecondsOfWeek = env->GetMethodID(
1552 measCorrClass, "getToaGpsNanosecondsOfWeek", "()J");
1553
1554 method_correctionsGetSingleSatCorrectionList = env->GetMethodID(
1555 measCorrClass, "getSingleSatelliteCorrectionList", "()Ljava/util/List;");
1556
1557 method_correctionsHasEnvironmentBearing = env->GetMethodID(
1558 measCorrClass, "hasEnvironmentBearing", "()Z");
1559 method_correctionsGetEnvironmentBearingDegrees = env->GetMethodID(
1560 measCorrClass, "getEnvironmentBearingDegrees", "()F");
1561 method_correctionsGetEnvironmentBearingUncertaintyDegrees = env->GetMethodID(
1562 measCorrClass, "getEnvironmentBearingUncertaintyDegrees", "()F");
1563
1564 jclass corrListClass = env->FindClass("java/util/List");
1565 method_listSize = env->GetMethodID(corrListClass, "size", "()I");
1566 method_correctionListGet = env->GetMethodID(corrListClass, "get", "(I)Ljava/lang/Object;");
1567
1568 jclass singleSatCorrClass = env->FindClass("android/location/GnssSingleSatCorrection");
1569 method_correctionSatFlags = env->GetMethodID(
1570 singleSatCorrClass, "getSingleSatelliteCorrectionFlags", "()I");
1571 method_correctionSatConstType = env->GetMethodID(
1572 singleSatCorrClass, "getConstellationType", "()I");
1573 method_correctionSatId= env->GetMethodID(
1574 singleSatCorrClass, "getSatelliteId", "()I");
1575 method_correctionSatCarrierFreq = env->GetMethodID(
1576 singleSatCorrClass, "getCarrierFrequencyHz", "()F");
1577 method_correctionSatIsLosProb = env->GetMethodID(
1578 singleSatCorrClass,"getProbabilityLineOfSight", "()F");
1579 method_correctionSatEpl = env->GetMethodID(
1580 singleSatCorrClass, "getExcessPathLengthMeters", "()F");
1581 method_correctionSatEplUnc = env->GetMethodID(
1582 singleSatCorrClass, "getExcessPathLengthUncertaintyMeters", "()F");
1583 method_correctionSatRefPlane = env->GetMethodID(
1584 singleSatCorrClass, "getReflectingPlane", "()Landroid/location/GnssReflectingPlane;");
1585
1586 jclass refPlaneClass = env->FindClass("android/location/GnssReflectingPlane");
1587 method_correctionPlaneLatDeg = env->GetMethodID(refPlaneClass, "getLatitudeDegrees", "()D");
1588 method_correctionPlaneLngDeg = env->GetMethodID(refPlaneClass, "getLongitudeDegrees", "()D");
1589 method_correctionPlaneAltDeg = env->GetMethodID(refPlaneClass, "getAltitudeMeters", "()D");
1590 method_correctionPlaneAzimDeg = env->GetMethodID(refPlaneClass, "getAzimuthDegrees", "()D");
1591
1592 jclass gnssAntennaInfoBuilder = env->FindClass("android/location/GnssAntennaInfo$Builder");
1593 class_gnssAntennaInfoBuilder = (jclass)env->NewGlobalRef(gnssAntennaInfoBuilder);
1594 method_gnssAntennaInfoBuilderCtor =
1595 env->GetMethodID(class_gnssAntennaInfoBuilder, "<init>", "()V");
1596 method_gnssAntennaInfoBuilderSetCarrierFrequencyMHz =
1597 env->GetMethodID(class_gnssAntennaInfoBuilder, "setCarrierFrequencyMHz",
1598 "(D)Landroid/location/GnssAntennaInfo$Builder;");
1599 method_gnssAntennaInfoBuilderSetPhaseCenterOffset =
1600 env->GetMethodID(class_gnssAntennaInfoBuilder, "setPhaseCenterOffset",
1601 "(Landroid/location/GnssAntennaInfo$PhaseCenterOffset;)"
1602 "Landroid/location/GnssAntennaInfo$Builder;");
1603 method_gnssAntennaInfoBuilderSetPhaseCenterVariationCorrections =
1604 env->GetMethodID(class_gnssAntennaInfoBuilder, "setPhaseCenterVariationCorrections",
1605 "(Landroid/location/GnssAntennaInfo$SphericalCorrections;)"
1606 "Landroid/location/GnssAntennaInfo$Builder;");
1607 method_gnssAntennaInfoBuilderSetSignalGainCorrections =
1608 env->GetMethodID(class_gnssAntennaInfoBuilder, "setSignalGainCorrections",
1609 "(Landroid/location/GnssAntennaInfo$SphericalCorrections;)"
1610 "Landroid/location/GnssAntennaInfo$Builder;");
1611 method_gnssAntennaInfoBuilderBuild = env->GetMethodID(class_gnssAntennaInfoBuilder, "build",
1612 "()Landroid/location/GnssAntennaInfo;");
1613
1614 jclass phaseCenterOffsetClass =
1615 env->FindClass("android/location/GnssAntennaInfo$PhaseCenterOffset");
1616 class_phaseCenterOffset = (jclass)env->NewGlobalRef(phaseCenterOffsetClass);
1617 method_phaseCenterOffsetCtor = env->GetMethodID(class_phaseCenterOffset, "<init>", "(DDDDDD)V");
1618
1619 jclass sphericalCorrectionsClass =
1620 env->FindClass("android/location/GnssAntennaInfo$SphericalCorrections");
1621 class_sphericalCorrections = (jclass)env->NewGlobalRef(sphericalCorrectionsClass);
1622 method_sphericalCorrectionsCtor =
1623 env->GetMethodID(class_sphericalCorrections, "<init>", "([[D[[D)V");
1624
1625 jclass gnssPowerStatsClass = env->FindClass("com/android/server/location/gnss/GnssPowerStats");
1626 class_gnssPowerStats = (jclass)env->NewGlobalRef(gnssPowerStatsClass);
1627 method_gnssPowerStatsCtor = env->GetMethodID(class_gnssPowerStats, "<init>", "(IJDDDDDD[D)V");
1628
1629 jclass locationClass = env->FindClass("android/location/Location");
1630 class_location = (jclass) env->NewGlobalRef(locationClass);
1631 method_locationCtor = env->GetMethodID(class_location, "<init>", "(Ljava/lang/String;)V");
1632
1633 jclass gnssNavigationMessageClass = env->FindClass("android/location/GnssNavigationMessage");
1634 class_gnssNavigationMessage = (jclass) env->NewGlobalRef(gnssNavigationMessageClass);
1635 method_gnssNavigationMessageCtor = env->GetMethodID(class_gnssNavigationMessage, "<init>", "()V");
1636
1637 jclass arrayListClass = env->FindClass("java/util/ArrayList");
1638 class_arrayList = (jclass)env->NewGlobalRef(arrayListClass);
1639 method_arrayListCtor = env->GetMethodID(class_arrayList, "<init>", "()V");
1640 method_arrayListAdd = env->GetMethodID(class_arrayList, "add", "(Ljava/lang/Object;)Z");
1641
1642 jclass doubleArrayClass = env->FindClass("[D");
1643 class_doubleArray = (jclass)env->NewGlobalRef(doubleArrayClass);
1644
1645 gnss::GnssConfiguration_class_init_once(env);
1646 gnss::GnssMeasurement_class_init_once(env, clazz);
1647 }
1648
1649 /* Initialization needed at system boot and whenever GNSS service dies. */
android_location_gnss_hal_GnssNative_init_once(JNIEnv * env,jobject obj,jboolean reinitializeGnssServiceHandle)1650 static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject obj,
1651 jboolean reinitializeGnssServiceHandle) {
1652 /*
1653 * Save a pointer to JVM.
1654 */
1655 jint jvmStatus = env->GetJavaVM(&android::ScopedJniThreadAttach::sJvm);
1656 if (jvmStatus != JNI_OK) {
1657 LOG_ALWAYS_FATAL("Unable to get Java VM. Error: %d", jvmStatus);
1658 }
1659
1660 if (reinitializeGnssServiceHandle) {
1661 android_location_gnss_hal_GnssNative_set_gps_service_handle();
1662 }
1663
1664 if (gnssHal == nullptr) {
1665 ALOGE("Unable to get GPS service\n");
1666 return;
1667 }
1668
1669 gnssHalDeathRecipient = new GnssDeathRecipient();
1670 hardware::Return<bool> linked = gnssHal->linkToDeath(gnssHalDeathRecipient, /*cookie*/ 0);
1671 if (!linked.isOk()) {
1672 ALOGE("Transaction error in linking to GnssHAL death: %s",
1673 linked.description().c_str());
1674 } else if (!linked) {
1675 ALOGW("Unable to link to GnssHal death notifications");
1676 } else {
1677 ALOGD("Link to death notification successful");
1678 }
1679
1680 if (gnssHalAidl != nullptr) {
1681 sp<IGnssPsdsAidl> gnssPsdsAidl;
1682 auto status = gnssHalAidl->getExtensionPsds(&gnssPsdsAidl);
1683 if (status.isOk()) {
1684 gnssPsdsAidlIface = gnssPsdsAidl;
1685 } else {
1686 ALOGD("Unable to get a handle to PSDS AIDL interface.");
1687 }
1688 } else {
1689 auto gnssXtra = gnssHal->getExtensionXtra();
1690 if (!gnssXtra.isOk()) {
1691 ALOGD("Unable to get a handle to Xtra");
1692 } else {
1693 gnssXtraIface = gnssXtra;
1694 }
1695 }
1696
1697 if (gnssHal_V2_0 != nullptr) {
1698 auto agnssRil_V2_0 = gnssHal_V2_0->getExtensionAGnssRil_2_0();
1699 if (!agnssRil_V2_0.isOk()) {
1700 ALOGD("Unable to get a handle to AGnssRil_V2_0");
1701 } else {
1702 agnssRilIface_V2_0 = agnssRil_V2_0;
1703 agnssRilIface = agnssRilIface_V2_0;
1704 }
1705 } else {
1706 auto agnssRil_V1_0 = gnssHal->getExtensionAGnssRil();
1707 if (!agnssRil_V1_0.isOk()) {
1708 ALOGD("Unable to get a handle to AGnssRil");
1709 } else {
1710 agnssRilIface = agnssRil_V1_0;
1711 }
1712 }
1713
1714 if (gnssHal_V2_0 != nullptr) {
1715 auto agnss_V2_0 = gnssHal_V2_0->getExtensionAGnss_2_0();
1716 if (!agnss_V2_0.isOk()) {
1717 ALOGD("Unable to get a handle to AGnss_V2_0");
1718 } else {
1719 agnssIface_V2_0 = agnss_V2_0;
1720 }
1721 } else {
1722 auto agnss_V1_0 = gnssHal->getExtensionAGnss();
1723 if (!agnss_V1_0.isOk()) {
1724 ALOGD("Unable to get a handle to AGnss");
1725 } else {
1726 agnssIface = agnss_V1_0;
1727 }
1728 }
1729
1730 auto gnssNavigationMessage = gnssHal->getExtensionGnssNavigationMessage();
1731 if (!gnssNavigationMessage.isOk()) {
1732 ALOGD("Unable to get a handle to GnssNavigationMessage");
1733 } else {
1734 gnssNavigationMessageIface = gnssNavigationMessage;
1735 }
1736
1737 // Allow all causal combinations between IGnss.hal and IGnssMeasurement.hal. That means,
1738 // 2.1@IGnss can be paired with {1.0, 1,1, 2.0, 2.1}@IGnssMeasurement
1739 // 2.0@IGnss can be paired with {1.0, 1,1, 2.0}@IGnssMeasurement
1740 // 1.1@IGnss can be paired {1.0, 1.1}@IGnssMeasurement
1741 // 1.0@IGnss is paired with 1.0@IGnssMeasurement
1742 gnssMeasurementIface = nullptr;
1743 if (gnssHalAidl != nullptr) {
1744 sp<hardware::gnss::IGnssMeasurementInterface> gnssMeasurement;
1745 auto status = gnssHalAidl->getExtensionGnssMeasurement(&gnssMeasurement);
1746 if (checkAidlStatus(status, "Unable to get a handle to GnssMeasurement AIDL interface.")) {
1747 gnssMeasurementIface =
1748 std::make_unique<android::gnss::GnssMeasurement>(gnssMeasurement);
1749 }
1750 }
1751 if (gnssHal_V2_1 != nullptr && gnssMeasurementIface == nullptr) {
1752 auto gnssMeasurement = gnssHal_V2_1->getExtensionGnssMeasurement_2_1();
1753 if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V2_1")) {
1754 gnssMeasurementIface =
1755 std::make_unique<android::gnss::GnssMeasurement_V2_1>(gnssMeasurement);
1756 }
1757 }
1758 if (gnssHal_V2_0 != nullptr && gnssMeasurementIface == nullptr) {
1759 auto gnssMeasurement = gnssHal_V2_0->getExtensionGnssMeasurement_2_0();
1760 if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V2_0")) {
1761 gnssMeasurementIface =
1762 std::make_unique<android::gnss::GnssMeasurement_V2_0>(gnssMeasurement);
1763 }
1764 }
1765 if (gnssHal_V1_1 != nullptr && gnssMeasurementIface == nullptr) {
1766 auto gnssMeasurement = gnssHal_V1_1->getExtensionGnssMeasurement_1_1();
1767 if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V1_1")) {
1768 gnssMeasurementIface =
1769 std::make_unique<android::gnss::GnssMeasurement_V1_1>(gnssMeasurement);
1770 }
1771 }
1772 if (gnssMeasurementIface == nullptr) {
1773 auto gnssMeasurement = gnssHal->getExtensionGnssMeasurement();
1774 if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V1_0")) {
1775 gnssMeasurementIface =
1776 std::make_unique<android::gnss::GnssMeasurement_V1_0>(gnssMeasurement);
1777 }
1778 }
1779
1780 if (gnssHal_V2_1 != nullptr) {
1781 auto gnssAntennaInfo = gnssHal_V2_1->getExtensionGnssAntennaInfo();
1782 if (!gnssAntennaInfo.isOk()) {
1783 ALOGD("Unable to get a handle to GnssAntennaInfo");
1784 } else {
1785 gnssAntennaInfoIface = gnssAntennaInfo;
1786 }
1787 }
1788
1789 if (gnssHal_V2_1 != nullptr) {
1790 auto gnssCorrections = gnssHal_V2_1->getExtensionMeasurementCorrections_1_1();
1791 if (!gnssCorrections.isOk()) {
1792 ALOGD("Unable to get a handle to GnssMeasurementCorrections 1.1 interface");
1793 } else {
1794 gnssCorrectionsIface_V1_1 = gnssCorrections;
1795 gnssCorrectionsIface_V1_0 = gnssCorrectionsIface_V1_1;
1796 }
1797 } else if (gnssHal_V2_0 != nullptr) {
1798 auto gnssCorrections = gnssHal_V2_0->getExtensionMeasurementCorrections();
1799 if (!gnssCorrections.isOk()) {
1800 ALOGD("Unable to get a handle to GnssMeasurementCorrections interface");
1801 } else {
1802 gnssCorrectionsIface_V1_0 = gnssCorrections;
1803 }
1804 }
1805
1806 // Allow all causal combinations between IGnss.hal and IGnssDebug.hal. That means,
1807 // 2.0@IGnss can be paired with {1.0, 2.0}@IGnssDebug
1808 // 1.0@IGnss is paired with 1.0@IGnssDebug
1809 gnssDebugIface = nullptr;
1810 if (gnssHal_V2_0 != nullptr) {
1811 auto gnssDebug = gnssHal_V2_0->getExtensionGnssDebug_2_0();
1812 if (!gnssDebug.isOk()) {
1813 ALOGD("Unable to get a handle to GnssDebug_V2_0");
1814 } else {
1815 gnssDebugIface_V2_0 = gnssDebug;
1816 gnssDebugIface = gnssDebugIface_V2_0;
1817 }
1818 }
1819 if (gnssDebugIface == nullptr) {
1820 auto gnssDebug = gnssHal->getExtensionGnssDebug();
1821 if (!gnssDebug.isOk()) {
1822 ALOGD("Unable to get a handle to GnssDebug");
1823 } else {
1824 gnssDebugIface = gnssDebug;
1825 }
1826 }
1827
1828 auto gnssNi = gnssHal->getExtensionGnssNi();
1829 if (!gnssNi.isOk()) {
1830 ALOGD("Unable to get a handle to GnssNi");
1831 } else {
1832 gnssNiIface = gnssNi;
1833 }
1834
1835 if (gnssHalAidl != nullptr) {
1836 sp<IGnssConfigurationAidl> gnssConfigurationAidl;
1837 auto status = gnssHalAidl->getExtensionGnssConfiguration(&gnssConfigurationAidl);
1838 if (checkAidlStatus(status,
1839 "Unable to get a handle to GnssConfiguration AIDL interface.")) {
1840 gnssConfigurationIface =
1841 std::make_unique<android::gnss::GnssConfiguration>(gnssConfigurationAidl);
1842 }
1843 } else if (gnssHal_V2_1 != nullptr) {
1844 auto gnssConfiguration = gnssHal_V2_1->getExtensionGnssConfiguration_2_1();
1845 if (checkHidlReturn(gnssConfiguration,
1846 "Unable to get a handle to GnssConfiguration_V2_1")) {
1847 gnssConfigurationIface =
1848 std::make_unique<android::gnss::GnssConfiguration_V2_1>(gnssConfiguration);
1849 }
1850 } else if (gnssHal_V2_0 != nullptr) {
1851 auto gnssConfiguration = gnssHal_V2_0->getExtensionGnssConfiguration_2_0();
1852 if (checkHidlReturn(gnssConfiguration,
1853 "Unable to get a handle to GnssConfiguration_V2_0")) {
1854 gnssConfigurationIface =
1855 std::make_unique<android::gnss::GnssConfiguration_V2_0>(gnssConfiguration);
1856 }
1857 } else if (gnssHal_V1_1 != nullptr) {
1858 auto gnssConfiguration = gnssHal_V1_1->getExtensionGnssConfiguration_1_1();
1859 if (checkHidlReturn(gnssConfiguration,
1860 "Unable to get a handle to GnssConfiguration_V1_1")) {
1861 gnssConfigurationIface =
1862 std::make_unique<android::gnss::GnssConfiguration_V1_1>(gnssConfiguration);
1863 }
1864 } else {
1865 auto gnssConfiguration = gnssHal->getExtensionGnssConfiguration();
1866 if (checkHidlReturn(gnssConfiguration,
1867 "Unable to get a handle to GnssConfiguration_V1_0")) {
1868 gnssConfigurationIface =
1869 std::make_unique<android::gnss::GnssConfiguration_V1_0>(gnssConfiguration);
1870 }
1871 }
1872
1873 auto gnssGeofencing = gnssHal->getExtensionGnssGeofencing();
1874 if (!gnssGeofencing.isOk()) {
1875 ALOGD("Unable to get a handle to GnssGeofencing");
1876 } else {
1877 gnssGeofencingIface = gnssGeofencing;
1878 }
1879
1880 // If IGnssBatching.hal@2.0 is not supported, use IGnssBatching.hal@1.0
1881 if (gnssHal_V2_0 != nullptr) {
1882 auto gnssBatching_V2_0 = gnssHal_V2_0->getExtensionGnssBatching_2_0();
1883 if (!gnssBatching_V2_0.isOk()) {
1884 ALOGD("Unable to get a handle to GnssBatching_V2_0");
1885 } else {
1886 gnssBatchingIface_V2_0 = gnssBatching_V2_0;
1887 }
1888 }
1889 if (gnssBatchingIface_V2_0 == nullptr ) {
1890 auto gnssBatching_V1_0 = gnssHal->getExtensionGnssBatching();
1891 if (!gnssBatching_V1_0.isOk()) {
1892 ALOGD("Unable to get a handle to GnssBatching");
1893 } else {
1894 gnssBatchingIface = gnssBatching_V1_0;
1895 }
1896 }
1897
1898 if (gnssHal_V2_0 != nullptr) {
1899 auto gnssVisibilityControl = gnssHal_V2_0->getExtensionVisibilityControl();
1900 if (!gnssVisibilityControl.isOk()) {
1901 ALOGD("Unable to get a handle to GnssVisibilityControl interface");
1902 } else {
1903 gnssVisibilityControlIface = gnssVisibilityControl;
1904 }
1905 }
1906
1907 if (gnssHalAidl != nullptr) {
1908 sp<IGnssPowerIndication> gnssPowerIndication;
1909 auto status = gnssHalAidl->getExtensionGnssPowerIndication(&gnssPowerIndication);
1910 if (checkAidlStatus(status, "Unable to get a handle to GnssPowerIndication interface.")) {
1911 gnssPowerIndicationIface = gnssPowerIndication;
1912 }
1913 }
1914
1915 if (mCallbacksObj) {
1916 ALOGE("Callbacks already initialized");
1917 } else {
1918 mCallbacksObj = env->NewGlobalRef(obj);
1919 }
1920 }
1921
android_location_gnss_hal_GnssNative_is_supported(JNIEnv *,jclass)1922 static jboolean android_location_gnss_hal_GnssNative_is_supported(JNIEnv* /* env */, jclass) {
1923 return (gnssHal != nullptr) ? JNI_TRUE : JNI_FALSE;
1924 }
1925
android_location_GnssNetworkConnectivityHandler_is_agps_ril_supported(JNIEnv *,jclass)1926 static jboolean android_location_GnssNetworkConnectivityHandler_is_agps_ril_supported(
1927 JNIEnv* /* env */, jclass /* clazz */) {
1928 return (agnssRilIface != nullptr) ? JNI_TRUE : JNI_FALSE;
1929 }
1930
android_location_GnssConfiguration_get_gnss_configuration_version(JNIEnv * env,jclass)1931 static jobject android_location_GnssConfiguration_get_gnss_configuration_version(
1932 JNIEnv* env, jclass /* jclazz */) {
1933 if (gnssConfigurationIface == nullptr) {
1934 return nullptr;
1935 }
1936 return gnssConfigurationIface->getVersion(env);
1937 }
1938
1939 /* Initialization needed each time the GPS service is shutdown. */
android_location_gnss_hal_GnssNative_init(JNIEnv *,jclass)1940 static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jclass) {
1941 /*
1942 * This must be set before calling into the HAL library.
1943 */
1944 if (!mCallbacksObj) {
1945 ALOGE("No callbacks set during GNSS HAL initialization.");
1946 return JNI_FALSE;
1947 }
1948
1949 /*
1950 * Fail if the main interface fails to initialize
1951 */
1952 if (gnssHal == nullptr) {
1953 ALOGE("Unable to initialize GNSS HAL.");
1954 return JNI_FALSE;
1955 }
1956
1957 Return<bool> result = false;
1958
1959 // Set top level IGnss.hal callback.
1960 sp<IGnssCallback_V2_1> gnssCbIface = new GnssCallback();
1961 if (gnssHal_V2_1 != nullptr) {
1962 result = gnssHal_V2_1->setCallback_2_1(gnssCbIface);
1963 } else if (gnssHal_V2_0 != nullptr) {
1964 result = gnssHal_V2_0->setCallback_2_0(gnssCbIface);
1965 } else if (gnssHal_V1_1 != nullptr) {
1966 result = gnssHal_V1_1->setCallback_1_1(gnssCbIface);
1967 } else {
1968 result = gnssHal->setCallback(gnssCbIface);
1969 }
1970
1971 if (!checkHidlReturn(result, "IGnss setCallback() failed.")) {
1972 return JNI_FALSE;
1973 }
1974
1975 sp<IGnssCallbackAidl> gnssCbIfaceAidl = new GnssCallbackAidl();
1976 if (gnssHalAidl != nullptr) {
1977 auto status = gnssHalAidl->setCallback(gnssCbIfaceAidl);
1978 if (!checkAidlStatus(status, "IGnssAidl setCallback() failed.")) {
1979 return JNI_FALSE;
1980 }
1981 }
1982
1983 // Set IGnssPsds or IGnssXtra callback.
1984 if (gnssPsdsAidlIface != nullptr) {
1985 sp<IGnssPsdsCallbackAidl> gnssPsdsCallbackAidl = new GnssPsdsCallbackAidl();
1986 auto status = gnssPsdsAidlIface->setCallback(gnssPsdsCallbackAidl);
1987 if (!checkAidlStatus(status, "IGnssPsdsAidl setCallback() failed.")) {
1988 gnssPsdsAidlIface = nullptr;
1989 }
1990 } else if (gnssXtraIface != nullptr) {
1991 sp<IGnssXtraCallback> gnssXtraCbIface = new GnssXtraCallback();
1992 result = gnssXtraIface->setCallback(gnssXtraCbIface);
1993 if (!checkHidlReturn(result, "IGnssXtra setCallback() failed.")) {
1994 gnssXtraIface = nullptr;
1995 } else {
1996 ALOGI("Unable to initialize IGnssXtra interface.");
1997 }
1998 }
1999
2000 // Set IAGnss.hal callback.
2001 if (agnssIface_V2_0 != nullptr) {
2002 sp<IAGnssCallback_V2_0> aGnssCbIface = new AGnssCallback_V2_0();
2003 auto agnssStatus = agnssIface_V2_0->setCallback(aGnssCbIface);
2004 checkHidlReturn(agnssStatus, "IAGnss 2.0 setCallback() failed.");
2005 } else if (agnssIface != nullptr) {
2006 sp<IAGnssCallback_V1_0> aGnssCbIface = new AGnssCallback_V1_0();
2007 auto agnssStatus = agnssIface->setCallback(aGnssCbIface);
2008 checkHidlReturn(agnssStatus, "IAGnss setCallback() failed.");
2009 } else {
2010 ALOGI("Unable to initialize IAGnss interface.");
2011 }
2012
2013 // Set IGnssGeofencing.hal callback.
2014 sp<IGnssGeofenceCallback> gnssGeofencingCbIface = new GnssGeofenceCallback();
2015 if (gnssGeofencingIface != nullptr) {
2016 auto status = gnssGeofencingIface->setCallback(gnssGeofencingCbIface);
2017 checkHidlReturn(status, "IGnssGeofencing setCallback() failed.");
2018 } else {
2019 ALOGI("Unable to initialize IGnssGeofencing interface.");
2020 }
2021
2022 // Set IGnssNi.hal callback.
2023 sp<IGnssNiCallback> gnssNiCbIface = new GnssNiCallback();
2024 if (gnssNiIface != nullptr) {
2025 auto status = gnssNiIface->setCallback(gnssNiCbIface);
2026 checkHidlReturn(status, "IGnssNi setCallback() failed.");
2027 } else {
2028 ALOGI("Unable to initialize IGnssNi interface.");
2029 }
2030
2031 // Set IAGnssRil.hal callback.
2032 sp<IAGnssRilCallback> aGnssRilCbIface = new AGnssRilCallback();
2033 if (agnssRilIface != nullptr) {
2034 auto status = agnssRilIface->setCallback(aGnssRilCbIface);
2035 checkHidlReturn(status, "IAGnssRil setCallback() failed.");
2036 } else {
2037 ALOGI("Unable to initialize IAGnssRil interface.");
2038 }
2039
2040 // Set IGnssVisibilityControl.hal callback.
2041 if (gnssVisibilityControlIface != nullptr) {
2042 sp<IGnssVisibilityControlCallback> gnssVisibilityControlCbIface =
2043 new GnssVisibilityControlCallback();
2044 result = gnssVisibilityControlIface->setCallback(gnssVisibilityControlCbIface);
2045 checkHidlReturn(result, "IGnssVisibilityControl setCallback() failed.");
2046 }
2047
2048 // Set IMeasurementCorrections.hal callback.
2049 if (gnssCorrectionsIface_V1_1 != nullptr) {
2050 sp<IMeasurementCorrectionsCallback> gnssCorrectionsIfaceCbIface =
2051 new MeasurementCorrectionsCallback();
2052 result = gnssCorrectionsIface_V1_1->setCallback(gnssCorrectionsIfaceCbIface);
2053 checkHidlReturn(result, "IMeasurementCorrections 1.1 setCallback() failed.");
2054 } else if (gnssCorrectionsIface_V1_0 != nullptr) {
2055 sp<IMeasurementCorrectionsCallback> gnssCorrectionsIfaceCbIface =
2056 new MeasurementCorrectionsCallback();
2057 result = gnssCorrectionsIface_V1_0->setCallback(gnssCorrectionsIfaceCbIface);
2058 checkHidlReturn(result, "IMeasurementCorrections 1.0 setCallback() failed.");
2059 } else {
2060 ALOGI("Unable to find IMeasurementCorrections.");
2061 }
2062
2063 // Set IGnssPowerIndication.hal callback.
2064 if (gnssPowerIndicationIface != nullptr) {
2065 sp<IGnssPowerIndicationCallback> gnssPowerIndicationCallback =
2066 new GnssPowerIndicationCallback();
2067 auto status = gnssPowerIndicationIface->setCallback(gnssPowerIndicationCallback);
2068 if (!checkAidlStatus(status, "IGnssPowerIndication setCallback() failed.")) {
2069 gnssPowerIndicationIface = nullptr;
2070 }
2071 }
2072
2073 return JNI_TRUE;
2074 }
2075
android_location_gnss_hal_GnssNative_cleanup(JNIEnv *,jclass)2076 static void android_location_gnss_hal_GnssNative_cleanup(JNIEnv* /* env */, jclass) {
2077 if (gnssHal == nullptr) {
2078 return;
2079 }
2080
2081 auto result = gnssHal->cleanup();
2082 checkHidlReturn(result, "IGnss cleanup() failed.");
2083 }
2084
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)2085 static jboolean android_location_gnss_hal_GnssNative_set_position_mode(
2086 JNIEnv* /* env */, jclass, jint mode, jint recurrence, jint min_interval,
2087 jint preferred_accuracy, jint preferred_time, jboolean low_power_mode) {
2088 Return<bool> result = false;
2089 if (gnssHal_V1_1 != nullptr) {
2090 result = gnssHal_V1_1->setPositionMode_1_1(static_cast<IGnss_V1_0::GnssPositionMode>(mode),
2091 static_cast<IGnss_V1_0::GnssPositionRecurrence>(recurrence),
2092 min_interval,
2093 preferred_accuracy,
2094 preferred_time,
2095 low_power_mode);
2096 } else if (gnssHal != nullptr) {
2097 result = gnssHal->setPositionMode(static_cast<IGnss_V1_0::GnssPositionMode>(mode),
2098 static_cast<IGnss_V1_0::GnssPositionRecurrence>(recurrence),
2099 min_interval,
2100 preferred_accuracy,
2101 preferred_time);
2102 }
2103
2104 return checkHidlReturn(result, "IGnss setPositionMode() failed.");
2105 }
2106
android_location_gnss_hal_GnssNative_start(JNIEnv *,jclass)2107 static jboolean android_location_gnss_hal_GnssNative_start(JNIEnv* /* env */, jclass) {
2108 if (gnssHal == nullptr) {
2109 return JNI_FALSE;
2110 }
2111
2112 auto result = gnssHal->start();
2113 return checkHidlReturn(result, "IGnss start() failed.");
2114 }
2115
android_location_gnss_hal_GnssNative_stop(JNIEnv *,jclass)2116 static jboolean android_location_gnss_hal_GnssNative_stop(JNIEnv* /* env */, jclass) {
2117 if (gnssHal == nullptr) {
2118 return JNI_FALSE;
2119 }
2120
2121 auto result = gnssHal->stop();
2122 return checkHidlReturn(result, "IGnss stop() failed.");
2123 }
2124
android_location_gnss_hal_GnssNative_delete_aiding_data(JNIEnv *,jclass,jint flags)2125 static void android_location_gnss_hal_GnssNative_delete_aiding_data(JNIEnv* /* env */, jclass,
2126 jint flags) {
2127 if (gnssHal == nullptr) {
2128 return;
2129 }
2130
2131 auto result = gnssHal->deleteAidingData(static_cast<IGnss_V1_0::GnssAidingData>(flags));
2132 checkHidlReturn(result, "IGnss deleteAidingData() failed.");
2133 }
2134
android_location_gnss_hal_GnssNative_agps_set_reference_location_cellid(JNIEnv *,jclass,jint type,jint mcc,jint mnc,jint lac,jint cid)2135 static void android_location_gnss_hal_GnssNative_agps_set_reference_location_cellid(
2136 JNIEnv* /* env */, jclass, jint type, jint mcc, jint mnc, jint lac, jint cid) {
2137 IAGnssRil_V1_0::AGnssRefLocation location;
2138
2139 if (agnssRilIface == nullptr) {
2140 ALOGE("%s: IAGnssRil interface not available.", __func__);
2141 return;
2142 }
2143
2144 switch (static_cast<IAGnssRil_V1_0::AGnssRefLocationType>(type)) {
2145 case IAGnssRil_V1_0::AGnssRefLocationType::GSM_CELLID:
2146 case IAGnssRil_V1_0::AGnssRefLocationType::UMTS_CELLID:
2147 location.type = static_cast<IAGnssRil_V1_0::AGnssRefLocationType>(type);
2148 location.cellID.mcc = mcc;
2149 location.cellID.mnc = mnc;
2150 location.cellID.lac = lac;
2151 location.cellID.cid = cid;
2152 break;
2153 default:
2154 ALOGE("Neither a GSM nor a UMTS cellid (%s:%d).", __FUNCTION__, __LINE__);
2155 return;
2156 break;
2157 }
2158
2159 auto result = agnssRilIface->setRefLocation(location);
2160 checkHidlReturn(result, "IAGnssRil setRefLocation() failed.");
2161 }
2162
android_location_gnss_hal_GnssNative_agps_set_id(JNIEnv * env,jclass,jint type,jstring setid_string)2163 static void android_location_gnss_hal_GnssNative_agps_set_id(JNIEnv* env, jclass, jint type,
2164 jstring setid_string) {
2165 if (agnssRilIface == nullptr) {
2166 ALOGE("%s: IAGnssRil interface not available.", __func__);
2167 return;
2168 }
2169
2170 ScopedJniString jniSetId{env, setid_string};
2171 auto result = agnssRilIface->setSetId((IAGnssRil_V1_0::SetIDType)type, jniSetId);
2172 checkHidlReturn(result, "IAGnssRil setSetId() failed.");
2173 }
2174
android_location_gnss_hal_GnssNative_read_nmea(JNIEnv * env,jclass,jbyteArray nmeaArray,jint buffer_size)2175 static jint android_location_gnss_hal_GnssNative_read_nmea(JNIEnv* env, jclass,
2176 jbyteArray nmeaArray, jint buffer_size) {
2177 // this should only be called from within a call to reportNmea
2178 jbyte* nmea = reinterpret_cast<jbyte *>(env->GetPrimitiveArrayCritical(nmeaArray, 0));
2179 int length = GnssCallback::sNmeaStringLength;
2180 if (length > buffer_size)
2181 length = buffer_size;
2182 memcpy(nmea, GnssCallback::sNmeaString, length);
2183 env->ReleasePrimitiveArrayCritical(nmeaArray, nmea, JNI_ABORT);
2184 return (jint) length;
2185 }
2186
android_location_gnss_hal_GnssNative_inject_time(JNIEnv *,jclass,jlong time,jlong timeReference,jint uncertainty)2187 static void android_location_gnss_hal_GnssNative_inject_time(JNIEnv* /* env */, jclass, jlong time,
2188 jlong timeReference,
2189 jint uncertainty) {
2190 if (gnssHal == nullptr) {
2191 return;
2192 }
2193
2194 auto result = gnssHal->injectTime(time, timeReference, uncertainty);
2195 checkHidlReturn(result, "IGnss injectTime() failed.");
2196 }
2197
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)2198 static void android_location_gnss_hal_GnssNative_inject_best_location(
2199 JNIEnv* /* env */, jclass, jint gnssLocationFlags, jdouble latitudeDegrees,
2200 jdouble longitudeDegrees, jdouble altitudeMeters, jfloat speedMetersPerSec,
2201 jfloat bearingDegrees, jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
2202 jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees, jlong timestamp,
2203 jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
2204 jdouble elapsedRealtimeUncertaintyNanos) {
2205 if (gnssHal_V2_0 != nullptr) {
2206 GnssLocation_V2_0 location = createGnssLocation_V2_0(
2207 gnssLocationFlags,
2208 latitudeDegrees,
2209 longitudeDegrees,
2210 altitudeMeters,
2211 speedMetersPerSec,
2212 bearingDegrees,
2213 horizontalAccuracyMeters,
2214 verticalAccuracyMeters,
2215 speedAccuracyMetersPerSecond,
2216 bearingAccuracyDegrees,
2217 timestamp,
2218 elapsedRealtimeFlags,
2219 elapsedRealtimeNanos,
2220 elapsedRealtimeUncertaintyNanos);
2221 auto result = gnssHal_V2_0->injectBestLocation_2_0(location);
2222 checkHidlReturn(result, "IGnss injectBestLocation_2_0() failed.");
2223 return;
2224 }
2225
2226 if (gnssHal_V1_1 != nullptr) {
2227 GnssLocation_V1_0 location = createGnssLocation_V1_0(
2228 gnssLocationFlags,
2229 latitudeDegrees,
2230 longitudeDegrees,
2231 altitudeMeters,
2232 speedMetersPerSec,
2233 bearingDegrees,
2234 horizontalAccuracyMeters,
2235 verticalAccuracyMeters,
2236 speedAccuracyMetersPerSecond,
2237 bearingAccuracyDegrees,
2238 timestamp);
2239 auto result = gnssHal_V1_1->injectBestLocation(location);
2240 checkHidlReturn(result, "IGnss injectBestLocation() failed.");
2241 }
2242
2243 ALOGE("IGnss injectBestLocation() is called but gnssHal_V1_1 is not available.");
2244 }
2245
android_location_gnss_hal_GnssNative_inject_location(JNIEnv *,jclass,jdouble latitude,jdouble longitude,jfloat accuracy)2246 static void android_location_gnss_hal_GnssNative_inject_location(JNIEnv* /* env */, jclass,
2247 jdouble latitude,
2248 jdouble longitude,
2249 jfloat accuracy) {
2250 if (gnssHal == nullptr) {
2251 return;
2252 }
2253
2254 auto result = gnssHal->injectLocation(latitude, longitude, accuracy);
2255 checkHidlReturn(result, "IGnss injectLocation() failed.");
2256 }
2257
android_location_gnss_hal_GnssNative_supports_psds(JNIEnv *,jclass)2258 static jboolean android_location_gnss_hal_GnssNative_supports_psds(JNIEnv* /* env */, jclass) {
2259 return (gnssPsdsAidlIface != nullptr || gnssXtraIface != nullptr) ? JNI_TRUE : JNI_FALSE;
2260 }
2261
android_location_gnss_hal_GnssNative_inject_psds_data(JNIEnv * env,jclass,jbyteArray data,jint length,jint psdsType)2262 static void android_location_gnss_hal_GnssNative_inject_psds_data(JNIEnv* env, jclass,
2263 jbyteArray data, jint length,
2264 jint psdsType) {
2265 if (gnssPsdsAidlIface == nullptr && gnssXtraIface == nullptr) {
2266 ALOGE("%s: IGnssPsdsAidl or IGnssXtra interface not available.", __func__);
2267 return;
2268 }
2269
2270 jbyte* bytes = reinterpret_cast<jbyte *>(env->GetPrimitiveArrayCritical(data, 0));
2271 if (gnssPsdsAidlIface != nullptr) {
2272 auto status = gnssPsdsAidlIface->injectPsdsData(static_cast<PsdsType>(psdsType),
2273 std::vector<uint8_t>((const uint8_t*)bytes,
2274 (const uint8_t*)bytes +
2275 length));
2276 checkAidlStatus(status, "IGnssPsdsAidl injectPsdsData() failed.");
2277 } else if (gnssXtraIface != nullptr) {
2278 auto result = gnssXtraIface->injectXtraData(std::string((const char*)bytes, length));
2279 checkHidlReturn(result, "IGnssXtra injectXtraData() failed.");
2280 }
2281 env->ReleasePrimitiveArrayCritical(data, bytes, JNI_ABORT);
2282 }
2283
2284 struct AGnssDispatcher {
2285 static void dataConnOpen(sp<IAGnss_V1_0> agnssIface, JNIEnv* env, jstring apn, jint apnIpType);
2286 static void dataConnOpen(sp<IAGnss_V2_0> agnssIface_V2_0, JNIEnv* env, jlong networkHandle,
2287 jstring apn, jint apnIpType);
2288
2289 template <class T>
2290 static void dataConnClosed(sp<T> agnssIface);
2291
2292 template <class T>
2293 static void dataConnFailed(sp<T> agnssIface);
2294
2295 template <class T, class U>
2296 static void setServer(sp<T> agnssIface, JNIEnv* env, jint type, jstring hostname, jint port);
2297
2298 private:
2299 AGnssDispatcher() = delete;
2300 };
2301
dataConnOpen(sp<IAGnss_V1_0> agnssIface,JNIEnv * env,jstring apn,jint apnIpType)2302 void AGnssDispatcher::dataConnOpen(sp<IAGnss_V1_0> agnssIface, JNIEnv* env, jstring apn,
2303 jint apnIpType) {
2304 ScopedJniString jniApn{env, apn};
2305 auto result = agnssIface->dataConnOpen(jniApn,
2306 static_cast<IAGnss_V1_0::ApnIpType>(apnIpType));
2307 checkHidlReturn(result, "IAGnss dataConnOpen() failed. APN and its IP type not set.");
2308 }
2309
dataConnOpen(sp<IAGnss_V2_0> agnssIface_V2_0,JNIEnv * env,jlong networkHandle,jstring apn,jint apnIpType)2310 void AGnssDispatcher::dataConnOpen(sp<IAGnss_V2_0> agnssIface_V2_0, JNIEnv* env,
2311 jlong networkHandle, jstring apn, jint apnIpType) {
2312 ScopedJniString jniApn{env, apn};
2313 auto result = agnssIface_V2_0->dataConnOpen(static_cast<uint64_t>(networkHandle), jniApn,
2314 static_cast<IAGnss_V2_0::ApnIpType>(apnIpType));
2315 checkHidlReturn(result, "IAGnss 2.0 dataConnOpen() failed. APN and its IP type not set.");
2316 }
2317
2318 template<class T>
dataConnClosed(sp<T> agnssIface)2319 void AGnssDispatcher::dataConnClosed(sp<T> agnssIface) {
2320 auto result = agnssIface->dataConnClosed();
2321 checkHidlReturn(result, "IAGnss dataConnClosed() failed.");
2322 }
2323
2324 template<class T>
dataConnFailed(sp<T> agnssIface)2325 void AGnssDispatcher::dataConnFailed(sp<T> agnssIface) {
2326 auto result = agnssIface->dataConnFailed();
2327 checkHidlReturn(result, "IAGnss dataConnFailed() failed.");
2328 }
2329
2330 template <class T, class U>
setServer(sp<T> agnssIface,JNIEnv * env,jint type,jstring hostname,jint port)2331 void AGnssDispatcher::setServer(sp<T> agnssIface, JNIEnv* env, jint type, jstring hostname,
2332 jint port) {
2333 ScopedJniString jniHostName{env, hostname};
2334 auto result = agnssIface->setServer(static_cast<typename U::AGnssType>(type),
2335 jniHostName, port);
2336 checkHidlReturn(result, "IAGnss setServer() failed. Host name and port not set.");
2337 }
2338
android_location_GnssNetworkConnectivityHandler_agps_data_conn_open(JNIEnv * env,jobject,jlong networkHandle,jstring apn,jint apnIpType)2339 static void android_location_GnssNetworkConnectivityHandler_agps_data_conn_open(
2340 JNIEnv* env, jobject /* obj */, jlong networkHandle, jstring apn, jint apnIpType) {
2341 if (apn == nullptr) {
2342 jniThrowException(env, "java/lang/IllegalArgumentException", nullptr);
2343 return;
2344 }
2345
2346 if (agnssIface_V2_0 != nullptr) {
2347 AGnssDispatcher::dataConnOpen(agnssIface_V2_0, env, networkHandle, apn, apnIpType);
2348 } else if (agnssIface != nullptr) {
2349 AGnssDispatcher::dataConnOpen(agnssIface, env, apn, apnIpType);
2350 } else {
2351 ALOGE("%s: IAGnss interface not available.", __func__);
2352 return;
2353 }
2354 }
2355
android_location_GnssNetworkConnectivityHandler_agps_data_conn_closed(JNIEnv *,jobject)2356 static void android_location_GnssNetworkConnectivityHandler_agps_data_conn_closed(JNIEnv* /* env */,
2357 jobject /* obj */) {
2358 if (agnssIface_V2_0 != nullptr) {
2359 AGnssDispatcher::dataConnClosed(agnssIface_V2_0);
2360 } else if (agnssIface != nullptr) {
2361 AGnssDispatcher::dataConnClosed(agnssIface);
2362 } else {
2363 ALOGE("%s: IAGnss interface not available.", __func__);
2364 return;
2365 }
2366 }
2367
android_location_GnssNetworkConnectivityHandler_agps_data_conn_failed(JNIEnv *,jobject)2368 static void android_location_GnssNetworkConnectivityHandler_agps_data_conn_failed(JNIEnv* /* env */,
2369 jobject /* obj */) {
2370 if (agnssIface_V2_0 != nullptr) {
2371 AGnssDispatcher::dataConnFailed(agnssIface_V2_0);
2372 } else if (agnssIface != nullptr) {
2373 AGnssDispatcher::dataConnFailed(agnssIface);
2374 } else {
2375 ALOGE("%s: IAGnss interface not available.", __func__);
2376 return;
2377 }
2378 }
2379
android_location_gnss_hal_GnssNative_set_agps_server(JNIEnv * env,jclass,jint type,jstring hostname,jint port)2380 static void android_location_gnss_hal_GnssNative_set_agps_server(JNIEnv* env, jclass, jint type,
2381 jstring hostname, jint port) {
2382 if (agnssIface_V2_0 != nullptr) {
2383 AGnssDispatcher::setServer<IAGnss_V2_0, IAGnssCallback_V2_0>(agnssIface_V2_0, env, type,
2384 hostname, port);
2385 } else if (agnssIface != nullptr) {
2386 AGnssDispatcher::setServer<IAGnss_V1_0, IAGnssCallback_V1_0>(agnssIface, env, type,
2387 hostname, port);
2388 } else {
2389 ALOGE("%s: IAGnss interface not available.", __func__);
2390 return;
2391 }
2392 }
2393
android_location_gnss_hal_GnssNative_send_ni_response(JNIEnv *,jclass,jint notifId,jint response)2394 static void android_location_gnss_hal_GnssNative_send_ni_response(JNIEnv* /* env */, jclass,
2395 jint notifId, jint response) {
2396 if (gnssNiIface == nullptr) {
2397 ALOGE("%s: IGnssNi interface not available.", __func__);
2398 return;
2399 }
2400
2401 auto result = gnssNiIface->respond(notifId,
2402 static_cast<IGnssNiCallback::GnssUserResponseType>(response));
2403 checkHidlReturn(result, "IGnssNi respond() failed.");
2404 }
2405
getSatelliteData(const hidl_vec<IGnssDebug_V1_0::SatelliteData> & satelliteDataArray,size_t i)2406 const IGnssDebug_V1_0::SatelliteData& getSatelliteData(
2407 const hidl_vec<IGnssDebug_V1_0::SatelliteData>& satelliteDataArray, size_t i) {
2408 return satelliteDataArray[i];
2409 }
2410
getSatelliteData(const hidl_vec<IGnssDebug_V2_0::SatelliteData> & satelliteDataArray,size_t i)2411 const IGnssDebug_V1_0::SatelliteData& getSatelliteData(
2412 const hidl_vec<IGnssDebug_V2_0::SatelliteData>& satelliteDataArray, size_t i) {
2413 return satelliteDataArray[i].v1_0;
2414 }
2415
2416 template<class T>
getConstellationType(const hidl_vec<T> & satelliteDataArray,size_t i)2417 uint32_t getConstellationType(const hidl_vec<T>& satelliteDataArray, size_t i) {
2418 return static_cast<uint32_t>(satelliteDataArray[i].constellation);
2419 }
2420
2421 template<class T>
parseDebugData(JNIEnv * env,std::stringstream & internalState,const T & data)2422 static jstring parseDebugData(JNIEnv* env, std::stringstream& internalState, const T& data) {
2423 internalState << "Gnss Location Data:: ";
2424 if (!data.position.valid) {
2425 internalState << "not valid";
2426 } else {
2427 internalState << "LatitudeDegrees: " << data.position.latitudeDegrees
2428 << ", LongitudeDegrees: " << data.position.longitudeDegrees
2429 << ", altitudeMeters: " << data.position.altitudeMeters
2430 << ", speedMetersPerSecond: " << data.position.speedMetersPerSec
2431 << ", bearingDegrees: " << data.position.bearingDegrees
2432 << ", horizontalAccuracyMeters: "
2433 << data.position.horizontalAccuracyMeters
2434 << ", verticalAccuracyMeters: " << data.position.verticalAccuracyMeters
2435 << ", speedAccuracyMetersPerSecond: "
2436 << data.position.speedAccuracyMetersPerSecond
2437 << ", bearingAccuracyDegrees: " << data.position.bearingAccuracyDegrees
2438 << ", ageSeconds: " << data.position.ageSeconds;
2439 }
2440 internalState << std::endl;
2441
2442 internalState << "Gnss Time Data:: timeEstimate: " << data.time.timeEstimate
2443 << ", timeUncertaintyNs: " << data.time.timeUncertaintyNs
2444 << ", frequencyUncertaintyNsPerSec: "
2445 << data.time.frequencyUncertaintyNsPerSec << std::endl;
2446
2447 if (data.satelliteDataArray.size() != 0) {
2448 internalState << "Satellite Data for " << data.satelliteDataArray.size()
2449 << " satellites:: " << std::endl;
2450 }
2451
2452 internalState << "constell: 1=GPS, 2=SBAS, 3=GLO, 4=QZSS, 5=BDS, 6=GAL, 7=IRNSS; "
2453 << "ephType: 0=Eph, 1=Alm, 2=Unk; "
2454 << "ephSource: 0=Demod, 1=Supl, 2=Server, 3=Unk; "
2455 << "ephHealth: 0=Good, 1=Bad, 2=Unk" << std::endl;
2456 for (size_t i = 0; i < data.satelliteDataArray.size(); i++) {
2457 IGnssDebug_V1_0::SatelliteData satelliteData =
2458 getSatelliteData(data.satelliteDataArray, i);
2459 internalState << "constell: "
2460 << getConstellationType(data.satelliteDataArray, i)
2461 << ", svid: " << std::setw(3) << satelliteData.svid
2462 << ", serverPredAvail: "
2463 << satelliteData.serverPredictionIsAvailable
2464 << ", serverPredAgeSec: " << std::setw(7)
2465 << satelliteData.serverPredictionAgeSeconds
2466 << ", ephType: "
2467 << static_cast<uint32_t>(satelliteData.ephemerisType)
2468 << ", ephSource: "
2469 << static_cast<uint32_t>(satelliteData.ephemerisSource)
2470 << ", ephHealth: "
2471 << static_cast<uint32_t>(satelliteData.ephemerisHealth)
2472 << ", ephAgeSec: " << std::setw(7)
2473 << satelliteData.ephemerisAgeSeconds << std::endl;
2474 }
2475 return (jstring) env->NewStringUTF(internalState.str().c_str());
2476 }
2477
android_location_gnss_hal_GnssNative_get_internal_state(JNIEnv * env,jclass)2478 static jstring android_location_gnss_hal_GnssNative_get_internal_state(JNIEnv* env, jclass) {
2479 jstring internalStateStr = nullptr;
2480 /*
2481 * TODO: Create a jobject to represent GnssDebug.
2482 */
2483
2484 std::stringstream internalState;
2485
2486 if (gnssDebugIface == nullptr) {
2487 ALOGE("%s: IGnssDebug interface not available.", __func__);
2488 } else if (gnssDebugIface_V2_0 != nullptr) {
2489 IGnssDebug_V2_0::DebugData data;
2490 auto result = gnssDebugIface_V2_0->getDebugData_2_0(
2491 [&data](const IGnssDebug_V2_0::DebugData& debugData) {
2492 data = debugData;
2493 });
2494 if (checkHidlReturn(result, "IGnssDebug getDebugData_2_0() failed.")) {
2495 internalStateStr = parseDebugData(env, internalState, data);
2496 }
2497 } else {
2498 IGnssDebug_V1_0::DebugData data;
2499 auto result = gnssDebugIface->getDebugData(
2500 [&data](const IGnssDebug_V1_0::DebugData& debugData) {
2501 data = debugData;
2502 });
2503 if (checkHidlReturn(result, "IGnssDebug getDebugData() failed.")) {
2504 internalStateStr = parseDebugData(env, internalState, data);
2505 }
2506 }
2507 return internalStateStr;
2508 }
2509
android_location_gnss_hal_GnssNative_request_power_stats(JNIEnv * env)2510 static void android_location_gnss_hal_GnssNative_request_power_stats(JNIEnv* env) {
2511 if (gnssPowerIndicationIface == nullptr) {
2512 return;
2513 }
2514 auto status = gnssPowerIndicationIface->requestGnssPowerStats();
2515 checkAidlStatus(status, "IGnssPowerIndication requestGnssPowerStats() failed.");
2516 }
2517
android_location_gnss_hal_GnssNative_is_gnss_visibility_control_supported(JNIEnv *,jclass)2518 static jboolean android_location_gnss_hal_GnssNative_is_gnss_visibility_control_supported(
2519 JNIEnv* /* env */, jclass) {
2520 return (gnssVisibilityControlIface != nullptr) ? JNI_TRUE : JNI_FALSE;
2521 }
2522
android_location_GnssNetworkConnectivityHandler_update_network_state(JNIEnv * env,jobject,jboolean connected,jint type,jboolean roaming,jboolean available,jstring apn,jlong networkHandle,jshort capabilities)2523 static void android_location_GnssNetworkConnectivityHandler_update_network_state(JNIEnv* env,
2524 jobject /* obj */,
2525 jboolean connected,
2526 jint type,
2527 jboolean roaming,
2528 jboolean available,
2529 jstring apn,
2530 jlong networkHandle,
2531 jshort capabilities) {
2532 if (agnssRilIface_V2_0 != nullptr) {
2533 ScopedJniString jniApn{env, apn};
2534 IAGnssRil_V2_0::NetworkAttributes networkAttributes = {
2535 .networkHandle = static_cast<uint64_t>(networkHandle),
2536 .isConnected = static_cast<bool>(connected),
2537 .capabilities = static_cast<uint16_t>(capabilities),
2538 .apn = jniApn
2539 };
2540
2541 auto result = agnssRilIface_V2_0->updateNetworkState_2_0(networkAttributes);
2542 checkHidlReturn(result, "IAGnssRil updateNetworkState_2_0() failed.");
2543 } else if (agnssRilIface != nullptr) {
2544 ScopedJniString jniApn{env, apn};
2545 hidl_string hidlApn{jniApn};
2546 auto result = agnssRilIface->updateNetworkState(connected,
2547 static_cast<IAGnssRil_V1_0::NetworkType>(type), roaming);
2548 checkHidlReturn(result, "IAGnssRil updateNetworkState() failed.");
2549
2550 if (!hidlApn.empty()) {
2551 result = agnssRilIface->updateNetworkAvailability(available, hidlApn);
2552 checkHidlReturn(result, "IAGnssRil updateNetworkAvailability() failed.");
2553 }
2554 } else {
2555 ALOGE("%s: IAGnssRil interface not available.", __func__);
2556 }
2557 }
2558
android_location_gnss_hal_GnssNative_is_geofence_supported(JNIEnv *,jclass)2559 static jboolean android_location_gnss_hal_GnssNative_is_geofence_supported(JNIEnv* /* env */,
2560 jclass) {
2561 return (gnssGeofencingIface != nullptr) ? JNI_TRUE : JNI_FALSE;
2562 }
2563
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)2564 static jboolean android_location_gnss_hal_GnssNative_add_geofence(
2565 JNIEnv* /* env */, jclass, jint geofenceId, jdouble latitude, jdouble longitude,
2566 jdouble radius, jint last_transition, jint monitor_transition,
2567 jint notification_responsiveness, jint unknown_timer) {
2568 if (gnssGeofencingIface == nullptr) {
2569 ALOGE("%s: IGnssGeofencing interface not available.", __func__);
2570 return JNI_FALSE;
2571 }
2572
2573 auto result = gnssGeofencingIface->addGeofence(
2574 geofenceId, latitude, longitude, radius,
2575 static_cast<IGnssGeofenceCallback::GeofenceTransition>(last_transition),
2576 monitor_transition, notification_responsiveness, unknown_timer);
2577 return checkHidlReturn(result, "IGnssGeofencing addGeofence() failed.");
2578 }
2579
android_location_gnss_hal_GnssNative_remove_geofence(JNIEnv *,jclass,jint geofenceId)2580 static jboolean android_location_gnss_hal_GnssNative_remove_geofence(JNIEnv* /* env */, jclass,
2581 jint geofenceId) {
2582 if (gnssGeofencingIface == nullptr) {
2583 ALOGE("%s: IGnssGeofencing interface not available.", __func__);
2584 return JNI_FALSE;
2585 }
2586
2587 auto result = gnssGeofencingIface->removeGeofence(geofenceId);
2588 return checkHidlReturn(result, "IGnssGeofencing removeGeofence() failed.");
2589 }
2590
android_location_gnss_hal_GnssNative_pause_geofence(JNIEnv *,jclass,jint geofenceId)2591 static jboolean android_location_gnss_hal_GnssNative_pause_geofence(JNIEnv* /* env */, jclass,
2592 jint geofenceId) {
2593 if (gnssGeofencingIface == nullptr) {
2594 ALOGE("%s: IGnssGeofencing interface not available.", __func__);
2595 return JNI_FALSE;
2596 }
2597
2598 auto result = gnssGeofencingIface->pauseGeofence(geofenceId);
2599 return checkHidlReturn(result, "IGnssGeofencing pauseGeofence() failed.");
2600 }
2601
android_location_gnss_hal_GnssNative_resume_geofence(JNIEnv *,jclass,jint geofenceId,jint monitor_transition)2602 static jboolean android_location_gnss_hal_GnssNative_resume_geofence(JNIEnv* /* env */, jclass,
2603 jint geofenceId,
2604 jint monitor_transition) {
2605 if (gnssGeofencingIface == nullptr) {
2606 ALOGE("%s: IGnssGeofencing interface not available.", __func__);
2607 return JNI_FALSE;
2608 }
2609
2610 auto result = gnssGeofencingIface->resumeGeofence(geofenceId, monitor_transition);
2611 return checkHidlReturn(result, "IGnssGeofencing resumeGeofence() failed.");
2612 }
2613
android_location_gnss_hal_GnssNative_is_antenna_info_supported(JNIEnv * env,jclass)2614 static jboolean android_location_gnss_hal_GnssNative_is_antenna_info_supported(JNIEnv* env,
2615 jclass) {
2616 if (gnssAntennaInfoIface != nullptr) {
2617 return JNI_TRUE;
2618 }
2619 return JNI_FALSE;
2620 }
2621
android_location_gnss_hal_GnssNative_start_antenna_info_listening(JNIEnv *,jclass)2622 static jboolean android_location_gnss_hal_GnssNative_start_antenna_info_listening(JNIEnv* /* env */,
2623 jclass) {
2624 if (gnssAntennaInfoIface == nullptr) {
2625 ALOGE("%s: IGnssAntennaInfo interface not available.", __func__);
2626 return JNI_FALSE;
2627 }
2628
2629 sp<GnssAntennaInfoCallback> cbIface = new GnssAntennaInfoCallback();
2630
2631 auto result = gnssAntennaInfoIface->setCallback(cbIface);
2632
2633 if (!checkHidlReturn(result, "IGnssAntennaInfo setCallback() failed.")) {
2634 return JNI_FALSE;
2635 }
2636
2637 IGnssAntennaInfo::GnssAntennaInfoStatus initRet = result;
2638 if (initRet != IGnssAntennaInfo::GnssAntennaInfoStatus::SUCCESS) {
2639 ALOGE("An error has been found on GnssAntennaInfoInterface::init, status=%d",
2640 static_cast<int32_t>(initRet));
2641 return JNI_FALSE;
2642 } else {
2643 ALOGD("gnss antenna info has been enabled");
2644 }
2645
2646 return JNI_TRUE;
2647 }
2648
android_location_gnss_hal_GnssNative_stop_antenna_info_listening(JNIEnv *,jclass)2649 static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening(JNIEnv* /* env */,
2650 jclass) {
2651 if (gnssAntennaInfoIface == nullptr) {
2652 ALOGE("%s: IGnssAntennaInfo interface not available.", __func__);
2653 return JNI_FALSE;
2654 }
2655
2656 auto result = gnssAntennaInfoIface->close();
2657 return checkHidlReturn(result, "IGnssAntennaInfo close() failed.");
2658 }
2659
android_location_gnss_hal_GnssNative_is_measurement_supported(JNIEnv * env,jclass)2660 static jboolean android_location_gnss_hal_GnssNative_is_measurement_supported(JNIEnv* env, jclass) {
2661 if (gnssMeasurementIface != nullptr) {
2662 return JNI_TRUE;
2663 }
2664
2665 return JNI_FALSE;
2666 }
2667
android_location_gnss_hal_GnssNative_start_measurement_collection(JNIEnv *,jclass,jboolean enableFullTracking,jboolean enableCorrVecOutputs)2668 static jboolean android_location_gnss_hal_GnssNative_start_measurement_collection(
2669 JNIEnv* /* env */, jclass, jboolean enableFullTracking, jboolean enableCorrVecOutputs) {
2670 if (gnssMeasurementIface == nullptr) {
2671 ALOGE("%s: IGnssMeasurement interface not available.", __func__);
2672 return JNI_FALSE;
2673 }
2674
2675 return gnssMeasurementIface->setCallback(std::make_unique<gnss::GnssMeasurementCallback>(
2676 mCallbacksObj),
2677 enableFullTracking, enableCorrVecOutputs);
2678 }
2679
android_location_gnss_hal_GnssNative_stop_measurement_collection(JNIEnv * env,jclass)2680 static jboolean android_location_gnss_hal_GnssNative_stop_measurement_collection(JNIEnv* env,
2681 jclass) {
2682 if (gnssMeasurementIface == nullptr) {
2683 ALOGE("%s: IGnssMeasurement interface not available.", __func__);
2684 return JNI_FALSE;
2685 }
2686
2687 return gnssMeasurementIface->close();
2688 }
2689
android_location_gnss_hal_GnssNative_is_measurement_corrections_supported(JNIEnv * env,jclass)2690 static jboolean android_location_gnss_hal_GnssNative_is_measurement_corrections_supported(
2691 JNIEnv* env, jclass) {
2692 if (gnssCorrectionsIface_V1_0 != nullptr || gnssCorrectionsIface_V1_1 != nullptr) {
2693 return JNI_TRUE;
2694 }
2695
2696 return JNI_FALSE;
2697 }
2698
getSingleSatCorrection_1_0_withoutConstellation(JNIEnv * env,jobject singleSatCorrectionObj)2699 static SingleSatCorrection_V1_0 getSingleSatCorrection_1_0_withoutConstellation(
2700 JNIEnv* env, jobject singleSatCorrectionObj) {
2701 jint correctionFlags = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatFlags);
2702 jint satId = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatId);
2703 jfloat carrierFreqHz =
2704 env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatCarrierFreq);
2705 jfloat probSatIsLos =
2706 env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatIsLosProb);
2707 jfloat eplMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEpl);
2708 jfloat eplUncMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEplUnc);
2709 uint16_t corrFlags = static_cast<uint16_t>(correctionFlags);
2710 jobject reflectingPlaneObj;
2711 bool has_ref_plane = (corrFlags & GnssSingleSatCorrectionFlags::HAS_REFLECTING_PLANE) != 0;
2712 if (has_ref_plane) {
2713 reflectingPlaneObj =
2714 env->CallObjectMethod(singleSatCorrectionObj, method_correctionSatRefPlane);
2715 }
2716
2717 ReflectingPlane reflectingPlane;
2718 if (has_ref_plane) {
2719 jdouble latitudeDegreesRefPlane =
2720 env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneLatDeg);
2721 jdouble longitudeDegreesRefPlane =
2722 env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneLngDeg);
2723 jdouble altitudeDegreesRefPlane =
2724 env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneAltDeg);
2725 jdouble azimuthDegreeRefPlane =
2726 env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneAzimDeg);
2727 reflectingPlane = {
2728 .latitudeDegrees = latitudeDegreesRefPlane,
2729 .longitudeDegrees = longitudeDegreesRefPlane,
2730 .altitudeMeters = altitudeDegreesRefPlane,
2731 .azimuthDegrees = azimuthDegreeRefPlane,
2732 };
2733 }
2734
2735 SingleSatCorrection_V1_0 singleSatCorrection = {
2736 .singleSatCorrectionFlags = corrFlags,
2737 .svid = static_cast<uint16_t>(satId),
2738 .carrierFrequencyHz = carrierFreqHz,
2739 .probSatIsLos = probSatIsLos,
2740 .excessPathLengthMeters = eplMeters,
2741 .excessPathLengthUncertaintyMeters = eplUncMeters,
2742 .reflectingPlane = reflectingPlane,
2743 };
2744
2745 return singleSatCorrection;
2746 }
2747
getSingleSatCorrectionList_1_1(JNIEnv * env,jobject singleSatCorrectionList,hidl_vec<SingleSatCorrection_V1_1> & list)2748 static void getSingleSatCorrectionList_1_1(JNIEnv* env, jobject singleSatCorrectionList,
2749 hidl_vec<SingleSatCorrection_V1_1>& list) {
2750 for (uint16_t i = 0; i < list.size(); ++i) {
2751 jobject singleSatCorrectionObj =
2752 env->CallObjectMethod(singleSatCorrectionList, method_correctionListGet, i);
2753
2754 SingleSatCorrection_V1_0 singleSatCorrection_1_0 =
2755 getSingleSatCorrection_1_0_withoutConstellation(env, singleSatCorrectionObj);
2756
2757 jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType);
2758
2759 SingleSatCorrection_V1_1 singleSatCorrection_1_1 = {
2760 .v1_0 = singleSatCorrection_1_0,
2761 .constellation = static_cast<GnssConstellationType_V2_0>(constType),
2762 };
2763
2764 list[i] = singleSatCorrection_1_1;
2765 }
2766 }
2767
getSingleSatCorrectionList_1_0(JNIEnv * env,jobject singleSatCorrectionList,hidl_vec<SingleSatCorrection_V1_0> & list)2768 static void getSingleSatCorrectionList_1_0(JNIEnv* env, jobject singleSatCorrectionList,
2769 hidl_vec<SingleSatCorrection_V1_0>& list) {
2770 for (uint16_t i = 0; i < list.size(); ++i) {
2771 jobject singleSatCorrectionObj =
2772 env->CallObjectMethod(singleSatCorrectionList, method_correctionListGet, i);
2773
2774 SingleSatCorrection_V1_0 singleSatCorrection =
2775 getSingleSatCorrection_1_0_withoutConstellation(env, singleSatCorrectionObj);
2776
2777 jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType);
2778
2779 singleSatCorrection.constellation = static_cast<GnssConstellationType_V1_0>(constType),
2780
2781 list[i] = singleSatCorrection;
2782 }
2783 }
2784
android_location_gnss_hal_GnssNative_inject_measurement_corrections(JNIEnv * env,jclass,jobject correctionsObj)2785 static jboolean android_location_gnss_hal_GnssNative_inject_measurement_corrections(
2786 JNIEnv* env, jclass, jobject correctionsObj) {
2787 if (gnssCorrectionsIface_V1_0 == nullptr && gnssCorrectionsIface_V1_1 == nullptr) {
2788 ALOGW("Trying to inject GNSS measurement corrections on a chipset that does not"
2789 " support them.");
2790 return JNI_FALSE;
2791 }
2792
2793 jobject singleSatCorrectionList = env->CallObjectMethod(correctionsObj,
2794 method_correctionsGetSingleSatCorrectionList);
2795
2796 auto len = (singleSatCorrectionList == nullptr)
2797 ? 0
2798 : env->CallIntMethod(singleSatCorrectionList, method_listSize);
2799 if (len == 0) {
2800 ALOGI("Empty correction list injected....Returning with no HAL injection");
2801 return JNI_TRUE;
2802 }
2803
2804 jdouble latitudeDegreesCorr = env->CallDoubleMethod(
2805 correctionsObj, method_correctionsGetLatitudeDegrees);
2806 jdouble longitudeDegreesCorr = env->CallDoubleMethod(
2807 correctionsObj, method_correctionsGetLongitudeDegrees);
2808 jdouble altitudeDegreesCorr = env->CallDoubleMethod(
2809 correctionsObj, method_correctionsGetAltitudeMeters);
2810 jdouble horizontalPositionUncertaintyMeters = env->CallDoubleMethod(
2811 correctionsObj, method_correctionsGetHorPosUncMeters);
2812 jdouble verticalPositionUncertaintyMeters = env->CallDoubleMethod(
2813 correctionsObj, method_correctionsGetVerPosUncMeters);
2814 jlong toaGpsNanosOfWeek = env->CallLongMethod(
2815 correctionsObj, method_correctionsGetToaGpsNanosecondsOfWeek);
2816
2817 MeasurementCorrections_V1_0 measurementCorrections_1_0 = {
2818 .latitudeDegrees = latitudeDegreesCorr,
2819 .longitudeDegrees = longitudeDegreesCorr,
2820 .altitudeMeters = altitudeDegreesCorr,
2821 .horizontalPositionUncertaintyMeters = horizontalPositionUncertaintyMeters,
2822 .verticalPositionUncertaintyMeters = verticalPositionUncertaintyMeters,
2823 .toaGpsNanosecondsOfWeek = static_cast<uint64_t>(toaGpsNanosOfWeek),
2824 };
2825
2826 if (gnssCorrectionsIface_V1_1 != nullptr) {
2827
2828 jboolean hasEnvironmentBearingCorr = env->CallBooleanMethod(
2829 correctionsObj, method_correctionsHasEnvironmentBearing);
2830 jfloat environmentBearingDegreesCorr = env->CallFloatMethod(
2831 correctionsObj, method_correctionsGetEnvironmentBearingDegrees);
2832 jfloat environmentBearingUncertaintyDegreesCorr = env->CallFloatMethod(
2833 correctionsObj, method_correctionsGetEnvironmentBearingUncertaintyDegrees);
2834
2835 hidl_vec<SingleSatCorrection_V1_1> list(len);
2836 getSingleSatCorrectionList_1_1(env, singleSatCorrectionList, list);
2837
2838 MeasurementCorrections_V1_1 measurementCorrections_1_1 = {
2839 .v1_0 = measurementCorrections_1_0,
2840 .hasEnvironmentBearing = static_cast<bool>(hasEnvironmentBearingCorr),
2841 .environmentBearingDegrees = environmentBearingDegreesCorr,
2842 .environmentBearingUncertaintyDegrees = environmentBearingUncertaintyDegreesCorr,
2843 .satCorrections = list,
2844 };
2845
2846 auto result = gnssCorrectionsIface_V1_1->setCorrections_1_1(measurementCorrections_1_1);
2847 return checkHidlReturn(result, "IMeasurementCorrections 1.1 setCorrections() failed.");
2848 }
2849
2850 hidl_vec<SingleSatCorrection_V1_0> list(len);
2851 getSingleSatCorrectionList_1_0(env, singleSatCorrectionList, list);
2852 measurementCorrections_1_0.satCorrections = list;
2853
2854 auto result = gnssCorrectionsIface_V1_0->setCorrections(measurementCorrections_1_0);
2855 return checkHidlReturn(result, "IMeasurementCorrections 1.0 setCorrections() failed.");
2856 }
2857
android_location_gnss_hal_GnssNative_is_navigation_message_supported(JNIEnv * env,jclass)2858 static jboolean android_location_gnss_hal_GnssNative_is_navigation_message_supported(JNIEnv* env,
2859 jclass) {
2860 if (gnssNavigationMessageIface != nullptr) {
2861 return JNI_TRUE;
2862 }
2863 return JNI_FALSE;
2864 }
2865
android_location_gnss_hal_GnssNative_start_navigation_message_collection(JNIEnv * env,jclass)2866 static jboolean android_location_gnss_hal_GnssNative_start_navigation_message_collection(
2867 JNIEnv* env, jclass) {
2868 if (gnssNavigationMessageIface == nullptr) {
2869 ALOGE("%s: IGnssNavigationMessage interface not available.", __func__);
2870 return JNI_FALSE;
2871 }
2872
2873 sp<IGnssNavigationMessageCallback> gnssNavigationMessageCbIface =
2874 new GnssNavigationMessageCallback();
2875 auto result = gnssNavigationMessageIface->setCallback(gnssNavigationMessageCbIface);
2876 if (!checkHidlReturn(result, "IGnssNavigationMessage setCallback() failed.")) {
2877 return JNI_FALSE;
2878 }
2879
2880 IGnssNavigationMessage::GnssNavigationMessageStatus initRet = result;
2881 if (initRet != IGnssNavigationMessage::GnssNavigationMessageStatus::SUCCESS) {
2882 ALOGE("An error has been found in %s: %d", __FUNCTION__, static_cast<int32_t>(initRet));
2883 return JNI_FALSE;
2884 }
2885
2886 return JNI_TRUE;
2887 }
2888
android_location_gnss_hal_GnssNative_stop_navigation_message_collection(JNIEnv * env,jclass)2889 static jboolean android_location_gnss_hal_GnssNative_stop_navigation_message_collection(JNIEnv* env,
2890 jclass) {
2891 if (gnssNavigationMessageIface == nullptr) {
2892 ALOGE("%s: IGnssNavigationMessage interface not available.", __func__);
2893 return JNI_FALSE;
2894 }
2895
2896 auto result = gnssNavigationMessageIface->close();
2897 return checkHidlReturn(result, "IGnssNavigationMessage close() failed.");
2898 }
2899
android_location_GnssConfiguration_set_emergency_supl_pdn(JNIEnv *,jobject,jint emergencySuplPdn)2900 static jboolean android_location_GnssConfiguration_set_emergency_supl_pdn(JNIEnv*,
2901 jobject,
2902 jint emergencySuplPdn) {
2903 if (gnssConfigurationIface == nullptr) {
2904 ALOGE("%s: IGnssConfiguration interface not available.", __func__);
2905 return JNI_FALSE;
2906 }
2907 return gnssConfigurationIface->setEmergencySuplPdn(emergencySuplPdn);
2908 }
2909
android_location_GnssConfiguration_set_supl_version(JNIEnv *,jobject,jint version)2910 static jboolean android_location_GnssConfiguration_set_supl_version(JNIEnv*,
2911 jobject,
2912 jint version) {
2913 if (gnssConfigurationIface == nullptr) {
2914 ALOGE("%s: IGnssConfiguration interface not available.", __func__);
2915 return JNI_FALSE;
2916 }
2917 return gnssConfigurationIface->setSuplVersion(version);
2918 }
2919
android_location_GnssConfiguration_set_supl_es(JNIEnv *,jobject,jint suplEs)2920 static jboolean android_location_GnssConfiguration_set_supl_es(JNIEnv*,
2921 jobject,
2922 jint suplEs) {
2923 if (gnssConfigurationIface == nullptr) {
2924 ALOGE("%s: IGnssConfiguration interface not available.", __func__);
2925 return JNI_FALSE;
2926 }
2927 return gnssConfigurationIface->setSuplEs(suplEs);
2928 }
2929
android_location_GnssConfiguration_set_supl_mode(JNIEnv *,jobject,jint mode)2930 static jboolean android_location_GnssConfiguration_set_supl_mode(JNIEnv*,
2931 jobject,
2932 jint mode) {
2933 if (gnssConfigurationIface == nullptr) {
2934 ALOGE("%s: IGnssConfiguration interface not available.", __func__);
2935 return JNI_FALSE;
2936 }
2937 return gnssConfigurationIface->setSuplMode(mode);
2938 }
2939
android_location_GnssConfiguration_set_gps_lock(JNIEnv *,jobject,jint gpsLock)2940 static jboolean android_location_GnssConfiguration_set_gps_lock(JNIEnv*,
2941 jobject,
2942 jint gpsLock) {
2943 if (gnssConfigurationIface == nullptr) {
2944 ALOGE("%s: IGnssConfiguration interface not available.", __func__);
2945 return JNI_FALSE;
2946 }
2947 return gnssConfigurationIface->setGpsLock(gpsLock);
2948 }
2949
android_location_GnssConfiguration_set_lpp_profile(JNIEnv *,jobject,jint lppProfile)2950 static jboolean android_location_GnssConfiguration_set_lpp_profile(JNIEnv*,
2951 jobject,
2952 jint lppProfile) {
2953 if (gnssConfigurationIface == nullptr) {
2954 ALOGE("%s: IGnssConfiguration interface not available.", __func__);
2955 return JNI_FALSE;
2956 }
2957 return gnssConfigurationIface->setLppProfile(lppProfile);
2958 }
2959
android_location_GnssConfiguration_set_gnss_pos_protocol_select(JNIEnv *,jobject,jint gnssPosProtocol)2960 static jboolean android_location_GnssConfiguration_set_gnss_pos_protocol_select(JNIEnv*,
2961 jobject,
2962 jint gnssPosProtocol) {
2963 if (gnssConfigurationIface == nullptr) {
2964 ALOGE("%s: IGnssConfiguration interface not available.", __func__);
2965 return JNI_FALSE;
2966 }
2967 return gnssConfigurationIface->setGlonassPositioningProtocol(gnssPosProtocol);
2968 }
2969
android_location_GnssConfiguration_set_satellite_blocklist(JNIEnv * env,jobject,jintArray constellations,jintArray sv_ids)2970 static jboolean android_location_GnssConfiguration_set_satellite_blocklist(JNIEnv* env, jobject,
2971 jintArray constellations,
2972 jintArray sv_ids) {
2973 if (gnssConfigurationIface == nullptr) {
2974 ALOGI("IGnssConfiguration interface does not support satellite blocklist.");
2975 return JNI_FALSE;
2976 }
2977 return gnssConfigurationIface->setBlocklist(env, constellations, sv_ids);
2978 }
2979
android_location_GnssConfiguration_set_es_extension_sec(JNIEnv *,jobject,jint emergencyExtensionSeconds)2980 static jboolean android_location_GnssConfiguration_set_es_extension_sec(
2981 JNIEnv*, jobject, jint emergencyExtensionSeconds) {
2982 if (gnssConfigurationIface == nullptr) {
2983 ALOGE("%s: IGnssConfiguration interface not available.", __func__);
2984 return JNI_FALSE;
2985 }
2986 return gnssConfigurationIface->setEsExtensionSec(emergencyExtensionSeconds);
2987 }
2988
android_location_gnss_hal_GnssNative_get_batch_size(JNIEnv *)2989 static jint android_location_gnss_hal_GnssNative_get_batch_size(JNIEnv*) {
2990 if (gnssBatchingIface == nullptr) {
2991 return 0; // batching not supported, size = 0
2992 }
2993 auto result = gnssBatchingIface->getBatchSize();
2994 if (!checkHidlReturn(result, "IGnssBatching getBatchSize() failed.")) {
2995 return 0; // failure in binder, don't support batching
2996 }
2997
2998 return static_cast<jint>(result);
2999 }
3000
android_location_gnss_hal_GnssNative_init_batching(JNIEnv *,jclass)3001 static jboolean android_location_gnss_hal_GnssNative_init_batching(JNIEnv*, jclass) {
3002 if (gnssBatchingIface_V2_0 != nullptr) {
3003 sp<IGnssBatchingCallback_V2_0> gnssBatchingCbIface_V2_0 = new GnssBatchingCallback_V2_0();
3004 auto result = gnssBatchingIface_V2_0->init_2_0(gnssBatchingCbIface_V2_0);
3005 return checkHidlReturn(result, "IGnssBatching init_2_0() failed.");
3006 } else if (gnssBatchingIface != nullptr) {
3007 sp<IGnssBatchingCallback_V1_0> gnssBatchingCbIface_V1_0 = new GnssBatchingCallback_V1_0();
3008 auto result = gnssBatchingIface->init(gnssBatchingCbIface_V1_0);
3009 return checkHidlReturn(result, "IGnssBatching init() failed.");
3010 } else {
3011 return JNI_FALSE; // batching not supported
3012 }
3013 }
3014
android_location_gnss_hal_GnssNative_cleanup_batching(JNIEnv *,jclass)3015 static void android_location_gnss_hal_GnssNative_cleanup_batching(JNIEnv*, jclass) {
3016 if (gnssBatchingIface == nullptr) {
3017 return; // batching not supported
3018 }
3019 auto result = gnssBatchingIface->cleanup();
3020 checkHidlReturn(result, "IGnssBatching cleanup() failed.");
3021 }
3022
android_location_gnss_hal_GnssNative_start_batch(JNIEnv *,jclass,jlong periodNanos,jboolean wakeOnFifoFull)3023 static jboolean android_location_gnss_hal_GnssNative_start_batch(JNIEnv*, jclass, jlong periodNanos,
3024 jboolean wakeOnFifoFull) {
3025 if (gnssBatchingIface == nullptr) {
3026 return JNI_FALSE; // batching not supported
3027 }
3028
3029 IGnssBatching_V1_0::Options options;
3030 options.periodNanos = periodNanos;
3031 if (wakeOnFifoFull) {
3032 options.flags = static_cast<uint8_t>(IGnssBatching_V1_0::Flag::WAKEUP_ON_FIFO_FULL);
3033 } else {
3034 options.flags = 0;
3035 }
3036
3037 auto result = gnssBatchingIface->start(options);
3038 return checkHidlReturn(result, "IGnssBatching start() failed.");
3039 }
3040
android_location_gnss_hal_GnssNative_flush_batch(JNIEnv *,jclass)3041 static void android_location_gnss_hal_GnssNative_flush_batch(JNIEnv*, jclass) {
3042 if (gnssBatchingIface == nullptr) {
3043 return; // batching not supported
3044 }
3045 auto result = gnssBatchingIface->flush();
3046 checkHidlReturn(result, "IGnssBatching flush() failed.");
3047 }
3048
android_location_gnss_hal_GnssNative_stop_batch(JNIEnv *,jclass)3049 static jboolean android_location_gnss_hal_GnssNative_stop_batch(JNIEnv*, jclass) {
3050 if (gnssBatchingIface == nullptr) {
3051 return JNI_FALSE; // batching not supported
3052 }
3053 auto result = gnssBatchingIface->stop();
3054 return checkHidlReturn(result, "IGnssBatching stop() failed.");
3055 }
3056
android_location_GnssVisibilityControl_enable_nfw_location_access(JNIEnv * env,jobject,jobjectArray proxyApps)3057 static jboolean android_location_GnssVisibilityControl_enable_nfw_location_access(
3058 JNIEnv* env, jobject, jobjectArray proxyApps) {
3059 if (gnssVisibilityControlIface == nullptr) {
3060 ALOGI("IGnssVisibilityControl interface not available.");
3061 return JNI_FALSE;
3062 }
3063
3064 const jsize length = env->GetArrayLength(proxyApps);
3065 hidl_vec<hidl_string> hidlProxyApps(length);
3066 for (int i = 0; i < length; ++i) {
3067 jstring proxyApp = (jstring) (env->GetObjectArrayElement(proxyApps, i));
3068 ScopedJniString jniProxyApp(env, proxyApp);
3069 hidlProxyApps[i] = jniProxyApp;
3070 }
3071
3072 auto result = gnssVisibilityControlIface->enableNfwLocationAccess(hidlProxyApps);
3073 return checkHidlReturn(result, "IGnssVisibilityControl enableNfwLocationAccess() failed.");
3074 }
3075
3076 static const JNINativeMethod sCoreMethods[] = {
3077 /* name, signature, funcPtr */
3078 {"native_class_init_once", "()V",
3079 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_class_init_once)},
3080 {"native_is_supported", "()Z",
3081 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_is_supported)},
3082 {"native_init_once", "(Z)V",
3083 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_init_once)},
3084 };
3085
3086 static const JNINativeMethod sLocationProviderMethods[] = {
3087 /* name, signature, funcPtr */
3088 {"native_init", "()Z", reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_init)},
3089 {"native_cleanup", "()V",
3090 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_cleanup)},
3091 {"native_set_position_mode", "(IIIIIZ)Z",
3092 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_set_position_mode)},
3093 {"native_start", "()Z",
3094 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_start)},
3095 {"native_stop", "()Z", reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_stop)},
3096 {"native_delete_aiding_data", "(I)V",
3097 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_delete_aiding_data)},
3098 {"native_read_nmea", "([BI)I",
3099 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_read_nmea)},
3100 {"native_inject_time", "(JJI)V",
3101 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_time)},
3102 {"native_inject_best_location", "(IDDDFFFFFFJIJD)V",
3103 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_best_location)},
3104 {"native_inject_location", "(DDF)V",
3105 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_location)},
3106 {"native_supports_psds", "()Z",
3107 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_supports_psds)},
3108 {"native_inject_psds_data", "([BII)V",
3109 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_psds_data)},
3110 {"native_agps_set_id", "(ILjava/lang/String;)V",
3111 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_agps_set_id)},
3112 {"native_agps_set_ref_location_cellid", "(IIIII)V",
3113 reinterpret_cast<void*>(
3114 android_location_gnss_hal_GnssNative_agps_set_reference_location_cellid)},
3115 {"native_set_agps_server", "(ILjava/lang/String;I)V",
3116 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_set_agps_server)},
3117 {"native_send_ni_response", "(II)V",
3118 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_send_ni_response)},
3119 {"native_get_internal_state", "()Ljava/lang/String;",
3120 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_get_internal_state)},
3121 {"native_is_gnss_visibility_control_supported", "()Z",
3122 reinterpret_cast<void*>(
3123 android_location_gnss_hal_GnssNative_is_gnss_visibility_control_supported)},
3124 };
3125
3126 static const JNINativeMethod sBatchingMethods[] = {
3127 /* name, signature, funcPtr */
3128 {"native_get_batch_size", "()I",
3129 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_get_batch_size)},
3130 {"native_start_batch", "(JZ)Z",
3131 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_start_batch)},
3132 {"native_flush_batch", "()V",
3133 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_flush_batch)},
3134 {"native_stop_batch", "()Z",
3135 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_stop_batch)},
3136 {"native_init_batching", "()Z",
3137 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_init_batching)},
3138 {"native_cleanup_batching", "()V",
3139 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_cleanup_batching)},
3140 };
3141
3142 static const JNINativeMethod sAntennaInfoMethods[] = {
3143 /* name, signature, funcPtr */
3144 {"native_is_antenna_info_supported", "()Z",
3145 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_is_antenna_info_supported)},
3146 {"native_start_antenna_info_listening", "()Z",
3147 reinterpret_cast<void*>(
3148 android_location_gnss_hal_GnssNative_start_antenna_info_listening)},
3149 {"native_stop_antenna_info_listening", "()Z",
3150 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_stop_antenna_info_listening)},
3151 };
3152
3153 static const JNINativeMethod sGeofenceMethods[] = {
3154 /* name, signature, funcPtr */
3155 {"native_is_geofence_supported", "()Z",
3156 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_is_geofence_supported)},
3157 {"native_add_geofence", "(IDDDIIII)Z",
3158 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_add_geofence)},
3159 {"native_remove_geofence", "(I)Z",
3160 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_remove_geofence)},
3161 {"native_pause_geofence", "(I)Z",
3162 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_pause_geofence)},
3163 {"native_resume_geofence", "(II)Z",
3164 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_resume_geofence)},
3165 };
3166
3167 static const JNINativeMethod sMeasurementMethods[] = {
3168 /* name, signature, funcPtr */
3169 {"native_is_measurement_supported", "()Z",
3170 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_is_measurement_supported)},
3171 {"native_start_measurement_collection", "(ZZ)Z",
3172 reinterpret_cast<void*>(
3173 android_location_gnss_hal_GnssNative_start_measurement_collection)},
3174 {"native_stop_measurement_collection", "()Z",
3175 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_stop_measurement_collection)},
3176 };
3177
3178 static const JNINativeMethod sMeasurementCorrectionsMethods[] = {
3179 /* name, signature, funcPtr */
3180 {"native_is_measurement_corrections_supported", "()Z",
3181 reinterpret_cast<void*>(
3182 android_location_gnss_hal_GnssNative_is_measurement_corrections_supported)},
3183 {"native_inject_measurement_corrections",
3184 "(Landroid/location/GnssMeasurementCorrections;)Z",
3185 reinterpret_cast<void*>(
3186 android_location_gnss_hal_GnssNative_inject_measurement_corrections)},
3187 };
3188
3189 static const JNINativeMethod sNavigationMessageMethods[] = {
3190 /* name, signature, funcPtr */
3191 {"native_is_navigation_message_supported", "()Z",
3192 reinterpret_cast<void*>(
3193 android_location_gnss_hal_GnssNative_is_navigation_message_supported)},
3194 {"native_start_navigation_message_collection", "()Z",
3195 reinterpret_cast<void*>(
3196 android_location_gnss_hal_GnssNative_start_navigation_message_collection)},
3197 {"native_stop_navigation_message_collection", "()Z",
3198 reinterpret_cast<void*>(
3199 android_location_gnss_hal_GnssNative_stop_navigation_message_collection)},
3200 };
3201
3202 static const JNINativeMethod sNetworkConnectivityMethods[] = {
3203 /* name, signature, funcPtr */
3204 {"native_is_agps_ril_supported", "()Z",
3205 reinterpret_cast<void*>(
3206 android_location_GnssNetworkConnectivityHandler_is_agps_ril_supported)},
3207 {"native_update_network_state", "(ZIZZLjava/lang/String;JS)V",
3208 reinterpret_cast<void*>(
3209 android_location_GnssNetworkConnectivityHandler_update_network_state)},
3210 {"native_agps_data_conn_open", "(JLjava/lang/String;I)V",
3211 reinterpret_cast<void*>(
3212 android_location_GnssNetworkConnectivityHandler_agps_data_conn_open)},
3213 {"native_agps_data_conn_closed", "()V",
3214 reinterpret_cast<void*>(
3215 android_location_GnssNetworkConnectivityHandler_agps_data_conn_closed)},
3216 {"native_agps_data_conn_failed", "()V",
3217 reinterpret_cast<void*>(
3218 android_location_GnssNetworkConnectivityHandler_agps_data_conn_failed)},
3219 };
3220
3221 static const JNINativeMethod sConfigurationMethods[] = {
3222 /* name, signature, funcPtr */
3223 {"native_get_gnss_configuration_version",
3224 "()Lcom/android/server/location/gnss/GnssConfiguration$HalInterfaceVersion;",
3225 reinterpret_cast<void*>(
3226 android_location_GnssConfiguration_get_gnss_configuration_version)},
3227 {"native_set_supl_es", "(I)Z",
3228 reinterpret_cast<void*>(android_location_GnssConfiguration_set_supl_es)},
3229 {"native_set_supl_version", "(I)Z",
3230 reinterpret_cast<void*>(android_location_GnssConfiguration_set_supl_version)},
3231 {"native_set_supl_mode", "(I)Z",
3232 reinterpret_cast<void*>(android_location_GnssConfiguration_set_supl_mode)},
3233 {"native_set_lpp_profile", "(I)Z",
3234 reinterpret_cast<void*>(android_location_GnssConfiguration_set_lpp_profile)},
3235 {"native_set_gnss_pos_protocol_select", "(I)Z",
3236 reinterpret_cast<void*>(android_location_GnssConfiguration_set_gnss_pos_protocol_select)},
3237 {"native_set_gps_lock", "(I)Z",
3238 reinterpret_cast<void*>(android_location_GnssConfiguration_set_gps_lock)},
3239 {"native_set_emergency_supl_pdn", "(I)Z",
3240 reinterpret_cast<void*>(android_location_GnssConfiguration_set_emergency_supl_pdn)},
3241 {"native_set_satellite_blocklist", "([I[I)Z",
3242 reinterpret_cast<void*>(android_location_GnssConfiguration_set_satellite_blocklist)},
3243 {"native_set_es_extension_sec", "(I)Z",
3244 reinterpret_cast<void*>(android_location_GnssConfiguration_set_es_extension_sec)},
3245 };
3246
3247 static const JNINativeMethod sVisibilityControlMethods[] = {
3248 /* name, signature, funcPtr */
3249 {"native_enable_nfw_location_access", "([Ljava/lang/String;)Z",
3250 reinterpret_cast<void*>(
3251 android_location_GnssVisibilityControl_enable_nfw_location_access)},
3252 };
3253
3254 static const JNINativeMethod sPowerIndicationMethods[] = {
3255 /* name, signature, funcPtr */
3256 {"native_request_power_stats", "()V",
3257 reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_request_power_stats)},
3258 };
3259
register_android_server_location_GnssLocationProvider(JNIEnv * env)3260 int register_android_server_location_GnssLocationProvider(JNIEnv* env) {
3261 int res;
3262
3263 res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
3264 sAntennaInfoMethods, NELEM(sAntennaInfoMethods));
3265 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3266
3267 res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
3268 sBatchingMethods, NELEM(sBatchingMethods));
3269 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3270
3271 res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
3272 sGeofenceMethods, NELEM(sGeofenceMethods));
3273 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3274
3275 res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
3276 sMeasurementMethods, NELEM(sMeasurementMethods));
3277 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3278
3279 res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
3280 sMeasurementCorrectionsMethods,
3281 NELEM(sMeasurementCorrectionsMethods));
3282 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3283
3284 res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
3285 sNavigationMessageMethods, NELEM(sNavigationMessageMethods));
3286 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3287
3288 res = jniRegisterNativeMethods(env,
3289 "com/android/server/location/gnss/"
3290 "GnssNetworkConnectivityHandler",
3291 sNetworkConnectivityMethods, NELEM(sNetworkConnectivityMethods));
3292 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3293
3294 res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/GnssConfiguration",
3295 sConfigurationMethods, NELEM(sConfigurationMethods));
3296 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3297
3298 res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/GnssVisibilityControl",
3299 sVisibilityControlMethods, NELEM(sVisibilityControlMethods));
3300 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3301
3302 res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
3303 sPowerIndicationMethods, NELEM(sPowerIndicationMethods));
3304 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3305
3306 res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
3307 sLocationProviderMethods, NELEM(sLocationProviderMethods));
3308 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3309
3310 res = jniRegisterNativeMethods(env, "com/android/server/location/gnss/hal/GnssNative",
3311 sCoreMethods, NELEM(sCoreMethods));
3312 LOG_FATAL_IF(res < 0, "Unable to register native methods.");
3313
3314 return 0;
3315 }
3316
3317 } /* namespace android */
3318