From b1c6c0dfd78825c3dafe2b85619f74c5c4680f81 Mon Sep 17 00:00:00 2001 From: Anil Admal Date: Thu, 20 Jun 2019 12:00:16 -0700 Subject: [PATCH] Request high accuracy fix for DBH requests from GNSS HAL The GnssLocationProvider requests a LOW_POWER fix from fused location provider for DBH requests and uses a short request duration of 10 secs. Change it to request a high accuracy fix and use a larger request duration for emergency requests. Fixes: 135458882 Test: Simulated E911 DBH request from HAL and verified that a location is injected to HAL when location settings are OFF/ON. Tested with and without GPS signal. Change-Id: Ia40bff4cbf8574b30dfe65704d33c716a317c66d --- .../server/location/GnssLocationProvider.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index e7636ae8acb43..c312b76cc4634 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -222,6 +222,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements private static final long LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS = 1000; // Default update duration in milliseconds for REQUEST_LOCATION. private static final long LOCATION_UPDATE_DURATION_MILLIS = 10 * 1000; + // Update duration extension multiplier for emergency REQUEST_LOCATION. + private static final int EMERGENCY_LOCATION_UPDATE_DURATION_MULTIPLIER = 3; /** simpler wrapper for ProviderRequest + Worksource */ private static class GpsRequest { @@ -724,15 +726,28 @@ public class GnssLocationProvider extends AbstractLocationProvider implements Context.LOCATION_SERVICE); String provider; LocationChangeListener locationListener; + LocationRequest locationRequest = new LocationRequest() + .setInterval(LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS) + .setFastestInterval(LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS); if (independentFromGnss) { // For fast GNSS TTFF provider = LocationManager.NETWORK_PROVIDER; locationListener = mNetworkLocationListener; + locationRequest.setQuality(LocationRequest.POWER_LOW); } else { // For Device-Based Hybrid (E911) provider = LocationManager.FUSED_PROVIDER; locationListener = mFusedLocationListener; + locationRequest.setQuality(LocationRequest.ACCURACY_FINE); + } + + locationRequest.setProvider(provider); + + // Ignore location settings if in emergency mode. + if (isUserEmergency && mNIHandler.getInEmergency()) { + locationRequest.setLocationSettingsIgnored(true); + durationMillis *= EMERGENCY_LOCATION_UPDATE_DURATION_MULTIPLIER; } Log.i(TAG, @@ -740,14 +755,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements "GNSS HAL Requesting location updates from %s provider for %d millis.", provider, durationMillis)); - LocationRequest locationRequest = LocationRequest.createFromDeprecatedProvider(provider, - LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS, /* minDistance= */ 0, - /* singleShot= */ false); - - // Ignore location settings if in emergency mode. - if (isUserEmergency && mNIHandler.getInEmergency()) { - locationRequest.setLocationSettingsIgnored(true); - } try { locationManager.requestLocationUpdates(locationRequest, locationListener, mHandler.getLooper()); @@ -765,6 +772,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } private void injectBestLocation(Location location) { + if (DEBUG) { + Log.d(TAG, "injectBestLocation: " + location); + } int gnssLocationFlags = LOCATION_HAS_LAT_LONG | (location.hasAltitude() ? LOCATION_HAS_ALTITUDE : 0) | (location.hasSpeed() ? LOCATION_HAS_SPEED : 0) | @@ -869,6 +879,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements private void handleUpdateLocation(Location location) { if (location.hasAccuracy()) { + if (DEBUG) { + Log.d(TAG, "injectLocation: " + location); + } native_inject_location(location.getLatitude(), location.getLongitude(), location.getAccuracy()); }