Add IGnssConfiguration AIDL HAL (framework/base)
Bug: 168111993 Test: on cuttlefish Change-Id: Ib109f11abd3daea935d0b02df96c596db4477906
This commit is contained in:
@@ -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<IGnssBatching_V1_0> gnssBatchingIface = nullptr;
|
||||
sp<IGnssBatching_V2_0> gnssBatchingIface_V2_0 = nullptr;
|
||||
sp<IGnssDebug_V1_0> gnssDebugIface = nullptr;
|
||||
sp<IGnssDebug_V2_0> gnssDebugIface_V2_0 = nullptr;
|
||||
sp<IGnssConfigurationAidl> gnssConfigurationAidlIface = nullptr;
|
||||
sp<IGnssConfiguration_V1_0> gnssConfigurationIface = nullptr;
|
||||
sp<IGnssConfiguration_V1_1> gnssConfigurationIface_V1_1 = nullptr;
|
||||
sp<IGnssConfiguration_V2_0> 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<IGnssConfigurationAidl> 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<IGnssPsdsCallbackAidl> 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<jbyte *>(env->GetPrimitiveArrayCritical(data, 0));
|
||||
if (gnssPsdsAidlIface != nullptr) {
|
||||
bool success;
|
||||
auto status = gnssPsdsAidlIface->injectPsdsData(static_cast<PsdsType>(psdsType),
|
||||
std::vector<uint8_t>((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<BlocklistedSource> sources;
|
||||
sources.resize(length);
|
||||
|
||||
for (int i = 0; i < length; i++) {
|
||||
sources[i].constellation = static_cast<GnssConstellationType>(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<IGnssConfiguration_V2_1::BlacklistedSource> 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.");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user