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