diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 91645ba1a9b94..31b9ad617fba0 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -156,7 +156,6 @@ 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; @@ -228,9 +227,13 @@ 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 android::hardware::gnss::BlocklistedSource; +using android::hardware::gnss::GnssConstellationType; +using android::hardware::gnss::PsdsType; using IGnssAidl = android::hardware::gnss::IGnss; using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds; using IGnssPsdsCallbackAidl = android::hardware::gnss::IGnssPsdsCallback; +using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration; struct GnssDeathRecipient : virtual public hidl_death_recipient { @@ -266,6 +269,7 @@ sp gnssBatchingIface = nullptr; sp gnssBatchingIface_V2_0 = nullptr; sp gnssDebugIface = nullptr; sp gnssDebugIface_V2_0 = nullptr; +sp gnssConfigurationAidlIface = nullptr; sp gnssConfigurationIface = nullptr; sp gnssConfigurationIface_V1_1 = nullptr; sp gnssConfigurationIface_V2_0 = nullptr; @@ -455,16 +459,11 @@ static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodNa } } -static jboolean checkAidlStatus(const Status& status, const char* errorMessage, - const bool success) { +static jboolean checkAidlStatus(const Status& status, const char* errorMessage) { 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; } @@ -2371,7 +2370,15 @@ static void android_location_GnssNative_init_once(JNIEnv* env, jobject obj, gnssNiIface = gnssNi; } - if (gnssHal_V2_1 != nullptr) { + if (gnssHalAidl != nullptr) { + sp gnssConfigurationAidl; + auto status = gnssHalAidl->getExtensionGnssConfiguration(&gnssConfigurationAidl); + if (status.isOk()) { + gnssConfigurationAidlIface = gnssConfigurationAidl; + } else { + ALOGD("Unable to get a handle to GnssConfiguration AIDL interface."); + } + } else if (gnssHal_V2_1 != nullptr) { auto gnssConfiguration = gnssHal_V2_1->getExtensionGnssConfiguration_2_1(); if (!gnssConfiguration.isOk()) { ALOGD("Unable to get a handle to GnssConfiguration_V2_1"); @@ -2519,9 +2526,8 @@ static jboolean android_location_GnssLocationProvider_init(JNIEnv* /* env */, jo // Set IGnssPsds or IGnssXtra callback. if (gnssPsdsAidlIface != nullptr) { sp gnssPsdsCallbackAidl = new GnssPsdsCallbackAidl(); - bool success; - auto status = gnssPsdsAidlIface->setCallback(gnssPsdsCallbackAidl, &success); - if (!checkAidlStatus(status, "IGnssPsdsAidl setCallback() failed.", success)) { + auto status = gnssPsdsAidlIface->setCallback(gnssPsdsCallbackAidl); + if (!checkAidlStatus(status, "IGnssPsdsAidl setCallback() failed.")) { gnssPsdsAidlIface = nullptr; } } else { @@ -2814,13 +2820,11 @@ static void android_location_GnssLocationProvider_inject_psds_data(JNIEnv* env, jbyte* bytes = reinterpret_cast(env->GetPrimitiveArrayCritical(data, 0)); 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); + length)); + checkAidlStatus(status, "IGnssPsdsAidl injectPsdsData() failed."); } else if (gnssPsdsIface != nullptr) { auto result = gnssPsdsIface->injectPsdsData_3_0(psdsType, std::string((const char*)bytes, length)); @@ -3482,11 +3486,16 @@ static jboolean android_location_GnssNavigationMessageProvider_stop_navigation_m static jboolean android_location_GnssConfiguration_set_emergency_supl_pdn(JNIEnv*, jobject, jint emergencySuplPdn) { - if (gnssConfigurationIface == nullptr) { + if (gnssConfigurationIface == nullptr && gnssConfigurationAidlIface == nullptr) { ALOGE("%s: IGnssConfiguration interface not available.", __func__); return JNI_FALSE; } + if (gnssConfigurationAidlIface != nullptr) { + auto status = gnssConfigurationAidlIface->setEmergencySuplPdn(emergencySuplPdn); + return checkAidlStatus(status, "gnssConfigurationAidlIface setEmergencySuplPdn() failed."); + } + auto result = gnssConfigurationIface->setEmergencySuplPdn(emergencySuplPdn); return checkHidlReturn(result, "IGnssConfiguration setEmergencySuplPdn() failed."); } @@ -3494,10 +3503,16 @@ static jboolean android_location_GnssConfiguration_set_emergency_supl_pdn(JNIEnv static jboolean android_location_GnssConfiguration_set_supl_version(JNIEnv*, jobject, jint version) { - if (gnssConfigurationIface == nullptr) { + if (gnssConfigurationIface == nullptr && gnssConfigurationAidlIface == nullptr) { ALOGE("%s: IGnssConfiguration interface not available.", __func__); return JNI_FALSE; } + + if (gnssConfigurationAidlIface != nullptr) { + auto status = gnssConfigurationAidlIface->setSuplVersion(version); + return checkAidlStatus(status, "gnssConfigurationAidlIface setSuplVersion() failed."); + } + auto result = gnssConfigurationIface->setSuplVersion(version); return checkHidlReturn(result, "IGnssConfiguration setSuplVersion() failed."); } @@ -3505,7 +3520,8 @@ static jboolean android_location_GnssConfiguration_set_supl_version(JNIEnv*, static jboolean android_location_GnssConfiguration_set_supl_es(JNIEnv*, jobject, jint suplEs) { - if (gnssConfigurationIface_V2_0 != nullptr || gnssConfigurationIface_V2_1 != nullptr) { + if (gnssConfigurationIface_V2_0 != nullptr || gnssConfigurationIface_V2_1 != nullptr || + gnssConfigurationAidlIface != nullptr) { ALOGI("Config parameter SUPL_ES is deprecated in IGnssConfiguration.hal version 2.0 and higher."); return JNI_FALSE; } @@ -3522,11 +3538,16 @@ static jboolean android_location_GnssConfiguration_set_supl_es(JNIEnv*, static jboolean android_location_GnssConfiguration_set_supl_mode(JNIEnv*, jobject, jint mode) { - if (gnssConfigurationIface == nullptr) { + if (gnssConfigurationIface == nullptr && gnssConfigurationAidlIface == nullptr) { ALOGE("%s: IGnssConfiguration interface not available.", __func__); return JNI_FALSE; } + if (gnssConfigurationAidlIface != nullptr) { + auto status = gnssConfigurationAidlIface->setSuplMode(mode); + return checkAidlStatus(status, "gnssConfigurationAidlIface setSuplMode() failed."); + } + auto result = gnssConfigurationIface->setSuplMode(mode); return checkHidlReturn(result, "IGnssConfiguration setSuplMode() failed."); } @@ -3534,7 +3555,8 @@ static jboolean android_location_GnssConfiguration_set_supl_mode(JNIEnv*, static jboolean android_location_GnssConfiguration_set_gps_lock(JNIEnv*, jobject, jint gpsLock) { - if (gnssConfigurationIface_V2_0 != nullptr || gnssConfigurationIface_V2_1 != nullptr) { + if (gnssConfigurationIface_V2_0 != nullptr || gnssConfigurationIface_V2_1 != nullptr || + gnssConfigurationAidlIface != nullptr) { ALOGI("Config parameter GPS_LOCK is deprecated in IGnssConfiguration.hal version 2.0."); return JNI_FALSE; } @@ -3551,11 +3573,16 @@ static jboolean android_location_GnssConfiguration_set_gps_lock(JNIEnv*, static jboolean android_location_GnssConfiguration_set_lpp_profile(JNIEnv*, jobject, jint lppProfile) { - if (gnssConfigurationIface == nullptr) { + if (gnssConfigurationIface == nullptr && gnssConfigurationAidlIface == nullptr) { ALOGE("%s: IGnssConfiguration interface not available.", __func__); return JNI_FALSE; } + if (gnssConfigurationAidlIface != nullptr) { + auto status = gnssConfigurationAidlIface->setLppProfile(lppProfile); + return checkAidlStatus(status, "gnssConfigurationAidlIface setLppProfile() failed."); + } + auto result = gnssConfigurationIface->setLppProfile(lppProfile); return checkHidlReturn(result, "IGnssConfiguration setLppProfile() failed."); } @@ -3563,18 +3590,26 @@ static jboolean android_location_GnssConfiguration_set_lpp_profile(JNIEnv*, static jboolean android_location_GnssConfiguration_set_gnss_pos_protocol_select(JNIEnv*, jobject, jint gnssPosProtocol) { - if (gnssConfigurationIface == nullptr) { + if (gnssConfigurationIface == nullptr && gnssConfigurationAidlIface == nullptr) { ALOGE("%s: IGnssConfiguration interface not available.", __func__); return JNI_FALSE; } + if (gnssConfigurationAidlIface != nullptr) { + auto status = gnssConfigurationAidlIface->setGlonassPositioningProtocol(gnssPosProtocol); + return checkAidlStatus(status, + "gnssConfigurationAidlIface setGlonassPositioningProtocol() " + "failed."); + } + auto result = gnssConfigurationIface->setGlonassPositioningProtocol(gnssPosProtocol); return checkHidlReturn(result, "IGnssConfiguration setGlonassPositioningProtocol() failed."); } static jboolean android_location_GnssConfiguration_set_satellite_blacklist( JNIEnv* env, jobject, jintArray constellations, jintArray sv_ids) { - if (gnssConfigurationIface_V1_1 == nullptr && gnssConfigurationIface_V2_1 == nullptr) { + if (gnssConfigurationIface_V1_1 == nullptr && gnssConfigurationIface_V2_1 == nullptr && + gnssConfigurationAidlIface == nullptr) { ALOGI("IGnssConfiguration interface does not support satellite blacklist."); return JNI_FALSE; } @@ -3597,7 +3632,18 @@ static jboolean android_location_GnssConfiguration_set_satellite_blacklist( return JNI_FALSE; } - if (gnssConfigurationIface_V2_1 != nullptr) { + if (gnssConfigurationAidlIface != nullptr) { + std::vector sources; + sources.resize(length); + + for (int i = 0; i < length; i++) { + sources[i].constellation = static_cast(constellation_array[i]); + sources[i].svid = sv_id_array[i]; + } + + auto status = gnssConfigurationAidlIface->setBlocklist(sources); + return checkAidlStatus(status, "gnssConfigurationAidlIface setBlocklist() failed."); + } else if (gnssConfigurationIface_V2_1 != nullptr) { hidl_vec sources; sources.resize(length); @@ -3624,17 +3670,17 @@ static jboolean android_location_GnssConfiguration_set_satellite_blacklist( static jboolean android_location_GnssConfiguration_set_es_extension_sec( JNIEnv*, jobject, jint emergencyExtensionSeconds) { - if (gnssConfigurationIface == nullptr) { - ALOGE("%s: IGnssConfiguration interface not available.", __func__); - return JNI_FALSE; - } - - if (gnssConfigurationIface_V2_0 == nullptr) { + if (gnssConfigurationIface_V2_0 == nullptr && gnssConfigurationAidlIface == nullptr) { ALOGI("Config parameter ES_EXTENSION_SEC is not supported in IGnssConfiguration.hal" " versions earlier than 2.0."); return JNI_FALSE; } + if (gnssConfigurationAidlIface != nullptr) { + auto status = gnssConfigurationAidlIface->setEsExtensionSec(emergencyExtensionSeconds); + return checkAidlStatus(status, "gnssConfigurationAidlIface setEsExtensionSec() failed."); + } + auto result = gnssConfigurationIface_V2_0->setEsExtensionSec(emergencyExtensionSeconds); return checkHidlReturn(result, "IGnssConfiguration setEsExtensionSec() failed."); }