Home | History | Annotate | Download | only in android
      1 /*
      2  * Copyright (c) 2017, The Linux Foundation. All rights reserved.
      3  * Not a Contribution
      4  */
      5 /*
      6  * Copyright (C) 2016 The Android Open Source Project
      7  *
      8  * Licensed under the Apache License, Version 2.0 (the "License");
      9  * you may not use this file except in compliance with the License.
     10  * You may obtain a copy of the License at
     11  *
     12  *      http://www.apache.org/licenses/LICENSE-2.0
     13  *
     14  * Unless required by applicable law or agreed to in writing, software
     15  * distributed under the License is distributed on an "AS IS" BASIS,
     16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     17  * See the License for the specific language governing permissions and
     18  * limitations under the License.
     19  */
     20 
     21 #define LOG_TAG "GnssHal_GnssGeofencing"
     22 
     23 #include <log_util.h>
     24 #include <GeofenceAPIClient.h>
     25 #include "GnssGeofencing.h"
     26 
     27 namespace android {
     28 namespace hardware {
     29 namespace gnss {
     30 namespace V1_0 {
     31 namespace implementation {
     32 
     33 void GnssGeofencing::GnssGeofencingDeathRecipient::serviceDied(
     34         uint64_t cookie, const wp<IBase>& who) {
     35     LOC_LOGE("%s] service died. cookie: %llu, who: %p",
     36             __FUNCTION__, static_cast<unsigned long long>(cookie), &who);
     37     if (mGnssGeofencing != nullptr) {
     38         mGnssGeofencing->removeAllGeofences();
     39     }
     40 }
     41 
     42 GnssGeofencing::GnssGeofencing() : mApi(nullptr) {
     43     mGnssGeofencingDeathRecipient = new GnssGeofencingDeathRecipient(this);
     44 }
     45 
     46 GnssGeofencing::~GnssGeofencing() {
     47     if (mApi != nullptr) {
     48         delete mApi;
     49         mApi = nullptr;
     50     }
     51 }
     52 
     53 // Methods from ::android::hardware::gnss::V1_0::IGnssGeofencing follow.
     54 Return<void> GnssGeofencing::setCallback(const sp<IGnssGeofenceCallback>& callback)  {
     55     if (mApi != nullptr) {
     56         LOC_LOGE("%s]: mApi is NOT nullptr", __FUNCTION__);
     57         return Void();
     58     }
     59 
     60     mApi = new GeofenceAPIClient(callback);
     61     if (mApi == nullptr) {
     62         LOC_LOGE("%s]: failed to create mApi", __FUNCTION__);
     63     }
     64 
     65     if (mGnssGeofencingCbIface != nullptr) {
     66         mGnssGeofencingCbIface->unlinkToDeath(mGnssGeofencingDeathRecipient);
     67     }
     68     mGnssGeofencingCbIface = callback;
     69     if (mGnssGeofencingCbIface != nullptr) {
     70         mGnssGeofencingCbIface->linkToDeath(mGnssGeofencingDeathRecipient, 0 /*cookie*/);
     71     }
     72 
     73     return Void();
     74 }
     75 
     76 Return<void> GnssGeofencing::addGeofence(
     77         int32_t geofenceId,
     78         double latitudeDegrees,
     79         double longitudeDegrees,
     80         double radiusMeters,
     81         IGnssGeofenceCallback::GeofenceTransition lastTransition,
     82         int32_t monitorTransitions,
     83         uint32_t notificationResponsivenessMs,
     84         uint32_t unknownTimerMs)  {
     85     if (mApi == nullptr) {
     86         LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
     87     } else {
     88         mApi->geofenceAdd(
     89                 geofenceId,
     90                 latitudeDegrees,
     91                 longitudeDegrees,
     92                 radiusMeters,
     93                 static_cast<int32_t>(lastTransition),
     94                 monitorTransitions,
     95                 notificationResponsivenessMs,
     96                 unknownTimerMs);
     97     }
     98     return Void();
     99 }
    100 
    101 Return<void> GnssGeofencing::pauseGeofence(int32_t geofenceId)  {
    102     if (mApi == nullptr) {
    103         LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
    104     } else {
    105         mApi->geofencePause(geofenceId);
    106     }
    107     return Void();
    108 }
    109 
    110 Return<void> GnssGeofencing::resumeGeofence(int32_t geofenceId, int32_t monitorTransitions)  {
    111     if (mApi == nullptr) {
    112         LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
    113     } else {
    114         mApi->geofenceResume(geofenceId, monitorTransitions);
    115     }
    116     return Void();
    117 }
    118 
    119 Return<void> GnssGeofencing::removeGeofence(int32_t geofenceId)  {
    120     if (mApi == nullptr) {
    121         LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
    122     } else {
    123         mApi->geofenceRemove(geofenceId);
    124     }
    125     return Void();
    126 }
    127 
    128 Return<void> GnssGeofencing::removeAllGeofences()  {
    129     if (mApi == nullptr) {
    130         LOC_LOGD("%s]: mApi is nullptr, do nothing", __FUNCTION__);
    131     } else {
    132         mApi->geofenceRemoveAll();
    133     }
    134     return Void();
    135 }
    136 
    137 }  // namespace implementation
    138 }  // namespace V1_0
    139 }  // namespace gnss
    140 }  // namespace hardware
    141 }  // namespace android
    142