Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7d6793a8 authored by Yu-Han Yang's avatar Yu-Han Yang
Browse files

Refactor GnssGeofence JNI

Bug: 205185251
Test: on Cuttlefish
Change-Id: Ib4ac07fdcafa7108473f67ec30d407007cfb220d
parent 34b9804e
Loading
Loading
Loading
Loading
+31 −290
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@
#include "gnss/GnssAntennaInfoCallback.h"
#include "gnss/GnssBatching.h"
#include "gnss/GnssConfiguration.h"
#include "gnss/GnssGeofence.h"
#include "gnss/GnssMeasurement.h"
#include "gnss/GnssNavigationMessage.h"
#include "gnss/Utils.h"
@@ -79,12 +80,6 @@ static jmethodID method_requestLocation;
static jmethodID method_requestRefLocation;
static jmethodID method_requestSetID;
static jmethodID method_requestUtcTime;
static jmethodID method_reportGeofenceTransition;
static jmethodID method_reportGeofenceStatus;
static jmethodID method_reportGeofenceAddStatus;
static jmethodID method_reportGeofenceRemoveStatus;
static jmethodID method_reportGeofencePauseStatus;
static jmethodID method_reportGeofenceResumeStatus;
static jmethodID method_reportGnssServiceDied;
static jmethodID method_reportGnssPowerStats;
static jmethodID method_setSubHalMeasurementCorrectionsCapabilities;
@@ -133,8 +128,6 @@ using android::hardware::hidl_death_recipient;

using android::hardware::gnss::V1_0::GnssLocationFlags;
using android::hardware::gnss::V1_0::IAGnssRilCallback;
using android::hardware::gnss::V1_0::IGnssGeofenceCallback;
using android::hardware::gnss::V1_0::IGnssGeofencing;
using android::hardware::gnss::V1_0::IGnssNavigationMessage;
using android::hardware::gnss::V1_0::IGnssNavigationMessageCallback;
using android::hardware::gnss::V1_0::IGnssNi;
@@ -192,8 +185,6 @@ using android::hardware::gnss::PsdsType;
using IGnssAidl = android::hardware::gnss::IGnss;
using IGnssCallbackAidl = android::hardware::gnss::IGnssCallback;
using IGnssBatchingAidl = android::hardware::gnss::IGnssBatching;
using IGnssGeofenceAidl = android::hardware::gnss::IGnssGeofence;
using IGnssGeofenceCallbackAidl = android::hardware::gnss::IGnssGeofenceCallback;
using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds;
using IGnssPsdsCallbackAidl = android::hardware::gnss::IGnssPsdsCallback;
using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration;
@@ -220,12 +211,10 @@ sp<IGnss_V2_0> gnssHal_V2_0 = nullptr;
sp<IGnss_V2_1> gnssHal_V2_1 = nullptr;
sp<IGnssAidl> gnssHalAidl = nullptr;
sp<IGnssBatchingAidl> gnssBatchingAidlIface = nullptr;
sp<IGnssGeofenceAidl> gnssGeofenceAidlIface = nullptr;
sp<IGnssPsdsAidl> gnssPsdsAidlIface = nullptr;
sp<IGnssXtra> gnssXtraIface = nullptr;
sp<IAGnssRil_V1_0> agnssRilIface = nullptr;
sp<IAGnssRil_V2_0> agnssRilIface_V2_0 = nullptr;
sp<IGnssGeofencing> gnssGeofencingIface = nullptr;
sp<IAGnss_V1_0> agnssIface = nullptr;
sp<IAGnss_V2_0> agnssIface_V2_0 = nullptr;
sp<IGnssDebug_V1_0> gnssDebugIface = nullptr;
@@ -241,6 +230,7 @@ std::unique_ptr<GnssConfigurationInterface> gnssConfigurationIface = nullptr;
std::unique_ptr<android::gnss::GnssMeasurementInterface> gnssMeasurementIface = nullptr;
std::unique_ptr<android::gnss::GnssNavigationMessageInterface> gnssNavigationMessageIface = nullptr;
std::unique_ptr<android::gnss::GnssBatchingInterface> gnssBatchingIface = nullptr;
std::unique_ptr<android::gnss::GnssGeofenceInterface> gnssGeofencingIface = nullptr;

#define WAKE_LOCK_NAME  "GPS"

@@ -714,199 +704,6 @@ Return<void> GnssXtraCallback::downloadRequestCb() {
    return Void();
}

