xref: /aosp_15_r20/hardware/interfaces/gnss/2.0/default/Gnss.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "Gnss"
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker #include "Gnss.h"
20*4d7e907cSAndroid Build Coastguard Worker 
21*4d7e907cSAndroid Build Coastguard Worker #include <log/log.h>
22*4d7e907cSAndroid Build Coastguard Worker 
23*4d7e907cSAndroid Build Coastguard Worker #include "AGnss.h"
24*4d7e907cSAndroid Build Coastguard Worker #include "AGnssRil.h"
25*4d7e907cSAndroid Build Coastguard Worker #include "GnssBatching.h"
26*4d7e907cSAndroid Build Coastguard Worker #include "GnssConfiguration.h"
27*4d7e907cSAndroid Build Coastguard Worker #include "GnssMeasurement.h"
28*4d7e907cSAndroid Build Coastguard Worker #include "GnssMeasurementCorrections.h"
29*4d7e907cSAndroid Build Coastguard Worker #include "GnssVisibilityControl.h"
30*4d7e907cSAndroid Build Coastguard Worker #include "Utils.h"
31*4d7e907cSAndroid Build Coastguard Worker 
32*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::Status;
33*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::gnss::common::Utils;
34*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::gnss::measurement_corrections::V1_0::implementation::
35*4d7e907cSAndroid Build Coastguard Worker         GnssMeasurementCorrections;
36*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::gnss::visibility_control::V1_0::implementation::GnssVisibilityControl;
37*4d7e907cSAndroid Build Coastguard Worker 
38*4d7e907cSAndroid Build Coastguard Worker namespace android {
39*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
40*4d7e907cSAndroid Build Coastguard Worker namespace gnss {
41*4d7e907cSAndroid Build Coastguard Worker namespace V2_0 {
42*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
43*4d7e907cSAndroid Build Coastguard Worker 
44*4d7e907cSAndroid Build Coastguard Worker using GnssSvFlags = IGnssCallback::GnssSvFlags;
45*4d7e907cSAndroid Build Coastguard Worker 
46*4d7e907cSAndroid Build Coastguard Worker sp<V2_0::IGnssCallback> Gnss::sGnssCallback_2_0 = nullptr;
47*4d7e907cSAndroid Build Coastguard Worker sp<V1_1::IGnssCallback> Gnss::sGnssCallback_1_1 = nullptr;
48*4d7e907cSAndroid Build Coastguard Worker 
Gnss()49*4d7e907cSAndroid Build Coastguard Worker Gnss::Gnss() : mMinIntervalMs(1000) {}
50*4d7e907cSAndroid Build Coastguard Worker 
~Gnss()51*4d7e907cSAndroid Build Coastguard Worker Gnss::~Gnss() {
52*4d7e907cSAndroid Build Coastguard Worker     stop();
53*4d7e907cSAndroid Build Coastguard Worker }
54*4d7e907cSAndroid Build Coastguard Worker 
55*4d7e907cSAndroid Build Coastguard Worker // Methods from V1_0::IGnss follow.
setCallback(const sp<V1_0::IGnssCallback> &)56*4d7e907cSAndroid Build Coastguard Worker Return<bool> Gnss::setCallback(const sp<V1_0::IGnssCallback>&) {
57*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
58*4d7e907cSAndroid Build Coastguard Worker     return bool{};
59*4d7e907cSAndroid Build Coastguard Worker }
60*4d7e907cSAndroid Build Coastguard Worker 
start()61*4d7e907cSAndroid Build Coastguard Worker Return<bool> Gnss::start() {
62*4d7e907cSAndroid Build Coastguard Worker     if (mIsActive) {
63*4d7e907cSAndroid Build Coastguard Worker         ALOGW("Gnss has started. Restarting...");
64*4d7e907cSAndroid Build Coastguard Worker         stop();
65*4d7e907cSAndroid Build Coastguard Worker     }
66*4d7e907cSAndroid Build Coastguard Worker 
67*4d7e907cSAndroid Build Coastguard Worker     mIsActive = true;
68*4d7e907cSAndroid Build Coastguard Worker     mThread = std::thread([this]() {
69*4d7e907cSAndroid Build Coastguard Worker         while (mIsActive == true) {
70*4d7e907cSAndroid Build Coastguard Worker             const auto location = Utils::getMockLocationV2_0();
71*4d7e907cSAndroid Build Coastguard Worker             this->reportLocation(location);
72*4d7e907cSAndroid Build Coastguard Worker 
73*4d7e907cSAndroid Build Coastguard Worker             std::this_thread::sleep_for(std::chrono::milliseconds(mMinIntervalMs));
74*4d7e907cSAndroid Build Coastguard Worker         }
75*4d7e907cSAndroid Build Coastguard Worker     });
76*4d7e907cSAndroid Build Coastguard Worker     return true;
77*4d7e907cSAndroid Build Coastguard Worker }
78*4d7e907cSAndroid Build Coastguard Worker 
stop()79*4d7e907cSAndroid Build Coastguard Worker Return<bool> Gnss::stop() {
80*4d7e907cSAndroid Build Coastguard Worker     mIsActive = false;
81*4d7e907cSAndroid Build Coastguard Worker     if (mThread.joinable()) {
82*4d7e907cSAndroid Build Coastguard Worker         mThread.join();
83*4d7e907cSAndroid Build Coastguard Worker     }
84*4d7e907cSAndroid Build Coastguard Worker     return true;
85*4d7e907cSAndroid Build Coastguard Worker }
86*4d7e907cSAndroid Build Coastguard Worker 
cleanup()87*4d7e907cSAndroid Build Coastguard Worker Return<void> Gnss::cleanup() {
88*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
89*4d7e907cSAndroid Build Coastguard Worker     return Void();
90*4d7e907cSAndroid Build Coastguard Worker }
91*4d7e907cSAndroid Build Coastguard Worker 
injectTime(int64_t,int64_t,int32_t)92*4d7e907cSAndroid Build Coastguard Worker Return<bool> Gnss::injectTime(int64_t, int64_t, int32_t) {
93*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
94*4d7e907cSAndroid Build Coastguard Worker     return bool{};
95*4d7e907cSAndroid Build Coastguard Worker }
96*4d7e907cSAndroid Build Coastguard Worker 
injectLocation(double,double,float)97*4d7e907cSAndroid Build Coastguard Worker Return<bool> Gnss::injectLocation(double, double, float) {
98*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
99*4d7e907cSAndroid Build Coastguard Worker     return bool{};
100*4d7e907cSAndroid Build Coastguard Worker }
101*4d7e907cSAndroid Build Coastguard Worker 
deleteAidingData(V1_0::IGnss::GnssAidingData)102*4d7e907cSAndroid Build Coastguard Worker Return<void> Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData) {
103*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
104*4d7e907cSAndroid Build Coastguard Worker     return Void();
105*4d7e907cSAndroid Build Coastguard Worker }
106*4d7e907cSAndroid Build Coastguard Worker 
setPositionMode(V1_0::IGnss::GnssPositionMode,V1_0::IGnss::GnssPositionRecurrence,uint32_t,uint32_t,uint32_t)107*4d7e907cSAndroid Build Coastguard Worker Return<bool> Gnss::setPositionMode(V1_0::IGnss::GnssPositionMode,
108*4d7e907cSAndroid Build Coastguard Worker                                    V1_0::IGnss::GnssPositionRecurrence, uint32_t, uint32_t,
109*4d7e907cSAndroid Build Coastguard Worker                                    uint32_t) {
110*4d7e907cSAndroid Build Coastguard Worker     return true;
111*4d7e907cSAndroid Build Coastguard Worker }
112*4d7e907cSAndroid Build Coastguard Worker 
getExtensionAGnssRil()113*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_0::IAGnssRil>> Gnss::getExtensionAGnssRil() {
114*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
115*4d7e907cSAndroid Build Coastguard Worker     return sp<V1_0::IAGnssRil>{};
116*4d7e907cSAndroid Build Coastguard Worker }
117*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssGeofencing()118*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_0::IGnssGeofencing>> Gnss::getExtensionGnssGeofencing() {
119*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
120*4d7e907cSAndroid Build Coastguard Worker     return sp<V1_0::IGnssGeofencing>{};
121*4d7e907cSAndroid Build Coastguard Worker }
122*4d7e907cSAndroid Build Coastguard Worker 
getExtensionAGnss()123*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_0::IAGnss>> Gnss::getExtensionAGnss() {
124*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
125*4d7e907cSAndroid Build Coastguard Worker     return sp<V1_0::IAGnss>{};
126*4d7e907cSAndroid Build Coastguard Worker }
127*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssNi()128*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_0::IGnssNi>> Gnss::getExtensionGnssNi() {
129*4d7e907cSAndroid Build Coastguard Worker     // The IGnssNi.hal interface is deprecated in 2.0.
130*4d7e907cSAndroid Build Coastguard Worker     return nullptr;
131*4d7e907cSAndroid Build Coastguard Worker }
132*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssMeasurement()133*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_0::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() {
134*4d7e907cSAndroid Build Coastguard Worker     // Not supported
135*4d7e907cSAndroid Build Coastguard Worker     return nullptr;
136*4d7e907cSAndroid Build Coastguard Worker }
137*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssNavigationMessage()138*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_0::IGnssNavigationMessage>> Gnss::getExtensionGnssNavigationMessage() {
139*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
140*4d7e907cSAndroid Build Coastguard Worker     return sp<V1_0::IGnssNavigationMessage>{};
141*4d7e907cSAndroid Build Coastguard Worker }
142*4d7e907cSAndroid Build Coastguard Worker 
getExtensionXtra()143*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_0::IGnssXtra>> Gnss::getExtensionXtra() {
144*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
145*4d7e907cSAndroid Build Coastguard Worker     return sp<V1_0::IGnssXtra>{};
146*4d7e907cSAndroid Build Coastguard Worker }
147*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssConfiguration()148*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_0::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration() {
149*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
150*4d7e907cSAndroid Build Coastguard Worker     return sp<V1_0::IGnssConfiguration>{};
151*4d7e907cSAndroid Build Coastguard Worker }
152*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssDebug()153*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_0::IGnssDebug>> Gnss::getExtensionGnssDebug() {
154*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
155*4d7e907cSAndroid Build Coastguard Worker     return sp<V1_0::IGnssDebug>{};
156*4d7e907cSAndroid Build Coastguard Worker }
157*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssBatching()158*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_0::IGnssBatching>> Gnss::getExtensionGnssBatching() {
159*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
160*4d7e907cSAndroid Build Coastguard Worker     return sp<V1_0::IGnssBatching>{};
161*4d7e907cSAndroid Build Coastguard Worker }
162*4d7e907cSAndroid Build Coastguard Worker 
163*4d7e907cSAndroid Build Coastguard Worker // Methods from V1_1::IGnss follow.
setCallback_1_1(const sp<V1_1::IGnssCallback> & callback)164*4d7e907cSAndroid Build Coastguard Worker Return<bool> Gnss::setCallback_1_1(const sp<V1_1::IGnssCallback>& callback) {
165*4d7e907cSAndroid Build Coastguard Worker     ALOGD("Gnss::setCallback_1_1");
166*4d7e907cSAndroid Build Coastguard Worker     if (callback == nullptr) {
167*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: Null callback ignored", __func__);
168*4d7e907cSAndroid Build Coastguard Worker         return false;
169*4d7e907cSAndroid Build Coastguard Worker     }
170*4d7e907cSAndroid Build Coastguard Worker 
171*4d7e907cSAndroid Build Coastguard Worker     sGnssCallback_1_1 = callback;
172*4d7e907cSAndroid Build Coastguard Worker 
173*4d7e907cSAndroid Build Coastguard Worker     uint32_t capabilities = (uint32_t)V1_0::IGnssCallback::Capabilities::MEASUREMENTS;
174*4d7e907cSAndroid Build Coastguard Worker     auto ret = sGnssCallback_1_1->gnssSetCapabilitesCb(capabilities);
175*4d7e907cSAndroid Build Coastguard Worker     if (!ret.isOk()) {
176*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: Unable to invoke callback", __func__);
177*4d7e907cSAndroid Build Coastguard Worker     }
178*4d7e907cSAndroid Build Coastguard Worker 
179*4d7e907cSAndroid Build Coastguard Worker     V1_1::IGnssCallback::GnssSystemInfo gnssInfo = {.yearOfHw = 2019};
180*4d7e907cSAndroid Build Coastguard Worker 
181*4d7e907cSAndroid Build Coastguard Worker     ret = sGnssCallback_1_1->gnssSetSystemInfoCb(gnssInfo);
182*4d7e907cSAndroid Build Coastguard Worker     if (!ret.isOk()) {
183*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: Unable to invoke callback", __func__);
184*4d7e907cSAndroid Build Coastguard Worker     }
185*4d7e907cSAndroid Build Coastguard Worker 
186*4d7e907cSAndroid Build Coastguard Worker     auto gnssName = "Google Mock GNSS Implementation v2.0";
187*4d7e907cSAndroid Build Coastguard Worker     ret = sGnssCallback_1_1->gnssNameCb(gnssName);
188*4d7e907cSAndroid Build Coastguard Worker     if (!ret.isOk()) {
189*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: Unable to invoke callback", __func__);
190*4d7e907cSAndroid Build Coastguard Worker     }
191*4d7e907cSAndroid Build Coastguard Worker 
192*4d7e907cSAndroid Build Coastguard Worker     return true;
193*4d7e907cSAndroid Build Coastguard Worker }
194*4d7e907cSAndroid Build Coastguard Worker 
setPositionMode_1_1(V1_0::IGnss::GnssPositionMode,V1_0::IGnss::GnssPositionRecurrence,uint32_t,uint32_t,uint32_t,bool)195*4d7e907cSAndroid Build Coastguard Worker Return<bool> Gnss::setPositionMode_1_1(V1_0::IGnss::GnssPositionMode,
196*4d7e907cSAndroid Build Coastguard Worker                                        V1_0::IGnss::GnssPositionRecurrence, uint32_t, uint32_t,
197*4d7e907cSAndroid Build Coastguard Worker                                        uint32_t, bool) {
198*4d7e907cSAndroid Build Coastguard Worker     return true;
199*4d7e907cSAndroid Build Coastguard Worker }
200*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssConfiguration_1_1()201*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_1::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration_1_1() {
202*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
203*4d7e907cSAndroid Build Coastguard Worker     return sp<V1_1::IGnssConfiguration>{};
204*4d7e907cSAndroid Build Coastguard Worker }
205*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssMeasurement_1_1()206*4d7e907cSAndroid Build Coastguard Worker Return<sp<V1_1::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement_1_1() {
207*4d7e907cSAndroid Build Coastguard Worker     ALOGD("Gnss::getExtensionGnssMeasurement_1_1");
208*4d7e907cSAndroid Build Coastguard Worker     return new GnssMeasurement();
209*4d7e907cSAndroid Build Coastguard Worker }
210*4d7e907cSAndroid Build Coastguard Worker 
injectBestLocation(const V1_0::GnssLocation &)211*4d7e907cSAndroid Build Coastguard Worker Return<bool> Gnss::injectBestLocation(const V1_0::GnssLocation&) {
212*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
213*4d7e907cSAndroid Build Coastguard Worker     return bool{};
214*4d7e907cSAndroid Build Coastguard Worker }
215*4d7e907cSAndroid Build Coastguard Worker 
216*4d7e907cSAndroid Build Coastguard Worker // Methods from V2_0::IGnss follow.
getExtensionGnssConfiguration_2_0()217*4d7e907cSAndroid Build Coastguard Worker Return<sp<V2_0::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration_2_0() {
218*4d7e907cSAndroid Build Coastguard Worker     return new GnssConfiguration{};
219*4d7e907cSAndroid Build Coastguard Worker }
220*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssDebug_2_0()221*4d7e907cSAndroid Build Coastguard Worker Return<sp<V2_0::IGnssDebug>> Gnss::getExtensionGnssDebug_2_0() {
222*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
223*4d7e907cSAndroid Build Coastguard Worker     return sp<V2_0::IGnssDebug>{};
224*4d7e907cSAndroid Build Coastguard Worker }
225*4d7e907cSAndroid Build Coastguard Worker 
getExtensionAGnss_2_0()226*4d7e907cSAndroid Build Coastguard Worker Return<sp<V2_0::IAGnss>> Gnss::getExtensionAGnss_2_0() {
227*4d7e907cSAndroid Build Coastguard Worker     return new AGnss{};
228*4d7e907cSAndroid Build Coastguard Worker }
229*4d7e907cSAndroid Build Coastguard Worker 
getExtensionAGnssRil_2_0()230*4d7e907cSAndroid Build Coastguard Worker Return<sp<V2_0::IAGnssRil>> Gnss::getExtensionAGnssRil_2_0() {
231*4d7e907cSAndroid Build Coastguard Worker     return new AGnssRil{};
232*4d7e907cSAndroid Build Coastguard Worker }
233*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssMeasurement_2_0()234*4d7e907cSAndroid Build Coastguard Worker Return<sp<V2_0::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement_2_0() {
235*4d7e907cSAndroid Build Coastguard Worker     ALOGD("Gnss::getExtensionGnssMeasurement_2_0");
236*4d7e907cSAndroid Build Coastguard Worker     return new GnssMeasurement();
237*4d7e907cSAndroid Build Coastguard Worker }
238*4d7e907cSAndroid Build Coastguard Worker 
239*4d7e907cSAndroid Build Coastguard Worker Return<sp<measurement_corrections::V1_0::IMeasurementCorrections>>
getExtensionMeasurementCorrections()240*4d7e907cSAndroid Build Coastguard Worker Gnss::getExtensionMeasurementCorrections() {
241*4d7e907cSAndroid Build Coastguard Worker     ALOGD("Gnss::getExtensionMeasurementCorrections");
242*4d7e907cSAndroid Build Coastguard Worker     return new GnssMeasurementCorrections();
243*4d7e907cSAndroid Build Coastguard Worker }
244*4d7e907cSAndroid Build Coastguard Worker 
getExtensionVisibilityControl()245*4d7e907cSAndroid Build Coastguard Worker Return<sp<visibility_control::V1_0::IGnssVisibilityControl>> Gnss::getExtensionVisibilityControl() {
246*4d7e907cSAndroid Build Coastguard Worker     ALOGD("Gnss::getExtensionVisibilityControl");
247*4d7e907cSAndroid Build Coastguard Worker     return new GnssVisibilityControl();
248*4d7e907cSAndroid Build Coastguard Worker }
249*4d7e907cSAndroid Build Coastguard Worker 
getExtensionGnssBatching_2_0()250*4d7e907cSAndroid Build Coastguard Worker Return<sp<V2_0::IGnssBatching>> Gnss::getExtensionGnssBatching_2_0() {
251*4d7e907cSAndroid Build Coastguard Worker     return new GnssBatching();
252*4d7e907cSAndroid Build Coastguard Worker }
253*4d7e907cSAndroid Build Coastguard Worker 
setCallback_2_0(const sp<V2_0::IGnssCallback> & callback)254*4d7e907cSAndroid Build Coastguard Worker Return<bool> Gnss::setCallback_2_0(const sp<V2_0::IGnssCallback>& callback) {
255*4d7e907cSAndroid Build Coastguard Worker     ALOGD("Gnss::setCallback_2_0");
256*4d7e907cSAndroid Build Coastguard Worker     if (callback == nullptr) {
257*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: Null callback ignored", __func__);
258*4d7e907cSAndroid Build Coastguard Worker         return false;
259*4d7e907cSAndroid Build Coastguard Worker     }
260*4d7e907cSAndroid Build Coastguard Worker 
261*4d7e907cSAndroid Build Coastguard Worker     sGnssCallback_2_0 = callback;
262*4d7e907cSAndroid Build Coastguard Worker 
263*4d7e907cSAndroid Build Coastguard Worker     using Capabilities = V2_0::IGnssCallback::Capabilities;
264*4d7e907cSAndroid Build Coastguard Worker     const auto capabilities = Capabilities::MEASUREMENTS | Capabilities::MEASUREMENT_CORRECTIONS |
265*4d7e907cSAndroid Build Coastguard Worker                               Capabilities::LOW_POWER_MODE | Capabilities::SATELLITE_BLACKLIST;
266*4d7e907cSAndroid Build Coastguard Worker     auto ret = sGnssCallback_2_0->gnssSetCapabilitiesCb_2_0(capabilities);
267*4d7e907cSAndroid Build Coastguard Worker     if (!ret.isOk()) {
268*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: Unable to invoke callback", __func__);
269*4d7e907cSAndroid Build Coastguard Worker     }
270*4d7e907cSAndroid Build Coastguard Worker 
271*4d7e907cSAndroid Build Coastguard Worker     V1_1::IGnssCallback::GnssSystemInfo gnssInfo = {.yearOfHw = 2019};
272*4d7e907cSAndroid Build Coastguard Worker 
273*4d7e907cSAndroid Build Coastguard Worker     ret = sGnssCallback_2_0->gnssSetSystemInfoCb(gnssInfo);
274*4d7e907cSAndroid Build Coastguard Worker     if (!ret.isOk()) {
275*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: Unable to invoke callback", __func__);
276*4d7e907cSAndroid Build Coastguard Worker     }
277*4d7e907cSAndroid Build Coastguard Worker 
278*4d7e907cSAndroid Build Coastguard Worker     auto gnssName = "Google Mock GNSS Implementation v2.0";
279*4d7e907cSAndroid Build Coastguard Worker     ret = sGnssCallback_2_0->gnssNameCb(gnssName);
280*4d7e907cSAndroid Build Coastguard Worker     if (!ret.isOk()) {
281*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: Unable to invoke callback", __func__);
282*4d7e907cSAndroid Build Coastguard Worker     }
283*4d7e907cSAndroid Build Coastguard Worker 
284*4d7e907cSAndroid Build Coastguard Worker     return true;
285*4d7e907cSAndroid Build Coastguard Worker }
286*4d7e907cSAndroid Build Coastguard Worker 
reportLocation(const V2_0::GnssLocation & location) const287*4d7e907cSAndroid Build Coastguard Worker Return<void> Gnss::reportLocation(const V2_0::GnssLocation& location) const {
288*4d7e907cSAndroid Build Coastguard Worker     std::unique_lock<std::mutex> lock(mMutex);
289*4d7e907cSAndroid Build Coastguard Worker     if (sGnssCallback_2_0 == nullptr) {
290*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: sGnssCallback 2.0 is null.", __func__);
291*4d7e907cSAndroid Build Coastguard Worker         return Void();
292*4d7e907cSAndroid Build Coastguard Worker     }
293*4d7e907cSAndroid Build Coastguard Worker     sGnssCallback_2_0->gnssLocationCb_2_0(location);
294*4d7e907cSAndroid Build Coastguard Worker     return Void();
295*4d7e907cSAndroid Build Coastguard Worker }
296*4d7e907cSAndroid Build Coastguard Worker 
injectBestLocation_2_0(const V2_0::GnssLocation &)297*4d7e907cSAndroid Build Coastguard Worker Return<bool> Gnss::injectBestLocation_2_0(const V2_0::GnssLocation&) {
298*4d7e907cSAndroid Build Coastguard Worker     // TODO(b/124012850): Implement function.
299*4d7e907cSAndroid Build Coastguard Worker     return bool{};
300*4d7e907cSAndroid Build Coastguard Worker }
301*4d7e907cSAndroid Build Coastguard Worker 
302*4d7e907cSAndroid Build Coastguard Worker }  // namespace implementation
303*4d7e907cSAndroid Build Coastguard Worker }  // namespace V2_0
304*4d7e907cSAndroid Build Coastguard Worker }  // namespace gnss
305*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
306*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
307