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

Commit 95768ce2 authored by Soonil Nagarkar's avatar Soonil Nagarkar
Browse files

Fix determining request expiration time

Add a helper method to LocationRequest for determining the expiration
time and utilise from both LMS and GeofenceManager.

Bug: 143963313
Test: atest LocationManagerTest
Change-Id: Iac2af3f7f41d68342ef067cfef3b7169476266eb
parent 235a9b30
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -504,6 +504,23 @@ public final class LocationRequest implements Parcelable {
        return mExpireIn;
    }

    /**
     * Returns the realtime at which this request expires, taking into account both
     * {@link #setExpireAt(long)} and {@link #setExpireIn(long)} relative to the given realtime.
     *
     * @hide
     */
    public long getExpirationRealtimeMs(long startRealtimeMs) {
        long expirationRealtimeMs;
        // Check for > Long.MAX_VALUE overflow (elapsedRealtime > 0):
        if (mExpireIn > Long.MAX_VALUE - startRealtimeMs) {
            expirationRealtimeMs = Long.MAX_VALUE;
        } else {
            expirationRealtimeMs = startRealtimeMs + mExpireIn;
        }
        return Math.min(expirationRealtimeMs, mExpireAt);
    }

    /**
     * Set the number of location updates.
     *
+4 −14
Original line number Diff line number Diff line
@@ -2081,23 +2081,13 @@ public class LocationManagerService extends ILocationManager.Stub {
        private boolean mIsForegroundUid;
        private Location mLastFixBroadcast;
        private Throwable mStackTrace;  // for debugging only
        private long mExpirationRealtimeMs;

        /**
         * Note: must be constructed with lock held.
         */
        private UpdateRecord(String provider, LocationRequest request, Receiver receiver) {
            // translate expireIn value into expireAt
            long elapsedRealtime = SystemClock.elapsedRealtime();
            long expireAt;
            // Check for > Long.MAX_VALUE overflow (elapsedRealtime > 0):
            if (request.getExpireIn() > Long.MAX_VALUE - elapsedRealtime) {
                expireAt = Long.MAX_VALUE;
            } else {
                expireAt = Math.max(request.getExpireIn() + elapsedRealtime, 0);
            }
            request.setExpireAt(Math.min(request.getExpireAt(), expireAt));
            request.setExpireIn(Long.MAX_VALUE);

            mExpirationRealtimeMs = request.getExpirationRealtimeMs(SystemClock.elapsedRealtime());
            mProvider = provider;
            mRealRequest = request;
            mRequest = request;
@@ -2969,7 +2959,7 @@ public class LocationManagerService extends ILocationManager.Stub {
        }

        // Check whether the expiry date has passed
        return record.mRealRequest.getExpireAt() >= now;
        return record.mExpirationRealtimeMs >= now;
    }

    @GuardedBy("mLock")
@@ -3100,7 +3090,7 @@ public class LocationManagerService extends ILocationManager.Stub {
            }

            // track expired records
            if (r.mRealRequest.getNumUpdates() <= 0 || r.mRealRequest.getExpireAt() < now) {
            if (r.mRealRequest.getNumUpdates() <= 0 || r.mExpirationRealtimeMs < now) {
                // notify the client it can remove this listener
                r.mReceiver.callRemovedLocked();
                if (deadUpdateRecords == null) {
+2 −2
Original line number Diff line number Diff line
@@ -161,8 +161,8 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish
        }

        GeofenceState state = new GeofenceState(geofence,
                request.getExpireAt(), allowedResolutionLevel, uid, packageName, featureId,
                listenerIdentifier, intent);
                request.getExpirationRealtimeMs(SystemClock.elapsedRealtime()),
                allowedResolutionLevel, uid, packageName, featureId, listenerIdentifier, intent);
        synchronized (mLock) {
            // first make sure it doesn't already exist
            for (int i = mFences.size() - 1; i >= 0; i--) {