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

Commit 62c42dc1 authored by Anil Admal's avatar Anil Admal
Browse files

Restore gnss@1.1 HAL capability bits removed in gnss@2.0 (framework)

In the IGnssCallback.hal@2.0 introduced in Android Q, the
capability bits in IGnssCallback.hal@1.1 that represent sub-HAL
interfaces have been removed as they are derivable from the
existing getExtensionXXX() family of methods in the IGnss.hal
interface.

These need to be restored back as the synchronous nature of the
getExtensionXXX() methods called by the framework has an impact on
partner implementations that need to communicate with the modem to
get the capabilities.

Additionally, the capability bit MEASUREMENT_CORRECTIONS needs to be
added for the new optional measurement_corrections@1.0 sub-HAL
introduced in gnss@2.0.

Fixes: 129870126
Test: Verified through cuttlefish default implementation and VTS tests.
Change-Id: I30c34361882e0722240feb3deba7d80136cd4bb3
parent dd07ae57
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -75,9 +75,7 @@ public class GnssCapabilitiesProvider {
    /**
     * Updates the general capabilities exposed through {@link android.location.GnssCapabilities}.
     */
    void setTopHalCapabilities(int topHalCapabilities,
            boolean hasGeofencingCapability, boolean hasMeasurementsCapability,
            boolean hasNavMessagesCapability) {
    void setTopHalCapabilities(int topHalCapabilities) {
        long gnssCapabilities = 0;
        if (hasCapability(topHalCapabilities,
                GnssLocationProvider.GPS_CAPABILITY_LOW_POWER_MODE)) {
@@ -87,13 +85,13 @@ public class GnssCapabilitiesProvider {
                GnssLocationProvider.GPS_CAPABILITY_SATELLITE_BLACKLIST)) {
            gnssCapabilities |= GNSS_CAPABILITY_SATELLITE_BLACKLIST;
        }
        if (hasGeofencingCapability) {
        if (hasCapability(topHalCapabilities, GnssLocationProvider.GPS_CAPABILITY_GEOFENCING)) {
            gnssCapabilities |= GNSS_CAPABILITY_GEOFENCING;
        }
        if (hasMeasurementsCapability) {
        if (hasCapability(topHalCapabilities, GnssLocationProvider.GPS_CAPABILITY_MEASUREMENTS)) {
            gnssCapabilities |= GNSS_CAPABILITY_MEASUREMENTS;
        }
        if (hasNavMessagesCapability) {
        if (hasCapability(topHalCapabilities, GnssLocationProvider.GPS_CAPABILITY_NAV_MESSAGES)) {
            gnssCapabilities |= GNSS_CAPABILITY_NAV_MESSAGES;
        }

+13 −39
Original line number Diff line number Diff line
@@ -166,15 +166,12 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
    private static final int GPS_CAPABILITY_MSA = 0x0000004;
    private static final int GPS_CAPABILITY_SINGLE_SHOT = 0x0000008;
    private static final int GPS_CAPABILITY_ON_DEMAND_TIME = 0x0000010;

    // The following three capability flags are removed in IGnssCallback.hal@2.0 and their values
    // are marked reserved and not reused in 2.0 to avoid confusion with prior versions.
    public static final int GPS_CAPABILITY_GEOFENCING = 0x0000020;
    public static final int GPS_CAPABILITY_MEASUREMENTS = 0x0000040;
    public static final int GPS_CAPABILITY_NAV_MESSAGES = 0x0000080;

    static final int GPS_CAPABILITY_LOW_POWER_MODE = 0x0000100;
    static final int GPS_CAPABILITY_SATELLITE_BLACKLIST = 0x0000200;
    public static final int GPS_CAPABILITY_LOW_POWER_MODE = 0x0000100;
    public static final int GPS_CAPABILITY_SATELLITE_BLACKLIST = 0x0000200;
    public static final int GPS_CAPABILITY_MEASUREMENT_CORRECTIONS = 0x0000400;

    // The AGPS SUPL mode
    private static final int AGPS_SUPL_MODE_MSA = 0x02;
@@ -1490,12 +1487,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
    }

    @NativeEntryPoint
    private void setTopHalCapabilities(int topHalCapabilities, boolean hasSubHalCapabilityFlags) {
        // The IGnssCallback.hal@2.0 removed sub-HAL capability flags from the Capabilities enum
        // and instead uses the sub-HAL non-null handle returned from IGnss.hal@2.0 to indicate
        // support. Therefore, the 'hasSubHalCapabilityFlags' parameter is needed to tell if the
        // 'capabilities' parameter includes the sub-HAL capability flags or not. Old HALs
        // which explicitly set the sub-HAL capability bits must continue to work.
    private void setTopHalCapabilities(int topHalCapabilities) {
        mHandler.post(() -> {
            mTopHalCapabilities = topHalCapabilities;

@@ -1504,25 +1496,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
                requestUtcTime();
            }

            boolean hasGeofencingCapability;
            boolean hasMeasurementsCapability;
            boolean hasNavMessagesCapability;
            if (hasSubHalCapabilityFlags) {
                hasGeofencingCapability = hasCapability(GPS_CAPABILITY_GEOFENCING);
                hasMeasurementsCapability = hasCapability(GPS_CAPABILITY_MEASUREMENTS);
                hasNavMessagesCapability = hasCapability(GPS_CAPABILITY_NAV_MESSAGES);
            } else {
                hasGeofencingCapability = mGnssGeofenceProvider.isHardwareGeofenceSupported();
                hasMeasurementsCapability = mGnssMeasurementsProvider.isAvailableInPlatform();
                hasNavMessagesCapability = mGnssNavigationMessageProvider.isAvailableInPlatform();
            }

            mGnssMeasurementsProvider.onCapabilitiesUpdated(hasMeasurementsCapability);
            mGnssNavigationMessageProvider.onCapabilitiesUpdated(hasNavMessagesCapability);
            mGnssMeasurementsProvider.onCapabilitiesUpdated(
                    hasCapability(GPS_CAPABILITY_MEASUREMENTS));
            mGnssNavigationMessageProvider.onCapabilitiesUpdated(
                    hasCapability(GPS_CAPABILITY_NAV_MESSAGES));
            restartRequests();

            mGnssCapabilitiesProvider.setTopHalCapabilities(topHalCapabilities,
                    hasGeofencingCapability, hasMeasurementsCapability, hasNavMessagesCapability);
            mGnssCapabilitiesProvider.setTopHalCapabilities(mTopHalCapabilities);
        });
    }

@@ -2184,18 +2164,12 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
        if (hasCapability(GPS_CAPABILITY_NAV_MESSAGES)) s.append("NAV_MESSAGES ");
        if (hasCapability(GPS_CAPABILITY_LOW_POWER_MODE)) s.append("LOW_POWER_MODE ");
        if (hasCapability(GPS_CAPABILITY_SATELLITE_BLACKLIST)) s.append("SATELLITE_BLACKLIST ");
        s.append(")\n");
        if (mGnssGeofenceProvider.isHardwareGeofenceSupported()) {
            s.append("  hasSubHal=GEOFENCING\n");
        }
        if (mGnssMeasurementsProvider.isAvailableInPlatform()) {
            s.append("  hasSubHal=MEASUREMENTS\n");
        }
        if (mGnssNavigationMessageProvider.isAvailableInPlatform()) {
            s.append("  hasSubHal=NAV_MESSAGES\n");
        if (hasCapability(GPS_CAPABILITY_MEASUREMENT_CORRECTIONS)) {
            s.append("MEASUREMENT_CORRECTIONS ");
        }
        s.append(")\n");
        if (mGnssMeasurementCorrectionsProvider.isAvailableInPlatform()) {
            s.append("  hasSubHal=MEASUREMENT_CORRECTIONS [");
            s.append("  SubHal=MEASUREMENT_CORRECTIONS[");
            s.append(mGnssMeasurementCorrectionsProvider.toStringCapabilities());
            s.append("]\n");
        }
+7 −20
Original line number Diff line number Diff line
@@ -735,31 +735,18 @@ Return<void> GnssCallback::gnssNmeaCb(
}

Return<void> GnssCallback::gnssSetCapabilitesCb(uint32_t capabilities) {
    return GnssCallback::gnssSetCapabilitesCbImpl(capabilities,
        /* hasSubHalCapabilityFlags = */ true);
}
    ALOGD("%s: %du\n", __func__, capabilities);

Return<void> GnssCallback::gnssSetCapabilitiesCb_2_0(uint32_t capabilities) {
    return GnssCallback::gnssSetCapabilitesCbImpl(capabilities,
        /* hasSubHalCapabilityFlags = */ false);
}

Return <void> GnssCallback::gnssSetCapabilitesCbImpl(uint32_t capabilities,
        bool hasSubHalCapabilityFlags) {
    // The IGnssCallback.hal@2.0 removed sub-HAL capability flags from the Capabilities enum
    // and instead uses the sub-HAL non-null handle returned from IGnss.hal@2.0 to indicate
    // support. Therefore, the 'hasSubHalCapabilityFlags' parameter is needed to tell if the
    // 'capabilities' parameter includes the sub-HAL capability flags or not. Old HALs
    // which explicitly set the sub-HAL capability bits must continue to work.
    ALOGD("%s: capabilities=%du, hasSubHalCapabilityFlags=%d\n", __func__, capabilities,
        hasSubHalCapabilityFlags);
    JNIEnv* env = getJniEnv();
    env->CallVoidMethod(mCallbacksObj, method_setTopHalCapabilities, capabilities,
            boolToJbool(hasSubHalCapabilityFlags));
    env->CallVoidMethod(mCallbacksObj, method_setTopHalCapabilities, capabilities);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
    return Void();
}

Return<void> GnssCallback::gnssSetCapabilitiesCb_2_0(uint32_t capabilities) {
    return GnssCallback::gnssSetCapabilitesCb(capabilities);
}

Return<void> GnssCallback::gnssAcquireWakelockCb() {
    acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_NAME);
    return Void();
@@ -1542,7 +1529,7 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass
    method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "(I[I[F[F[F[F)V");
    method_reportAGpsStatus = env->GetMethodID(clazz, "reportAGpsStatus", "(II[B)V");
    method_reportNmea = env->GetMethodID(clazz, "reportNmea", "(J)V");
    method_setTopHalCapabilities = env->GetMethodID(clazz, "setTopHalCapabilities", "(IZ)V");
    method_setTopHalCapabilities = env->GetMethodID(clazz, "setTopHalCapabilities", "(I)V");
    method_setGnssYearOfHardware = env->GetMethodID(clazz, "setGnssYearOfHardware", "(I)V");
    method_setGnssHardwareModelName = env->GetMethodID(clazz, "setGnssHardwareModelName",
            "(Ljava/lang/String;)V");