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

Commit 60ec50a8 authored by Laurent Tu's avatar Laurent Tu
Browse files

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
parent dfc8e799
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -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<UpdateRecord> 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<UpdateRecord> records = mRecordsByProvider.get(provider);
        if (records == null || records.size() == 0) return;

        // Fetch coarse location
        Location coarseLocation = null;
        if (noGPSLocation != null && !noGPSLocation.equals(lastNoGPSLocation)) {
+2 −4
Original line number Diff line number Diff line
@@ -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<GeofenceState> mFences = new LinkedList<GeofenceState>();

    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<PendingIntent> exitIntents = new LinkedList<PendingIntent>();

        synchronized (mLock) {
            mLastLocation = location;

            removeExpiredFencesLocked();

            for (GeofenceState state : mFences) {