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

Commit a207a578 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Reland "Add GnssVisibilityControl AIDL HAL (frameworks/base)""

parents 747a0b78 c2b1fe36
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -155,7 +155,6 @@ cc_defaults {
        "android.hardware.gnss@2.0",
        "android.hardware.gnss@2.1",
        "android.hardware.gnss.measurement_corrections@1.0",
        "android.hardware.gnss.visibility_control@1.0",
        "android.hardware.graphics.bufferqueue@1.0",
        "android.hardware.graphics.bufferqueue@2.0",
        "android.hardware.graphics.common@1.2",
+24 −75
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@
#include <android/hardware/gnss/BnGnssPsdsCallback.h>
#include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h>
#include <android/hardware/gnss/measurement_corrections/1.1/IMeasurementCorrections.h>
#include <android/hardware/gnss/visibility_control/1.0/IGnssVisibilityControl.h>
#include <binder/IServiceManager.h>
#include <nativehelper/JNIHelp.h>
#include <pthread.h>
@@ -59,6 +58,7 @@
#include "gnss/GnssGeofence.h"
#include "gnss/GnssMeasurement.h"
#include "gnss/GnssNavigationMessage.h"
#include "gnss/GnssVisibilityControl.h"
#include "gnss/Utils.h"
#include "hardware_legacy/power.h"
#include "jni.h"
@@ -162,9 +162,6 @@ using IMeasurementCorrections_V1_1 = android::hardware::gnss::measurement_correc
using android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrectionsCallback;
using android::hardware::gnss::measurement_corrections::V1_0::GnssSingleSatCorrectionFlags;

using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl;
using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControlCallback;

using android::hardware::gnss::BlocklistedSource;
using android::hardware::gnss::GnssConstellationType;
using android::hardware::gnss::GnssPowerStats;
@@ -210,7 +207,6 @@ sp<IGnssNi> gnssNiIface = nullptr;
sp<IGnssPowerIndication> gnssPowerIndicationIface = nullptr;
sp<IMeasurementCorrections_V1_0> gnssCorrectionsIface_V1_0 = nullptr;
sp<IMeasurementCorrections_V1_1> gnssCorrectionsIface_V1_1 = nullptr;
sp<IGnssVisibilityControl> gnssVisibilityControlIface = nullptr;
sp<IGnssAntennaInfo> gnssAntennaInfoIface = nullptr;

std::unique_ptr<GnssConfigurationInterface> gnssConfigurationIface = nullptr;
@@ -221,6 +217,7 @@ std::unique_ptr<android::gnss::GnssGeofenceInterface> gnssGeofencingIface = null
std::unique_ptr<android::gnss::AGnssInterface> agnssIface = nullptr;
std::unique_ptr<android::gnss::GnssDebugInterface> gnssDebugIface = nullptr;
std::unique_ptr<android::gnss::AGnssRilInterface> agnssRilIface = nullptr;
std::unique_ptr<android::gnss::GnssVisibilityControlInterface> gnssVisibilityControlIface = nullptr;

#define WAKE_LOCK_NAME  "GPS"

@@ -878,54 +875,6 @@ Return<void> GnssNiCallback::niNotifyCb(
    return Void();
}

/*
 * GnssVisibilityControlCallback implements callback methods of IGnssVisibilityControlCallback.hal.
 */
struct GnssVisibilityControlCallback : public IGnssVisibilityControlCallback {
    Return<void> nfwNotifyCb(const IGnssVisibilityControlCallback::NfwNotification& notification)
            override;
    Return<bool> isInEmergencySession() override;
};

Return<void> GnssVisibilityControlCallback::nfwNotifyCb(
        const IGnssVisibilityControlCallback::NfwNotification& notification) {
    JNIEnv* env = getJniEnv();
    jstring proxyAppPackageName = env->NewStringUTF(notification.proxyAppPackageName.c_str());
    jstring otherProtocolStackName = env->NewStringUTF(notification.otherProtocolStackName.c_str());
    jstring requestorId = env->NewStringUTF(notification.requestorId.c_str());

    if (proxyAppPackageName && otherProtocolStackName && requestorId) {
        env->CallVoidMethod(mCallbacksObj, method_reportNfwNotification, proxyAppPackageName,
                            notification.protocolStack, otherProtocolStackName,
                            notification.requestor, requestorId, notification.responseType,
                            notification.inEmergencyMode, notification.isCachedLocation);
    } else {
        ALOGE("%s: OOM Error\n", __func__);
    }

    if (requestorId) {
        env->DeleteLocalRef(requestorId);
    }

    if (otherProtocolStackName) {
        env->DeleteLocalRef(otherProtocolStackName);
    }

    if (proxyAppPackageName) {
        env->DeleteLocalRef(proxyAppPackageName);
    }

    checkAndClearExceptionFromCallback(env, __FUNCTION__);
    return Void();
}

Return<bool> GnssVisibilityControlCallback::isInEmergencySession() {
    JNIEnv* env = getJniEnv();
    auto result = env->CallBooleanMethod(mCallbacksObj, method_isInEmergencySession);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
    return result;
}

/* Initializes the GNSS service handle. */
static void android_location_gnss_hal_GnssNative_set_gps_service_handle() {
    gnssHalAidl = waitForVintfService<IGnssAidl>();
@@ -1060,6 +1009,7 @@ static void android_location_gnss_hal_GnssNative_class_init_once(JNIEnv* env, jc
    gnss::GnssGeofence_class_init_once(env, clazz);
    gnss::GnssMeasurement_class_init_once(env, clazz);
    gnss::GnssNavigationMessage_class_init_once(env, clazz);
    gnss::GnssVisibilityControl_class_init_once(env, clazz);
    gnss::AGnss_class_init_once(env, clazz);
    gnss::AGnssRil_class_init_once(env, clazz);
    gnss::Utils_class_init_once(env);
@@ -1342,12 +1292,21 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
        }
    }

    if (gnssHal_V2_0 != nullptr) {
        auto gnssVisibilityControl = gnssHal_V2_0->getExtensionVisibilityControl();
        if (!gnssVisibilityControl.isOk()) {
            ALOGD("Unable to get a handle to GnssVisibilityControl interface");
        } else {
            gnssVisibilityControlIface = gnssVisibilityControl;
    if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
        sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl>
                gnssVisibilityControlAidl;
        auto status = gnssHalAidl->getExtensionGnssVisibilityControl(&gnssVisibilityControlAidl);
        if (checkAidlStatus(status,
                            "Unable to get a handle to GnssVisibilityControl AIDL interface.")) {
            gnssVisibilityControlIface =
                    std::make_unique<gnss::GnssVisibilityControlAidl>(gnssVisibilityControlAidl);
        }
    } else if (gnssHal_V2_0 != nullptr) {
        auto gnssVisibilityControlHidl = gnssHal_V2_0->getExtensionVisibilityControl();
        if (checkHidlReturn(gnssVisibilityControlHidl,
                            "Unable to get a handle to GnssVisibilityControl HIDL interface")) {
            gnssVisibilityControlIface =
                    std::make_unique<gnss::GnssVisibilityControlHidl>(gnssVisibilityControlHidl);
        }
    }

@@ -1472,12 +1431,12 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
        ALOGI("Unable to initialize IAGnssRil interface.");
    }

    // Set IGnssVisibilityControl.hal callback.
    // Set IGnssVisibilityControl callback.
    if (gnssVisibilityControlIface != nullptr) {
        sp<IGnssVisibilityControlCallback> gnssVisibilityControlCbIface =
                new GnssVisibilityControlCallback();
        auto result = gnssVisibilityControlIface->setCallback(gnssVisibilityControlCbIface);
        checkHidlReturn(result, "IGnssVisibilityControl setCallback() failed.");
        gnssVisibilityControlIface->setCallback(
                std::make_unique<gnss::GnssVisibilityControlCallback>());
    } else {
        ALOGI("Unable to initialize IGnssVisibilityControl interface.");
    }

    // Set IMeasurementCorrections.hal callback.
@@ -2380,17 +2339,7 @@ static jboolean android_location_GnssVisibilityControl_enable_nfw_location_acces
        ALOGI("IGnssVisibilityControl interface not available.");
        return JNI_FALSE;
    }

    const jsize length = env->GetArrayLength(proxyApps);
    hidl_vec<hidl_string> hidlProxyApps(length);
    for (int i = 0; i < length; ++i) {
        jstring proxyApp = (jstring) (env->GetObjectArrayElement(proxyApps, i));
        ScopedJniString jniProxyApp(env, proxyApp);
        hidlProxyApps[i] = jniProxyApp;
    }

    auto result = gnssVisibilityControlIface->enableNfwLocationAccess(hidlProxyApps);
    return checkHidlReturn(result, "IGnssVisibilityControl enableNfwLocationAccess() failed.");
    return gnssVisibilityControlIface->enableNfwLocationAccess(env, proxyApps);
}

