Merge "Add register/unregister methods for SvStatus and NMEA (frameworks/base)"

This commit is contained in:
Yu-Han Yang
2022-02-02 01:05:24 +00:00
committed by Android (Google) Code Review
4 changed files with 171 additions and 12 deletions

View File

@@ -63,16 +63,25 @@ class GnssNmeaProvider extends GnssListenerMultiplexer<Void, IGnssNmeaListener,
@Override
protected boolean registerWithService(Void ignored,
Collection<GnssListenerRegistration> registrations) {
if (D) {
Log.d(TAG, "starting gnss nmea messages");
if (mGnssNative.startNmeaMessageCollection()) {
if (D) {
Log.d(TAG, "starting gnss nmea messages collection");
}
return true;
} else {
Log.e(TAG, "error starting gnss nmea messages collection");
return false;
}
return true;
}
@Override
protected void unregisterWithService() {
if (D) {
Log.d(TAG, "stopping gnss nmea messages");
if (mGnssNative.stopNmeaMessageCollection()) {
if (D) {
Log.d(TAG, "stopping gnss nmea messages collection");
}
} else {
Log.e(TAG, "error stopping gnss nmea messages collection");
}
}

View File

@@ -43,6 +43,7 @@ public class GnssStatusProvider extends
private final AppOpsHelper mAppOpsHelper;
private final LocationUsageLogger mLogger;
private final GnssNative mGnssNative;
private boolean mIsNavigating = false;
@@ -50,6 +51,7 @@ public class GnssStatusProvider extends
super(injector);
mAppOpsHelper = injector.getAppOpsHelper();
mLogger = injector.getLocationUsageLogger();
mGnssNative = gnssNative;
gnssNative.addBaseCallbacks(this);
gnssNative.addStatusCallbacks(this);
@@ -64,16 +66,25 @@ public class GnssStatusProvider extends
@Override
protected boolean registerWithService(Void ignored,
Collection<GnssListenerRegistration> registrations) {
if (D) {
Log.d(TAG, "starting gnss status");
if (mGnssNative.startSvStatusCollection()) {
if (D) {
Log.d(TAG, "starting gnss sv status");
}
return true;
} else {
Log.e(TAG, "error starting gnss sv status");
return false;
}
return true;
}
@Override
protected void unregisterWithService() {
if (D) {
Log.d(TAG, "stopping gnss status");
if (mGnssNative.stopSvStatusCollection()) {
if (D) {
Log.d(TAG, "stopping gnss sv status");
}
} else {
Log.e(TAG, "error stopping gnss sv status");
}
}

View File

@@ -782,6 +782,38 @@ public class GnssNative {
return mGnssHal.stopMeasurementCollection();
}
/**
* Starts sv status collection.
*/
public boolean startSvStatusCollection() {
Preconditions.checkState(mRegistered);
return mGnssHal.startSvStatusCollection();
}
/**
* Stops sv status collection.
*/
public boolean stopSvStatusCollection() {
Preconditions.checkState(mRegistered);
return mGnssHal.stopSvStatusCollection();
}
/**
* Starts NMEA message collection.
*/
public boolean startNmeaMessageCollection() {
Preconditions.checkState(mRegistered);
return mGnssHal.startNmeaMessageCollection();
}
/**
* Stops NMEA message collection.
*/
public boolean stopNmeaMessageCollection() {
Preconditions.checkState(mRegistered);
return mGnssHal.stopNmeaMessageCollection();
}
/**
* Returns true if measurement corrections are supported.
*/
@@ -1369,6 +1401,22 @@ public class GnssNative {
return native_inject_measurement_corrections(corrections);
}
protected boolean startSvStatusCollection() {
return native_start_sv_status_collection();
}
protected boolean stopSvStatusCollection() {
return native_stop_sv_status_collection();
}
protected boolean startNmeaMessageCollection() {
return native_start_nmea_message_collection();
}
protected boolean stopNmeaMessageCollection() {
return native_stop_nmea_message_collection();
}
protected int getBatchSize() {
return native_get_batch_size();
}
@@ -1478,6 +1526,10 @@ public class GnssNative {
private static native int native_read_nmea(byte[] buffer, int bufferSize);
private static native boolean native_start_nmea_message_collection();
private static native boolean native_stop_nmea_message_collection();
// location injection APIs
private static native void native_inject_location(
@@ -1501,6 +1553,11 @@ public class GnssNative {
private static native void native_inject_time(long time, long timeReference, int uncertainty);
// sv status APIs
private static native boolean native_start_sv_status_collection();
private static native boolean native_stop_sv_status_collection();
// navigation message APIs
private static native boolean native_is_navigation_message_supported();

View File

@@ -244,6 +244,9 @@ bool hasLatLong(const GnssLocation_V2_0& location) {
return hasLatLong(location.v1_0);
}
bool isSvStatusRegistered = false;
bool isNmeaRegistered = false;
} // namespace
static inline jboolean boolToJbool(bool value) {
@@ -505,6 +508,13 @@ uint32_t GnssCallback::getConstellationType(
template <class T_list, class T_sv_info>
Return<void> GnssCallback::gnssSvStatusCbImpl(const T_list& svStatus) {
// In HIDL or AIDL v1, if no listener is registered, do not report svInfoList to the framework.
if (gnssHalAidl == nullptr || gnssHalAidl->getInterfaceVersion() == 1) {
if (!isSvStatusRegistered) {
return Void();
}
}
JNIEnv* env = getJniEnv();
uint32_t listSize = getGnssSvInfoListSize(svStatus);
@@ -566,8 +576,12 @@ Return<void> GnssCallback::gnssSvStatusCbImpl(const T_list& svStatus) {
return Void();
}
Return<void> GnssCallback::gnssNmeaCb(
int64_t timestamp, const ::android::hardware::hidl_string& nmea) {
Return<void> GnssCallback::gnssNmeaCb(int64_t timestamp,
const ::android::hardware::hidl_string& nmea) {
// In HIDL, if no listener is registered, do not report nmea to the framework.
if (!isNmeaRegistered) {
return Void();
}
JNIEnv* env = getJniEnv();
/*
* The Java code will call back to read these values.
@@ -680,6 +694,12 @@ Status GnssCallbackAidl::gnssLocationCb(const GnssLocationAidl& location) {
}
Status GnssCallbackAidl::gnssNmeaCb(const int64_t timestamp, const std::string& nmea) {
// In AIDL v1, if no listener is registered, do not report nmea to the framework.
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() == 1) {
if (!isNmeaRegistered) {
return Status::ok();
}
}
JNIEnv* env = getJniEnv();
/*
* The Java code will call back to read these values.
@@ -1562,6 +1582,58 @@ static jboolean android_location_gnss_hal_GnssNative_stop(JNIEnv* /* env */, jcl
return checkHidlReturn(result, "IGnss stop() failed.");
}
static jboolean android_location_gnss_hal_GnssNative_start_sv_status_collection(JNIEnv* /* env */,
jclass) {
isSvStatusRegistered = true;
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
auto status = gnssHalAidl->startSvStatus();
return checkAidlStatus(status, "IGnssAidl startSvStatus() failed.");
}
if (gnssHal == nullptr) {
return JNI_FALSE;
}
return JNI_TRUE;
}
static jboolean android_location_gnss_hal_GnssNative_stop_sv_status_collection(JNIEnv* /* env */,
jclass) {
isSvStatusRegistered = false;
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
auto status = gnssHalAidl->stopSvStatus();
return checkAidlStatus(status, "IGnssAidl stopSvStatus() failed.");
}
if (gnssHal == nullptr) {
return JNI_FALSE;
}
return JNI_TRUE;
}
static jboolean android_location_gnss_hal_GnssNative_start_nmea_message_collection(
JNIEnv* /* env */, jclass) {
isNmeaRegistered = true;
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
auto status = gnssHalAidl->startNmea();
return checkAidlStatus(status, "IGnssAidl startNmea() failed.");
}
if (gnssHal == nullptr) {
return JNI_FALSE;
}
return JNI_TRUE;
}
static jboolean android_location_gnss_hal_GnssNative_stop_nmea_message_collection(JNIEnv* /* env */,
jclass) {
isNmeaRegistered = false;
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
auto status = gnssHalAidl->stopNmea();
return checkAidlStatus(status, "IGnssAidl stopNmea() failed.");
}
if (gnssHal == nullptr) {
return JNI_FALSE;
}
return JNI_TRUE;
}
static void android_location_gnss_hal_GnssNative_delete_aiding_data(JNIEnv* /* env */, jclass,
jint flags) {
if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
@@ -2365,6 +2437,16 @@ static const JNINativeMethod sLocationProviderMethods[] = {
{"native_is_gnss_visibility_control_supported", "()Z",
reinterpret_cast<void*>(
android_location_gnss_hal_GnssNative_is_gnss_visibility_control_supported)},
{"native_start_sv_status_collection", "()Z",
reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_start_sv_status_collection)},
{"native_stop_sv_status_collection", "()Z",
reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_stop_sv_status_collection)},
{"native_start_nmea_message_collection", "()Z",
reinterpret_cast<void*>(
android_location_gnss_hal_GnssNative_start_nmea_message_collection)},
{"native_stop_nmea_message_collection", "()Z",
reinterpret_cast<void*>(
android_location_gnss_hal_GnssNative_stop_nmea_message_collection)},
};
static const JNINativeMethod sBatchingMethods[] = {