Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e3b703f3 authored by Yu-Han Yang's avatar Yu-Han Yang
Browse files

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
parent 7810e620
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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);
    }

+23 −0
Original line number Diff line number Diff line
@@ -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();