/** Util class for GnssGeofenceCallback methods. */
struct GnssGeofenceCallbackUtil {
    template <class T>
    static void gnssGeofenceTransitionCb(int geofenceId, const T& location, int transition,
                                         int64_t timestampMillis);
    template <class T>
    static void gnssGeofenceStatusCb(int availability, const T& lastLocation);
    static void gnssGeofenceAddCb(int geofenceId, int status);
    static void gnssGeofenceRemoveCb(int geofenceId, int status);
    static void gnssGeofencePauseCb(int geofenceId, int status);
    static void gnssGeofenceResumeCb(int geofenceId, int status);

private:
    GnssGeofenceCallbackUtil() = delete;
};

template <class T>
void GnssGeofenceCallbackUtil::gnssGeofenceTransitionCb(int geofenceId, const T& location,
                                                        int transition, int64_t timestamp) {
    JNIEnv* env = getJniEnv();

    jobject jLocation = translateGnssLocation(env, location);

    env->CallVoidMethod(mCallbacksObj,
                        method_reportGeofenceTransition,
                        geofenceId,
                        jLocation,
                        transition,
                        timestamp);

    checkAndClearExceptionFromCallback(env, __FUNCTION__);
    env->DeleteLocalRef(jLocation);
}

template <class T>
void GnssGeofenceCallbackUtil::gnssGeofenceStatusCb(int availability, const T& lastLocation) {
    JNIEnv* env = getJniEnv();

    jobject jLocation = translateGnssLocation(env, lastLocation);

    env->CallVoidMethod(mCallbacksObj, method_reportGeofenceStatus, availability, jLocation);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
    env->DeleteLocalRef(jLocation);
}

void GnssGeofenceCallbackUtil::gnssGeofenceAddCb(int geofenceId, int status) {
    JNIEnv* env = getJniEnv();
    if (status != IGnssGeofenceCallbackAidl::OPERATION_SUCCESS) {
        ALOGE("%s: Error in adding a Geofence: %d\n", __func__, status);
    }

    env->CallVoidMethod(mCallbacksObj,
                        method_reportGeofenceAddStatus,
                        geofenceId,
                        status);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
}

void GnssGeofenceCallbackUtil::gnssGeofenceRemoveCb(int geofenceId, int status) {
    JNIEnv* env = getJniEnv();
    if (status != IGnssGeofenceCallbackAidl::OPERATION_SUCCESS) {
        ALOGE("%s: Error in removing a Geofence: %d\n", __func__, status);
    }

    env->CallVoidMethod(mCallbacksObj,
                        method_reportGeofenceRemoveStatus,
                        geofenceId, status);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
}

void GnssGeofenceCallbackUtil::gnssGeofencePauseCb(int geofenceId, int status) {
    JNIEnv* env = getJniEnv();
    if (status != IGnssGeofenceCallbackAidl::OPERATION_SUCCESS) {
        ALOGE("%s: Error in pausing Geofence: %d\n", __func__, status);
    }

    env->CallVoidMethod(mCallbacksObj,
                        method_reportGeofencePauseStatus,
                        geofenceId, status);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
}

void GnssGeofenceCallbackUtil::gnssGeofenceResumeCb(int geofenceId, int status) {
    JNIEnv* env = getJniEnv();
    if (status != IGnssGeofenceCallbackAidl::OPERATION_SUCCESS) {
        ALOGE("%s: Error in resuming Geofence: %d\n", __func__, status);
    }

    env->CallVoidMethod(mCallbacksObj,
                        method_reportGeofenceResumeStatus,
                        geofenceId, status);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
}

/*
 * GnssGeofenceCallbackAidl class implements the callback methods for the IGnssGeofence AIDL
 * interface.
 */
struct GnssGeofenceCallbackAidl : public android::hardware::gnss::BnGnssGeofenceCallback {
    Status gnssGeofenceTransitionCb(int geofenceId, const GnssLocationAidl& location,
                                    int transition, int64_t timestampMillis) override;
    Status gnssGeofenceStatusCb(int availability, const GnssLocationAidl& lastLocation) override;
    Status gnssGeofenceAddCb(int geofenceId, int status) override;
    Status gnssGeofenceRemoveCb(int geofenceId, int status) override;
    Status gnssGeofencePauseCb(int geofenceId, int status) override;
    Status gnssGeofenceResumeCb(int geofenceId, int status) override;
};

