1eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
2eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *
3eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Redistribution and use in source and binary forms, with or without
4eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * modification, are permitted provided that the following conditions are
5eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * met:
6eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *     * Redistributions of source code must retain the above copyright
7eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *       notice, this list of conditions and the following disclaimer.
8eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *     * Redistributions in binary form must reproduce the above
9eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *       copyright notice, this list of conditions and the following
10eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *       disclaimer in the documentation and/or other materials provided
11eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *       with the distribution.
12eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *     * Neither the name of The Linux Foundation, nor the names of its
13eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *       contributors may be used to endorse or promote products derived
14eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *       from this software without specific prior written permission.
15eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *
16eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *
28eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh */
29eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
30eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define LOG_NDEBUG 0
31eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define LOG_TAG "LocSvc_GeofenceApiClient"
32eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
33eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <log_util.h>
34eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <loc_cfg.h>
35eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
36eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include "LocationUtil.h"
37eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include "GeofenceAPIClient.h"
38eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
39eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace android {
40eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace hardware {
41eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace gnss {
42eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace V1_0 {
43eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace implementation {
44eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
45eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
46eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGeofenceAPIClient::GeofenceAPIClient(const sp<IGnssGeofenceCallback>& callback) :
47eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationAPIClientBase(),
48eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    mGnssGeofencingCbIface(callback)
49eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
50eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
51eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
52eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationCallbacks locationCallbacks;
53eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
54eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locationCallbacks.size = sizeof(LocationCallbacks);
55eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
56eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locationCallbacks.trackingCb = nullptr;
57eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locationCallbacks.batchingCb = nullptr;
58eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
59eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locationCallbacks.geofenceBreachCb = nullptr;
60eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnssGeofencingCbIface != nullptr) {
61eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        locationCallbacks.geofenceBreachCb =
62eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            [this](GeofenceBreachNotification geofenceBreachNotification) {
63eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                onGeofenceBreachCb(geofenceBreachNotification);
64eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            };
65eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
66eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        locationCallbacks.geofenceStatusCb =
67eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            [this](GeofenceStatusNotification geofenceStatusNotification) {
68eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                onGeofenceStatusCb(geofenceStatusNotification);
69eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            };
70eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
71eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
72eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locationCallbacks.gnssLocationInfoCb = nullptr;
73eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locationCallbacks.gnssNiCb = nullptr;
74eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locationCallbacks.gnssSvCb = nullptr;
75eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locationCallbacks.gnssNmeaCb = nullptr;
76eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locationCallbacks.gnssMeasurementsCb = nullptr;
77eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
78eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locAPISetCallbacks(locationCallbacks);
79eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
80eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
81eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GeofenceAPIClient::geofenceAdd(uint32_t geofence_id, double latitude, double longitude,
82eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        double radius_meters, int32_t last_transition, int32_t monitor_transitions,
83eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        uint32_t notification_responsiveness_ms, uint32_t unknown_timer_ms)
84eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
85eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]: (%d %f %f %f %d %d %d %d)", __FUNCTION__,
86eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            geofence_id, latitude, longitude, radius_meters,
87eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            last_transition, monitor_transitions, notification_responsiveness_ms, unknown_timer_ms);
88eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
89eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GeofenceOption options;
90eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    memset(&options, 0, sizeof(GeofenceOption));
91eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    options.size = sizeof(GeofenceOption);
92eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (monitor_transitions & IGnssGeofenceCallback::GeofenceTransition::ENTERED)
93eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        options.breachTypeMask |= GEOFENCE_BREACH_ENTER_BIT;
94eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (monitor_transitions & IGnssGeofenceCallback::GeofenceTransition::EXITED)
95eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        options.breachTypeMask |=  GEOFENCE_BREACH_EXIT_BIT;
96eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    options.responsiveness = notification_responsiveness_ms;
97eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
98eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GeofenceInfo data;
99eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    data.size = sizeof(GeofenceInfo);
100eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    data.latitude = latitude;
101eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    data.longitude = longitude;
102eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    data.radius = radius_meters;
103eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
104eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationError err = (LocationError)locAPIAddGeofences(1, &geofence_id, &options, &data);
105eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (LOCATION_ERROR_SUCCESS != err) {
106eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        onAddGeofencesCb(1, &err, &geofence_id);
107eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
108eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
109eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
110eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GeofenceAPIClient::geofencePause(uint32_t geofence_id)
111eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
112eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]: (%d)", __FUNCTION__, geofence_id);
113eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locAPIPauseGeofences(1, &geofence_id);
114eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
115eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
116eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GeofenceAPIClient::geofenceResume(uint32_t geofence_id, int32_t monitor_transitions)
117eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
118eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]: (%d %d)", __FUNCTION__, geofence_id, monitor_transitions);
119eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GeofenceBreachTypeMask mask = 0;
120eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (monitor_transitions & IGnssGeofenceCallback::GeofenceTransition::ENTERED)
121eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        mask |= GEOFENCE_BREACH_ENTER_BIT;
122eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (monitor_transitions & IGnssGeofenceCallback::GeofenceTransition::EXITED)
123eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        mask |=  GEOFENCE_BREACH_EXIT_BIT;
124eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locAPIResumeGeofences(1, &geofence_id, &mask);
125eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
126eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
127eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GeofenceAPIClient::geofenceRemove(uint32_t geofence_id)
128eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
129eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]: (%d)", __FUNCTION__, geofence_id);
130eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    locAPIRemoveGeofences(1, &geofence_id);
131eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
132eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
133eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GeofenceAPIClient::geofenceRemoveAll()
134eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
135eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]", __FUNCTION__);
136eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    // TODO locAPIRemoveAllGeofences();
137eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
138eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
139eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh// callbacks
140eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GeofenceAPIClient::onGeofenceBreachCb(GeofenceBreachNotification geofenceBreachNotification)
141eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
142eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]: (%zu)", __FUNCTION__, geofenceBreachNotification.count);
143eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnssGeofencingCbIface != nullptr) {
144eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        for (size_t i = 0; i < geofenceBreachNotification.count; i++) {
145eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            GnssLocation gnssLocation;
146eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            convertGnssLocation(geofenceBreachNotification.location, gnssLocation);
147eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
148eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            IGnssGeofenceCallback::GeofenceTransition transition;
149eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            if (geofenceBreachNotification.type == GEOFENCE_BREACH_ENTER)
150eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                transition = IGnssGeofenceCallback::GeofenceTransition::ENTERED;
151eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            else if (geofenceBreachNotification.type == GEOFENCE_BREACH_EXIT)
152eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                transition = IGnssGeofenceCallback::GeofenceTransition::EXITED;
153eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            else {
154eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                // continue with other breach if transition is
155eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                // nether GPS_GEOFENCE_ENTERED nor GPS_GEOFENCE_EXITED
156eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                continue;
157eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            }
158eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
159eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            auto r = mGnssGeofencingCbIface->gnssGeofenceTransitionCb(
160eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                    geofenceBreachNotification.ids[i], gnssLocation, transition,
161eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                    static_cast<GnssUtcTime>(geofenceBreachNotification.timestamp));
162eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            if (!r.isOk()) {
163eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                LOC_LOGE("%s] Error from gnssGeofenceTransitionCb description=%s",
164eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                    __func__, r.description().c_str());
165eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            }
166eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        }
167eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
168eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
169eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
170eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GeofenceAPIClient::onGeofenceStatusCb(GeofenceStatusNotification geofenceStatusNotification)
171eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
172eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]: (%d)", __FUNCTION__, geofenceStatusNotification.available);
173eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnssGeofencingCbIface != nullptr) {
174eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        IGnssGeofenceCallback::GeofenceAvailability status =
175eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            IGnssGeofenceCallback::GeofenceAvailability::UNAVAILABLE;
176eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        if (geofenceStatusNotification.available == GEOFENCE_STATUS_AVAILABILE_YES) {
177eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            status = IGnssGeofenceCallback::GeofenceAvailability::AVAILABLE;
178eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        }
179eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        GnssLocation gnssLocation;
180eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        memset(&gnssLocation, 0, sizeof(GnssLocation));
181eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        auto r = mGnssGeofencingCbIface->gnssGeofenceStatusCb(status, gnssLocation);
182eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        if (!r.isOk()) {
183eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            LOC_LOGE("%s] Error from gnssGeofenceStatusCb description=%s",
184eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                __func__, r.description().c_str());
185eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        }
186eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
187eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
188eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
189eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GeofenceAPIClient::onAddGeofencesCb(size_t count, LocationError* errors, uint32_t* ids)
190eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
191eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]: (%zu)", __FUNCTION__, count);
192eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnssGeofencingCbIface != nullptr) {
193eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        for (size_t i = 0; i < count; i++) {
194eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            IGnssGeofenceCallback::GeofenceStatus status =
195eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                IGnssGeofenceCallback::GeofenceStatus::ERROR_GENERIC;
196eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            if (errors[i] == LOCATION_ERROR_SUCCESS)
197eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                status = IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS;
198eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            else if (errors[i] == LOCATION_ERROR_ID_EXISTS)
199eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                status = IGnssGeofenceCallback::GeofenceStatus::ERROR_ID_EXISTS;
200eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            auto r = mGnssGeofencingCbIface->gnssGeofenceAddCb(ids[i], status);
201eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            if (!r.isOk()) {
202eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                LOC_LOGE("%s] Error from gnssGeofenceAddCb description=%s",
203eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                    __func__, r.description().c_str());
204eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            }
205eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        }
206eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
207eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
208eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
209eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GeofenceAPIClient::onRemoveGeofencesCb(size_t count, LocationError* errors, uint32_t* ids)
210eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
211eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]: (%zu)", __FUNCTION__, count);
212eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnssGeofencingCbIface != nullptr) {
213eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        for (size_t i = 0; i < count; i++) {
214eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            IGnssGeofenceCallback::GeofenceStatus status =
215eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                IGnssGeofenceCallback::GeofenceStatus::ERROR_GENERIC;
216eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            if (errors[i] == LOCATION_ERROR_SUCCESS)
217eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                status = IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS;
218eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            else if (errors[i] == LOCATION_ERROR_ID_UNKNOWN)
219eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                status = IGnssGeofenceCallback::GeofenceStatus::ERROR_ID_UNKNOWN;
220eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            auto r = mGnssGeofencingCbIface->gnssGeofenceRemoveCb(ids[i], status);
221eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            if (!r.isOk()) {
222eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                LOC_LOGE("%s] Error from gnssGeofenceRemoveCb description=%s",
223eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                    __func__, r.description().c_str());
224eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            }
225eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        }
226eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
227eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
228eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
229eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GeofenceAPIClient::onPauseGeofencesCb(size_t count, LocationError* errors, uint32_t* ids)
230eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
231eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]: (%zu)", __FUNCTION__, count);
232eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnssGeofencingCbIface != nullptr) {
233eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        for (size_t i = 0; i < count; i++) {
234eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            IGnssGeofenceCallback::GeofenceStatus status =
235eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                IGnssGeofenceCallback::GeofenceStatus::ERROR_GENERIC;
236eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            if (errors[i] == LOCATION_ERROR_SUCCESS)
237eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                status = IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS;
238eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            else if (errors[i] == LOCATION_ERROR_ID_UNKNOWN)
239eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                status = IGnssGeofenceCallback::GeofenceStatus::ERROR_ID_UNKNOWN;
240eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            auto r = mGnssGeofencingCbIface->gnssGeofencePauseCb(ids[i], status);
241eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            if (!r.isOk()) {
242eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                LOC_LOGE("%s] Error from gnssGeofencePauseCb description=%s",
243eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                    __func__, r.description().c_str());
244eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            }
245eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        }
246eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
247eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
248eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
249eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GeofenceAPIClient::onResumeGeofencesCb(size_t count, LocationError* errors, uint32_t* ids)
250eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{
251eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LOC_LOGD("%s]: (%zu)", __FUNCTION__, count);
252eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    if (mGnssGeofencingCbIface != nullptr) {
253eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        for (size_t i = 0; i < count; i++) {
254eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            IGnssGeofenceCallback::GeofenceStatus status =
255eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                IGnssGeofenceCallback::GeofenceStatus::ERROR_GENERIC;
256eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            if (errors[i] == LOCATION_ERROR_SUCCESS)
257eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                status = IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS;
258eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            else if (errors[i] == LOCATION_ERROR_ID_UNKNOWN)
259eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                status = IGnssGeofenceCallback::GeofenceStatus::ERROR_ID_UNKNOWN;
260eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            auto r = mGnssGeofencingCbIface->gnssGeofenceResumeCb(ids[i], status);
261eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            if (!r.isOk()) {
262eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                LOC_LOGE("%s] Error from gnssGeofenceResumeCb description=%s",
263eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                    __func__, r.description().c_str());
264eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            }
265eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh        }
266eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    }
267eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
268eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
269eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}  // namespace implementation
270eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}  // namespace V1_0
271eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}  // namespace gnss
272eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}  // namespace hardware
273eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}  // namespace android
274