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

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

Add GnssGeofence AIDL HAL (frameworks/base)

Bug: 201253590
Test: on Cuttlefish
Change-Id: Ibef18e39735634daff1b6ead1926052bcc3d436e
parent add2bc58
Loading
Loading
Loading
Loading
+245 −110
Original line number Diff line number Diff line
@@ -29,6 +29,8 @@
#include <android/hardware/gnss/2.1/IGnssMeasurement.h>
#include <android/hardware/gnss/BnGnss.h>
#include <android/hardware/gnss/BnGnssCallback.h>
#include <android/hardware/gnss/BnGnssGeofence.h>
#include <android/hardware/gnss/BnGnssGeofenceCallback.h>
#include <android/hardware/gnss/BnGnssMeasurementCallback.h>
#include <android/hardware/gnss/BnGnssPowerIndicationCallback.h>
#include <android/hardware/gnss/BnGnssPsdsCallback.h>
@@ -191,6 +193,9 @@ using android::hardware::gnss::IGnssPowerIndicationCallback;
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;
@@ -216,6 +221,8 @@ sp<IGnss_V1_1> gnssHal_V1_1 = nullptr;
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;
@@ -709,35 +716,25 @@ Return<void> GnssXtraCallback::downloadRequestCb() {
    return Void();
}

/*
 * GnssGeofenceCallback class implements the callback methods for the
 * IGnssGeofence 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;
/** 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;
};

Return<void> GnssGeofenceCallback::gnssGeofenceTransitionCb(
        int32_t geofenceId, const GnssLocation_V1_0& location,
        GeofenceTransition transition,
        hardware::gnss::V1_0::GnssUtcTime timestamp) {
template <class T>
void GnssGeofenceCallbackUtil::gnssGeofenceTransitionCb(int geofenceId, const T& location,
                                                        int transition, int64_t timestamp) {
    JNIEnv* env = getJniEnv();

    jobject jLocation = translateGnssLocation(env, location);
@@ -751,27 +748,22 @@ Return<void> GnssGeofenceCallback::gnssGeofenceTransitionCb(

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

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

    jobject jLocation = translateGnssLocation(env, location);
    jobject jLocation = translateGnssLocation(env, lastLocation);

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

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

@@ -780,13 +772,11 @@ Return<void> GnssGeofenceCallback::gnssGeofenceAddCb(int32_t geofenceId,
                        geofenceId,
                        status);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
    return Void();
}

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

@@ -794,13 +784,11 @@ Return<void> GnssGeofenceCallback::gnssGeofenceRemoveCb(int32_t geofenceId,
                        method_reportGeofenceRemoveStatus,
                        geofenceId, status);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
    return Void();
}

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

@@ -808,13 +796,11 @@ Return<void> GnssGeofenceCallback::gnssGeofencePauseCb(int32_t geofenceId,
                        method_reportGeofencePauseStatus,
                        geofenceId, status);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
    return Void();
}

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

@@ -822,6 +808,104 @@ Return<void> GnssGeofenceCallback::gnssGeofenceResumeCb(int32_t geofenceId,
                        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();
}

@@ -1279,11 +1363,13 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
        android_location_gnss_hal_GnssNative_set_gps_service_handle();
    }

    if (gnssHal == nullptr) {
    if (gnssHal == nullptr && gnssHalAidl == nullptr) {
        ALOGE("Unable to get GPS service\n");
        return;
    }

    // TODO: linkToDeath for AIDL HAL

    gnssHalDeathRecipient = new GnssDeathRecipient();
    hardware::Return<bool> linked = gnssHal->linkToDeath(gnssHalDeathRecipient, /*cookie*/ 0);
    if (!linked.isOk()) {
@@ -1303,7 +1389,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
        } else {
            ALOGD("Unable to get a handle to PSDS AIDL interface.");
        }
    } else {
    } else if (gnssHal != nullptr) {
        auto gnssXtra = gnssHal->getExtensionXtra();
        if (!gnssXtra.isOk()) {
            ALOGD("Unable to get a handle to Xtra");
@@ -1320,7 +1406,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
            agnssRilIface_V2_0 = agnssRil_V2_0;
            agnssRilIface = agnssRilIface_V2_0;
        }
    } else {
    } else if (gnssHal != nullptr) {
        auto agnssRil_V1_0 = gnssHal->getExtensionAGnssRil();
        if (!agnssRil_V1_0.isOk()) {
            ALOGD("Unable to get a handle to AGnssRil");
@@ -1336,7 +1422,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
        } else {
            agnssIface_V2_0 = agnss_V2_0;
        }
    } else {
    } else if (gnssHal != nullptr) {
        auto agnss_V1_0 = gnssHal->getExtensionAGnss();
        if (!agnss_V1_0.isOk()) {
            ALOGD("Unable to get a handle to AGnss");
@@ -1345,12 +1431,14 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
        }
    }

    if (gnssHal != nullptr) {
        auto gnssNavigationMessage = gnssHal->getExtensionGnssNavigationMessage();
        if (!gnssNavigationMessage.isOk()) {
            ALOGD("Unable to get a handle to GnssNavigationMessage");
        } else {
            gnssNavigationMessageIface = gnssNavigationMessage;
        }
    }

    // Allow all causal combinations between IGnss.hal and IGnssMeasurement.hal. That means,
    // 2.1@IGnss can be paired with {1.0, 1,1, 2.0, 2.1}@IGnssMeasurement
