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

Commit d838847e authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix determining request expiration time"

parents abd59239 95768ce2
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
@@ -2005,23 +2005,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;
@@ -2883,7 +2873,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")
@@ -3015,7 +3005,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
@@ -133,8 +133,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--) {