• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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 before <log/log.h> to overwrite the default value.
18 #define LOG_TAG "GnssJni"
19 
20 #include "Gnss.h"
21 
22 #include <binder/IServiceManager.h>
23 
24 #include "Utils.h"
25 
26 namespace android::gnss {
27 
28 using hardware::Return;
29 
30 using GnssLocationAidl = hardware::gnss::GnssLocation;
31 using GnssLocation_V1_0 = hardware::gnss::V1_0::GnssLocation;
32 using GnssLocation_V2_0 = hardware::gnss::V2_0::GnssLocation;
33 using IAGnssAidl = hardware::gnss::IAGnss;
34 using IAGnssRilAidl = hardware::gnss::IAGnssRil;
35 using IGnssAidl = hardware::gnss::IGnss;
36 using IGnss_V1_0 = hardware::gnss::V1_0::IGnss;
37 using IGnss_V1_1 = hardware::gnss::V1_1::IGnss;
38 using IGnss_V2_0 = hardware::gnss::V2_0::IGnss;
39 using IGnss_V2_1 = hardware::gnss::V2_1::IGnss;
40 using IGnssAntennaInfoAidl = hardware::gnss::IGnssAntennaInfo;
41 using IGnssCallbackAidl = hardware::gnss::IGnssCallback;
42 using IGnssCallback_V1_0 = hardware::gnss::V1_0::IGnssCallback;
43 using IGnssCallback_V2_0 = hardware::gnss::V2_0::IGnssCallback;
44 using IGnssCallback_V2_1 = hardware::gnss::V2_1::IGnssCallback;
45 using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration;
46 using IGnssDebugAidl = hardware::gnss::IGnssDebug;
47 using android::hardware::gnss::IGnssPsds;
48 
49 namespace {
50 
createGnssLocation(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)51 GnssLocationAidl createGnssLocation(jint gnssLocationFlags, jdouble latitudeDegrees,
52                                     jdouble longitudeDegrees, jdouble altitudeMeters,
53                                     jfloat speedMetersPerSec, jfloat bearingDegrees,
54                                     jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
55                                     jfloat speedAccuracyMetersPerSecond,
56                                     jfloat bearingAccuracyDegrees, jlong timestamp,
57                                     jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
58                                     jdouble elapsedRealtimeUncertaintyNanos) {
59     GnssLocationAidl location;
60     location.gnssLocationFlags = static_cast<int>(gnssLocationFlags);
61     location.latitudeDegrees = static_cast<double>(latitudeDegrees);
62     location.longitudeDegrees = static_cast<double>(longitudeDegrees);
63     location.altitudeMeters = static_cast<double>(altitudeMeters);
64     location.speedMetersPerSec = static_cast<double>(speedMetersPerSec);
65     location.bearingDegrees = static_cast<double>(bearingDegrees);
66     location.horizontalAccuracyMeters = static_cast<double>(horizontalAccuracyMeters);
67     location.verticalAccuracyMeters = static_cast<double>(verticalAccuracyMeters);
68     location.speedAccuracyMetersPerSecond = static_cast<double>(speedAccuracyMetersPerSecond);
69     location.bearingAccuracyDegrees = static_cast<double>(bearingAccuracyDegrees);
70     location.timestampMillis = static_cast<uint64_t>(timestamp);
71 
72     location.elapsedRealtime.flags = static_cast<int>(elapsedRealtimeFlags);
73     location.elapsedRealtime.timestampNs = static_cast<uint64_t>(elapsedRealtimeNanos);
74     location.elapsedRealtime.timeUncertaintyNs =
75             static_cast<double>(elapsedRealtimeUncertaintyNanos);
76 
77     return location;
78 }
79 
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)80 GnssLocation_V1_0 createGnssLocation_V1_0(jint gnssLocationFlags, jdouble latitudeDegrees,
81                                           jdouble longitudeDegrees, jdouble altitudeMeters,
82                                           jfloat speedMetersPerSec, jfloat bearingDegrees,
83                                           jfloat horizontalAccuracyMeters,
84                                           jfloat verticalAccuracyMeters,
85                                           jfloat speedAccuracyMetersPerSecond,
86                                           jfloat bearingAccuracyDegrees, jlong timestamp) {
87     GnssLocation_V1_0 location;
88     location.gnssLocationFlags = static_cast<uint16_t>(gnssLocationFlags);
89     location.latitudeDegrees = static_cast<double>(latitudeDegrees);
90     location.longitudeDegrees = static_cast<double>(longitudeDegrees);
91     location.altitudeMeters = static_cast<double>(altitudeMeters);
92     location.speedMetersPerSec = static_cast<float>(speedMetersPerSec);
93     location.bearingDegrees = static_cast<float>(bearingDegrees);
94     location.horizontalAccuracyMeters = static_cast<float>(horizontalAccuracyMeters);
95     location.verticalAccuracyMeters = static_cast<float>(verticalAccuracyMeters);
96     location.speedAccuracyMetersPerSecond = static_cast<float>(speedAccuracyMetersPerSecond);
97     location.bearingAccuracyDegrees = static_cast<float>(bearingAccuracyDegrees);
98     location.timestamp = static_cast<uint64_t>(timestamp);
99 
100     return location;
101 }
102 
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)103 GnssLocation_V2_0 createGnssLocation_V2_0(jint gnssLocationFlags, jdouble latitudeDegrees,
104                                           jdouble longitudeDegrees, jdouble altitudeMeters,
105                                           jfloat speedMetersPerSec, jfloat bearingDegrees,
106                                           jfloat horizontalAccuracyMeters,
107                                           jfloat verticalAccuracyMeters,
108                                           jfloat speedAccuracyMetersPerSecond,
109                                           jfloat bearingAccuracyDegrees, jlong timestamp,
110                                           jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
111                                           jdouble elapsedRealtimeUncertaintyNanos) {
112     GnssLocation_V2_0 location;
113     location.v1_0 = createGnssLocation_V1_0(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
114                                             altitudeMeters, speedMetersPerSec, bearingDegrees,
115                                             horizontalAccuracyMeters, verticalAccuracyMeters,
116                                             speedAccuracyMetersPerSecond, bearingAccuracyDegrees,
117                                             timestamp);
118 
119     location.elapsedRealtime.flags = static_cast<uint16_t>(elapsedRealtimeFlags);
120     location.elapsedRealtime.timestampNs = static_cast<uint64_t>(elapsedRealtimeNanos);
121     location.elapsedRealtime.timeUncertaintyNs =
122             static_cast<uint64_t>(elapsedRealtimeUncertaintyNanos);
123 
124     return location;
125 }
126 
127 } // anonymous namespace
128 
129 // Implementation of GnssHal, which unifies all versions of GNSS HALs
130 
GnssHal()131 GnssHal::GnssHal() {
132     gnssHalAidl = waitForVintfService<IGnssAidl>();
133     if (gnssHalAidl != nullptr) {
134         ALOGD("Successfully got GNSS AIDL handle. Version=%d.", gnssHalAidl->getInterfaceVersion());
135         if (gnssHalAidl->getInterfaceVersion() >= 2) {
136             return;
137         }
138     }
139 
140     ALOGD("Trying IGnss_V2_1::getService()");
141     gnssHal_V2_1 = IGnss_V2_1::getService();
142     if (gnssHal_V2_1 != nullptr) {
143         gnssHal_V2_0 = gnssHal_V2_1;
144         gnssHal_V1_1 = gnssHal_V2_1;
145         gnssHal = gnssHal_V2_1;
146         return;
147     }
148 
149     ALOGD("gnssHal 2.1 was null, trying 2.0");
150     gnssHal_V2_0 = IGnss_V2_0::getService();
151     if (gnssHal_V2_0 != nullptr) {
152         gnssHal_V1_1 = gnssHal_V2_0;
153         gnssHal = gnssHal_V2_0;
154         return;
155     }
156 
157     ALOGD("gnssHal 2.0 was null, trying 1.1");
158     gnssHal_V1_1 = IGnss_V1_1::getService();
159     if (gnssHal_V1_1 != nullptr) {
160         gnssHal = gnssHal_V1_1;
161         return;
162     }
163 
164     ALOGD("gnssHal 1.1 was null, trying 1.0");
165     gnssHal = IGnss_V1_0::getService();
166 }
167 
isSupported()168 jboolean GnssHal::isSupported() {
169     return (gnssHalAidl != nullptr || gnssHal != nullptr) ? JNI_TRUE : JNI_FALSE;
170 }
171 
linkToDeath()172 void GnssHal::linkToDeath() {
173     if (gnssHalAidl != nullptr) {
174         gnssHalDeathRecipientAidl = new GnssDeathRecipientAidl();
175         status_t linked = IInterface::asBinder(gnssHalAidl)->linkToDeath(gnssHalDeathRecipientAidl);
176         if (linked != OK) {
177             ALOGE("Unable to link to GNSS AIDL HAL death notification");
178         } else {
179             ALOGD("Successfully linked to GNSS AIDL HAl death notification");
180         }
181     }
182 
183     if (gnssHal != nullptr) {
184         gnssHalDeathRecipient = new GnssDeathRecipient();
185         hardware::Return<bool> linked = gnssHal->linkToDeath(gnssHalDeathRecipient, /*cookie*/ 0);
186         if (!linked.isOk()) {
187             ALOGE("Transaction error in linking to GnssHAL death: %s",
188                   linked.description().c_str());
189         } else if (!linked) {
190             ALOGW("Unable to link to GnssHal death notifications");
191         } else {
192             ALOGD("Link to death notification successful");
193         }
194     }
195 }
196 
setCallback()197 jboolean GnssHal::setCallback() {
198     if (gnssHalAidl != nullptr) {
199         sp<IGnssCallbackAidl> gnssCbIfaceAidl = new GnssCallbackAidl();
200         auto status = gnssHalAidl->setCallback(gnssCbIfaceAidl);
201         if (!checkAidlStatus(status, "IGnssAidl setCallback() failed.")) {
202             return JNI_FALSE;
203         }
204     }
205     if (gnssHal != nullptr) {
206         Return<bool> result = false;
207         sp<IGnssCallback_V2_1> gnssCbIface = new GnssCallbackHidl();
208         if (gnssHal_V2_1 != nullptr) {
209             result = gnssHal_V2_1->setCallback_2_1(gnssCbIface);
210         } else if (gnssHal_V2_0 != nullptr) {
211             result = gnssHal_V2_0->setCallback_2_0(gnssCbIface);
212         } else if (gnssHal_V1_1 != nullptr) {
213             result = gnssHal_V1_1->setCallback_1_1(gnssCbIface);
214         } else {
215             result = gnssHal->setCallback(gnssCbIface);
216         }
217         if (!checkHidlReturn(result, "IGnss setCallback() failed.")) {
218             return JNI_FALSE;
219         }
220     }
221     return JNI_TRUE;
222 }
223 
close()224 void GnssHal::close() {
225     if (gnssHalAidl != nullptr) {
226         auto status = gnssHalAidl->close();
227         checkAidlStatus(status, "IGnssAidl close() failed.");
228     }
229 
230     if (gnssHal != nullptr) {
231         auto result = gnssHal->cleanup();
232         checkHidlReturn(result, "IGnss cleanup() failed.");
233     }
234 }
235 
start()236 jboolean GnssHal::start() {
237     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
238         auto status = gnssHalAidl->start();
239         return checkAidlStatus(status, "IGnssAidl start() failed.");
240     }
241 
242     if (gnssHal == nullptr) {
243         return JNI_FALSE;
244     }
245 
246     auto result = gnssHal->start();
247     return checkHidlReturn(result, "IGnss start() failed.");
248 }
249 
stop()250 jboolean GnssHal::stop() {
251     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
252         auto status = gnssHalAidl->stop();
253         return checkAidlStatus(status, "IGnssAidl stop() failed.");
254     }
255 
256     if (gnssHal == nullptr) {
257         return JNI_FALSE;
258     }
259 
260     auto result = gnssHal->stop();
261     return checkHidlReturn(result, "IGnss stop() failed.");
262 }
263 
startSvStatus()264 jboolean GnssHal::startSvStatus() {
265     isSvStatusRegistered = true;
266     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
267         auto status = gnssHalAidl->startSvStatus();
268         return checkAidlStatus(status, "IGnssAidl startSvStatus() failed.");
269     }
270     if (gnssHal == nullptr) {
271         return JNI_FALSE;
272     }
273     return JNI_TRUE;
274 }
275 
stopSvStatus()276 jboolean GnssHal::stopSvStatus() {
277     isSvStatusRegistered = false;
278     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
279         auto status = gnssHalAidl->stopSvStatus();
280         return checkAidlStatus(status, "IGnssAidl stopSvStatus() failed.");
281     }
282     if (gnssHal == nullptr) {
283         return JNI_FALSE;
284     }
285     return JNI_TRUE;
286 }
287 
startNmea()288 jboolean GnssHal::startNmea() {
289     isNmeaRegistered = true;
290     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
291         auto status = gnssHalAidl->startNmea();
292         return checkAidlStatus(status, "IGnssAidl startNmea() failed.");
293     }
294     if (gnssHal == nullptr) {
295         return JNI_FALSE;
296     }
297     return JNI_TRUE;
298 }
299 
stopNmea()300 jboolean GnssHal::stopNmea() {
301     isNmeaRegistered = false;
302     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
303         auto status = gnssHalAidl->stopNmea();
304         return checkAidlStatus(status, "IGnssAidl stopNmea() failed.");
305     }
306     if (gnssHal == nullptr) {
307         return JNI_FALSE;
308     }
309     return JNI_TRUE;
310 }
311 
readNmea(jbyteArray & nmeaArray,jint & buffer_size)312 jint GnssHal::readNmea(jbyteArray& nmeaArray, jint& buffer_size) {
313     // this should only be called from within a call to reportNmea
314     JNIEnv* env = getJniEnv();
315     jbyte* nmea = reinterpret_cast<jbyte*>(env->GetPrimitiveArrayCritical(nmeaArray, 0));
316     int length = GnssCallbackHidl::sNmeaStringLength;
317     if (length > buffer_size) {
318         length = buffer_size;
319     }
320     memcpy(nmea, GnssCallbackHidl::sNmeaString, length);
321     env->ReleasePrimitiveArrayCritical(nmeaArray, nmea, JNI_ABORT);
322     return (jint)length;
323 }
324 
setPositionMode(jint mode,jint recurrence,jint min_interval,jint preferred_accuracy,jint preferred_time,jboolean low_power_mode)325 jboolean GnssHal::setPositionMode(jint mode, jint recurrence, jint min_interval,
326                                   jint preferred_accuracy, jint preferred_time,
327                                   jboolean low_power_mode) {
328     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
329         IGnssAidl::PositionModeOptions options;
330         options.mode = static_cast<IGnssAidl::GnssPositionMode>(mode);
331         options.recurrence = static_cast<IGnssAidl::GnssPositionRecurrence>(recurrence);
332         options.minIntervalMs = min_interval;
333         options.preferredAccuracyMeters = preferred_accuracy;
334         options.preferredTimeMs = preferred_time;
335         options.lowPowerMode = low_power_mode;
336         auto status = gnssHalAidl->setPositionMode(options);
337         return checkAidlStatus(status, "IGnssAidl setPositionMode() failed.");
338     }
339 
340     Return<bool> result = false;
341     if (gnssHal_V1_1 != nullptr) {
342         result = gnssHal_V1_1->setPositionMode_1_1(static_cast<IGnss_V1_0::GnssPositionMode>(mode),
343                                                    static_cast<IGnss_V1_0::GnssPositionRecurrence>(
344                                                            recurrence),
345                                                    min_interval, preferred_accuracy, preferred_time,
346                                                    low_power_mode);
347     } else if (gnssHal != nullptr) {
348         result = gnssHal->setPositionMode(static_cast<IGnss_V1_0::GnssPositionMode>(mode),
349                                           static_cast<IGnss_V1_0::GnssPositionRecurrence>(
350                                                   recurrence),
351                                           min_interval, preferred_accuracy, preferred_time);
352     }
353     return checkHidlReturn(result, "IGnss setPositionMode() failed.");
354 }
355 
deleteAidingData(jint flags)356 void GnssHal::deleteAidingData(jint flags) {
357     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
358         auto status = gnssHalAidl->deleteAidingData(static_cast<IGnssAidl::GnssAidingData>(flags));
359         checkAidlStatus(status, "IGnssAidl deleteAidingData() failed.");
360         return;
361     }
362 
363     if (gnssHal == nullptr) {
364         return;
365     }
366 
367     auto result = gnssHal->deleteAidingData(static_cast<IGnss_V1_0::GnssAidingData>(flags));
368     checkHidlReturn(result, "IGnss deleteAidingData() failed.");
369 }
370 
injectTime(jlong time,jlong timeReference,jint uncertainty)371 void GnssHal::injectTime(jlong time, jlong timeReference, jint uncertainty) {
372     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
373         auto status = gnssHalAidl->injectTime(time, timeReference, uncertainty);
374         checkAidlStatus(status, "IGnssAidl injectTime() failed.");
375         return;
376     }
377 
378     if (gnssHal == nullptr) {
379         return;
380     }
381     auto result = gnssHal->injectTime(time, timeReference, uncertainty);
382     checkHidlReturn(result, "IGnss injectTime() failed.");
383 }
384 
injectLocation(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)385 void GnssHal::injectLocation(jint gnssLocationFlags, jdouble latitudeDegrees,
386                              jdouble longitudeDegrees, jdouble altitudeMeters,
387                              jfloat speedMetersPerSec, jfloat bearingDegrees,
388                              jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
389                              jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees,
390                              jlong timestamp, jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
391                              jdouble elapsedRealtimeUncertaintyNanos) {
392     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
393         GnssLocationAidl location =
394                 createGnssLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
395                                    altitudeMeters, speedMetersPerSec, bearingDegrees,
396                                    horizontalAccuracyMeters, verticalAccuracyMeters,
397                                    speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
398                                    elapsedRealtimeFlags, elapsedRealtimeNanos,
399                                    elapsedRealtimeUncertaintyNanos);
400         auto status = gnssHalAidl->injectLocation(location);
401         checkAidlStatus(status, "IGnssAidl injectLocation() failed.");
402         return;
403     }
404 
405     if (gnssHal == nullptr) {
406         return;
407     }
408     auto result =
409             gnssHal->injectLocation(latitudeDegrees, longitudeDegrees, horizontalAccuracyMeters);
410     checkHidlReturn(result, "IGnss injectLocation() failed.");
411 }
412 
injectBestLocation(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)413 void GnssHal::injectBestLocation(jint gnssLocationFlags, jdouble latitudeDegrees,
414                                  jdouble longitudeDegrees, jdouble altitudeMeters,
415                                  jfloat speedMetersPerSec, jfloat bearingDegrees,
416                                  jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
417                                  jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees,
418                                  jlong timestamp, jint elapsedRealtimeFlags,
419                                  jlong elapsedRealtimeNanos,
420                                  jdouble elapsedRealtimeUncertaintyNanos) {
421     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
422         GnssLocationAidl location =
423                 createGnssLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
424                                    altitudeMeters, speedMetersPerSec, bearingDegrees,
425                                    horizontalAccuracyMeters, verticalAccuracyMeters,
426                                    speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
427                                    elapsedRealtimeFlags, elapsedRealtimeNanos,
428                                    elapsedRealtimeUncertaintyNanos);
429         auto status = gnssHalAidl->injectBestLocation(location);
430         checkAidlStatus(status, "IGnssAidl injectBestLocation() failed.");
431         return;
432     }
433 
434     if (gnssHal_V2_0 != nullptr) {
435         GnssLocation_V2_0 location =
436                 createGnssLocation_V2_0(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
437                                         altitudeMeters, speedMetersPerSec, bearingDegrees,
438                                         horizontalAccuracyMeters, verticalAccuracyMeters,
439                                         speedAccuracyMetersPerSecond, bearingAccuracyDegrees,
440                                         timestamp, elapsedRealtimeFlags, elapsedRealtimeNanos,
441                                         elapsedRealtimeUncertaintyNanos);
442         auto result = gnssHal_V2_0->injectBestLocation_2_0(location);
443         checkHidlReturn(result, "IGnss injectBestLocation_2_0() failed.");
444         return;
445     }
446 
447     if (gnssHal_V1_1 != nullptr) {
448         GnssLocation_V1_0 location =
449                 createGnssLocation_V1_0(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
450                                         altitudeMeters, speedMetersPerSec, bearingDegrees,
451                                         horizontalAccuracyMeters, verticalAccuracyMeters,
452                                         speedAccuracyMetersPerSecond, bearingAccuracyDegrees,
453                                         timestamp);
454         auto result = gnssHal_V1_1->injectBestLocation(location);
455         checkHidlReturn(result, "IGnss injectBestLocation() failed.");
456         return;
457     }
458 
459     ALOGE("IGnss injectBestLocation() is called but gnssHal_V1_1 is not available.");
460 }
461 
getAGnssInterface()462 std::unique_ptr<AGnssInterface> GnssHal::getAGnssInterface() {
463     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
464         sp<IAGnssAidl> agnssAidl;
465         auto status = gnssHalAidl->getExtensionAGnss(&agnssAidl);
466         if (checkAidlStatus(status, "Unable to get a handle to AGnss interface.")) {
467             return std::make_unique<gnss::AGnss>(agnssAidl);
468         }
469     } else if (gnssHal_V2_0 != nullptr) {
470         auto agnss_V2_0 = gnssHal_V2_0->getExtensionAGnss_2_0();
471         if (checkHidlReturn(agnss_V2_0, "Unable to get a handle to AGnss_V2_0")) {
472             return std::make_unique<gnss::AGnss_V2_0>(agnss_V2_0);
473         }
474     } else if (gnssHal != nullptr) {
475         auto agnss_V1_0 = gnssHal->getExtensionAGnss();
476         if (checkHidlReturn(agnss_V1_0, "Unable to get a handle to AGnss_V1_0")) {
477             return std::make_unique<gnss::AGnss_V1_0>(agnss_V1_0);
478         }
479     }
480     return nullptr;
481 }
482 
getAGnssRilInterface()483 std::unique_ptr<AGnssRilInterface> GnssHal::getAGnssRilInterface() {
484     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
485         sp<IAGnssRilAidl> agnssRilAidl;
486         auto status = gnssHalAidl->getExtensionAGnssRil(&agnssRilAidl);
487         if (checkAidlStatus(status, "Unable to get a handle to AGnssRil interface.")) {
488             return std::make_unique<gnss::AGnssRil>(agnssRilAidl);
489         }
490     } else if (gnssHal_V2_0 != nullptr) {
491         auto agnssRil_V2_0 = gnssHal_V2_0->getExtensionAGnssRil_2_0();
492         if (checkHidlReturn(agnssRil_V2_0, "Unable to get a handle to AGnssRil_V2_0")) {
493             return std::make_unique<gnss::AGnssRil_V2_0>(agnssRil_V2_0);
494         }
495     } else if (gnssHal != nullptr) {
496         auto agnssRil_V1_0 = gnssHal->getExtensionAGnssRil();
497         if (checkHidlReturn(agnssRil_V1_0, "Unable to get a handle to AGnssRil_V1_0")) {
498             return std::make_unique<gnss::AGnssRil_V1_0>(agnssRil_V1_0);
499         }
500     }
501     return nullptr;
502 }
503 
getGnssNavigationMessageInterface()504 std::unique_ptr<GnssNavigationMessageInterface> GnssHal::getGnssNavigationMessageInterface() {
505     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
506         sp<hardware::gnss::IGnssNavigationMessageInterface> gnssNavigationMessage;
507         auto status = gnssHalAidl->getExtensionGnssNavigationMessage(&gnssNavigationMessage);
508         if (checkAidlStatus(status,
509                             "Unable to get a handle to GnssNavigationMessage AIDL interface.")) {
510             return std::make_unique<gnss::GnssNavigationMessageAidl>(gnssNavigationMessage);
511         }
512     } else if (gnssHal != nullptr) {
513         auto gnssNavigationMessage = gnssHal->getExtensionGnssNavigationMessage();
514         if (checkHidlReturn(gnssNavigationMessage,
515                             "Unable to get a handle to GnssNavigationMessage interface.")) {
516             return std::make_unique<gnss::GnssNavigationMessageHidl>(gnssNavigationMessage);
517         }
518     }
519     return nullptr;
520 }
521 
getGnssMeasurementInterface()522 std::unique_ptr<GnssMeasurementInterface> GnssHal::getGnssMeasurementInterface() {
523     // Allow all causal combinations between IGnss.hal and IGnssMeasurement.hal. That means,
524     // 2.1@IGnss can be paired with {1.0, 1,1, 2.0, 2.1}@IGnssMeasurement
525     // 2.0@IGnss can be paired with {1.0, 1,1, 2.0}@IGnssMeasurement
526     // 1.1@IGnss can be paired {1.0, 1.1}@IGnssMeasurement
527     // 1.0@IGnss is paired with 1.0@IGnssMeasurement
528     if (gnssHalAidl != nullptr) {
529         sp<hardware::gnss::IGnssMeasurementInterface> gnssMeasurement;
530         auto status = gnssHalAidl->getExtensionGnssMeasurement(&gnssMeasurement);
531         if (checkAidlStatus(status, "Unable to get a handle to GnssMeasurement AIDL interface.")) {
532             return std::make_unique<android::gnss::GnssMeasurement>(gnssMeasurement);
533         }
534     }
535     if (gnssHal_V2_1 != nullptr) {
536         auto gnssMeasurement = gnssHal_V2_1->getExtensionGnssMeasurement_2_1();
537         if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V2_1")) {
538             return std::make_unique<android::gnss::GnssMeasurement_V2_1>(gnssMeasurement);
539         }
540     }
541     if (gnssHal_V2_0 != nullptr) {
542         auto gnssMeasurement = gnssHal_V2_0->getExtensionGnssMeasurement_2_0();
543         if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V2_0")) {
544             return std::make_unique<android::gnss::GnssMeasurement_V2_0>(gnssMeasurement);
545         }
546     }
547     if (gnssHal_V1_1 != nullptr) {
548         auto gnssMeasurement = gnssHal_V1_1->getExtensionGnssMeasurement_1_1();
549         if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V1_1")) {
550             return std::make_unique<android::gnss::GnssMeasurement_V1_1>(gnssMeasurement);
551         }
552     }
553     if (gnssHal != nullptr) {
554         auto gnssMeasurement = gnssHal->getExtensionGnssMeasurement();
555         if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V1_0")) {
556             return std::make_unique<android::gnss::GnssMeasurement_V1_0>(gnssMeasurement);
557         }
558     }
559     return nullptr;
560 }
561 
getGnssDebugInterface()562 std::unique_ptr<GnssDebugInterface> GnssHal::getGnssDebugInterface() {
563     // Allow all causal combinations between IGnss.hal and IGnssDebug.hal. That means,
564     // 2.0@IGnss can be paired with {1.0, 2.0}@IGnssDebug
565     // 1.0@IGnss is paired with 1.0@IGnssDebug
566     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
567         sp<IGnssDebugAidl> gnssDebugAidl;
568         auto status = gnssHalAidl->getExtensionGnssDebug(&gnssDebugAidl);
569         if (checkAidlStatus(status, "Unable to get a handle to GnssDebug interface.")) {
570             return std::make_unique<gnss::GnssDebug>(gnssDebugAidl);
571         }
572     }
573     if (gnssHal_V2_0 != nullptr) {
574         auto gnssDebug_V2_0 = gnssHal_V2_0->getExtensionGnssDebug_2_0();
575         if (checkHidlReturn(gnssDebug_V2_0, "Unable to get a handle to GnssDebug_V2_0.")) {
576             return std::make_unique<gnss::GnssDebug_V2_0>(gnssDebug_V2_0);
577         }
578     }
579     if (gnssHal != nullptr) {
580         auto gnssDebug_V1_0 = gnssHal->getExtensionGnssDebug();
581         if (checkHidlReturn(gnssDebug_V1_0, "Unable to get a handle to GnssDebug_V1_0.")) {
582             return std::make_unique<gnss::GnssDebug_V1_0>(gnssDebug_V1_0);
583         }
584     }
585     return nullptr;
586 }
587 
getGnssConfigurationInterface()588 std::unique_ptr<GnssConfigurationInterface> GnssHal::getGnssConfigurationInterface() {
589     if (gnssHalAidl != nullptr) {
590         sp<IGnssConfigurationAidl> gnssConfigurationAidl;
591         auto status = gnssHalAidl->getExtensionGnssConfiguration(&gnssConfigurationAidl);
592         if (checkAidlStatus(status,
593                             "Unable to get a handle to GnssConfiguration AIDL interface.")) {
594             return std::make_unique<android::gnss::GnssConfiguration>(gnssConfigurationAidl);
595         }
596     } else if (gnssHal_V2_1 != nullptr) {
597         auto gnssConfiguration = gnssHal_V2_1->getExtensionGnssConfiguration_2_1();
598         if (checkHidlReturn(gnssConfiguration,
599                             "Unable to get a handle to GnssConfiguration_V2_1")) {
600             return std::make_unique<android::gnss::GnssConfiguration_V2_1>(gnssConfiguration);
601         }
602     } else if (gnssHal_V2_0 != nullptr) {
603         auto gnssConfiguration = gnssHal_V2_0->getExtensionGnssConfiguration_2_0();
604         if (checkHidlReturn(gnssConfiguration,
605                             "Unable to get a handle to GnssConfiguration_V2_0")) {
606             return std::make_unique<android::gnss::GnssConfiguration_V2_0>(gnssConfiguration);
607         }
608     } else if (gnssHal_V1_1 != nullptr) {
609         auto gnssConfiguration = gnssHal_V1_1->getExtensionGnssConfiguration_1_1();
610         if (checkHidlReturn(gnssConfiguration,
611                             "Unable to get a handle to GnssConfiguration_V1_1")) {
612             return std::make_unique<gnss::GnssConfiguration_V1_1>(gnssConfiguration);
613         }
614     } else if (gnssHal != nullptr) {
615         auto gnssConfiguration = gnssHal->getExtensionGnssConfiguration();
616         if (checkHidlReturn(gnssConfiguration,
617                             "Unable to get a handle to GnssConfiguration_V1_0")) {
618             return std::make_unique<gnss::GnssConfiguration_V1_0>(gnssConfiguration);
619         }
620     }
621     return nullptr;
622 }
623 
getGnssGeofenceInterface()624 std::unique_ptr<GnssGeofenceInterface> GnssHal::getGnssGeofenceInterface() {
625     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
626         sp<hardware::gnss::IGnssGeofence> gnssGeofence;
627         auto status = gnssHalAidl->getExtensionGnssGeofence(&gnssGeofence);
628         if (checkAidlStatus(status, "Unable to get a handle to GnssGeofence AIDL interface.")) {
629             return std::make_unique<gnss::GnssGeofenceAidl>(gnssGeofence);
630         }
631     } else if (gnssHal != nullptr) {
632         auto gnssGeofencing = gnssHal->getExtensionGnssGeofencing();
633         if (checkHidlReturn(gnssGeofencing, "Unable to get a handle to GnssGeofencing")) {
634             return std::make_unique<gnss::GnssGeofenceHidl>(gnssGeofencing);
635         }
636     }
637     return nullptr;
638 }
639 
getGnssBatchingInterface()640 std::unique_ptr<GnssBatchingInterface> GnssHal::getGnssBatchingInterface() {
641     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
642         sp<android::hardware::gnss::IGnssBatching> gnssBatchingAidl;
643         auto status = gnssHalAidl->getExtensionGnssBatching(&gnssBatchingAidl);
644         if (checkAidlStatus(status, "Unable to get a handle to GnssBatching interface.")) {
645             return std::make_unique<gnss::GnssBatching>(gnssBatchingAidl);
646         }
647     }
648     if (gnssHal_V2_0 != nullptr) {
649         auto gnssBatching_V2_0 = gnssHal_V2_0->getExtensionGnssBatching_2_0();
650         if (checkHidlReturn(gnssBatching_V2_0, "Unable to get a handle to GnssBatching_V2_0")) {
651             return std::make_unique<gnss::GnssBatching_V2_0>(gnssBatching_V2_0);
652         }
653     }
654     if (gnssHal != nullptr) {
655         auto gnssBatching_V1_0 = gnssHal->getExtensionGnssBatching();
656         if (checkHidlReturn(gnssBatching_V1_0, "Unable to get a handle to GnssBatching")) {
657             return std::make_unique<gnss::GnssBatching_V1_0>(gnssBatching_V1_0);
658         }
659     }
660     return nullptr;
661 }
662 
getMeasurementCorrectionsInterface()663 std::unique_ptr<MeasurementCorrectionsInterface> GnssHal::getMeasurementCorrectionsInterface() {
664     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
665         sp<android::hardware::gnss::measurement_corrections::IMeasurementCorrectionsInterface>
666                 gnssMeasurementCorrectionsAidl;
667         auto status =
668                 gnssHalAidl->getExtensionMeasurementCorrections(&gnssMeasurementCorrectionsAidl);
669         if (checkAidlStatus(status,
670                             "Unable to get a handle to GnssVisibilityControl AIDL interface.")) {
671             return std::make_unique<gnss::MeasurementCorrectionsIface_Aidl>(
672                     gnssMeasurementCorrectionsAidl);
673         }
674     }
675     if (gnssHal_V2_1 != nullptr) {
676         auto gnssCorrections = gnssHal_V2_1->getExtensionMeasurementCorrections_1_1();
677         if (checkHidlReturn(gnssCorrections,
678                             "Unable to get a handle to GnssMeasurementCorrections HIDL "
679                             "interface")) {
680             return std::make_unique<gnss::MeasurementCorrectionsIface_V1_1>(gnssCorrections);
681         }
682     }
683     if (gnssHal_V2_0 != nullptr) {
684         auto gnssCorrections = gnssHal_V2_0->getExtensionMeasurementCorrections();
685         if (checkHidlReturn(gnssCorrections,
686                             "Unable to get a handle to GnssMeasurementCorrections HIDL "
687                             "interface")) {
688             return std::make_unique<gnss::MeasurementCorrectionsIface_V1_0>(gnssCorrections);
689         }
690     }
691     return nullptr;
692 }
693 
getGnssVisibilityControlInterface()694 std::unique_ptr<GnssVisibilityControlInterface> GnssHal::getGnssVisibilityControlInterface() {
695     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
696         sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl>
697                 gnssVisibilityControlAidl;
698         auto status = gnssHalAidl->getExtensionGnssVisibilityControl(&gnssVisibilityControlAidl);
699         if (checkAidlStatus(status,
700                             "Unable to get a handle to GnssVisibilityControl AIDL interface.")) {
701             return std::make_unique<gnss::GnssVisibilityControlAidl>(gnssVisibilityControlAidl);
702         }
703     } else if (gnssHal_V2_0 != nullptr) {
704         auto gnssVisibilityControlHidl = gnssHal_V2_0->getExtensionVisibilityControl();
705         if (checkHidlReturn(gnssVisibilityControlHidl,
706                             "Unable to get a handle to GnssVisibilityControl HIDL interface")) {
707             return std::make_unique<gnss::GnssVisibilityControlHidl>(gnssVisibilityControlHidl);
708         }
709     }
710     return nullptr;
711 }
712 
getGnssAntennaInfoInterface()713 std::unique_ptr<GnssAntennaInfoInterface> GnssHal::getGnssAntennaInfoInterface() {
714     if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
715         sp<IGnssAntennaInfoAidl> gnssAntennaInfoAidl;
716         auto status = gnssHalAidl->getExtensionGnssAntennaInfo(&gnssAntennaInfoAidl);
717         if (checkAidlStatus(status, "Unable to get a handle to GnssAntennaInfo interface.")) {
718             return std::make_unique<gnss::GnssAntennaInfoAidl>(gnssAntennaInfoAidl);
719         }
720     } else if (gnssHal_V2_1 != nullptr) {
721         auto gnssAntennaInfo_V2_1 = gnssHal_V2_1->getExtensionGnssAntennaInfo();
722         if (checkHidlReturn(gnssAntennaInfo_V2_1,
723                             "Unable to get a handle to GnssAntennaInfo_V2_1")) {
724             return std::make_unique<gnss::GnssAntennaInfo_V2_1>(gnssAntennaInfo_V2_1);
725         }
726     }
727     return nullptr;
728 }
729 
getGnssPsdsInterface()730 std::unique_ptr<GnssPsdsInterface> GnssHal::getGnssPsdsInterface() {
731     if (gnssHalAidl != nullptr) {
732         sp<IGnssPsds> gnssPsdsAidl;
733         auto status = gnssHalAidl->getExtensionPsds(&gnssPsdsAidl);
734         if (checkAidlStatus(status, "Unable to get a handle to PSDS interface.")) {
735             return std::make_unique<gnss::GnssPsdsAidl>(gnssPsdsAidl);
736         }
737     } else if (gnssHal != nullptr) {
738         auto gnssXtra = gnssHal->getExtensionXtra();
739         if (checkHidlReturn(gnssXtra, "Unable to get a handle to XTRA interface.")) {
740             return std::make_unique<gnss::GnssPsdsHidl>(gnssXtra);
741         }
742     }
743     return nullptr;
744 }
745 
getGnssPowerIndicationInterface()746 sp<hardware::gnss::IGnssPowerIndication> GnssHal::getGnssPowerIndicationInterface() {
747     if (gnssHalAidl != nullptr) {
748         sp<hardware::gnss::IGnssPowerIndication> gnssPowerIndication;
749         auto status = gnssHalAidl->getExtensionGnssPowerIndication(&gnssPowerIndication);
750         if (checkAidlStatus(status, "Unable to get a handle to GnssPowerIndication")) {
751             return gnssPowerIndication;
752         }
753     }
754     return nullptr;
755 }
756 
getGnssNiInterface()757 sp<hardware::gnss::V1_0::IGnssNi> GnssHal::getGnssNiInterface() {
758     if (gnssHal != nullptr) {
759         auto gnssNi = gnssHal->getExtensionGnssNi();
760         if (checkHidlReturn(gnssNi, "Unable to get a handle to GnssNi")) {
761             return gnssNi;
762         }
763     }
764     return nullptr;
765 }
766 
767 } // namespace android::gnss
768