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

Commit 4624189b authored by Yu-Han Yang's avatar Yu-Han Yang Committed by Android (Google) Code Review
Browse files

Merge "Pipe GnssSignalType from HAL to Java"

parents c2710373 e75758a7
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ public final class GnssCapabilities implements Parcelable {
            @SubHalMeasurementCorrectionsCapabilityFlags int measurementCorrectionsFlags,
            @SubHalPowerCapabilityFlags int powerFlags,
            @NonNull List<GnssSignalType> gnssSignalTypes) {
        Objects.requireNonNull(gnssSignalTypes);
        mTopFlags = topFlags;
        mMeasurementCorrectionsFlags = measurementCorrectionsFlags;
        mPowerFlags = powerFlags;
@@ -189,6 +190,21 @@ public final class GnssCapabilities implements Parcelable {
        }
    }

    /**
     * Returns a new GnssCapabilities object with a list of GnssSignalType.
     *
     * @hide
     */
    public GnssCapabilities withSignalTypes(@NonNull List<GnssSignalType> gnssSignalTypes) {
        Objects.requireNonNull(gnssSignalTypes);
        if (mGnssSignalTypes.equals(gnssSignalTypes)) {
            return this;
        } else {
            return new GnssCapabilities(mTopFlags, mMeasurementCorrectionsFlags, mPowerFlags,
                    new ArrayList<>(gnssSignalTypes));
        }
    }

    /**
     * Returns {@code true} if GNSS chipset supports scheduling, {@code false} otherwise.
     */
@@ -452,7 +468,8 @@ public final class GnssCapabilities implements Parcelable {
        GnssCapabilities that = (GnssCapabilities) o;
        return mTopFlags == that.mTopFlags
                && mMeasurementCorrectionsFlags == that.mMeasurementCorrectionsFlags
                && mPowerFlags == that.mPowerFlags;
                && mPowerFlags == that.mPowerFlags
                && mGnssSignalTypes.equals(that.mGnssSignalTypes);
    }

    @Override
