From 67ae4f5a385daab72c6eae6e5705a48982c4f74b Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Wed, 15 Dec 2021 14:45:32 -0800 Subject: [PATCH] Add intervalMillis to GnssMeasurement JNI Bug: 206670536 Test: atest GnssMeasurementRegistrationTest Change-Id: I3691e8bd2052667c9ffc0e50a5da86e3f5b91bd9 --- .../gnss/GnssMeasurementsProvider.java | 3 +- .../server/location/gnss/hal/GnssNative.java | 12 +++-- ...d_server_location_GnssLocationProvider.cpp | 11 ++-- services/core/jni/gnss/GnssMeasurement.cpp | 51 +++++++++++++------ services/core/jni/gnss/GnssMeasurement.h | 30 ++++++----- .../server/location/gnss/hal/FakeGnssHal.java | 5 +- 6 files changed, 75 insertions(+), 37 deletions(-) diff --git a/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java b/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java index 699f1439538e7..7bb0d4899de54 100644 --- a/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java +++ b/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java @@ -114,7 +114,8 @@ public final class GnssMeasurementsProvider extends protected boolean registerWithService(GnssMeasurementRequest request, Collection registrations) { if (mGnssNative.startMeasurementCollection(request.isFullTracking(), - request.isCorrelationVectorOutputsEnabled())) { + request.isCorrelationVectorOutputsEnabled(), + request.getIntervalMillis())) { if (D) { Log.d(TAG, "starting gnss measurements (" + request + ")"); } 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..cc5dcf30c957a 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 @@ -735,9 +735,10 @@ public class GnssNative { * Starts measurement collection. */ public boolean startMeasurementCollection(boolean enableFullTracking, - boolean enableCorrVecOutputs) { + boolean enableCorrVecOutputs, int intervalMillis) { Preconditions.checkState(mRegistered); - return mGnssHal.startMeasurementCollection(enableFullTracking, enableCorrVecOutputs); + return mGnssHal.startMeasurementCollection(enableFullTracking, enableCorrVecOutputs, + intervalMillis); } /** @@ -1310,8 +1311,9 @@ public class GnssNative { } protected boolean startMeasurementCollection(boolean enableFullTracking, - boolean enableCorrVecOutputs) { - return native_start_measurement_collection(enableFullTracking, enableCorrVecOutputs); + boolean enableCorrVecOutputs, int intervalMillis) { + return native_start_measurement_collection(enableFullTracking, enableCorrVecOutputs, + intervalMillis); } protected boolean stopMeasurementCollection() { @@ -1475,7 +1477,7 @@ public class GnssNative { private static native boolean native_is_measurement_supported(); private static native boolean native_start_measurement_collection(boolean enableFullTracking, - boolean enableCorrVecOutputs); + boolean enableCorrVecOutputs, int intervalMillis); private static native boolean native_stop_measurement_collection(); diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 826171a0f10e6..f66f119c592b0 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -1806,15 +1806,20 @@ static jboolean android_location_gnss_hal_GnssNative_is_measurement_supported(JN } static jboolean android_location_gnss_hal_GnssNative_start_measurement_collection( - JNIEnv* /* env */, jclass, jboolean enableFullTracking, jboolean enableCorrVecOutputs) { + JNIEnv* /* env */, jclass, jboolean enableFullTracking, jboolean enableCorrVecOutputs, + jint intervalMs) { if (gnssMeasurementIface == nullptr) { ALOGE("%s: IGnssMeasurement interface not available.", __func__); return JNI_FALSE; } + hardware::gnss::IGnssMeasurementInterface::Options options; + options.enableFullTracking = enableFullTracking; + options.enableCorrVecOutputs = enableCorrVecOutputs; + options.intervalMs = intervalMs; return gnssMeasurementIface->setCallback(std::make_unique( mCallbacksObj), - enableFullTracking, enableCorrVecOutputs); + options); } static jboolean android_location_gnss_hal_GnssNative_stop_measurement_collection(JNIEnv* env, @@ -2269,7 +2274,7 @@ static const JNINativeMethod sMeasurementMethods[] = { /* name, signature, funcPtr */ {"native_is_measurement_supported", "()Z", reinterpret_cast(android_location_gnss_hal_GnssNative_is_measurement_supported)}, - {"native_start_measurement_collection", "(ZZ)Z", + {"native_start_measurement_collection", "(ZZI)Z", reinterpret_cast( android_location_gnss_hal_GnssNative_start_measurement_collection)}, {"native_stop_measurement_collection", "()Z", diff --git a/services/core/jni/gnss/GnssMeasurement.cpp b/services/core/jni/gnss/GnssMeasurement.cpp index 663d839ff1591..9fbf259d582a8 100644 --- a/services/core/jni/gnss/GnssMeasurement.cpp +++ b/services/core/jni/gnss/GnssMeasurement.cpp @@ -50,9 +50,15 @@ GnssMeasurement::GnssMeasurement(const sp& iGnssMeasu : mIGnssMeasurement(iGnssMeasurement) {} jboolean GnssMeasurement::setCallback(const std::unique_ptr& callback, - bool enableFullTracking, bool enableCorrVecOutputs) { - auto status = mIGnssMeasurement->setCallback(callback->getAidl(), enableFullTracking, - enableCorrVecOutputs); + const IGnssMeasurementInterface::Options& options) { + if (mIGnssMeasurement->getInterfaceVersion() >= 2) { + auto status = mIGnssMeasurement->setCallbackWithOptions(callback->getAidl(), options); + if (checkAidlStatus(status, "IGnssMeasurement setCallbackWithOptions() failed.")) { + return true; + } + } + auto status = mIGnssMeasurement->setCallback(callback->getAidl(), options.enableFullTracking, + options.enableCorrVecOutputs); return checkAidlStatus(status, "IGnssMeasurement setCallback() failed."); } @@ -67,13 +73,16 @@ GnssMeasurement_V1_0::GnssMeasurement_V1_0(const sp& iGns : mIGnssMeasurement_V1_0(iGnssMeasurement) {} jboolean GnssMeasurement_V1_0::setCallback(const std::unique_ptr& callback, - bool enableFullTracking, bool enableCorrVecOutputs) { - if (enableFullTracking == true) { + const IGnssMeasurementInterface::Options& options) { + if (options.enableFullTracking == true) { ALOGW("Full tracking mode is not supported in 1.0 GNSS HAL."); } - if (enableCorrVecOutputs == true) { + if (options.enableCorrVecOutputs == true) { ALOGW("Correlation vector output is not supported in 1.0 GNSS HAL."); } + if (options.intervalMs > 1000) { + ALOGW("Measurement interval is not supported in 1.0 GNSS HAL."); + } auto status = mIGnssMeasurement_V1_0->setCallback(callback->getHidl()); if (!checkHidlReturn(status, "IGnssMeasurement setCallback() failed.")) { return JNI_FALSE; @@ -93,11 +102,15 @@ GnssMeasurement_V1_1::GnssMeasurement_V1_1(const sp& iGns : GnssMeasurement_V1_0{iGnssMeasurement}, mIGnssMeasurement_V1_1(iGnssMeasurement) {} jboolean GnssMeasurement_V1_1::setCallback(const std::unique_ptr& callback, - bool enableFullTracking, bool enableCorrVecOutputs) { - if (enableCorrVecOutputs == true) { + const IGnssMeasurementInterface::Options& options) { + if (options.enableCorrVecOutputs == true) { ALOGW("Correlation vector output is not supported in 1.1 GNSS HAL."); } - auto status = mIGnssMeasurement_V1_1->setCallback_1_1(callback->getHidl(), enableFullTracking); + if (options.intervalMs > 1000) { + ALOGW("Measurement interval is not supported in 1.0 GNSS HAL."); + } + auto status = mIGnssMeasurement_V1_1->setCallback_1_1(callback->getHidl(), + options.enableFullTracking); if (!checkHidlReturn(status, "IGnssMeasurement setCallback_V1_1() failed.")) { return JNI_FALSE; } @@ -111,11 +124,15 @@ GnssMeasurement_V2_0::GnssMeasurement_V2_0(const sp& iGns : GnssMeasurement_V1_1{iGnssMeasurement}, mIGnssMeasurement_V2_0(iGnssMeasurement) {} jboolean GnssMeasurement_V2_0::setCallback(const std::unique_ptr& callback, - bool enableFullTracking, bool enableCorrVecOutputs) { - if (enableCorrVecOutputs == true) { + const IGnssMeasurementInterface::Options& options) { + if (options.enableCorrVecOutputs == true) { ALOGW("Correlation vector output is not supported in 2.0 GNSS HAL."); } - auto status = mIGnssMeasurement_V2_0->setCallback_2_0(callback->getHidl(), enableFullTracking); + if (options.intervalMs > 1000) { + ALOGW("Measurement interval is not supported in 1.0 GNSS HAL."); + } + auto status = mIGnssMeasurement_V2_0->setCallback_2_0(callback->getHidl(), + options.enableFullTracking); if (!checkHidlReturn(status, "IGnssMeasurement setCallback_2_0() failed.")) { return JNI_FALSE; } @@ -129,11 +146,15 @@ GnssMeasurement_V2_1::GnssMeasurement_V2_1(const sp& iGns : GnssMeasurement_V2_0{iGnssMeasurement}, mIGnssMeasurement_V2_1(iGnssMeasurement) {} jboolean GnssMeasurement_V2_1::setCallback(const std::unique_ptr& callback, - bool enableFullTracking, bool enableCorrVecOutputs) { - if (enableCorrVecOutputs == true) { + const IGnssMeasurementInterface::Options& options) { + if (options.enableCorrVecOutputs == true) { ALOGW("Correlation vector output is not supported in 2.1 GNSS HAL."); } - auto status = mIGnssMeasurement_V2_1->setCallback_2_1(callback->getHidl(), enableFullTracking); + if (options.intervalMs > 1000) { + ALOGW("Measurement interval is not supported in 1.0 GNSS HAL."); + } + auto status = mIGnssMeasurement_V2_1->setCallback_2_1(callback->getHidl(), + options.enableFullTracking); if (!checkHidlReturn(status, "IGnssMeasurement setCallback_2_1() failed.")) { return JNI_FALSE; } diff --git a/services/core/jni/gnss/GnssMeasurement.h b/services/core/jni/gnss/GnssMeasurement.h index f0752cd3ab5b2..7a95db8ed7b60 100644 --- a/services/core/jni/gnss/GnssMeasurement.h +++ b/services/core/jni/gnss/GnssMeasurement.h @@ -37,16 +37,18 @@ namespace android::gnss { class GnssMeasurementInterface { public: virtual ~GnssMeasurementInterface() {} - virtual jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking, bool enableCorrVecOutputs) = 0; + virtual jboolean setCallback( + const std::unique_ptr& callback, + const android::hardware::gnss::IGnssMeasurementInterface::Options& options) = 0; virtual jboolean close() = 0; }; class GnssMeasurement : public GnssMeasurementInterface { public: GnssMeasurement(const sp& iGnssMeasurement); - jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking, bool enableCorrVecOutputs) override; + jboolean setCallback( + const std::unique_ptr& callback, + const android::hardware::gnss::IGnssMeasurementInterface::Options& options) override; jboolean close() override; private: @@ -57,8 +59,9 @@ class GnssMeasurement_V1_0 : public GnssMeasurementInterface { public: GnssMeasurement_V1_0( const sp& iGnssMeasurement); - jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking, bool enableCorrVecOutputs) override; + jboolean setCallback( + const std::unique_ptr& callback, + const android::hardware::gnss::IGnssMeasurementInterface::Options& options) override; jboolean close() override; private: @@ -69,8 +72,9 @@ class GnssMeasurement_V1_1 : public GnssMeasurement_V1_0 { public: GnssMeasurement_V1_1( const sp& iGnssMeasurement); - jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking, bool enableCorrVecOutputs) override; + jboolean setCallback( + const std::unique_ptr& callback, + const android::hardware::gnss::IGnssMeasurementInterface::Options& options) override; private: const sp mIGnssMeasurement_V1_1; @@ -80,8 +84,9 @@ class GnssMeasurement_V2_0 : public GnssMeasurement_V1_1 { public: GnssMeasurement_V2_0( const sp& iGnssMeasurement); - jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking, bool enableCorrVecOutputs) override; + jboolean setCallback( + const std::unique_ptr& callback, + const android::hardware::gnss::IGnssMeasurementInterface::Options& options) override; private: const sp mIGnssMeasurement_V2_0; @@ -91,8 +96,9 @@ class GnssMeasurement_V2_1 : public GnssMeasurement_V2_0 { public: GnssMeasurement_V2_1( const sp& iGnssMeasurement); - jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking, bool enableCorrVecOutputs) override; + jboolean setCallback( + const std::unique_ptr& callback, + const android::hardware::gnss::IGnssMeasurementInterface::Options& options) override; private: const sp mIGnssMeasurement_V2_1; 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..16ffda824d070 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 @@ -234,6 +234,7 @@ public final class FakeGnssHal extends GnssNative.GnssHal { private boolean mMeasurementCollectionStarted = false; private boolean mMeasurementCollectionFullTracking = false; private boolean mMeasurementCollectionCorrVecOutputsEnabled = false; + private int mMeasurementCollectionIntervalMillis = 0; private GnssHalPositionMode mPositionMode = new GnssHalPositionMode(); private GnssHalBatchingMode mBatchingMode = new GnssHalBatchingMode(); private final ArrayList mBatchedLocations = new ArrayList<>(); @@ -523,10 +524,11 @@ public final class FakeGnssHal extends GnssNative.GnssHal { @Override protected boolean startMeasurementCollection(boolean enableFullTracking, - boolean enableCorrVecOutputs) { + boolean enableCorrVecOutputs, int intervalMillis) { mState.mMeasurementCollectionStarted = true; mState.mMeasurementCollectionFullTracking = enableFullTracking; mState.mMeasurementCollectionCorrVecOutputsEnabled = enableCorrVecOutputs; + mState.mMeasurementCollectionIntervalMillis = intervalMillis; return true; } @@ -535,6 +537,7 @@ public final class FakeGnssHal extends GnssNative.GnssHal { mState.mMeasurementCollectionStarted = false; mState.mMeasurementCollectionFullTracking = false; mState.mMeasurementCollectionCorrVecOutputsEnabled = false; + mState.mMeasurementCollectionIntervalMillis = 0; return true; }