From 97177b6f846fbcb683b7aacbe7fafbccb1e6c76b Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Fri, 11 Sep 2020 20:37:37 -0700 Subject: Add GNSS AIDL interfaces (framework/base) Bug: 159467682 Test: atest VtsHalGnssTargetTest Change-Id: Ifd75a6580a0b5cd81b6af95a4856a7389202c2a8 --- services/core/jni/Android.bp | 1 + ...ndroid_server_location_GnssLocationProvider.cpp | 112 ++++++++++++++++----- 2 files changed, 90 insertions(+), 23 deletions(-) diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 1b649fda1976..5db6c46a26b4 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -132,6 +132,7 @@ cc_defaults { "android.hardware.broadcastradio@1.0", "android.hardware.broadcastradio@1.1", "android.hardware.contexthub@1.0", + "android.hardware.gnss-cpp", "android.hardware.gnss@1.0", "android.hardware.gnss@1.1", "android.hardware.gnss@2.0", diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 4e53aa218b71..91645ba1a9b9 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -30,9 +30,12 @@ #include #include #include +#include +#include #include #include #include +#include #include #include "android_runtime/AndroidRuntime.h" #include "android_runtime/Log.h" @@ -142,9 +145,10 @@ static JavaVM* sJvm; using android::OK; using android::sp; -using android::wp; using android::status_t; using android::String16; +using android::wp; +using android::binder::Status; using android::hardware::Return; using android::hardware::Void; @@ -152,6 +156,7 @@ using android::hardware::hidl_vec; using android::hardware::hidl_string; using android::hardware::hidl_death_recipient; +using android::hardware::gnss::PsdsType; using android::hardware::gnss::V1_0::GnssLocationFlags; using android::hardware::gnss::V1_0::IAGnssRilCallback; using android::hardware::gnss::V1_0::IGnssGeofenceCallback; @@ -161,11 +166,10 @@ using android::hardware::gnss::V1_0::IGnssNavigationMessageCallback; using android::hardware::gnss::V1_0::IGnssNi; using android::hardware::gnss::V1_0::IGnssNiCallback; using android::hardware::gnss::V1_0::IGnssXtra; +using android::hardware::gnss::V2_0::ElapsedRealtimeFlags; using android::hardware::gnss::V3_0::IGnssPsds; using android::hardware::gnss::V3_0::IGnssPsdsCallback; -using android::hardware::gnss::V2_0::ElapsedRealtimeFlags; - using MeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections; using MeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::MeasurementCorrections; @@ -224,6 +228,10 @@ using android::hardware::gnss::measurement_corrections::V1_0::GnssSingleSatCorre using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl; using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControlCallback; +using IGnssAidl = android::hardware::gnss::IGnss; +using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds; +using IGnssPsdsCallbackAidl = android::hardware::gnss::IGnssPsdsCallback; + struct GnssDeathRecipient : virtual public hidl_death_recipient { // hidl_death_recipient interface @@ -245,7 +253,9 @@ sp gnssHal_V1_1 = nullptr; sp gnssHal_V2_0 = nullptr; sp gnssHal_V2_1 = nullptr; sp gnssHal_V3_0 = nullptr; +sp gnssHalAidl = nullptr; sp gnssPsdsIface = nullptr; +sp gnssPsdsAidlIface = nullptr; sp gnssXtraIface = nullptr; sp agnssRilIface = nullptr; sp agnssRilIface_V2_0 = nullptr; @@ -445,6 +455,19 @@ static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodNa } } +static jboolean checkAidlStatus(const Status& status, const char* errorMessage, + const bool success) { + if (!status.isOk()) { + ALOGE("%s AIDL transport error: %s", errorMessage, status.toString8().c_str()); + return JNI_FALSE; + } + if (!success) { + ALOGE("AIDL return failure: %s", errorMessage); + return JNI_FALSE; + } + return JNI_TRUE; +} + static jobject createHalInterfaceVersionJavaObject(JNIEnv* env, jint major, jint minor) { jobject version = env->NewObject(class_gnssConfiguration_halInterfaceVersion, method_halInterfaceVersionCtor, major, minor); @@ -924,6 +947,20 @@ Return GnssCallback::gnssSetSystemInfoCb(const IGnssCallback_V2_0::GnssSys return Void(); } +/* + * GnssPsdsCallback class implements the callback methods for the IGnssPsds + * interface. + */ +struct GnssPsdsCallbackAidl : public android::hardware::gnss::BnGnssPsdsCallback { + Status downloadRequestCb(PsdsType psdsType) override { + ALOGD("%s. psdsType: %d", __func__, static_cast(psdsType)); + JNIEnv* env = getJniEnv(); + env->CallVoidMethod(mCallbacksObj, method_psdsDownloadRequest, psdsType); + checkAndClearExceptionFromCallback(env, __FUNCTION__); + return Status::ok(); + } +}; + /* * GnssPsdsCallback class implements the callback methods for the IGnssPsds * interface. @@ -934,14 +971,11 @@ struct GnssPsdsCallback : public IGnssPsdsCallback { }; Return GnssPsdsCallback::downloadRequestCb() { - JNIEnv* env = getJniEnv(); - env->CallVoidMethod(mCallbacksObj, method_psdsDownloadRequest, /* psdsType= */ 1); - checkAndClearExceptionFromCallback(env, __FUNCTION__); - return Void(); + return downloadRequestCb_3_0(/* psdsType= */ 1); } Return GnssPsdsCallback::downloadRequestCb_3_0(int32_t psdsType) { - ALOGD("%s: %d", __func__, psdsType); + ALOGD("%s. psdsType: %d", __func__, psdsType); JNIEnv* env = getJniEnv(); env->CallVoidMethod(mCallbacksObj, method_psdsDownloadRequest, psdsType); checkAndClearExceptionFromCallback(env, __FUNCTION__); @@ -1917,6 +1951,11 @@ struct GnssBatchingCallback_V2_0 : public IGnssBatchingCallback_V2_0 { /* Initializes the GNSS service handle. */ static void android_location_GnssLocationProvider_set_gps_service_handle() { + gnssHalAidl = waitForVintfService(); + if (gnssHalAidl != nullptr) { + ALOGD("Successfully got GNSS AIDL handle."); + } + ALOGD("Trying IGnss_V3_0::getService()"); gnssHal_V3_0 = IGnss_V3_0::getService(); if (gnssHal_V3_0 != nullptr) { @@ -2168,7 +2207,15 @@ static void android_location_GnssNative_init_once(JNIEnv* env, jobject obj, ALOGD("Link to death notification successful"); } - if (gnssHal_V3_0 != nullptr) { + if (gnssHalAidl != nullptr) { + sp gnssPsdsAidl; + auto status = gnssHalAidl->getExtensionPsds(&gnssPsdsAidl); + if (status.isOk()) { + gnssPsdsAidlIface = gnssPsdsAidl; + } else { + ALOGD("Unable to get a handle to PSDS AIDL interface."); + } + } else if (gnssHal_V3_0 != nullptr) { auto gnssPsds = gnssHal_V3_0->getExtensionPsds(); if (!gnssPsds.isOk()) { ALOGD("Unable to get a handle to Psds"); @@ -2470,19 +2517,28 @@ static jboolean android_location_GnssLocationProvider_init(JNIEnv* /* env */, jo } // Set IGnssPsds or IGnssXtra callback. - sp gnssPsdsCbIface = new GnssPsdsCallback(); - if (gnssPsdsIface != nullptr) { - result = gnssPsdsIface->setCallback_3_0(gnssPsdsCbIface); - if (!checkHidlReturn(result, "IGnssPsds setCallback() failed.")) { - gnssPsdsIface = nullptr; - } - } else if (gnssXtraIface != nullptr) { - result = gnssXtraIface->setCallback(gnssPsdsCbIface); - if (!checkHidlReturn(result, "IGnssXtra setCallback() failed.")) { - gnssXtraIface = nullptr; + if (gnssPsdsAidlIface != nullptr) { + sp gnssPsdsCallbackAidl = new GnssPsdsCallbackAidl(); + bool success; + auto status = gnssPsdsAidlIface->setCallback(gnssPsdsCallbackAidl, &success); + if (!checkAidlStatus(status, "IGnssPsdsAidl setCallback() failed.", success)) { + gnssPsdsAidlIface = nullptr; } } else { - ALOGI("Unable to initialize IGnssPsds/IGnssXtra interface."); + sp gnssPsdsCbIface = new GnssPsdsCallback(); + if (gnssPsdsIface != nullptr) { + result = gnssPsdsIface->setCallback_3_0(gnssPsdsCbIface); + if (!checkHidlReturn(result, "IGnssPsds setCallback() failed.")) { + gnssPsdsIface = nullptr; + } + } else if (gnssXtraIface != nullptr) { + result = gnssXtraIface->setCallback(gnssPsdsCbIface); + if (!checkHidlReturn(result, "IGnssXtra setCallback() failed.")) { + gnssXtraIface = nullptr; + } + } else { + ALOGI("Unable to initialize IGnssPsds/IGnssXtra interface."); + } } // Set IAGnss.hal callback. @@ -2743,19 +2799,29 @@ static void android_location_GnssLocationProvider_inject_location(JNIEnv* /* env static jboolean android_location_GnssLocationProvider_supports_psds( JNIEnv* /* env */, jobject /* obj */) { - return (gnssPsdsIface != nullptr || gnssXtraIface != nullptr) ? JNI_TRUE : JNI_FALSE; + return (gnssPsdsAidlIface != nullptr || gnssPsdsIface != nullptr || gnssXtraIface != nullptr) + ? JNI_TRUE + : JNI_FALSE; } static void android_location_GnssLocationProvider_inject_psds_data(JNIEnv* env, jobject /* obj */, jbyteArray data, jint length, jint psdsType) { - if (gnssPsdsIface == nullptr && gnssXtraIface == nullptr) { + if (gnssPsdsAidlIface == nullptr && gnssPsdsIface == nullptr && gnssXtraIface == nullptr) { ALOGE("%s: IGnssPsds or IGnssXtra interface not available.", __func__); return; } jbyte* bytes = reinterpret_cast(env->GetPrimitiveArrayCritical(data, 0)); - if (gnssPsdsIface != nullptr) { + if (gnssPsdsAidlIface != nullptr) { + bool success; + auto status = gnssPsdsAidlIface->injectPsdsData(static_cast(psdsType), + std::vector((const uint8_t*)bytes, + (const uint8_t*)bytes + + length), + &success); + checkAidlStatus(status, "IGnssPsdsAidl injectPsdsData() failed.", success); + } else if (gnssPsdsIface != nullptr) { auto result = gnssPsdsIface->injectPsdsData_3_0(psdsType, std::string((const char*)bytes, length)); checkHidlReturn(result, "IGnssPsds injectPsdsData() failed."); -- cgit v1.2.3-59-g8ed1b