Status GnssGeofenceCallbackAidl::gnssGeofenceTransitionCb(int geofenceId,
                                                          const GnssLocationAidl& location,
                                                          int transition, int64_t timestampMillis) {
    GnssGeofenceCallbackUtil::gnssGeofenceTransitionCb(geofenceId, location, transition,
                                                       timestampMillis);
    return Status::ok();
}

Status GnssGeofenceCallbackAidl::gnssGeofenceStatusCb(int availability,
                                                      const GnssLocationAidl& lastLocation) {
    GnssGeofenceCallbackUtil::gnssGeofenceStatusCb(availability, lastLocation);
    return Status::ok();
}

Status GnssGeofenceCallbackAidl::gnssGeofenceAddCb(int geofenceId, int status) {
    GnssGeofenceCallbackUtil::gnssGeofenceAddCb(geofenceId, status);
    return Status::ok();
}

Status GnssGeofenceCallbackAidl::gnssGeofenceRemoveCb(int geofenceId, int status) {
    GnssGeofenceCallbackUtil::gnssGeofenceRemoveCb(geofenceId, status);
    return Status::ok();
}

Status GnssGeofenceCallbackAidl::gnssGeofencePauseCb(int geofenceId, int status) {
    GnssGeofenceCallbackUtil::gnssGeofencePauseCb(geofenceId, status);
    return Status::ok();
}

Status GnssGeofenceCallbackAidl::gnssGeofenceResumeCb(int geofenceId, int status) {
    GnssGeofenceCallbackUtil::gnssGeofenceResumeCb(geofenceId, status);
    return Status::ok();
}

/*
 * GnssGeofenceCallback class implements the callback methods for the
 * IGnssGeofence HIDL interface.
 */
struct GnssGeofenceCallback : public IGnssGeofenceCallback {
    // Methods from ::android::hardware::gps::V1_0::IGnssGeofenceCallback follow.
    Return<void> gnssGeofenceTransitionCb(int32_t geofenceId, const GnssLocation_V1_0& location,
                                          GeofenceTransition transition,
                                          hardware::gnss::V1_0::GnssUtcTime timestamp) override;
    Return<void> gnssGeofenceStatusCb(GeofenceAvailability status,
                                      const GnssLocation_V1_0& location) override;
    Return<void> gnssGeofenceAddCb(int32_t geofenceId, GeofenceStatus status) override;
    Return<void> gnssGeofenceRemoveCb(int32_t geofenceId, GeofenceStatus status) override;
    Return<void> gnssGeofencePauseCb(int32_t geofenceId, GeofenceStatus status) override;
    Return<void> gnssGeofenceResumeCb(int32_t geofenceId, GeofenceStatus status) override;
};

Return<void> GnssGeofenceCallback::gnssGeofenceTransitionCb(
        int32_t geofenceId, const GnssLocation_V1_0& location, GeofenceTransition transition,
        hardware::gnss::V1_0::GnssUtcTime timestamp) {
    GnssGeofenceCallbackUtil::gnssGeofenceTransitionCb(geofenceId, location, (int)transition,
                                                       (int64_t)timestamp);
    return Void();
}

Return<void> GnssGeofenceCallback::gnssGeofenceStatusCb(GeofenceAvailability availability,
                                                        const GnssLocation_V1_0& location) {
    GnssGeofenceCallbackUtil::gnssGeofenceStatusCb((int)availability, location);
    return Void();
}

Return<void> GnssGeofenceCallback::gnssGeofenceAddCb(int32_t geofenceId, GeofenceStatus status) {
    GnssGeofenceCallbackUtil::gnssGeofenceAddCb(geofenceId, (int)status);
    return Void();
}

Return<void> GnssGeofenceCallback::gnssGeofenceRemoveCb(int32_t geofenceId, GeofenceStatus status) {
    GnssGeofenceCallbackUtil::gnssGeofenceRemoveCb(geofenceId, (int)status);
    return Void();
}

Return<void> GnssGeofenceCallback::gnssGeofencePauseCb(int32_t geofenceId, GeofenceStatus status) {
    GnssGeofenceCallbackUtil::gnssGeofencePauseCb(geofenceId, (int)status);
    return Void();
}

Return<void> GnssGeofenceCallback::gnssGeofenceResumeCb(int32_t geofenceId, GeofenceStatus status) {
    GnssGeofenceCallbackUtil::gnssGeofenceResumeCb(geofenceId, (int)status);
    return Void();
}