@@ -1387,7 +1475,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
                    std::make_unique<android::gnss::GnssMeasurement_V1_1>(gnssMeasurement);
        }
    }
    if (gnssMeasurementIface == nullptr) {
    if (gnssHal != nullptr && gnssMeasurementIface == nullptr) {
        auto gnssMeasurement = gnssHal->getExtensionGnssMeasurement();
        if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V1_0")) {
            gnssMeasurementIface =
@@ -1434,7 +1522,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
            gnssDebugIface = gnssDebugIface_V2_0;
        }
    }
    if (gnssDebugIface == nullptr) {
    if (gnssHal != nullptr && gnssDebugIface == nullptr) {
        auto gnssDebug = gnssHal->getExtensionGnssDebug();
        if (!gnssDebug.isOk()) {
            ALOGD("Unable to get a handle to GnssDebug");
@@ -1443,12 +1531,14 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
        }
    }

    if (gnssHal != nullptr) {
        auto gnssNi = gnssHal->getExtensionGnssNi();
        if (!gnssNi.isOk()) {
            ALOGD("Unable to get a handle to GnssNi");
        } else {
            gnssNiIface = gnssNi;
        }
    }

    if (gnssHalAidl != nullptr) {
        sp<IGnssConfigurationAidl> gnssConfigurationAidl;
@@ -1488,12 +1578,18 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
        }
    }

    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;
        }
    } else if (gnssHal != nullptr) {
        auto gnssGeofencing = gnssHal->getExtensionGnssGeofencing();
    if (!gnssGeofencing.isOk()) {
        ALOGD("Unable to get a handle to GnssGeofencing");
    } else {
        if (checkHidlReturn(gnssGeofencing, "Unable to get a handle to GnssGeofencing")) {
            gnssGeofencingIface = gnssGeofencing;
        }
    }

    if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
        sp<android::hardware::gnss::IGnssBatching> gnssBatchingAidl;
@@ -1507,7 +1603,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
            gnssBatchingIface = std::make_unique<gnss::GnssBatching_V2_0>(gnssBatching_V2_0);
        }
    }
    if (gnssBatchingIface == nullptr) {
    if (gnssHal != nullptr && gnssBatchingIface == nullptr) {
        auto gnssBatching_V1_0 = gnssHal->getExtensionGnssBatching();
        if (checkHidlReturn(gnssBatching_V1_0, "Unable to get a handle to GnssBatching")) {
            gnssBatchingIface = std::make_unique<gnss::GnssBatching_V1_0>(gnssBatching_V1_0);
@@ -1568,7 +1664,7 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
    /*
     * Fail if the main interface fails to initialize
     */
    if (gnssHal == nullptr) {
    if (gnssHal == nullptr && gnssHalAidl == nullptr) {
        ALOGE("Unable to initialize GNSS HAL.");
        return JNI_FALSE;
    }
@@ -1583,7 +1679,7 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
        result = gnssHal_V2_0->setCallback_2_0(gnssCbIface);
    } else if (gnssHal_V1_1 != nullptr) {
        result = gnssHal_V1_1->setCallback_1_1(gnssCbIface);
    } else {
    } else if (gnssHal != nullptr) {
        result = gnssHal->setCallback(gnssCbIface);
    }

@@ -1630,10 +1726,18 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
    }

    // 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();
    if (gnssGeofencingIface != nullptr) {
        auto status = gnssGeofencingIface->setCallback(gnssGeofencingCbIface);
        checkHidlReturn(status, "IGnssGeofencing setCallback() failed.");
        if (!checkHidlReturn(status, "IGnssGeofencing setCallback() failed.")) {
            gnssGeofencingIface = nullptr;
        }
    } else {
        ALOGI("Unable to initialize IGnssGeofencing interface.");
    }
@@ -1693,13 +1797,16 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
}

static void android_location_gnss_hal_GnssNative_cleanup(JNIEnv* /* env */, jclass) {
    if (gnssHal == nullptr) {
        return;
    if (gnssHalAidl != nullptr) {
        auto status = gnssHalAidl->close();
        checkAidlStatus(status, "IGnssAidl close() failed.");
    }

    if (gnssHal != nullptr) {
        auto result = gnssHal->cleanup();
        checkHidlReturn(result, "IGnss cleanup() failed.");
    }
}

static jboolean android_location_gnss_hal_GnssNative_set_position_mode(
        JNIEnv* /* env */, jclass, jint mode, jint recurrence, jint min_interval,
@@ -2177,59 +2284,87 @@ static void android_location_GnssNetworkConnectivityHandler_update_network_state

static jboolean android_location_gnss_hal_GnssNative_is_geofence_supported(JNIEnv* /* env */,
                                                                           jclass) {
    return (gnssGeofencingIface != nullptr) ? JNI_TRUE : JNI_FALSE;
    if (gnssGeofencingIface == nullptr && gnssGeofenceAidlIface == nullptr) {
        return JNI_FALSE;
    }
    return JNI_TRUE;
}

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 (gnssGeofencingIface == nullptr) {
        ALOGE("%s: IGnssGeofencing interface not available.", __func__);
        return JNI_FALSE;
    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.");
    }

    auto result = gnssGeofencingIface->addGeofence(
            geofenceId, latitude, longitude, radius,
            static_cast<IGnssGeofenceCallback::GeofenceTransition>(last_transition),
            monitor_transition, notification_responsiveness, unknown_timer);
    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.");
    }

static jboolean android_location_gnss_hal_GnssNative_remove_geofence(JNIEnv* /* env */, jclass,
                                                                     jint geofenceId) {
    if (gnssGeofencingIface == nullptr) {
    ALOGE("%s: IGnssGeofencing interface not available.", __func__);
    return JNI_FALSE;
}

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.");
    }

static jboolean android_location_gnss_hal_GnssNative_pause_geofence(JNIEnv* /* env */, jclass,
                                                                    jint geofenceId) {
    if (gnssGeofencingIface == nullptr) {
    ALOGE("%s: IGnssGeofencing interface not available.", __func__);
    return JNI_FALSE;
}

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.");
    }

    ALOGE("%s: IGnssGeofencing interface not available.", __func__);
    return JNI_FALSE;
}

static jboolean android_location_gnss_hal_GnssNative_resume_geofence(JNIEnv* /* env */, jclass,
                                                                     jint geofenceId,
                                                                     jint monitor_transition) {
    if (gnssGeofencingIface == nullptr) {
        ALOGE("%s: IGnssGeofencing interface not available.", __func__);
        return JNI_FALSE;
    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.");
    }

    ALOGE("%s: IGnssGeofencing interface not available.", __func__);
    return JNI_FALSE;
}

static jboolean android_location_gnss_hal_GnssNative_is_antenna_info_supported(JNIEnv* env,
                                                                               jclass) {
    if (gnssAntennaInfoIface != nullptr) {