From 60ec50a850ac7265b662df3c872583b6ef581ef8 Mon Sep 17 00:00:00 2001 From: Laurent Tu Date: Thu, 4 Oct 2012 17:00:10 -0700 Subject: [PATCH] Last position improvements for GeofenceManager Use LocationManager.getLastPosition() in GeofenceManager instead of keeping track of it manually. Keeping track of it in GeofenceManager doesn't handle the case where we install a fence, and cross it just after that based on the last position before we installed the fence. Also shuffle around some code in LocationManagerService to remember the last position even if there are no UpdateRecords. This is useful in the GeofenceManager for example. Bug: 7047435 Change-Id: Ia8acc32e357ecc2e1bd689432a5beb1ea7dcd1c7 --- .../java/com/android/server/LocationManagerService.java | 7 +++++-- .../java/com/android/server/location/GeofenceManager.java | 6 ++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java index 0087b57456d2c..e73d599297aa0 100644 --- a/services/java/com/android/server/LocationManagerService.java +++ b/services/java/com/android/server/LocationManagerService.java @@ -1414,9 +1414,8 @@ public class LocationManagerService extends ILocationManager.Stub implements Run long now = SystemClock.elapsedRealtime(); String provider = (passive ? LocationManager.PASSIVE_PROVIDER : location.getProvider()); - ArrayList records = mRecordsByProvider.get(provider); - if (records == null || records.size() == 0) return; + // Skip if the provider is unknown. LocationProviderInterface p = mProvidersByName.get(provider); if (p == null) return; @@ -1437,6 +1436,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } lastLocation.set(location); + // Skip if there are no UpdateRecords for this provider. + ArrayList records = mRecordsByProvider.get(provider); + if (records == null || records.size() == 0) return; + // Fetch coarse location Location coarseLocation = null; if (noGPSLocation != null && !noGPSLocation.equals(lastNoGPSLocation)) { diff --git a/services/java/com/android/server/location/GeofenceManager.java b/services/java/com/android/server/location/GeofenceManager.java index 26d9c15557745..d04d2f32d46e4 100644 --- a/services/java/com/android/server/location/GeofenceManager.java +++ b/services/java/com/android/server/location/GeofenceManager.java @@ -58,7 +58,6 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish private Object mLock = new Object(); // access to members below is synchronized on mLock - private Location mLastLocation; private List mFences = new LinkedList(); public GeofenceManager(Context context, LocationBlacklist blacklist) { @@ -77,7 +76,8 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish public void addFence(LocationRequest request, Geofence geofence, PendingIntent intent, int uid, String packageName) { - GeofenceState state = new GeofenceState(geofence, mLastLocation, + Location lastLocation = mLocationManager.getLastLocation(); + GeofenceState state = new GeofenceState(geofence, lastLocation, request.getExpireAt(), packageName, intent); synchronized (mLock) { @@ -146,8 +146,6 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish List exitIntents = new LinkedList(); synchronized (mLock) { - mLastLocation = location; - removeExpiredFencesLocked(); for (GeofenceState state : mFences) {