From ef752b69444b1d63e2b177e0589d2bf4e5383845 Mon Sep 17 00:00:00 2001 From: destradaa Date: Fri, 17 Apr 2015 13:10:47 -0700 Subject: [PATCH] Avoid performing work in the platform when GPS HAL does not support a feature. b/19271554 Prevents accessing and computing data in cases when we know that the result cannot be used by the GPS HAL, because the required interface is not supported. Change-Id: I74bf1719f2c8ab7fbfe1244ebe0bebe3ed55ba24 --- .../server/location/GpsLocationProvider.java | 82 +++++++++++++--------- ...android_server_location_GpsLocationProvider.cpp | 46 ++++++------ 2 files changed, 76 insertions(+), 52 deletions(-) diff --git a/services/core/java/com/android/server/location/GpsLocationProvider.java b/services/core/java/com/android/server/location/GpsLocationProvider.java index a279e0f4282f..cde44a26aad5 100644 --- a/services/core/java/com/android/server/location/GpsLocationProvider.java +++ b/services/core/java/com/android/server/location/GpsLocationProvider.java @@ -550,14 +550,19 @@ public class GpsLocationProvider implements LocationProviderInterface { } } - try { - // Convert properties to string contents and send it to HAL. - ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); - properties.store(baos, null); - native_configuration_update(baos.toString()); - Log.d(TAG, "final config = " + baos.toString()); - } catch (IOException ex) { - Log.w(TAG, "failed to dump properties contents"); + if (native_is_gnss_configuration_supported()) { + try { + // Convert properties to string contents and send it to HAL. + ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); + properties.store(baos, null); + native_configuration_update(baos.toString()); + Log.d(TAG, "final config = " + baos.toString()); + } catch (IOException ex) { + Log.w(TAG, "failed to dump properties contents"); + } + } else if (DEBUG) { + Log.d(TAG, "Skipped configuration update because GNSS configuration in GPS HAL is not" + + " supported"); } // SUPL_ES configuration. @@ -732,16 +737,21 @@ public class GpsLocationProvider implements LocationProviderInterface { } if (info != null) { - boolean dataEnabled = TelephonyManager.getDefault().getDataEnabled(); - boolean networkAvailable = info.isAvailable() && dataEnabled; - String defaultApn = getSelectedApn(); - if (defaultApn == null) { - defaultApn = "dummy-apn"; - } + if (native_is_agps_ril_supported()) { + boolean dataEnabled = TelephonyManager.getDefault().getDataEnabled(); + boolean networkAvailable = info.isAvailable() && dataEnabled; + String defaultApn = getSelectedApn(); + if (defaultApn == null) { + defaultApn = "dummy-apn"; + } - native_update_network_state(info.isConnected(), info.getType(), - info.isRoaming(), networkAvailable, - info.getExtraInfo(), defaultApn); + native_update_network_state(info.isConnected(), info.getType(), + info.isRoaming(), networkAvailable, + info.getExtraInfo(), defaultApn); + } else if (DEBUG) { + Log.d(TAG, "Skipped network state update because AGPS-RIL in GPS HAL is not" + + " supported"); + } } if (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE_SUPL @@ -1752,7 +1762,7 @@ public class GpsLocationProvider implements LocationProviderInterface { // NI Client support //============================================================= private final INetInitiatedListener mNetInitiatedListener = new INetInitiatedListener.Stub() { - // Sends a response for an NI reqeust to HAL. + // Sends a response for an NI request to HAL. @Override public boolean sendNiResponse(int notificationId, int userResponse) { @@ -1843,7 +1853,7 @@ public class GpsLocationProvider implements LocationProviderInterface { private void requestSetID(int flags) { TelephonyManager phone = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); - int type = AGPS_SETID_TYPE_NONE; + int type = AGPS_SETID_TYPE_NONE; String data = ""; if ((flags & AGPS_RIL_REQUEST_SETID_IMSI) == AGPS_RIL_REQUEST_SETID_IMSI) { @@ -1994,20 +2004,26 @@ public class GpsLocationProvider implements LocationProviderInterface { .addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener); // listen for events - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(Intents.DATA_SMS_RECEIVED_ACTION); - intentFilter.addDataScheme("sms"); - intentFilter.addDataAuthority("localhost","7275"); - mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, this); - - intentFilter = new IntentFilter(); - intentFilter.addAction(Intents.WAP_PUSH_RECEIVED_ACTION); - try { - intentFilter.addDataType("application/vnd.omaloc-supl-init"); - } catch (IntentFilter.MalformedMimeTypeException e) { - Log.w(TAG, "Malformed SUPL init mime type"); + IntentFilter intentFilter; + if (native_is_agps_ril_supported()) { + intentFilter = new IntentFilter(); + intentFilter.addAction(Intents.DATA_SMS_RECEIVED_ACTION); + intentFilter.addDataScheme("sms"); + intentFilter.addDataAuthority("localhost", "7275"); + mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, this); + + intentFilter = new IntentFilter(); + intentFilter.addAction(Intents.WAP_PUSH_RECEIVED_ACTION); + try { + intentFilter.addDataType("application/vnd.omaloc-supl-init"); + } catch (IntentFilter.MalformedMimeTypeException e) { + Log.w(TAG, "Malformed SUPL init mime type"); + } + mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, this); + } else if (DEBUG) { + Log.d(TAG, "Skipped registration for SMS/WAP-PUSH messages because AGPS Ril in GPS" + + " HAL is not supported"); } - mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, this); intentFilter = new IntentFilter(); intentFilter.addAction(ALARM_WAKEUP); @@ -2187,6 +2203,8 @@ public class GpsLocationProvider implements LocationProviderInterface { static { class_init_native(); } private static native void class_init_native(); private static native boolean native_is_supported(); + private static native boolean native_is_agps_ril_supported(); + private static native boolean native_is_gnss_configuration_supported(); private native boolean native_init(); private native void native_cleanup(); diff --git a/services/core/jni/com_android_server_location_GpsLocationProvider.cpp b/services/core/jni/com_android_server_location_GpsLocationProvider.cpp index 0cd6eb588b00..3804e1d33b63 100644 --- a/services/core/jni/com_android_server_location_GpsLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GpsLocationProvider.cpp @@ -509,13 +509,22 @@ static void android_location_GpsLocationProvider_class_init_native(JNIEnv* env, } } -static jboolean android_location_GpsLocationProvider_is_supported(JNIEnv* /* env */, - jclass /* clazz */) { - if (sGpsInterface != NULL) { - return JNI_TRUE; - } else { - return JNI_FALSE; - } +static jboolean android_location_GpsLocationProvider_is_supported( + JNIEnv* /* env */, jclass /* clazz */) +{ + return (sGpsInterface != NULL) ? JNI_TRUE : JNI_FALSE; +} + +static jboolean android_location_GpsLocationProvider_is_agps_ril_supported( + JNIEnv* /* env */, jclass /* clazz */) +{ + return (sAGpsRilInterface != NULL) ? JNI_TRUE : JNI_FALSE; +} + +static jboolean android_location_gpsLocationProvider_is_gnss_configuration_supported( + JNIEnv* /* env */, jclass /* jclazz */) +{ + return (sGnssConfigurationInterface != NULL) ? JNI_TRUE : JNI_FALSE; } static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj) @@ -715,14 +724,10 @@ static void android_location_GpsLocationProvider_inject_location(JNIEnv* /* env sGpsInterface->inject_location(latitude, longitude, accuracy); } -static jboolean android_location_GpsLocationProvider_supports_xtra(JNIEnv* /* env */, - jobject /* obj */) +static jboolean android_location_GpsLocationProvider_supports_xtra( + JNIEnv* /* env */, jobject /* obj */) { - if (sGpsXtraInterface != NULL) { - return JNI_TRUE; - } else { - return JNI_FALSE; - } + return (sGpsXtraInterface != NULL) ? JNI_TRUE : JNI_FALSE; } static void android_location_GpsLocationProvider_inject_xtra_data(JNIEnv* env, jobject /* obj */, @@ -844,13 +849,10 @@ static void android_location_GpsLocationProvider_update_network_state(JNIEnv* en } } -static jboolean android_location_GpsLocationProvider_is_geofence_supported(JNIEnv* /* env */, - jobject /* obj */) +static jboolean android_location_GpsLocationProvider_is_geofence_supported( + JNIEnv* /* env */, jobject /* obj */) { - if (sGpsGeofencingInterface != NULL) { - return JNI_TRUE; - } - return JNI_FALSE; + return (sGpsGeofencingInterface != NULL) ? JNI_TRUE : JNI_FALSE; } static jboolean android_location_GpsLocationProvider_add_geofence(JNIEnv* /* env */, @@ -1436,6 +1438,10 @@ static JNINativeMethod sMethods[] = { /* name, signature, funcPtr */ {"class_init_native", "()V", (void *)android_location_GpsLocationProvider_class_init_native}, {"native_is_supported", "()Z", (void*)android_location_GpsLocationProvider_is_supported}, + {"native_is_agps_ril_supported", "()Z", + (void*)android_location_GpsLocationProvider_is_agps_ril_supported}, + {"native_is_gnss_configuration_supported", "()Z", + (void*)android_location_gpsLocationProvider_is_gnss_configuration_supported}, {"native_init", "()Z", (void*)android_location_GpsLocationProvider_init}, {"native_cleanup", "()V", (void*)android_location_GpsLocationProvider_cleanup}, {"native_set_position_mode", -- 2.11.0