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

Commit 1ebf6158 authored by Sasha Kuznetsov's avatar Sasha Kuznetsov
Browse files

Update jni with measurement_corrections 1.1

Test: manually injected dummy measurement corrections in
GnssLocationProvider and verified that cuttlefish implementation
properly recieved them below the HAL
Bug: 145963440
Change-Id: Id659b0fdddd7852012da1bab07d0f26a3abb29af
parent daa6bcdb
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -3787,12 +3787,15 @@ package android.location {
  public final class GnssMeasurementCorrections implements android.os.Parcelable {
    method public int describeContents();
    method @FloatRange(from=-1000.0F, to=10000.0f) public double getAltitudeMeters();
    method @FloatRange(from=0.0f, to=360.0f) public float getEnvironmentBearingDegrees();
    method @FloatRange(from=0.0f, to=180.0f) public float getEnvironmentBearingUncertaintyDegrees();
    method @FloatRange(from=0.0f) public double getHorizontalPositionUncertaintyMeters();
    method @FloatRange(from=-90.0F, to=90.0f) public double getLatitudeDegrees();
    method @FloatRange(from=-180.0F, to=180.0f) public double getLongitudeDegrees();
    method @NonNull public java.util.List<android.location.GnssSingleSatCorrection> getSingleSatelliteCorrectionList();
    method @IntRange(from=0) public long getToaGpsNanosecondsOfWeek();
    method @FloatRange(from=0.0f) public double getVerticalPositionUncertaintyMeters();
    method public boolean hasEnvironmentBearing();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.location.GnssMeasurementCorrections> CREATOR;
  }
@@ -3801,6 +3804,8 @@ package android.location {
    ctor public GnssMeasurementCorrections.Builder();
    method @NonNull public android.location.GnssMeasurementCorrections build();
    method @NonNull public android.location.GnssMeasurementCorrections.Builder setAltitudeMeters(@FloatRange(from=-1000.0F, to=10000.0f) double);
    method @NonNull public android.location.GnssMeasurementCorrections.Builder setEnvironmentBearingDegrees(@FloatRange(from=0.0f, to=360.0f) float);
    method @NonNull public android.location.GnssMeasurementCorrections.Builder setEnvironmentBearingUncertaintyDegrees(@FloatRange(from=0.0f, to=180.0f) float);
    method @NonNull public android.location.GnssMeasurementCorrections.Builder setHorizontalPositionUncertaintyMeters(@FloatRange(from=0.0f) double);
    method @NonNull public android.location.GnssMeasurementCorrections.Builder setLatitudeDegrees(@FloatRange(from=-90.0F, to=90.0f) double);
    method @NonNull public android.location.GnssMeasurementCorrections.Builder setLongitudeDegrees(@FloatRange(from=-180.0F, to=180.0f) double);
+100 −0
Original line number Diff line number Diff line
@@ -79,6 +79,25 @@ public final class GnssMeasurementCorrections implements Parcelable {
    @NonNull
    private final List<GnssSingleSatCorrection> mSingleSatCorrectionList;

    /**
     * Indicates whether the environment bearing is available.
     */
    private final boolean mHasEnvironmentBearing;

    /**
     * Environment bearing in degrees clockwise from true north, in the direction of user motion.
     * Environment bearing is provided when it is known with high probability that velocity is
     * aligned with an environment feature (such as edge of a building, or road).
     */
    @FloatRange(from = 0.0f, to = 360.0f)
    private final float mEnvironmentBearingDegrees;

    /**
     * Environment bearing uncertainty in degrees.
     */
    @FloatRange(from = 0.0f, to = 180.0f)
    private final float mEnvironmentBearingUncertaintyDegrees;

    private GnssMeasurementCorrections(Builder builder) {
        mLatitudeDegrees = builder.mLatitudeDegrees;
        mLongitudeDegrees = builder.mLongitudeDegrees;
@@ -89,6 +108,10 @@ public final class GnssMeasurementCorrections implements Parcelable {
        final List<GnssSingleSatCorrection> singleSatCorrList =  builder.mSingleSatCorrectionList;
        Preconditions.checkArgument(singleSatCorrList != null && !singleSatCorrList.isEmpty());
        mSingleSatCorrectionList = Collections.unmodifiableList(new ArrayList<>(singleSatCorrList));
        mHasEnvironmentBearing = builder.mEnvironmentBearingIsSet
                && builder.mEnvironmentBearingUncertaintyIsSet;
        mEnvironmentBearingDegrees = builder.mEnvironmentBearingDegrees;
        mEnvironmentBearingUncertaintyDegrees = builder.mEnvironmentBearingUncertaintyDegrees;
    }

    /** Gets the latitude in degrees at which the corrections are computed. */
@@ -145,6 +168,31 @@ public final class GnssMeasurementCorrections implements Parcelable {
        return mSingleSatCorrectionList;
    }

    /**
     * If true, environment bearing will be available.
     */
    public boolean hasEnvironmentBearing() {
        return mHasEnvironmentBearing;
    }

    /**
     * Gets the environment bearing in degrees clockwise from true north, in the direction of user
     * motion. Environment bearing is provided when it is known with high probability that
     * velocity is aligned with an environment feature (such as edge of a building, or road).
     */
    @FloatRange(from = 0.0f, to = 360.0f)
    public float getEnvironmentBearingDegrees() {
        return mEnvironmentBearingDegrees;
    }

    /**
     * Gets the environment bearing uncertainty in degrees.
     */
    @FloatRange(from = 0.0f, to = 180.0f)
    public float getEnvironmentBearingUncertaintyDegrees() {
        return mEnvironmentBearingUncertaintyDegrees;
    }

    @Override
    public int describeContents() {
        return 0;
@@ -167,6 +215,12 @@ public final class GnssMeasurementCorrections implements Parcelable {
                    parcel.readTypedList(singleSatCorrectionList, GnssSingleSatCorrection.CREATOR);
                    gnssMeasurementCorrectons.setSingleSatelliteCorrectionList(
                            singleSatCorrectionList);
                    boolean hasEnvironmentBearing = parcel.readBoolean();
                    if (hasEnvironmentBearing) {
                        gnssMeasurementCorrectons.setEnvironmentBearingDegrees(parcel.readFloat());
                        gnssMeasurementCorrectons.setEnvironmentBearingUncertaintyDegrees(
                                parcel.readFloat());
                    }
                    return gnssMeasurementCorrectons.build();
                }

@@ -192,6 +246,14 @@ public final class GnssMeasurementCorrections implements Parcelable {
                String.format(format, "ToaGpsNanosecondsOfWeek = ", mToaGpsNanosecondsOfWeek));
        builder.append(
                String.format(format, "mSingleSatCorrectionList = ", mSingleSatCorrectionList));
        builder.append(
                String.format(format, "HasEnvironmentBearing = ", mHasEnvironmentBearing));
        builder.append(
                String.format(format, "EnvironmentBearingDegrees = ",
                        mEnvironmentBearingDegrees));
        builder.append(
                String.format(format, "EnvironmentBearingUncertaintyDegrees = ",
                mEnvironmentBearingUncertaintyDegrees));
        return builder.toString();
    }

@@ -204,6 +266,11 @@ public final class GnssMeasurementCorrections implements Parcelable {
        parcel.writeDouble(mVerticalPositionUncertaintyMeters);
        parcel.writeLong(mToaGpsNanosecondsOfWeek);
        parcel.writeTypedList(mSingleSatCorrectionList);
        parcel.writeBoolean(mHasEnvironmentBearing);
        if (mHasEnvironmentBearing) {
            parcel.writeFloat(mEnvironmentBearingDegrees);
            parcel.writeFloat(mEnvironmentBearingUncertaintyDegrees);
        }
    }

    /** Builder for {@link GnssMeasurementCorrections} */
@@ -219,6 +286,10 @@ public final class GnssMeasurementCorrections implements Parcelable {
        private double mVerticalPositionUncertaintyMeters;
        private long mToaGpsNanosecondsOfWeek;
        @Nullable private List<GnssSingleSatCorrection> mSingleSatCorrectionList;
        private float mEnvironmentBearingDegrees;
        private boolean mEnvironmentBearingIsSet = false;
        private float mEnvironmentBearingUncertaintyDegrees;
        private boolean mEnvironmentBearingUncertaintyIsSet = false;

        /** Sets the latitude in degrees at which the corrections are computed. */
        @NonNull public Builder setLatitudeDegrees(
@@ -282,8 +353,37 @@ public final class GnssMeasurementCorrections implements Parcelable {
            return this;
        }

        /**
         * Sets the environment bearing in degrees clockwise from true north, in the direction of
         * user motion. Environment bearing is provided when it is known with high probability
         * that velocity is aligned with an environment feature (such as edge of a building, or
         * road).
         */
        @NonNull public Builder setEnvironmentBearingDegrees(
                @FloatRange(from = 0.0f, to = 360.0f)
                        float environmentBearingDegrees) {
            mEnvironmentBearingDegrees = environmentBearingDegrees;
            mEnvironmentBearingIsSet = true;
            return this;
        }

        /**
         * Sets the environment bearing uncertainty in degrees.
         */
        @NonNull public Builder setEnvironmentBearingUncertaintyDegrees(
                @FloatRange(from = 0.0f, to = 180.0f)
                        float environmentBearingUncertaintyDegrees) {
            mEnvironmentBearingUncertaintyDegrees = environmentBearingUncertaintyDegrees;
            mEnvironmentBearingUncertaintyIsSet = true;
            return this;
        }

        /** Builds a {@link GnssMeasurementCorrections} instance as specified by this builder. */
        @NonNull public GnssMeasurementCorrections build() {
            if (mEnvironmentBearingIsSet ^ mEnvironmentBearingUncertaintyIsSet) {
                throw new IllegalStateException("Both environment bearing and environment bearing "
                        + "uncertainty must be set.");
            }
            return new GnssMeasurementCorrections(this);
        }
    }
+77 −25
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <android/hardware/gnss/2.0/IGnssMeasurement.h>
#include <android/hardware/gnss/2.1/IGnssMeasurement.h>
#include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h>
#include <android/hardware/gnss/measurement_corrections/1.1/IMeasurementCorrections.h>
#include <android/hardware/gnss/visibility_control/1.0/IGnssVisibilityControl.h>
#include <nativehelper/JNIHelp.h>
#include "jni.h"
@@ -88,6 +89,9 @@ static jmethodID method_correctionsGetHorPosUncMeters;
static jmethodID method_correctionsGetVerPosUncMeters;
static jmethodID method_correctionsGetToaGpsNanosecondsOfWeek;
static jmethodID method_correctionsGetSingleSatCorrectionList;
static jmethodID method_correctionsHasEnvironmentBearing;
static jmethodID method_correctionsGetEnvironmentBearingDegrees;
static jmethodID method_correctionsGetEnvironmentBearingUncertaintyDegrees;
static jmethodID method_listSize;
static jmethodID method_correctionListGet;
static jmethodID method_correctionSatFlags;
@@ -142,7 +146,9 @@ using android::hardware::gnss::V1_0::IGnssXtraCallback;

using android::hardware::gnss::V2_0::ElapsedRealtimeFlags;

using android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections;
using MeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections;
using MeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::MeasurementCorrections;

using android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection;
using android::hardware::gnss::measurement_corrections::V1_0::ReflectingPlane;

@@ -184,7 +190,8 @@ using IGnssBatching_V2_0 = android::hardware::gnss::V2_0::IGnssBatching;
using IGnssBatchingCallback_V1_0 = android::hardware::gnss::V1_0::IGnssBatchingCallback;
using IGnssBatchingCallback_V2_0 = android::hardware::gnss::V2_0::IGnssBatchingCallback;

using android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections;
using IMeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections;
using IMeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::IMeasurementCorrections;
using android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrectionsCallback;
using android::hardware::gnss::measurement_corrections::V1_0::GnssSingleSatCorrectionFlags;

@@ -231,7 +238,8 @@ sp<IGnssMeasurement_V1_1> gnssMeasurementIface_V1_1 = nullptr;
sp<IGnssMeasurement_V2_0> gnssMeasurementIface_V2_0 = nullptr;
sp<IGnssMeasurement_V2_1> gnssMeasurementIface_V2_1 = nullptr;
sp<IGnssNavigationMessage> gnssNavigationMessageIface = nullptr;
sp<IMeasurementCorrections> gnssCorrectionsIface = nullptr;
sp<IMeasurementCorrections_V1_0> gnssCorrectionsIface_V1_0 = nullptr;
sp<IMeasurementCorrections_V1_1> gnssCorrectionsIface_V1_1 = nullptr;
sp<IGnssVisibilityControl> gnssVisibilityControlIface = nullptr;

#define WAKE_LOCK_NAME  "GPS"
@@ -1692,6 +1700,13 @@ static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env,
    method_correctionsGetSingleSatCorrectionList = env->GetMethodID(
            measCorrClass, "getSingleSatelliteCorrectionList", "()Ljava/util/List;");

    method_correctionsHasEnvironmentBearing = env->GetMethodID(
            measCorrClass, "hasEnvironmentBearing", "()Z");
    method_correctionsGetEnvironmentBearingDegrees = env->GetMethodID(
            measCorrClass, "getEnvironmentBearingDegrees", "()F");
    method_correctionsGetEnvironmentBearingUncertaintyDegrees = env->GetMethodID(
            measCorrClass, "getEnvironmentBearingUncertaintyDegrees", "()F");

    jclass corrListClass = env->FindClass("java/util/List");
    method_listSize = env->GetMethodID(corrListClass, "size", "()I");
    method_correctionListGet = env->GetMethodID(corrListClass, "get", "(I)Ljava/lang/Object;");
@@ -1874,12 +1889,20 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass
         }
    }

    if (gnssHal_V2_0 != nullptr) {
    if (gnssHal_V2_1 != nullptr) {
        auto gnssCorrections = gnssHal_V2_1->getExtensionMeasurementCorrections_1_1();
        if (!gnssCorrections.isOk()) {
            ALOGD("Unable to get a handle to GnssMeasurementCorrections 1.1 interface");
        } else {
            gnssCorrectionsIface_V1_1 = gnssCorrections;
            gnssCorrectionsIface_V1_0 = gnssCorrectionsIface_V1_1;
        }
    } else if (gnssHal_V2_0 != nullptr) {
        auto gnssCorrections = gnssHal_V2_0->getExtensionMeasurementCorrections();
        if (!gnssCorrections.isOk()) {
            ALOGD("Unable to get a handle to GnssMeasurementCorrections interface");
        } else {
            gnssCorrectionsIface = gnssCorrections;
            gnssCorrectionsIface_V1_0 = gnssCorrections;
        }
    }

@@ -2110,11 +2133,18 @@ static jboolean android_location_GnssLocationProvider_init(JNIEnv* env, jobject
    }

    // Set IMeasurementCorrections.hal callback.
    if (gnssCorrectionsIface != nullptr) {
    if (gnssCorrectionsIface_V1_1 != nullptr) {
            sp<IMeasurementCorrectionsCallback> gnssCorrectionsIfaceCbIface =
                    new MeasurementCorrectionsCallback();
        result = gnssCorrectionsIface->setCallback(gnssCorrectionsIfaceCbIface);
        checkHidlReturn(result, "IMeasurementCorrections setCallback() failed.");
            result = gnssCorrectionsIface_V1_1->setCallback(gnssCorrectionsIfaceCbIface);
            checkHidlReturn(result, "IMeasurementCorrections 1.1 setCallback() failed.");
    } else if (gnssCorrectionsIface_V1_0 != nullptr) {
        sp<IMeasurementCorrectionsCallback> gnssCorrectionsIfaceCbIface =
                new MeasurementCorrectionsCallback();
        result = gnssCorrectionsIface_V1_0->setCallback(gnssCorrectionsIfaceCbIface);
        checkHidlReturn(result, "IMeasurementCorrections 1.0 setCallback() failed.");
    } else {
        ALOGI("Unable to find IMeasurementCorrections.");
    }

    return JNI_TRUE;
@@ -2717,7 +2747,7 @@ static jboolean android_location_GnssMeasurementsProvider_stop_measurement_colle
static jboolean
    android_location_GnssMeasurementCorrectionsProvider_is_measurement_corrections_supported(
    JNIEnv* env, jclass clazz) {
    if (gnssCorrectionsIface != nullptr) {
    if (gnssCorrectionsIface_V1_0 != nullptr || gnssCorrectionsIface_V1_1 != nullptr) {
        return JNI_TRUE;
    }

@@ -2730,24 +2760,12 @@ static jboolean
        jobject obj /* clazz*/,
        jobject correctionsObj) {

    if (gnssCorrectionsIface == nullptr) {
    if (gnssCorrectionsIface_V1_0 == nullptr && gnssCorrectionsIface_V1_1 == nullptr) {
        ALOGW("Trying to inject GNSS measurement corrections on a chipset that does not"
            " support them.");
        return JNI_FALSE;
    }

    jdouble latitudeDegreesCorr = env->CallDoubleMethod(
        correctionsObj, method_correctionsGetLatitudeDegrees);
    jdouble longitudeDegreesCorr = env->CallDoubleMethod(
        correctionsObj, method_correctionsGetLongitudeDegrees);
    jdouble altitudeDegreesCorr = env->CallDoubleMethod(
        correctionsObj, method_correctionsGetAltitudeMeters);
    jdouble horizontalPositionUncertaintyMeters = env->CallDoubleMethod(
        correctionsObj, method_correctionsGetHorPosUncMeters);
    jdouble verticalPositionUncertaintyMeters = env->CallDoubleMethod(
            correctionsObj, method_correctionsGetVerPosUncMeters);
    jlong toaGpsNanosOfWeek = env->CallLongMethod(
        correctionsObj, method_correctionsGetToaGpsNanosecondsOfWeek);
    jobject singleSatCorrectionList = env->CallObjectMethod(correctionsObj,
        method_correctionsGetSingleSatCorrectionList);

@@ -2816,7 +2834,21 @@ static jboolean
        };
        list[i] = singleSatCorrection;
    }
    MeasurementCorrections measurementCorrections = {

    jdouble latitudeDegreesCorr = env->CallDoubleMethod(
        correctionsObj, method_correctionsGetLatitudeDegrees);
    jdouble longitudeDegreesCorr = env->CallDoubleMethod(
        correctionsObj, method_correctionsGetLongitudeDegrees);
    jdouble altitudeDegreesCorr = env->CallDoubleMethod(
        correctionsObj, method_correctionsGetAltitudeMeters);
    jdouble horizontalPositionUncertaintyMeters = env->CallDoubleMethod(
        correctionsObj, method_correctionsGetHorPosUncMeters);
    jdouble verticalPositionUncertaintyMeters = env->CallDoubleMethod(
            correctionsObj, method_correctionsGetVerPosUncMeters);
    jlong toaGpsNanosOfWeek = env->CallLongMethod(
        correctionsObj, method_correctionsGetToaGpsNanosecondsOfWeek);

    MeasurementCorrections_V1_0 measurementCorrections_1_0 = {
        .latitudeDegrees = latitudeDegreesCorr,
        .longitudeDegrees = longitudeDegreesCorr,
        .altitudeMeters = altitudeDegreesCorr,
@@ -2826,8 +2858,28 @@ static jboolean
        .satCorrections = list,
    };

    auto result = gnssCorrectionsIface->setCorrections(measurementCorrections);
    return checkHidlReturn(result, "IMeasurementCorrections setCorrections() failed.");
    if (gnssCorrectionsIface_V1_1 != nullptr) {

        jboolean hasEnvironmentBearingCorr = env->CallBooleanMethod(
            correctionsObj, method_correctionsHasEnvironmentBearing);
        jfloat environmentBearingDegreesCorr = env->CallFloatMethod(
            correctionsObj, method_correctionsGetEnvironmentBearingDegrees);
        jfloat environmentBearingUncertaintyDegreesCorr = env->CallFloatMethod(
            correctionsObj, method_correctionsGetEnvironmentBearingUncertaintyDegrees);

        MeasurementCorrections_V1_1 measurementCorrections_1_1 = {
            .v1_0 = measurementCorrections_1_0,
            .hasEnvironmentBearing = static_cast<bool>(hasEnvironmentBearingCorr),
            .environmentBearingDegrees = environmentBearingDegreesCorr,
            .environmentBearingUncertaintyDegrees = environmentBearingUncertaintyDegreesCorr,
        };

        auto result = gnssCorrectionsIface_V1_1->setCorrections_1_1(measurementCorrections_1_1);
        return checkHidlReturn(result, "IMeasurementCorrections 1.1 setCorrections() failed.");
    }

    auto result = gnssCorrectionsIface_V1_0->setCorrections(measurementCorrections_1_0);
    return checkHidlReturn(result, "IMeasurementCorrections 1.0 setCorrections() failed.");
}

static jboolean android_location_GnssNavigationMessageProvider_is_navigation_message_supported(