/*
 * MeasurementCorrectionsCallback implements callback methods of interface
 * IMeasurementCorrectionsCallback.hal.
@@ -1206,18 +1003,6 @@ static void android_location_gnss_hal_GnssNative_class_init_once(JNIEnv* env, jc
    method_requestRefLocation = env->GetMethodID(clazz, "requestRefLocation", "()V");
    method_requestSetID = env->GetMethodID(clazz, "requestSetID", "(I)V");
    method_requestUtcTime = env->GetMethodID(clazz, "requestUtcTime", "()V");
    method_reportGeofenceTransition = env->GetMethodID(clazz, "reportGeofenceTransition",
            "(ILandroid/location/Location;IJ)V");
    method_reportGeofenceStatus = env->GetMethodID(clazz, "reportGeofenceStatus",
            "(ILandroid/location/Location;)V");
    method_reportGeofenceAddStatus = env->GetMethodID(clazz, "reportGeofenceAddStatus",
            "(II)V");
    method_reportGeofenceRemoveStatus = env->GetMethodID(clazz, "reportGeofenceRemoveStatus",
            "(II)V");
    method_reportGeofenceResumeStatus = env->GetMethodID(clazz, "reportGeofenceResumeStatus",
            "(II)V");
    method_reportGeofencePauseStatus = env->GetMethodID(clazz, "reportGeofencePauseStatus",
            "(II)V");
    method_reportGnssServiceDied = env->GetMethodID(clazz, "reportGnssServiceDied", "()V");
    method_reportNfwNotification = env->GetMethodID(clazz, "reportNfwNotification",
            "(Ljava/lang/String;BLjava/lang/String;BLjava/lang/String;BZZ)V");
@@ -1522,27 +1307,27 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
        if (checkHidlReturn(gnssConfiguration,
                            "Unable to get a handle to GnssConfiguration_V1_1")) {
            gnssConfigurationIface =
                    std::make_unique<android::gnss::GnssConfiguration_V1_1>(gnssConfiguration);
                    std::make_unique<gnss::GnssConfiguration_V1_1>(gnssConfiguration);
        }
    } else {
        auto gnssConfiguration = gnssHal->getExtensionGnssConfiguration();
        if (checkHidlReturn(gnssConfiguration,
                            "Unable to get a handle to GnssConfiguration_V1_0")) {
            gnssConfigurationIface =
                    std::make_unique<android::gnss::GnssConfiguration_V1_0>(gnssConfiguration);
                    std::make_unique<gnss::GnssConfiguration_V1_0>(gnssConfiguration);
        }
    }

    if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
        sp<IGnssGeofenceAidl> gnssGeofenceAidl;
        auto status = gnssHalAidl->getExtensionGnssGeofence(&gnssGeofenceAidl);
        if (checkAidlStatus(status, "Unable to get a handle to GnssGeofence interface.")) {
            gnssGeofenceAidlIface = gnssGeofenceAidl;
        sp<hardware::gnss::IGnssGeofence> gnssGeofence;
        auto status = gnssHalAidl->getExtensionGnssGeofence(&gnssGeofence);
        if (checkAidlStatus(status, "Unable to get a handle to GnssGeofence AIDL interface.")) {
            gnssGeofencingIface = std::make_unique<gnss::GnssGeofenceAidl>(gnssGeofence);
        }
    } else if (gnssHal != nullptr) {
        auto gnssGeofencing = gnssHal->getExtensionGnssGeofencing();
        if (checkHidlReturn(gnssGeofencing, "Unable to get a handle to GnssGeofencing")) {
            gnssGeofencingIface = gnssGeofencing;
            gnssGeofencingIface = std::make_unique<gnss::GnssGeofenceHidl>(gnssGeofencing);
        }
    }

@@ -1680,19 +1465,9 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
        ALOGI("Unable to initialize IAGnss interface.");
    }

    // Set IGnssGeofencing.hal callback.
    if (gnssGeofenceAidlIface != nullptr) {
        sp<IGnssGeofenceCallbackAidl> gnssGeofenceCallbackAidl = new GnssGeofenceCallbackAidl();
        auto status = gnssGeofenceAidlIface->setCallback(gnssGeofenceCallbackAidl);
        if (!checkAidlStatus(status, "IGnssGeofenceAidl setCallback() failed.")) {
            gnssGeofenceAidlIface = nullptr;
        }
    } else if (gnssGeofencingIface != nullptr) {
        sp<IGnssGeofenceCallback> gnssGeofencingCbIface = new GnssGeofenceCallback();
        auto status = gnssGeofencingIface->setCallback(gnssGeofencingCbIface);
        if (!checkHidlReturn(status, "IGnssGeofencing setCallback() failed.")) {
            gnssGeofencingIface = nullptr;
        }
    // Set GnssGeofence callback.
    if (gnssGeofencingIface != nullptr) {
        gnssGeofencingIface->setCallback(std::make_unique<gnss::GnssGeofenceCallback>());
    } else {
        ALOGI("Unable to initialize IGnssGeofencing interface.");
    }
@@ -2239,7 +2014,7 @@ static void android_location_GnssNetworkConnectivityHandler_update_network_state

static jboolean android_location_gnss_hal_GnssNative_is_geofence_supported(JNIEnv* /* env */,
                                                                           jclass) {
    if (gnssGeofencingIface == nullptr && gnssGeofenceAidlIface == nullptr) {
    if (gnssGeofencingIface == nullptr) {
        return JNI_FALSE;
    }
    return JNI_TRUE;
@@ -2249,76 +2024,42 @@ static jboolean android_location_gnss_hal_GnssNative_add_geofence(
        JNIEnv* /* env */, jclass, jint geofenceId, jdouble latitude, jdouble longitude,
        jdouble radius, jint last_transition, jint monitor_transition,
        jint notification_responsiveness, jint unknown_timer) {
    if (gnssGeofenceAidlIface != nullptr) {
        auto status =
                gnssGeofenceAidlIface->addGeofence(geofenceId, latitude, longitude, radius,
                                                   last_transition, monitor_transition,
                                                   notification_responsiveness, unknown_timer);
        return checkAidlStatus(status, "IGnssGeofenceAidl addGeofence() failed.");
    }

    if (gnssGeofencingIface != nullptr) {
        auto result = gnssGeofencingIface
                              ->addGeofence(geofenceId, latitude, longitude, radius,
                                            static_cast<IGnssGeofenceCallback::GeofenceTransition>(
                                                    last_transition),
                                            monitor_transition, notification_responsiveness,
                                            unknown_timer);
        return checkHidlReturn(result, "IGnssGeofencing addGeofence() failed.");
    }

    if (gnssGeofencingIface == nullptr) {
        ALOGE("%s: IGnssGeofencing interface not available.", __func__);
        return JNI_FALSE;
    }
    return gnssGeofencingIface->addGeofence(geofenceId, latitude, longitude, radius,
                                            last_transition, monitor_transition,
                                            notification_responsiveness, unknown_timer);
}

static jboolean android_location_gnss_hal_GnssNative_remove_geofence(JNIEnv* /* env */, jclass,
                                                                     jint geofenceId) {
    if (gnssGeofenceAidlIface != nullptr) {
        auto status = gnssGeofenceAidlIface->removeGeofence(geofenceId);
        return checkAidlStatus(status, "IGnssGeofenceAidl removeGeofence() failed.");
    }

    if (gnssGeofencingIface != nullptr) {
        auto result = gnssGeofencingIface->removeGeofence(geofenceId);
        return checkHidlReturn(result, "IGnssGeofencing removeGeofence() failed.");
    }

    if (gnssGeofencingIface == nullptr) {
        ALOGE("%s: IGnssGeofencing interface not available.", __func__);
        return JNI_FALSE;
    }
    return gnssGeofencingIface->removeGeofence(geofenceId);
}

static jboolean android_location_gnss_hal_GnssNative_pause_geofence(JNIEnv* /* env */, jclass,
                                                                    jint geofenceId) {
    if (gnssGeofenceAidlIface != nullptr) {
        auto status = gnssGeofenceAidlIface->pauseGeofence(geofenceId);
        return checkAidlStatus(status, "IGnssGeofenceAidl pauseGeofence() failed.");
    }

    if (gnssGeofencingIface != nullptr) {
        auto result = gnssGeofencingIface->pauseGeofence(geofenceId);
        return checkHidlReturn(result, "IGnssGeofencing pauseGeofence() failed.");
    }

    if (gnssGeofencingIface == nullptr) {
        ALOGE("%s: IGnssGeofencing interface not available.", __func__);
        return JNI_FALSE;
    }
    return gnssGeofencingIface->pauseGeofence(geofenceId);
}

static jboolean android_location_gnss_hal_GnssNative_resume_geofence(JNIEnv* /* env */, jclass,
                                                                     jint geofenceId,
                                                                     jint monitor_transition) {
    if (gnssGeofenceAidlIface != nullptr) {
        auto status = gnssGeofenceAidlIface->resumeGeofence(geofenceId, monitor_transition);
        return checkAidlStatus(status, "IGnssGeofenceAidl resumeGeofence() failed.");
    }

    if (gnssGeofencingIface != nullptr) {
        auto result = gnssGeofencingIface->resumeGeofence(geofenceId, monitor_transition);
        return checkHidlReturn(result, "IGnssGeofencing resumeGeofence() failed.");
    }

    if (gnssGeofencingIface == nullptr) {
        ALOGE("%s: IGnssGeofencing interface not available.", __func__);
        return JNI_FALSE;
    }
    return gnssGeofencingIface->resumeGeofence(geofenceId, monitor_transition);
}

static jboolean android_location_gnss_hal_GnssNative_is_antenna_info_supported(JNIEnv* env,
                                                                               jclass) {
+2 −0
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@ cc_library_shared {
        "GnssBatching.cpp",
        "GnssBatchingCallback.cpp",
        "GnssConfiguration.cpp",
        "GnssGeofence.cpp",
        "GnssGeofenceCallback.cpp",
        "GnssMeasurement.cpp",
        "GnssMeasurementCallback.cpp",
        "GnssNavigationMessage.cpp",
+108 −0

File added.

Preview size limit exceeded, changes collapsed.

+79 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _ANDROID_SERVER_GNSS_GNSSGEOFENCE_H
#define _ANDROID_SERVER_GNSS_GNSSGEOFENCE_H

#pragma once

#ifndef LOG_TAG
#error LOG_TAG must be defined before including this file.
#endif

#include <android/hardware/gnss/1.0/IGnssGeofencing.h>
#include <android/hardware/gnss/BnGnssGeofence.h>
#include <log/log.h>

#include "GnssGeofenceCallback.h"
#include "jni.h"

namespace android::gnss {

class GnssGeofenceInterface {
public:
    virtual ~GnssGeofenceInterface() {}
    virtual jboolean setCallback(const std::unique_ptr<GnssGeofenceCallback>& callback);
    virtual jboolean addGeofence(int geofenceId, double latitudeDegrees, double longitudeDegrees,
                                 double radiusMeters, int lastTransition, int monitorTransitions,
                                 int notificationResponsivenessMs, int unknownTimerMs);
    virtual jboolean pauseGeofence(int geofenceId);
    virtual jboolean resumeGeofence(int geofenceId, int monitorTransitions);
    virtual jboolean removeGeofence(int geofenceId);
};

class GnssGeofenceAidl : public GnssGeofenceInterface {
public:
    GnssGeofenceAidl(const sp<android::hardware::gnss::IGnssGeofence>& iGnssGeofence);
    jboolean setCallback(const std::unique_ptr<GnssGeofenceCallback>& callback) override;
    jboolean addGeofence(int geofenceId, double latitudeDegrees, double longitudeDegrees,
                         double radiusMeters, int lastTransition, int monitorTransitions,
                         int notificationResponsivenessMs, int unknownTimerMs) override;
    jboolean pauseGeofence(int geofenceId) override;
    jboolean resumeGeofence(int geofenceId, int monitorTransitions) override;
    jboolean removeGeofence(int geofenceId) override;

private:
    const sp<android::hardware::gnss::IGnssGeofence> mIGnssGeofenceAidl;
};

class GnssGeofenceHidl : public GnssGeofenceInterface {
public:
    GnssGeofenceHidl(const sp<android::hardware::gnss::V1_0::IGnssGeofencing>& iGnssGeofence);
    jboolean setCallback(const std::unique_ptr<GnssGeofenceCallback>& callback) override;
    jboolean addGeofence(int geofenceId, double latitudeDegrees, double longitudeDegrees,
                         double radiusMeters, int lastTransition, int monitorTransitions,
                         int notificationResponsivenessMs, int unknownTimerMs) override;
    jboolean pauseGeofence(int geofenceId) override;
    jboolean resumeGeofence(int geofenceId, int monitorTransitions) override;
    jboolean removeGeofence(int geofenceId) override;

private:
    const sp<android::hardware::gnss::V1_0::IGnssGeofencing> mIGnssGeofenceHidl;
};

} // namespace android::gnss

#endif // _ANDROID_SERVER_GNSS_GNSSGEOFENCE_H
+171 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading