From 5eaf444de7a4c0966359302b0db4d3cd6b56abe6 Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Fri, 3 Dec 2021 17:06:05 -0800 Subject: [PATCH] Add IGnss AIDL HAL (frameworks/base) Bug: 201253590 Test: atest GnssLocationValuesTest GnssStatusTest Change-Id: I653826718d1ad3fb74f9767819033ad8fb88573c --- .../server/location/gnss/hal/GnssNative.java | 54 ++- ...d_server_location_GnssLocationProvider.cpp | 361 ++++++++++++++---- services/core/jni/gnss/AGnss.cpp | 6 +- .../server/location/gnss/hal/FakeGnssHal.java | 8 +- 4 files changed, 339 insertions(+), 90 deletions(-) diff --git a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java index 1eef0de3a05db..f741a5b59ef22 100644 --- a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java +++ b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java @@ -623,8 +623,38 @@ public class GnssNative { public void injectLocation(Location location) { Preconditions.checkState(mRegistered); if (location.hasAccuracy()) { - mGnssHal.injectLocation(location.getLatitude(), location.getLongitude(), - location.getAccuracy()); + + int gnssLocationFlags = GNSS_LOCATION_HAS_LAT_LONG + | (location.hasAltitude() ? GNSS_LOCATION_HAS_ALTITUDE : 0) + | (location.hasSpeed() ? GNSS_LOCATION_HAS_SPEED : 0) + | (location.hasBearing() ? GNSS_LOCATION_HAS_BEARING : 0) + | (location.hasAccuracy() ? GNSS_LOCATION_HAS_HORIZONTAL_ACCURACY : 0) + | (location.hasVerticalAccuracy() ? GNSS_LOCATION_HAS_VERTICAL_ACCURACY : 0) + | (location.hasSpeedAccuracy() ? GNSS_LOCATION_HAS_SPEED_ACCURACY : 0) + | (location.hasBearingAccuracy() ? GNSS_LOCATION_HAS_BEARING_ACCURACY : 0); + + double latitudeDegrees = location.getLatitude(); + double longitudeDegrees = location.getLongitude(); + double altitudeMeters = location.getAltitude(); + float speedMetersPerSec = location.getSpeed(); + float bearingDegrees = location.getBearing(); + float horizontalAccuracyMeters = location.getAccuracy(); + float verticalAccuracyMeters = location.getVerticalAccuracyMeters(); + float speedAccuracyMetersPerSecond = location.getSpeedAccuracyMetersPerSecond(); + float bearingAccuracyDegrees = location.getBearingAccuracyDegrees(); + long timestamp = location.getTime(); + + int elapsedRealtimeFlags = GNSS_REALTIME_HAS_TIMESTAMP_NS + | (location.hasElapsedRealtimeUncertaintyNanos() + ? GNSS_REALTIME_HAS_TIME_UNCERTAINTY_NS : 0); + long elapsedRealtimeNanos = location.getElapsedRealtimeNanos(); + double elapsedRealtimeUncertaintyNanos = location.getElapsedRealtimeUncertaintyNanos(); + + mGnssHal.injectLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, + altitudeMeters, speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters, + verticalAccuracyMeters, speedAccuracyMetersPerSecond, bearingAccuracyDegrees, + timestamp, elapsedRealtimeFlags, elapsedRealtimeNanos, + elapsedRealtimeUncertaintyNanos); } } @@ -1262,8 +1292,15 @@ public class GnssNative { return native_read_nmea(buffer, bufferSize); } - protected void injectLocation(double latitude, double longitude, float accuracy) { - native_inject_location(latitude, longitude, accuracy); + protected void injectLocation(@GnssLocationFlags int gnssLocationFlags, double latitude, + double longitude, double altitude, float speed, float bearing, + float horizontalAccuracy, float verticalAccuracy, float speedAccuracy, + float bearingAccuracy, long timestamp, @GnssRealtimeFlags int elapsedRealtimeFlags, + long elapsedRealtimeNanos, double elapsedRealtimeUncertaintyNanos) { + native_inject_location(gnssLocationFlags, latitude, longitude, altitude, speed, + bearing, horizontalAccuracy, verticalAccuracy, speedAccuracy, bearingAccuracy, + timestamp, elapsedRealtimeFlags, elapsedRealtimeNanos, + elapsedRealtimeUncertaintyNanos); } protected void injectBestLocation(@GnssLocationFlags int gnssLocationFlags, double latitude, @@ -1436,8 +1473,13 @@ public class GnssNative { // location injection APIs - private static native void native_inject_location(double latitude, double longitude, - float accuracy); + private static native void native_inject_location( + int gnssLocationFlags, double latitudeDegrees, double longitudeDegrees, + double altitudeMeters, float speedMetersPerSec, float bearingDegrees, + float horizontalAccuracyMeters, float verticalAccuracyMeters, + float speedAccuracyMetersPerSecond, float bearingAccuracyDegrees, + long timestamp, int elapsedRealtimeFlags, long elapsedRealtimeNanos, + double elapsedRealtimeUncertaintyNanos); private static native void native_inject_best_location( diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 06f5aed026ce9..f5d000f7a44d7 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -231,6 +231,11 @@ namespace android { namespace { +// Returns true if location has lat/long information. +bool hasLatLong(const GnssLocationAidl& location) { + return (location.gnssLocationFlags & GnssLocationAidl::HAS_LAT_LONG) != 0; +} + // Returns true if location has lat/long information. bool hasLatLong(const GnssLocation_V1_0& location) { return (static_cast(location.gnssLocationFlags) & @@ -248,6 +253,36 @@ static inline jboolean boolToJbool(bool value) { return value ? JNI_TRUE : JNI_FALSE; } +static GnssLocationAidl createGnssLocation(jint gnssLocationFlags, jdouble latitudeDegrees, + jdouble longitudeDegrees, jdouble altitudeMeters, + jfloat speedMetersPerSec, jfloat bearingDegrees, + jfloat horizontalAccuracyMeters, + jfloat verticalAccuracyMeters, + jfloat speedAccuracyMetersPerSecond, + jfloat bearingAccuracyDegrees, jlong timestamp, + jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos, + jdouble elapsedRealtimeUncertaintyNanos) { + GnssLocationAidl location; + location.gnssLocationFlags = static_cast(gnssLocationFlags); + location.latitudeDegrees = static_cast(latitudeDegrees); + location.longitudeDegrees = static_cast(longitudeDegrees); + location.altitudeMeters = static_cast(altitudeMeters); + location.speedMetersPerSec = static_cast(speedMetersPerSec); + location.bearingDegrees = static_cast(bearingDegrees); + location.horizontalAccuracyMeters = static_cast(horizontalAccuracyMeters); + location.verticalAccuracyMeters = static_cast(verticalAccuracyMeters); + location.speedAccuracyMetersPerSecond = static_cast(speedAccuracyMetersPerSecond); + location.bearingAccuracyDegrees = static_cast(bearingAccuracyDegrees); + location.timestampMillis = static_cast(timestamp); + + location.elapsedRealtime.flags = static_cast(elapsedRealtimeFlags); + location.elapsedRealtime.timestampNs = static_cast(elapsedRealtimeNanos); + location.elapsedRealtime.timeUncertaintyNs = + static_cast(elapsedRealtimeUncertaintyNanos); + + return location; +} + static GnssLocation_V1_0 createGnssLocation_V1_0( jint gnssLocationFlags, jdouble latitudeDegrees, jdouble longitudeDegrees, jdouble altitudeMeters, jfloat speedMetersPerSec, jfloat bearingDegrees, @@ -298,7 +333,8 @@ struct GnssCallback : public IGnssCallback_V2_1 { Return gnssLocationCb(const GnssLocation_V1_0& location) override; Return gnssStatusCb(const IGnssCallback_V1_0::GnssStatusValue status) override; Return gnssSvStatusCb(const IGnssCallback_V1_0::GnssSvStatus& svStatus) override { - return gnssSvStatusCbImpl(svStatus); + return gnssSvStatusCbImpl( + svStatus); } Return gnssNmeaCb(int64_t timestamp, const android::hardware::hidl_string& nmea) override; Return gnssSetCapabilitesCb(uint32_t capabilities) override; @@ -318,73 +354,67 @@ struct GnssCallback : public IGnssCallback_V2_1 { Return gnssSetCapabilitiesCb_2_0(uint32_t capabilities) override; Return gnssLocationCb_2_0(const GnssLocation_V2_0& location) override; Return gnssSvStatusCb_2_0(const hidl_vec& svInfoList) override { - return gnssSvStatusCbImpl(svInfoList); + return gnssSvStatusCbImpl, + IGnssCallback_V1_0::GnssSvInfo>(svInfoList); } // New in 2.1 Return gnssSvStatusCb_2_1(const hidl_vec& svInfoList) override { - return gnssSvStatusCbImpl(svInfoList); + return gnssSvStatusCbImpl, + IGnssCallback_V1_0::GnssSvInfo>(svInfoList); } Return gnssSetCapabilitiesCb_2_1(uint32_t capabilities) override; // TODO: Reconsider allocation cost vs threadsafety on these statics static const char* sNmeaString; static size_t sNmeaStringLength; + + template + static Return gnssLocationCbImpl(const T& location); + + template + static Return gnssSvStatusCbImpl(const T_list& svStatus); + private: - template - Return gnssLocationCbImpl(const T& location); - - template - Return gnssSvStatusCbImpl(const T& svStatus); - - template - uint32_t getHasBasebandCn0DbHzFlag(const T& svStatus) { + template + static uint32_t getHasBasebandCn0DbHzFlag(const T& svStatus) { return 0; } - template - double getBasebandCn0DbHz(const T& svStatus, size_t i) { + template + static double getBasebandCn0DbHz(const T& svStatus, size_t i) { return 0.0; } - uint32_t getGnssSvInfoListSize(const IGnssCallback_V1_0::GnssSvStatus& svStatus) { - return svStatus.numSvs; - } - - uint32_t getGnssSvInfoListSize(const hidl_vec& svInfoList) { + template + static uint32_t getGnssSvInfoListSize(const T& svInfoList) { return svInfoList.size(); } - uint32_t getGnssSvInfoListSize(const hidl_vec& svInfoList) { - return svInfoList.size(); + static const IGnssCallbackAidl::GnssSvInfo& getGnssSvInfoOfIndex( + const std::vector& svInfoList, size_t i) { + return svInfoList[i]; } - const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex( + static const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex( const IGnssCallback_V1_0::GnssSvStatus& svStatus, size_t i) { return svStatus.gnssSvList.data()[i]; } - const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex( + static const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex( const hidl_vec& svInfoList, size_t i) { return svInfoList[i].v1_0; } - const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex( + static const IGnssCallback_V1_0::GnssSvInfo& getGnssSvInfoOfIndex( const hidl_vec& svInfoList, size_t i) { return svInfoList[i].v2_0.v1_0; } - uint32_t getConstellationType(const IGnssCallback_V1_0::GnssSvStatus& svStatus, size_t i) { - return static_cast(svStatus.gnssSvList.data()[i].constellation); - } - - uint32_t getConstellationType(const hidl_vec& svInfoList, size_t i) { + template + static uint32_t getConstellationType(const T& svInfoList, size_t i) { return static_cast(svInfoList[i].constellation); } - - uint32_t getConstellationType(const hidl_vec& svInfoList, size_t i) { - return static_cast(svInfoList[i].v2_0.constellation); - } }; Return GnssCallback::gnssNameCb(const android::hardware::hidl_string& name) { @@ -441,14 +471,43 @@ uint32_t GnssCallback::getHasBasebandCn0DbHzFlag(const hidl_vec +uint32_t GnssCallback::getHasBasebandCn0DbHzFlag( + const std::vector& svStatus) { + return SVID_FLAGS_HAS_BASEBAND_CN0; +} + +template <> +double GnssCallback::getBasebandCn0DbHz( + const std::vector& svInfoList, size_t i) { + return svInfoList[i].basebandCN0DbHz; +} + template<> double GnssCallback::getBasebandCn0DbHz(const hidl_vec& svInfoList, size_t i) { return svInfoList[i].basebandCN0DbHz; } -template -Return GnssCallback::gnssSvStatusCbImpl(const T& svStatus) { +template <> +uint32_t GnssCallback::getGnssSvInfoListSize(const IGnssCallback_V1_0::GnssSvStatus& svStatus) { + return svStatus.numSvs; +} + +template <> +uint32_t GnssCallback::getConstellationType(const IGnssCallback_V1_0::GnssSvStatus& svStatus, + size_t i) { + return static_cast(svStatus.gnssSvList.data()[i].constellation); +} + +template <> +uint32_t GnssCallback::getConstellationType( + const hidl_vec& svInfoList, size_t i) { + return static_cast(svInfoList[i].v2_0.constellation); +} + +template +Return GnssCallback::gnssSvStatusCbImpl(const T_list& svStatus) { JNIEnv* env = getJniEnv(); uint32_t listSize = getGnssSvInfoListSize(svStatus); @@ -476,7 +535,7 @@ Return GnssCallback::gnssSvStatusCbImpl(const T& svStatus) { CONSTELLATION_TYPE_SHIFT_WIDTH = 8 }; - const IGnssCallback_V1_0::GnssSvInfo& info = getGnssSvInfoOfIndex(svStatus, i); + const T_sv_info& info = getGnssSvInfoOfIndex(svStatus, i); svidWithFlags[i] = (info.svid << SVID_SHIFT_WIDTH) | (getConstellationType(svStatus, i) << CONSTELLATION_TYPE_SHIFT_WIDTH) | static_cast(info.svFlag); @@ -586,6 +645,16 @@ Return GnssCallback::gnssSetSystemInfoCb(const IGnssCallback_V2_0::GnssSys class GnssCallbackAidl : public android::hardware::gnss::BnGnssCallback { public: Status gnssSetCapabilitiesCb(const int capabilities) override; + Status gnssStatusCb(const GnssStatusValue status) override; + Status gnssSvStatusCb(const std::vector& svInfoList) override; + Status gnssLocationCb(const GnssLocationAidl& location) override; + Status gnssNmeaCb(const int64_t timestamp, const std::string& nmea) override; + Status gnssAcquireWakelockCb() override; + Status gnssReleaseWakelockCb() override; + Status gnssSetSystemInfoCb(const GnssSystemInfo& info) override; + Status gnssRequestTimeCb() override; + Status gnssRequestLocationCb(const bool independentFromGnss, + const bool isUserEmergency) override; }; Status GnssCallbackAidl::gnssSetCapabilitiesCb(const int capabilities) { @@ -596,6 +665,76 @@ Status GnssCallbackAidl::gnssSetCapabilitiesCb(const int capabilities) { return Status::ok(); } +Status GnssCallbackAidl::gnssStatusCb(const GnssStatusValue status) { + JNIEnv* env = getJniEnv(); + env->CallVoidMethod(mCallbacksObj, method_reportStatus, status); + checkAndClearExceptionFromCallback(env, __FUNCTION__); + return Status::ok(); +} + +Status GnssCallbackAidl::gnssSvStatusCb(const std::vector& svInfoList) { + GnssCallback::gnssSvStatusCbImpl, GnssSvInfo>(svInfoList); + return Status::ok(); +} + +Status GnssCallbackAidl::gnssLocationCb(const GnssLocationAidl& location) { + GnssCallback::gnssLocationCbImpl(location); + return Status::ok(); +} + +Status GnssCallbackAidl::gnssNmeaCb(const int64_t timestamp, const std::string& nmea) { + JNIEnv* env = getJniEnv(); + /* + * The Java code will call back to read these values. + * We do this to avoid creating unnecessary String objects. + */ + GnssCallback::sNmeaString = nmea.c_str(); + GnssCallback::sNmeaStringLength = nmea.size(); + + env->CallVoidMethod(mCallbacksObj, method_reportNmea, timestamp); + checkAndClearExceptionFromCallback(env, __FUNCTION__); + return Status::ok(); +} + +Status GnssCallbackAidl::gnssAcquireWakelockCb() { + acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_NAME); + return Status::ok(); +} + +Status GnssCallbackAidl::gnssReleaseWakelockCb() { + release_wake_lock(WAKE_LOCK_NAME); + return Status::ok(); +} + +Status GnssCallbackAidl::gnssSetSystemInfoCb(const GnssSystemInfo& info) { + ALOGD("%s: yearOfHw=%d, name=%s\n", __func__, info.yearOfHw, info.name.c_str()); + JNIEnv* env = getJniEnv(); + env->CallVoidMethod(mCallbacksObj, method_setGnssYearOfHardware, info.yearOfHw); + jstring jstringName = env->NewStringUTF(info.name.c_str()); + env->CallVoidMethod(mCallbacksObj, method_setGnssHardwareModelName, jstringName); + if (jstringName) { + env->DeleteLocalRef(jstringName); + } + checkAndClearExceptionFromCallback(env, __FUNCTION__); + return Status::ok(); +} + +Status GnssCallbackAidl::gnssRequestTimeCb() { + JNIEnv* env = getJniEnv(); + env->CallVoidMethod(mCallbacksObj, method_requestUtcTime); + checkAndClearExceptionFromCallback(env, __FUNCTION__); + return Status::ok(); +} + +Status GnssCallbackAidl::gnssRequestLocationCb(const bool independentFromGnss, + const bool isUserEmergency) { + JNIEnv* env = getJniEnv(); + env->CallVoidMethod(mCallbacksObj, method_requestLocation, boolToJbool(independentFromGnss), + boolToJbool(isUserEmergency)); + checkAndClearExceptionFromCallback(env, __FUNCTION__); + return Status::ok(); +} + /* * GnssPowerIndicationCallback class implements the callback methods for the IGnssPowerIndication * interface. @@ -797,7 +936,10 @@ Return AGnssRilCallback::requestRefLocCb() { static void android_location_gnss_hal_GnssNative_set_gps_service_handle() { gnssHalAidl = waitForVintfService(); if (gnssHalAidl != nullptr) { - ALOGD("Successfully got GNSS AIDL handle."); + ALOGD("Successfully got GNSS AIDL handle. Version=%d.", gnssHalAidl->getInterfaceVersion()); + if (gnssHalAidl->getInterfaceVersion() >= 2) { + return; + } } ALOGD("Trying IGnss_V2_1::getService()"); @@ -952,15 +1094,17 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject // TODO: linkToDeath for AIDL HAL - gnssHalDeathRecipient = new GnssDeathRecipient(); - hardware::Return linked = gnssHal->linkToDeath(gnssHalDeathRecipient, /*cookie*/ 0); - if (!linked.isOk()) { - ALOGE("Transaction error in linking to GnssHAL death: %s", - linked.description().c_str()); - } else if (!linked) { - ALOGW("Unable to link to GnssHal death notifications"); - } else { - ALOGD("Link to death notification successful"); + if (gnssHal != nullptr) { + gnssHalDeathRecipient = new GnssDeathRecipient(); + hardware::Return linked = gnssHal->linkToDeath(gnssHalDeathRecipient, /*cookie*/ 0); + if (!linked.isOk()) { + ALOGE("Transaction error in linking to GnssHAL death: %s", + linked.description().c_str()); + } else if (!linked) { + ALOGW("Unable to link to GnssHal death notifications"); + } else { + ALOGD("Link to death notification successful"); + } } if (gnssHalAidl != nullptr) { @@ -997,7 +1141,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject } } - if (gnssHalAidl != nullptr) { + if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { sp agnssAidl; auto status = gnssHalAidl->getExtensionAGnss(&agnssAidl); if (checkAidlStatus(status, "Unable to get a handle to AGnss interface.")) { @@ -1161,7 +1305,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject gnssConfigurationIface = std::make_unique(gnssConfiguration); } - } else { + } else if (gnssHal != nullptr) { auto gnssConfiguration = gnssHal->getExtensionGnssConfiguration(); if (checkHidlReturn(gnssConfiguration, "Unable to get a handle to GnssConfiguration_V1_0")) { @@ -1227,7 +1371,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject } static jboolean android_location_gnss_hal_GnssNative_is_supported(JNIEnv* /* env */, jclass) { - return (gnssHal != nullptr) ? JNI_TRUE : JNI_FALSE; + return (gnssHalAidl != nullptr || gnssHal != nullptr) ? JNI_TRUE : JNI_FALSE; } static jboolean android_location_GnssNetworkConnectivityHandler_is_agps_ril_supported( @@ -1261,26 +1405,26 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl return JNI_FALSE; } - Return result = false; - // Set top level IGnss.hal callback. - sp gnssCbIface = new GnssCallback(); - if (gnssHal_V2_1 != nullptr) { - result = gnssHal_V2_1->setCallback_2_1(gnssCbIface); - } else if (gnssHal_V2_0 != nullptr) { - result = gnssHal_V2_0->setCallback_2_0(gnssCbIface); - } else if (gnssHal_V1_1 != nullptr) { - result = gnssHal_V1_1->setCallback_1_1(gnssCbIface); - } else if (gnssHal != nullptr) { - result = gnssHal->setCallback(gnssCbIface); + if (gnssHal != nullptr) { + Return result = false; + sp gnssCbIface = new GnssCallback(); + if (gnssHal_V2_1 != nullptr) { + result = gnssHal_V2_1->setCallback_2_1(gnssCbIface); + } else if (gnssHal_V2_0 != nullptr) { + result = gnssHal_V2_0->setCallback_2_0(gnssCbIface); + } else if (gnssHal_V1_1 != nullptr) { + result = gnssHal_V1_1->setCallback_1_1(gnssCbIface); + } else { + result = gnssHal->setCallback(gnssCbIface); + } + if (!checkHidlReturn(result, "IGnss setCallback() failed.")) { + return JNI_FALSE; + } } - if (!checkHidlReturn(result, "IGnss setCallback() failed.")) { - return JNI_FALSE; - } - - sp gnssCbIfaceAidl = new GnssCallbackAidl(); if (gnssHalAidl != nullptr) { + sp gnssCbIfaceAidl = new GnssCallbackAidl(); auto status = gnssHalAidl->setCallback(gnssCbIfaceAidl); if (!checkAidlStatus(status, "IGnssAidl setCallback() failed.")) { return JNI_FALSE; @@ -1296,7 +1440,7 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl } } else if (gnssXtraIface != nullptr) { sp gnssXtraCbIface = new GnssXtraCallback(); - result = gnssXtraIface->setCallback(gnssXtraCbIface); + auto result = gnssXtraIface->setCallback(gnssXtraCbIface); if (!checkHidlReturn(result, "IGnssXtra setCallback() failed.")) { gnssXtraIface = nullptr; } else { @@ -1339,20 +1483,20 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl if (gnssVisibilityControlIface != nullptr) { sp gnssVisibilityControlCbIface = new GnssVisibilityControlCallback(); - result = gnssVisibilityControlIface->setCallback(gnssVisibilityControlCbIface); + auto result = gnssVisibilityControlIface->setCallback(gnssVisibilityControlCbIface); checkHidlReturn(result, "IGnssVisibilityControl setCallback() failed."); } // Set IMeasurementCorrections.hal callback. if (gnssCorrectionsIface_V1_1 != nullptr) { - sp gnssCorrectionsIfaceCbIface = - new MeasurementCorrectionsCallback(); - result = gnssCorrectionsIface_V1_1->setCallback(gnssCorrectionsIfaceCbIface); - checkHidlReturn(result, "IMeasurementCorrections 1.1 setCallback() failed."); + sp gnssCorrectionsIfaceCbIface = + new MeasurementCorrectionsCallback(); + auto result = gnssCorrectionsIface_V1_1->setCallback(gnssCorrectionsIfaceCbIface); + checkHidlReturn(result, "IMeasurementCorrections 1.1 setCallback() failed."); } else if (gnssCorrectionsIface_V1_0 != nullptr) { sp gnssCorrectionsIfaceCbIface = new MeasurementCorrectionsCallback(); - result = gnssCorrectionsIface_V1_0->setCallback(gnssCorrectionsIfaceCbIface); + auto result = gnssCorrectionsIface_V1_0->setCallback(gnssCorrectionsIfaceCbIface); checkHidlReturn(result, "IMeasurementCorrections 1.0 setCallback() failed."); } else { ALOGI("Unable to find IMeasurementCorrections."); @@ -1386,6 +1530,15 @@ static void android_location_gnss_hal_GnssNative_cleanup(JNIEnv* /* env */, jcla static jboolean android_location_gnss_hal_GnssNative_set_position_mode( JNIEnv* /* env */, jclass, jint mode, jint recurrence, jint min_interval, jint preferred_accuracy, jint preferred_time, jboolean low_power_mode) { + if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { + auto status = gnssHalAidl->setPositionMode(static_cast(mode), + static_cast( + recurrence), + min_interval, preferred_accuracy, preferred_time, + low_power_mode); + return checkAidlStatus(status, "IGnssAidl setPositionMode() failed."); + } + Return result = false; if (gnssHal_V1_1 != nullptr) { result = gnssHal_V1_1->setPositionMode_1_1(static_cast(mode), @@ -1406,6 +1559,11 @@ static jboolean android_location_gnss_hal_GnssNative_set_position_mode( } static jboolean android_location_gnss_hal_GnssNative_start(JNIEnv* /* env */, jclass) { + if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { + auto status = gnssHalAidl->start(); + return checkAidlStatus(status, "IGnssAidl start() failed."); + } + if (gnssHal == nullptr) { return JNI_FALSE; } @@ -1415,6 +1573,11 @@ static jboolean android_location_gnss_hal_GnssNative_start(JNIEnv* /* env */, jc } static jboolean android_location_gnss_hal_GnssNative_stop(JNIEnv* /* env */, jclass) { + if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { + auto status = gnssHalAidl->stop(); + return checkAidlStatus(status, "IGnssAidl stop() failed."); + } + if (gnssHal == nullptr) { return JNI_FALSE; } @@ -1425,6 +1588,12 @@ static jboolean android_location_gnss_hal_GnssNative_stop(JNIEnv* /* env */, jcl static void android_location_gnss_hal_GnssNative_delete_aiding_data(JNIEnv* /* env */, jclass, jint flags) { + if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { + auto status = gnssHalAidl->deleteAidingData(static_cast(flags)); + checkAidlStatus(status, "IGnssAidl deleteAidingData() failed."); + return; + } + if (gnssHal == nullptr) { return; } @@ -1488,10 +1657,15 @@ static jint android_location_gnss_hal_GnssNative_read_nmea(JNIEnv* env, jclass, static void android_location_gnss_hal_GnssNative_inject_time(JNIEnv* /* env */, jclass, jlong time, jlong timeReference, jint uncertainty) { - if (gnssHal == nullptr) { + if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { + auto status = gnssHalAidl->injectTime(time, timeReference, uncertainty); + checkAidlStatus(status, "IGnssAidl injectTime() failed."); return; } + if (gnssHal == nullptr) { + return; + } auto result = gnssHal->injectTime(time, timeReference, uncertainty); checkHidlReturn(result, "IGnss injectTime() failed."); } @@ -1503,6 +1677,19 @@ static void android_location_gnss_hal_GnssNative_inject_best_location( jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees, jlong timestamp, jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos, jdouble elapsedRealtimeUncertaintyNanos) { + if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { + GnssLocationAidl location = + createGnssLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, + altitudeMeters, speedMetersPerSec, bearingDegrees, + horizontalAccuracyMeters, verticalAccuracyMeters, + speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp, + elapsedRealtimeFlags, elapsedRealtimeNanos, + elapsedRealtimeUncertaintyNanos); + auto status = gnssHalAidl->injectBestLocation(location); + checkAidlStatus(status, "IGnssAidl injectBestLocation() failed."); + return; + } + if (gnssHal_V2_0 != nullptr) { GnssLocation_V2_0 location = createGnssLocation_V2_0( gnssLocationFlags, @@ -1544,15 +1731,31 @@ static void android_location_gnss_hal_GnssNative_inject_best_location( ALOGE("IGnss injectBestLocation() is called but gnssHal_V1_1 is not available."); } -static void android_location_gnss_hal_GnssNative_inject_location(JNIEnv* /* env */, jclass, - jdouble latitude, - jdouble longitude, - jfloat accuracy) { - if (gnssHal == nullptr) { +static void android_location_gnss_hal_GnssNative_inject_location( + JNIEnv* /* env */, jclass, jint gnssLocationFlags, jdouble latitudeDegrees, + jdouble longitudeDegrees, jdouble altitudeMeters, jfloat speedMetersPerSec, + jfloat bearingDegrees, jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters, + jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees, jlong timestamp, + jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos, + jdouble elapsedRealtimeUncertaintyNanos) { + if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { + GnssLocationAidl location = + createGnssLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, + altitudeMeters, speedMetersPerSec, bearingDegrees, + horizontalAccuracyMeters, verticalAccuracyMeters, + speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp, + elapsedRealtimeFlags, elapsedRealtimeNanos, + elapsedRealtimeUncertaintyNanos); + auto status = gnssHalAidl->injectLocation(location); + checkAidlStatus(status, "IGnssAidl injectLocation() failed."); return; } - auto result = gnssHal->injectLocation(latitude, longitude, accuracy); + if (gnssHal == nullptr) { + return; + } + auto result = + gnssHal->injectLocation(latitudeDegrees, longitudeDegrees, horizontalAccuracyMeters); checkHidlReturn(result, "IGnss injectLocation() failed."); } @@ -2292,7 +2495,7 @@ static const JNINativeMethod sLocationProviderMethods[] = { reinterpret_cast(android_location_gnss_hal_GnssNative_inject_time)}, {"native_inject_best_location", "(IDDDFFFFFFJIJD)V", reinterpret_cast(android_location_gnss_hal_GnssNative_inject_best_location)}, - {"native_inject_location", "(DDF)V", + {"native_inject_location", "(IDDDFFFFFFJIJD)V", reinterpret_cast(android_location_gnss_hal_GnssNative_inject_location)}, {"native_supports_psds", "()Z", reinterpret_cast(android_location_gnss_hal_GnssNative_supports_psds)}, diff --git a/services/core/jni/gnss/AGnss.cpp b/services/core/jni/gnss/AGnss.cpp index 00403d6313066..091fffde6f542 100644 --- a/services/core/jni/gnss/AGnss.cpp +++ b/services/core/jni/gnss/AGnss.cpp @@ -43,7 +43,7 @@ jboolean AGnss::setCallback(const std::unique_ptr& callback) { jboolean AGnss::dataConnOpen(JNIEnv* env, jlong networkHandle, jstring apn, jint apnIpType) { ScopedJniString jniApn{env, apn}; - auto status = mIAGnss->dataConnOpen(networkHandle, String16(jniApn.c_str()), + auto status = mIAGnss->dataConnOpen(networkHandle, std::string(jniApn.c_str()), static_cast(apnIpType)); return checkAidlStatus(status, "IAGnssAidl dataConnOpen() failed. APN and its IP type not set."); @@ -61,8 +61,8 @@ jboolean AGnss::dataConnFailed() { jboolean AGnss::setServer(JNIEnv* env, jint type, jstring hostname, jint port) { ScopedJniString jniHostName{env, hostname}; - auto status = - mIAGnss->setServer(static_cast(type), String16(jniHostName.c_str()), port); + auto status = mIAGnss->setServer(static_cast(type), std::string(jniHostName.c_str()), + port); return checkAidlStatus(status, "IAGnssAidl setServer() failed. Host name and port not set."); } diff --git a/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java b/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java index e0c8b09aae88e..9d5db080c680d 100644 --- a/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java +++ b/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java @@ -428,11 +428,15 @@ public final class FakeGnssHal extends GnssNative.GnssHal { } @Override - protected void injectLocation(double latitude, double longitude, float accuracy) { + protected void injectLocation(@GnssLocationFlags int gnssLocationFlags, double latitude, + double longitude, double altitude, float speed, float bearing, float horizontalAccuracy, + float verticalAccuracy, float speedAccuracy, float bearingAccuracy, long timestamp, + @GnssRealtimeFlags int elapsedRealtimeFlags, long elapsedRealtimeNanos, + double elapsedRealtimeUncertaintyNanos) { mState.mInjectedLocation = new Location("injected"); mState.mInjectedLocation.setLatitude(latitude); mState.mInjectedLocation.setLongitude(longitude); - mState.mInjectedLocation.setAccuracy(accuracy); + mState.mInjectedLocation.setAccuracy(horizontalAccuracy); } @Override