129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju/*
229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * Copyright (C) 2016 The Android Open Source Project
329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju *
429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * Licensed under the Apache License, Version 2.0 (the "License");
529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * you may not use this file except in compliance with the License.
629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * You may obtain a copy of the License at
729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju *
829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju *      http://www.apache.org/licenses/LICENSE-2.0
929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju *
1029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * Unless required by applicable law or agreed to in writing, software
1129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * distributed under the License is distributed on an "AS IS" BASIS,
1229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * See the License for the specific language governing permissions and
1429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju * limitations under the License.
1529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju */
1629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
1729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju#define LOG_TAG "GnssHal_GnssGeofencing"
1829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
1929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju#include "GnssGeofencing.h"
2029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju#include <GnssUtils.h>
2129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
2229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajunamespace android {
2329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajunamespace hardware {
2429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajunamespace gnss {
2529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajunamespace V1_0 {
2629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajunamespace implementation {
2729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
2829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajustd::vector<std::unique_ptr<ThreadFuncArgs>> GnssGeofencing::sThreadFuncArgsList;
2929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajusp<IGnssGeofenceCallback> GnssGeofencing::mGnssGeofencingCbIface = nullptr;
3029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajubool GnssGeofencing::sInterfaceExists = false;
3129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
3229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya ValsarajuGpsGeofenceCallbacks GnssGeofencing::sGnssGfCb = {
3329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    .geofence_transition_callback = gnssGfTransitionCb,
3429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    .geofence_status_callback = gnssGfStatusCb,
3529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    .geofence_add_callback = gnssGfAddCb,
3629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    .geofence_remove_callback = gnssGfRemoveCb,
3729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    .geofence_pause_callback = gnssGfPauseCb,
3829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    .geofence_resume_callback = gnssGfResumeCb,
3929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    .create_thread_cb = createThreadCb
4029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju};
4129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
4229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya ValsarajuGnssGeofencing::GnssGeofencing(const GpsGeofencingInterface* gpsGeofencingIface)
4329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    : mGnssGeofencingIface(gpsGeofencingIface) {
4429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    /* Error out if an instance of the interface already exists. */
4529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    LOG_ALWAYS_FATAL_IF(sInterfaceExists);
4629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    sInterfaceExists = true;
4729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
4829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
4929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya ValsarajuGnssGeofencing::~GnssGeofencing() {
5029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    sThreadFuncArgsList.clear();
51e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    sInterfaceExists = false;
5229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
5329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajuvoid GnssGeofencing::gnssGfTransitionCb(int32_t geofenceId,
5429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                                        GpsLocation* location,
5529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                                        int32_t transition,
5629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                                        GpsUtcTime timestamp) {
5729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (mGnssGeofencingCbIface == nullptr) {
5829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s: GNSS Geofence Callback Interface configured incorrectly", __func__);
5929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        return;
6029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
6129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
6229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (location == nullptr) {
6329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s : Invalid location from GNSS HAL", __func__);
6429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        return;
6529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
6629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
6729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    GnssLocation gnssLocation = convertToGnssLocation(location);
68e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    auto ret = mGnssGeofencingCbIface->gnssGeofenceTransitionCb(
6929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju            geofenceId,
7029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju            gnssLocation,
7129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju            static_cast<IGnssGeofenceCallback::GeofenceTransition>(transition),
7229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju            timestamp);
73e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    if (!ret.isOk()) {
74e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju        ALOGE("%s: Unable to invoke callback", __func__);
75e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    }
7629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
7729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
7829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajuvoid GnssGeofencing::gnssGfStatusCb(int32_t status, GpsLocation* location) {
7929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (mGnssGeofencingCbIface == nullptr) {
8029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s: GNSS Geofence Callback Interface configured incorrectly", __func__);
8129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        return;
8229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
8329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
8429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    GnssLocation gnssLocation;
8529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
8629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (location != nullptr) {
8729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        gnssLocation = convertToGnssLocation(location);
8829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    } else {
8929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        gnssLocation = {};
9029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
9129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
92e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    auto ret = mGnssGeofencingCbIface->gnssGeofenceStatusCb(
9329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju            static_cast<IGnssGeofenceCallback::GeofenceAvailability>(status), gnssLocation);
94e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    if (!ret.isOk()) {
95e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju        ALOGE("%s: Unable to invoke callback", __func__);
96e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    }
9729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
9829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
9929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajuvoid GnssGeofencing::gnssGfAddCb(int32_t geofenceId, int32_t status) {
10029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (mGnssGeofencingCbIface == nullptr) {
10129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s: GNSS Geofence Callback Interface configured incorrectly", __func__);
10229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        return;
10329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
10429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
105e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    auto ret = mGnssGeofencingCbIface->gnssGeofenceAddCb(
10629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju            geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
107e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    if (!ret.isOk()) {
108e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju        ALOGE("%s: Unable to invoke callback", __func__);
109e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    }
11029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
11129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
11229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajuvoid GnssGeofencing::gnssGfRemoveCb(int32_t geofenceId, int32_t status) {
11329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (mGnssGeofencingCbIface == nullptr) {
11429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s: GNSS Geofence Callback Interface configured incorrectly", __func__);
11529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        return;
11629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
11729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
118e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    auto ret = mGnssGeofencingCbIface->gnssGeofenceRemoveCb(
119e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju            geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
120e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    if (!ret.isOk()) {
121e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju        ALOGE("%s: Unable to invoke callback", __func__);
122e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    }
12329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
12429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
12529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajuvoid GnssGeofencing::gnssGfPauseCb(int32_t geofenceId, int32_t status) {
12629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (mGnssGeofencingCbIface == nullptr) {
12729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s: GNSS Geofence Callback Interface configured incorrectly", __func__);
12829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        return;
12929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
13029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
131e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    auto ret = mGnssGeofencingCbIface->gnssGeofencePauseCb(
13229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju            geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
133e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    if (!ret.isOk()) {
134e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju        ALOGE("%s: Unable to invoke callback", __func__);
135e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    }
13629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
13729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
13829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajuvoid GnssGeofencing::gnssGfResumeCb(int32_t geofenceId, int32_t status) {
13929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (mGnssGeofencingCbIface == nullptr) {
14029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s: GNSS Geofence Callback Interface configured incorrectly", __func__);
14129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        return;
14229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
14329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
144e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    auto ret = mGnssGeofencingCbIface->gnssGeofenceResumeCb(
14529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju            geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
146e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    if (!ret.isOk()) {
147e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju        ALOGE("%s: Unable to invoke callback", __func__);
148e020ce28f2deb46db8081a40174ba95d500504d5Hridya Valsaraju    }
14929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
15029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
15129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsarajupthread_t GnssGeofencing::createThreadCb(const char* name, void (*start)(void*), void* arg) {
15229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    return createPthread(name, start, arg, &sThreadFuncArgsList);
15329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
15429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
15529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju// Methods from ::android::hardware::gnss::V1_0::IGnssGeofencing follow.
15629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya ValsarajuReturn<void> GnssGeofencing::setCallback(const sp<IGnssGeofenceCallback>& callback)  {
15729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    mGnssGeofencingCbIface = callback;
15829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
15929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (mGnssGeofencingIface == nullptr) {
16029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s: GnssGeofencing interface is not available", __func__);
16129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    } else {
16229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        mGnssGeofencingIface->init(&sGnssGfCb);
16329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
16429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
16529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    return Void();
16629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
16729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
16829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya ValsarajuReturn<void> GnssGeofencing::addGeofence(
16929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        int32_t geofenceId,
17029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        double latitudeDegrees,
17129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        double longitudeDegrees,
17229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        double radiusMeters,
17329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        IGnssGeofenceCallback::GeofenceTransition lastTransition,
17429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        int32_t monitorTransitions,
17529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        uint32_t notificationResponsivenessMs,
17629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        uint32_t unknownTimerMs)  {
17729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (mGnssGeofencingIface == nullptr) {
17829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s: GnssGeofencing interface is not available", __func__);
17929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        return Void();
18029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    } else {
18129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        mGnssGeofencingIface->add_geofence_area(
18229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                geofenceId,
18329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                latitudeDegrees,
18429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                longitudeDegrees,
18529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                radiusMeters,
18629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                static_cast<int32_t>(lastTransition),
18729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                monitorTransitions,
18829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                notificationResponsivenessMs,
18929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju                unknownTimerMs);
19029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
19129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    return Void();
19229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
19329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
19429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya ValsarajuReturn<void> GnssGeofencing::pauseGeofence(int32_t geofenceId)  {
19529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (mGnssGeofencingIface == nullptr) {
19629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s: GnssGeofencing interface is not available", __func__);
19729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    } else {
19829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        mGnssGeofencingIface->pause_geofence(geofenceId);
19929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
20029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    return Void();
20129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
20229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
20329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya ValsarajuReturn<void> GnssGeofencing::resumeGeofence(int32_t geofenceId, int32_t monitorTransitions)  {
20429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (mGnssGeofencingIface == nullptr) {
20529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s: GnssGeofencing interface is not available", __func__);
20629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    } else {
20729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        mGnssGeofencingIface->resume_geofence(geofenceId, monitorTransitions);
20829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
20929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    return Void();
21029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
21129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
21229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya ValsarajuReturn<void> GnssGeofencing::removeGeofence(int32_t geofenceId)  {
21329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    if (mGnssGeofencingIface == nullptr) {
21429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        ALOGE("%s: GnssGeofencing interface is not available", __func__);
21529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    } else {
21629dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju        mGnssGeofencingIface->remove_geofence_area(geofenceId);
21729dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    }
21829dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju    return Void();
21929dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}
22029dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju
22129dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}  // namespace implementation
22229dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}  // namespace V1_0
22329dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}  // namespace gnss
22429dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}  // namespace hardware
22529dc1e0c724283413fdd13d68ac9751591baa3c5Hridya Valsaraju}  // namespace android
226