static const JNINativeMethod sCoreMethods[] = {
+2 −0
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@ cc_library_shared {
        "GnssMeasurementCallback.cpp",
        "GnssNavigationMessage.cpp",
        "GnssNavigationMessageCallback.cpp",
        "GnssVisibilityControl.cpp",
        "GnssVisibilityControlCallback.cpp",
        "Utils.cpp",
    ],
}
+84 −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.
 */

// Define LOG_TAG before <log/log.h> to overwrite the default value.
#define LOG_TAG "GnssVisibilityControlJni"

#include "GnssVisibilityControl.h"

#include "Utils.h"

using IGnssVisibilityControlAidl =
        android::hardware::gnss::visibility_control::IGnssVisibilityControl;
using IGnssVisibilityControlHidl =
        android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl;

namespace android::gnss {

// Implementation of GnssVisibilityControl (AIDL HAL)

GnssVisibilityControlAidl::GnssVisibilityControlAidl(
        const sp<IGnssVisibilityControlAidl>& iGnssVisibilityControl)
      : mIGnssVisibilityControlAidl(iGnssVisibilityControl) {
    assert(mIGnssVisibilityControlAidl != nullptr);
}

jboolean GnssVisibilityControlAidl::setCallback(
        const std::unique_ptr<GnssVisibilityControlCallback>& callback) {
    auto status = mIGnssVisibilityControlAidl->setCallback(callback->getAidl());
    return checkAidlStatus(status, "IGnssVisibilityControlAidl setCallback() failed.");
}

jboolean GnssVisibilityControlAidl::enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) {
    int length = env->GetArrayLength(proxyApps);
    std::vector<std::string> aidlProxyApps(length);
    for (int i = 0; i < length; ++i) {
        jstring proxyApp = (jstring)(env->GetObjectArrayElement(proxyApps, i));
        ScopedJniString jniProxyApp(env, proxyApp);
        aidlProxyApps[i] = std::string(jniProxyApp.c_str());
    }
    auto status = mIGnssVisibilityControlAidl->enableNfwLocationAccess(aidlProxyApps);
    return checkAidlStatus(status, "IGnssVisibilityControlAidl enableNfwLocationAccess() failed");
}

