From e3b703f3362433a6cc630eb1174dd723b498314b Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Wed, 6 Jan 2021 16:28:28 -0800 Subject: [PATCH] Implement AIDL setCapabilitiesCb GnssNative#setTopHalCapabilities() may be called twice (by AIDL and/or HIDL) so each call sets (bitwise OR) the enabled capabilities. Bug: 176854122 Test: on cuttlefish Change-Id: I0f0bf436d9ff929c15f8410a64b5cd410712e063 --- .../server/location/gnss/hal/GnssNative.java | 8 ++++++- ...d_server_location_GnssLocationProvider.cpp | 23 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) 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 89d82495dca30..f0eac4b0a499b 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 @@ -376,6 +376,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; @@ -484,6 +485,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 @@ -1025,8 +1027,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 e3a8bb4e405e7..35aad3e268ed2 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 #include #include +#include #include #include #include @@ -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 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 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 gnssPsdsCallbackAidl = new GnssPsdsCallbackAidl();