Merge "Add IGnss AIDL HAL (frameworks/base)"

This commit is contained in:
TreeHugger Robot
2022-01-06 04:27:16 +00:00
committed by Android (Google) Code Review
4 changed files with 338 additions and 89 deletions

View File

@@ -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);
}
}
@@ -1263,8 +1293,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,
@@ -1438,8 +1475,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(

View File

@@ -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<uint32_t>(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<int>(gnssLocationFlags);
location.latitudeDegrees = static_cast<double>(latitudeDegrees);
location.longitudeDegrees = static_cast<double>(longitudeDegrees);
location.altitudeMeters = static_cast<double>(altitudeMeters);
location.speedMetersPerSec = static_cast<double>(speedMetersPerSec);
location.bearingDegrees = static_cast<double>(bearingDegrees);
location.horizontalAccuracyMeters = static_cast<double>(horizontalAccuracyMeters);
location.verticalAccuracyMeters = static_cast<double>(verticalAccuracyMeters);
location.speedAccuracyMetersPerSecond = static_cast<double>(speedAccuracyMetersPerSecond);
location.bearingAccuracyDegrees = static_cast<double>(bearingAccuracyDegrees);
location.timestampMillis = static_cast<uint64_t>(timestamp);
location.elapsedRealtime.flags = static_cast<int>(elapsedRealtimeFlags);
location.elapsedRealtime.timestampNs = static_cast<uint64_t>(elapsedRealtimeNanos);
location.elapsedRealtime.timeUncertaintyNs =
static_cast<double>(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<void> gnssLocationCb(const GnssLocation_V1_0& location) override;
Return<void> gnssStatusCb(const IGnssCallback_V1_0::GnssStatusValue status) override;
Return<void> gnssSvStatusCb(const IGnssCallback_V1_0::GnssSvStatus& svStatus) override {
return gnssSvStatusCbImpl(svStatus);
return gnssSvStatusCbImpl<IGnssCallback_V1_0::GnssSvStatus, IGnssCallback_V1_0::GnssSvInfo>(
svStatus);
}
Return<void> gnssNmeaCb(int64_t timestamp, const android::hardware::hidl_string& nmea) override;
Return<void> gnssSetCapabilitesCb(uint32_t capabilities) override;
@@ -318,73 +354,67 @@ struct GnssCallback : public IGnssCallback_V2_1 {
Return<void> gnssSetCapabilitiesCb_2_0(uint32_t capabilities) override;
Return<void> gnssLocationCb_2_0(const GnssLocation_V2_0& location) override;
Return<void> gnssSvStatusCb_2_0(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList) override {
return gnssSvStatusCbImpl(svInfoList);
return gnssSvStatusCbImpl<hidl_vec<IGnssCallback_V2_0::GnssSvInfo>,
IGnssCallback_V1_0::GnssSvInfo>(svInfoList);
}
// New in 2.1
Return<void> gnssSvStatusCb_2_1(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList) override {
return gnssSvStatusCbImpl(svInfoList);
return gnssSvStatusCbImpl<hidl_vec<IGnssCallback_V2_1::GnssSvInfo>,
IGnssCallback_V1_0::GnssSvInfo>(svInfoList);
}
Return<void> 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 <class T>
static Return<void> gnssLocationCbImpl(const T& location);
template <class T_list, class T_sv_info>
static Return<void> gnssSvStatusCbImpl(const T_list& svStatus);
private:
template<class T>
Return<void> gnssLocationCbImpl(const T& location);
template<class T>
Return<void> gnssSvStatusCbImpl(const T& svStatus);
template<class T>
uint32_t getHasBasebandCn0DbHzFlag(const T& svStatus) {
template <class T>
static uint32_t getHasBasebandCn0DbHzFlag(const T& svStatus) {
return 0;
}
template<class T>
double getBasebandCn0DbHz(const T& svStatus, size_t i) {
template <class T>
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<IGnssCallback_V2_0::GnssSvInfo>& svInfoList) {
template <class T>
static uint32_t getGnssSvInfoListSize(const T& svInfoList) {
return svInfoList.size();
}
uint32_t getGnssSvInfoListSize(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList) {
return svInfoList.size();
static const IGnssCallbackAidl::GnssSvInfo& getGnssSvInfoOfIndex(
const std::vector<IGnssCallbackAidl::GnssSvInfo>& 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<IGnssCallback_V2_0::GnssSvInfo>& 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<IGnssCallback_V2_1::GnssSvInfo>& 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<uint32_t>(svStatus.gnssSvList.data()[i].constellation);
}
uint32_t getConstellationType(const hidl_vec<IGnssCallback_V2_0::GnssSvInfo>& svInfoList, size_t i) {
template <class T>
static uint32_t getConstellationType(const T& svInfoList, size_t i) {
return static_cast<uint32_t>(svInfoList[i].constellation);
}
uint32_t getConstellationType(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList, size_t i) {
return static_cast<uint32_t>(svInfoList[i].v2_0.constellation);
}
};
Return<void> GnssCallback::gnssNameCb(const android::hardware::hidl_string& name) {
@@ -441,14 +471,43 @@ uint32_t GnssCallback::getHasBasebandCn0DbHzFlag(const hidl_vec<IGnssCallback_V2
return SVID_FLAGS_HAS_BASEBAND_CN0;
}
template <>
uint32_t GnssCallback::getHasBasebandCn0DbHzFlag(
const std::vector<IGnssCallbackAidl::GnssSvInfo>& svStatus) {
return SVID_FLAGS_HAS_BASEBAND_CN0;
}
template <>
double GnssCallback::getBasebandCn0DbHz(
const std::vector<IGnssCallbackAidl::GnssSvInfo>& svInfoList, size_t i) {
return svInfoList[i].basebandCN0DbHz;
}
template<>
double GnssCallback::getBasebandCn0DbHz(const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList,
size_t i) {
return svInfoList[i].basebandCN0DbHz;
}
template<class T>
Return<void> 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<uint32_t>(svStatus.gnssSvList.data()[i].constellation);
}
template <>
uint32_t GnssCallback::getConstellationType(
const hidl_vec<IGnssCallback_V2_1::GnssSvInfo>& svInfoList, size_t i) {
return static_cast<uint32_t>(svInfoList[i].v2_0.constellation);
}
template <class T_list, class T_sv_info>
Return<void> GnssCallback::gnssSvStatusCbImpl(const T_list& svStatus) {
JNIEnv* env = getJniEnv();
uint32_t listSize = getGnssSvInfoListSize(svStatus);
@@ -476,7 +535,7 @@ Return<void> 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<uint32_t>(info.svFlag);
@@ -586,6 +645,16 @@ Return<void> 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<GnssSvInfo>& 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<GnssSvInfo>& svInfoList) {
GnssCallback::gnssSvStatusCbImpl<std::vector<GnssSvInfo>, GnssSvInfo>(svInfoList);
return Status::ok();
}
Status GnssCallbackAidl::gnssLocationCb(const GnssLocationAidl& location) {
GnssCallback::gnssLocationCbImpl<GnssLocationAidl>(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<void> AGnssRilCallback::requestRefLocCb() {
static void android_location_gnss_hal_GnssNative_set_gps_service_handle() {
gnssHalAidl = waitForVintfService<IGnssAidl>();
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<bool> 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<bool> 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) {
@@ -1163,7 +1307,7 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
gnssConfigurationIface =
std::make_unique<gnss::GnssConfiguration_V1_1>(gnssConfiguration);
}
} else {
} else if (gnssHal != nullptr) {
auto gnssConfiguration = gnssHal->getExtensionGnssConfiguration();
if (checkHidlReturn(gnssConfiguration,
"Unable to get a handle to GnssConfiguration_V1_0")) {
@@ -1229,7 +1373,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(
@@ -1263,26 +1407,26 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
return JNI_FALSE;
}
Return<bool> result = false;
// Set top level IGnss.hal callback.
sp<IGnssCallback_V2_1> 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<bool> result = false;
sp<IGnssCallback_V2_1> 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<IGnssCallbackAidl> gnssCbIfaceAidl = new GnssCallbackAidl();
if (gnssHalAidl != nullptr) {
sp<IGnssCallbackAidl> gnssCbIfaceAidl = new GnssCallbackAidl();
auto status = gnssHalAidl->setCallback(gnssCbIfaceAidl);
if (!checkAidlStatus(status, "IGnssAidl setCallback() failed.")) {
return JNI_FALSE;
@@ -1298,7 +1442,7 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
}
} else if (gnssXtraIface != nullptr) {
sp<IGnssXtraCallback> gnssXtraCbIface = new GnssXtraCallback();
result = gnssXtraIface->setCallback(gnssXtraCbIface);
auto result = gnssXtraIface->setCallback(gnssXtraCbIface);
if (!checkHidlReturn(result, "IGnssXtra setCallback() failed.")) {
gnssXtraIface = nullptr;
} else {
@@ -1341,20 +1485,20 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
if (gnssVisibilityControlIface != nullptr) {
sp<IGnssVisibilityControlCallback> 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<IMeasurementCorrectionsCallback> gnssCorrectionsIfaceCbIface =
new MeasurementCorrectionsCallback();
result = gnssCorrectionsIface_V1_1->setCallback(gnssCorrectionsIfaceCbIface);
checkHidlReturn(result, "IMeasurementCorrections 1.1 setCallback() failed.");
sp<IMeasurementCorrectionsCallback> gnssCorrectionsIfaceCbIface =
new MeasurementCorrectionsCallback();
auto result = gnssCorrectionsIface_V1_1->setCallback(gnssCorrectionsIfaceCbIface);
checkHidlReturn(result, "IMeasurementCorrections 1.1 setCallback() failed.");
} else if (gnssCorrectionsIface_V1_0 != nullptr) {
sp<IMeasurementCorrectionsCallback> 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.");
@@ -1388,6 +1532,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<IGnssAidl::GnssPositionMode>(mode),
static_cast<IGnssAidl::GnssPositionRecurrence>(
recurrence),
min_interval, preferred_accuracy, preferred_time,
low_power_mode);
return checkAidlStatus(status, "IGnssAidl setPositionMode() failed.");
}
Return<bool> result = false;
if (gnssHal_V1_1 != nullptr) {
result = gnssHal_V1_1->setPositionMode_1_1(static_cast<IGnss_V1_0::GnssPositionMode>(mode),
@@ -1408,6 +1561,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;
}
@@ -1417,6 +1575,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;
}
@@ -1427,6 +1590,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<IGnssAidl::GnssAidingData>(flags));
checkAidlStatus(status, "IGnssAidl deleteAidingData() failed.");
return;
}
if (gnssHal == nullptr) {
return;
}
@@ -1490,10 +1659,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.");
}
@@ -1505,6 +1679,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,
@@ -1546,15 +1733,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.");
}
@@ -2207,7 +2410,7 @@ static const JNINativeMethod sLocationProviderMethods[] = {
reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_time)},
{"native_inject_best_location", "(IDDDFFFFFFJIJD)V",
reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_best_location)},
{"native_inject_location", "(DDF)V",
{"native_inject_location", "(IDDDFFFFFFJIJD)V",
reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_location)},
{"native_supports_psds", "()Z",
reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_supports_psds)},

View File

@@ -43,7 +43,7 @@ jboolean AGnss::setCallback(const std::unique_ptr<AGnssCallback>& 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<IAGnss::ApnIpType>(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<AGnssType>(type), String16(jniHostName.c_str()), port);
auto status = mIAGnss->setServer(static_cast<AGnssType>(type), std::string(jniHostName.c_str()),
port);
return checkAidlStatus(status, "IAGnssAidl setServer() failed. Host name and port not set.");
}

View File

@@ -429,11 +429,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