// Implementation of GnssVisibilityControlHidl

GnssVisibilityControlHidl::GnssVisibilityControlHidl(
        const sp<IGnssVisibilityControlHidl>& iGnssVisibilityControl)
      : mIGnssVisibilityControlHidl(iGnssVisibilityControl) {
    assert(mIGnssVisibilityControlHidl != nullptr);
}

jboolean GnssVisibilityControlHidl::setCallback(
        const std::unique_ptr<GnssVisibilityControlCallback>& callback) {
    auto result = mIGnssVisibilityControlHidl->setCallback(callback->getHidl());
    return checkHidlReturn(result, "IGnssVisibilityControlHidl setCallback() failed.");
}

jboolean GnssVisibilityControlHidl::enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) {
    const jsize length = env->GetArrayLength(proxyApps);
    hardware::hidl_vec<hardware::hidl_string> hidlProxyApps(length);
    for (int i = 0; i < length; ++i) {
        jstring proxyApp = (jstring)(env->GetObjectArrayElement(proxyApps, i));
        ScopedJniString jniProxyApp(env, proxyApp);
        hidlProxyApps[i] = jniProxyApp;
    }

    auto result = mIGnssVisibilityControlHidl->enableNfwLocationAccess(hidlProxyApps);
    return checkHidlReturn(result, "IGnssVisibilityControlHidl enableNfwLocationAccess() failed.");
}

} // namespace android::gnss
+70 −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_VISIBILITYCONTROL_H
#define _ANDROID_SERVER_GNSS_VISIBILITYCONTROL_H

#pragma once

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

#include <android/hardware/gnss/visibility_control/BnGnssVisibilityControl.h>
#include <log/log.h>

#include "GnssVisibilityControlCallback.h"
#include "jni.h"

namespace android::gnss {

class GnssVisibilityControlInterface {
public:
    virtual ~GnssVisibilityControlInterface() {}
    virtual jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) = 0;
    virtual jboolean setCallback(
            const std::unique_ptr<GnssVisibilityControlCallback>& callback) = 0;
};

class GnssVisibilityControlAidl : public GnssVisibilityControlInterface {
public:
    GnssVisibilityControlAidl(
            const sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl>&
                    iGnssVisibilityControl);
    jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) override;
    jboolean setCallback(const std::unique_ptr<GnssVisibilityControlCallback>& callback) override;

private:
    const sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl>
            mIGnssVisibilityControlAidl;
};

class GnssVisibilityControlHidl : public GnssVisibilityControlInterface {
public:
    GnssVisibilityControlHidl(
            const sp<android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl>&
                    iGnssVisibilityControl);
    jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) override;
    jboolean setCallback(const std::unique_ptr<GnssVisibilityControlCallback>& callback) override;

private:
    const sp<android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl>
            mIGnssVisibilityControlHidl;
};

} // namespace android::gnss

#endif // _ANDROID_SERVER_GNSS_VISIBILITYCONTROL_H
Loading