diff options
author | 2021-01-07 23:55:53 +0000 | |
---|---|---|
committer | 2021-01-07 23:55:53 +0000 | |
commit | 77ff851a5797d492cedc50f65be51b21dc083685 (patch) | |
tree | 60d4531959ea00c30b2872a353b1228629628af5 | |
parent | 4eb327a07af506b58900f661a3000db65f3e7e70 (diff) | |
parent | e3b703f3362433a6cc630eb1174dd723b498314b (diff) |
Merge "Implement AIDL setCapabilitiesCb"
-rw-r--r-- | services/core/java/com/android/server/location/gnss/hal/GnssNative.java | 8 | ||||
-rw-r--r-- | services/core/jni/com_android_server_location_GnssLocationProvider.cpp | 23 |
2 files changed, 30 insertions, 1 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 65384d7d4a2f..402e84b959c6 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 @@ -377,6 +377,7 @@ public class GnssNative { private volatile boolean mItarSpeedLimitExceeded; private GnssCapabilities mCapabilities = new GnssCapabilities.Builder().build(); + private @GnssCapabilities.TopHalCapabilityFlags int mTopFlags; private @Nullable GnssPowerStats mPowerStats = null; private int mHardwareYear = 0; private @Nullable String mHardwareModelName = null; @@ -490,6 +491,7 @@ public class GnssNative { private void initializeGnss(boolean restart) { Preconditions.checkState(mRegistered); + mTopFlags = 0; mGnssHal.initOnce(GnssNative.this, restart); // gnss chipset appears to require an init/cleanup cycle on startup in order to properly @@ -1031,8 +1033,12 @@ public class GnssNative { @NativeEntryPoint void setTopHalCapabilities(@GnssCapabilities.TopHalCapabilityFlags int capabilities) { + // Here the bits specified by 'capabilities' are turned on. It is handled differently from + // sub hal because top hal capabilities could be set by HIDL HAL and/or AIDL HAL. Each of + // them possesses a different set of capabilities. + mTopFlags |= capabilities; GnssCapabilities oldCapabilities = mCapabilities; - mCapabilities = oldCapabilities.withTopHalFlags(capabilities); + mCapabilities = oldCapabilities.withTopHalFlags(mTopFlags); onCapabilitiesChanged(oldCapabilities, mCapabilities); } diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index e3a8bb4e405e..35aad3e268ed 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -31,6 +31,7 @@ #include <android/hardware/gnss/2.1/IGnssMeasurement.h> #include <android/hardware/gnss/3.0/IGnssPsds.h> #include <android/hardware/gnss/BnGnss.h> +#include <android/hardware/gnss/BnGnssCallback.h> #include <android/hardware/gnss/BnGnssMeasurementCallback.h> #include <android/hardware/gnss/BnGnssPowerIndicationCallback.h> #include <android/hardware/gnss/BnGnssPsdsCallback.h> @@ -223,6 +224,7 @@ using android::hardware::gnss::IGnssPowerIndication; using android::hardware::gnss::IGnssPowerIndicationCallback; using android::hardware::gnss::PsdsType; using IGnssAidl = android::hardware::gnss::IGnss; +using IGnssCallbackAidl = android::hardware::gnss::IGnssCallback; using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds; using IGnssPsdsCallbackAidl = android::hardware::gnss::IGnssPsdsCallback; using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration; @@ -711,6 +713,19 @@ Return<void> GnssCallback::gnssSetSystemInfoCb(const IGnssCallback_V2_0::GnssSys return Void(); } +class GnssCallbackAidl : public android::hardware::gnss::BnGnssCallback { +public: + Status gnssSetCapabilitiesCb(const int capabilities) override; +}; + +Status GnssCallbackAidl::gnssSetCapabilitiesCb(const int capabilities) { + ALOGD("GnssCallbackAidl::%s: %du\n", __func__, capabilities); + JNIEnv* env = getJniEnv(); + env->CallVoidMethod(mCallbacksObj, method_setTopHalCapabilities, capabilities); + checkAndClearExceptionFromCallback(env, __FUNCTION__); + return Status::ok(); +} + /* * GnssPowerIndicationCallback class implements the callback methods for the IGnssPowerIndication * interface. @@ -1987,6 +2002,14 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl return JNI_FALSE; } + sp<IGnssCallbackAidl> gnssCbIfaceAidl = new GnssCallbackAidl(); + if (gnssHalAidl != nullptr) { + auto status = gnssHalAidl->setCallback(gnssCbIfaceAidl); + if (!checkAidlStatus(status, "IGnssAidl setCallback() failed.")) { + return JNI_FALSE; + } + } + // Set IGnssPsds or IGnssXtra callback. if (gnssPsdsAidlIface != nullptr) { sp<IGnssPsdsCallbackAidl> gnssPsdsCallbackAidl = new GnssPsdsCallbackAidl(); |