From 62c42dc1757ad6c1cc6597610622276eaa752409 Mon Sep 17 00:00:00 2001 From: Anil Admal Date: Wed, 3 Apr 2019 15:39:22 -0700 Subject: [PATCH] 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 --- .../location/GnssCapabilitiesProvider.java | 10 ++-- .../server/location/GnssLocationProvider.java | 52 +++++-------------- ...d_server_location_GnssLocationProvider.cpp | 29 +++-------- 3 files changed, 25 insertions(+), 66 deletions(-) diff --git a/services/core/java/com/android/server/location/GnssCapabilitiesProvider.java b/services/core/java/com/android/server/location/GnssCapabilitiesProvider.java index 98085b8e219b4..b4b6160fadbee 100644 --- a/services/core/java/com/android/server/location/GnssCapabilitiesProvider.java +++ b/services/core/java/com/android/server/location/GnssCapabilitiesProvider.java @@ -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; } diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index be34adb1fca42..4504b2e38e2b1 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -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 "); + if (hasCapability(GPS_CAPABILITY_MEASUREMENT_CORRECTIONS)) { + s.append("MEASUREMENT_CORRECTIONS "); + } 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 (mGnssMeasurementCorrectionsProvider.isAvailableInPlatform()) { - s.append(" hasSubHal=MEASUREMENT_CORRECTIONS ["); + s.append(" SubHal=MEASUREMENT_CORRECTIONS["); s.append(mGnssMeasurementCorrectionsProvider.toStringCapabilities()); s.append("]\n"); } diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index f447f475684de..019cb315bc61d 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -735,29 +735,16 @@ Return GnssCallback::gnssNmeaCb( } Return GnssCallback::gnssSetCapabilitesCb(uint32_t capabilities) { - return GnssCallback::gnssSetCapabilitesCbImpl(capabilities, - /* hasSubHalCapabilityFlags = */ true); + ALOGD("%s: %du\n", __func__, capabilities); + + JNIEnv* env = getJniEnv(); + env->CallVoidMethod(mCallbacksObj, method_setTopHalCapabilities, capabilities); + checkAndClearExceptionFromCallback(env, __FUNCTION__); + return Void(); } Return GnssCallback::gnssSetCapabilitiesCb_2_0(uint32_t capabilities) { - return GnssCallback::gnssSetCapabilitesCbImpl(capabilities, - /* hasSubHalCapabilityFlags = */ false); -} - -Return 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)); - checkAndClearExceptionFromCallback(env, __FUNCTION__); - return Void(); + return GnssCallback::gnssSetCapabilitesCb(capabilities); } Return GnssCallback::gnssAcquireWakelockCb() { @@ -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");