summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2021-01-07 23:55:53 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-01-07 23:55:53 +0000
commit77ff851a5797d492cedc50f65be51b21dc083685 (patch)
tree60d4531959ea00c30b2872a353b1228629628af5
parent4eb327a07af506b58900f661a3000db65f3e7e70 (diff)
parente3b703f3362433a6cc630eb1174dd723b498314b (diff)
Merge "Implement AIDL setCapabilitiesCb"
-rw-r--r--services/core/java/com/android/server/location/gnss/hal/GnssNative.java8
-rw-r--r--services/core/jni/com_android_server_location_GnssLocationProvider.cpp23
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();