+8 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.location.GnssCapabilities;
import android.location.GnssMeasurementCorrections;
import android.location.GnssMeasurementsEvent;
import android.location.GnssNavigationMessage;
import android.location.GnssSignalType;
import android.location.GnssStatus;
import android.location.Location;
import android.os.Binder;
@@ -1144,6 +1145,13 @@ public class GnssNative {
        onCapabilitiesChanged(oldCapabilities, mCapabilities);
    }

    @NativeEntryPoint
    void setSignalTypeCapabilities(List<GnssSignalType> signalTypes) {
        GnssCapabilities oldCapabilities = mCapabilities;
        mCapabilities = oldCapabilities.withSignalTypes(signalTypes);
        onCapabilitiesChanged(oldCapabilities, mCapabilities);
    }

    private void onCapabilitiesChanged(GnssCapabilities oldCapabilities,
            GnssCapabilities newCapabilities) {
        Binder.withCleanCallingIdentity(() -> {
+1 −1
Original line number Diff line number Diff line
@@ -152,7 +152,7 @@ cc_defaults {
        "android.hardware.broadcastradio@1.0",
        "android.hardware.broadcastradio@1.1",
        "android.hardware.contexthub@1.0",
        "android.hardware.gnss-V2-cpp",
        "android.hardware.gnss-V3-cpp",
        "android.hardware.gnss@1.0",
        "android.hardware.gnss@1.1",
        "android.hardware.gnss@2.0",
+1 −1
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ cc_defaults {
        "libnativehelper",
        "libhardware_legacy",
        "libutils",
        "android.hardware.gnss-V2-cpp",
        "android.hardware.gnss-V3-cpp",
        "android.hardware.gnss@1.0",
        "android.hardware.gnss@1.1",
        "android.hardware.gnss@2.0",
+54 −2
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

#define LOG_TAG "GnssCallbckJni"
#define LOG_TAG "GnssCallbackJni"

#include "GnssCallback.h"

@@ -31,6 +31,7 @@ using hardware::Return;
using hardware::Void;

using GnssLocationAidl = android::hardware::gnss::GnssLocation;
using GnssSignalType = android::hardware::gnss::GnssSignalType;
using GnssLocation_V1_0 = android::hardware::gnss::V1_0::GnssLocation;
using GnssLocation_V2_0 = android::hardware::gnss::V2_0::GnssLocation;
using IGnssCallbackAidl = android::hardware::gnss::IGnssCallback;
@@ -42,11 +43,18 @@ jmethodID method_reportGnssServiceDied;

namespace {

jclass class_arrayList;
jclass class_gnssSignalType;

jmethodID method_arrayListAdd;
jmethodID method_arrayListCtor;
jmethodID method_gnssSignalTypeCreate;
jmethodID method_reportLocation;
jmethodID method_reportStatus;
jmethodID method_reportSvStatus;
jmethodID method_reportNmea;
jmethodID method_setTopHalCapabilities;
jmethodID method_setSignalTypeCapabilities;
jmethodID method_setGnssYearOfHardware;
jmethodID method_setGnssHardwareModelName;
jmethodID method_requestLocation;
@@ -88,6 +96,8 @@ void Gnss_class_init_once(JNIEnv* env, jclass& clazz) {
    method_reportNmea = env->GetMethodID(clazz, "reportNmea", "(J)V");

    method_setTopHalCapabilities = env->GetMethodID(clazz, "setTopHalCapabilities", "(I)V");
    method_setSignalTypeCapabilities =
            env->GetMethodID(clazz, "setSignalTypeCapabilities", "(Ljava/util/List;)V");
    method_setGnssYearOfHardware = env->GetMethodID(clazz, "setGnssYearOfHardware", "(I)V");
    method_setGnssHardwareModelName =
            env->GetMethodID(clazz, "setGnssHardwareModelName", "(Ljava/lang/String;)V");
@@ -95,16 +105,58 @@ void Gnss_class_init_once(JNIEnv* env, jclass& clazz) {
    method_requestLocation = env->GetMethodID(clazz, "requestLocation", "(ZZ)V");
    method_requestUtcTime = env->GetMethodID(clazz, "requestUtcTime", "()V");
    method_reportGnssServiceDied = env->GetMethodID(clazz, "reportGnssServiceDied", "()V");

    jclass arrayListClass = env->FindClass("java/util/ArrayList");
    class_arrayList = (jclass)env->NewGlobalRef(arrayListClass);
    method_arrayListCtor = env->GetMethodID(class_arrayList, "<init>", "()V");
    method_arrayListAdd = env->GetMethodID(class_arrayList, "add", "(Ljava/lang/Object;)Z");

    jclass gnssSignalTypeClass = env->FindClass("android/location/GnssSignalType");
    class_gnssSignalType = (jclass)env->NewGlobalRef(gnssSignalTypeClass);
    method_gnssSignalTypeCreate =
            env->GetStaticMethodID(class_gnssSignalType, "create",
                                   "(IDLjava/lang/String;)Landroid/location/GnssSignalType;");
}

Status GnssCallbackAidl::gnssSetCapabilitiesCb(const int capabilities) {
    ALOGD("GnssCallbackAidl::%s: %du\n", __func__, capabilities);
    ALOGD("%s: %du\n", __func__, capabilities);
    JNIEnv* env = getJniEnv();
    env->CallVoidMethod(mCallbacksObj, method_setTopHalCapabilities, capabilities);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
    return Status::ok();
}

namespace {

jobject translateSingleSignalType(JNIEnv* env, const GnssSignalType& signalType) {
    jstring jstringCodeType = env->NewStringUTF(signalType.codeType.c_str());
    jobject signalTypeObject =
            env->CallStaticObjectMethod(class_gnssSignalType, method_gnssSignalTypeCreate,
                                        signalType.constellation, signalType.carrierFrequencyHz,
                                        jstringCodeType);
    env->DeleteLocalRef(jstringCodeType);
    return signalTypeObject;
}

} // anonymous namespace

Status GnssCallbackAidl::gnssSetSignalTypeCapabilitiesCb(
        const std::vector<GnssSignalType>& signalTypes) {
    ALOGD("%s: %d signal types", __func__, (int)signalTypes.size());
    JNIEnv* env = getJniEnv();
    jobject arrayList = env->NewObject(class_arrayList, method_arrayListCtor);
    for (auto& signalType : signalTypes) {
        jobject signalTypeObject = translateSingleSignalType(env, signalType);
        env->CallBooleanMethod(arrayList, method_arrayListAdd, signalTypeObject);
        // Delete Local Refs
        env->DeleteLocalRef(signalTypeObject);
    }
    env->CallVoidMethod(mCallbacksObj, method_setSignalTypeCapabilities, arrayList);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
    env->DeleteLocalRef(arrayList);
    return Status::ok();
}

Status GnssCallbackAidl::gnssStatusCb(const GnssStatusValue status) {
    JNIEnv* env = getJniEnv();
    env->CallVoidMethod(mCallbacksObj, method_reportStatus, status);
Loading