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

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

Merge "DO NOT MERGE Fix bug in getCurrentLocation cancellation" into rvc-qpr-dev

parents 1688d946 05f32ddf
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -45,9 +45,9 @@ import com.android.internal.location.ProviderProperties;
interface ILocationManager
{
    Location getLastLocation(in LocationRequest request, String packageName, String featureId);
    boolean getCurrentLocation(in LocationRequest request,
            in ICancellationSignal cancellationSignal, in ILocationListener listener,
            String packageName, String featureId, String listenerId);
    @nullable ICancellationSignal getCurrentLocation(in LocationRequest request,
            in ILocationListener listener, String packageName, String featureId,
            String listenerId);

    void requestLocationUpdates(in LocationRequest request, in ILocationListener listener,
            in PendingIntent intent, String packageName, String featureId, String listenerId);
+13 −29
Original line number Diff line number Diff line
@@ -726,16 +726,15 @@ public class LocationManager {
            cancellationSignal.throwIfCanceled();
        }

        ICancellationSignal remoteCancellationSignal = CancellationSignal.createTransport();

        try {
            if (mService.getCurrentLocation(currentLocationRequest, remoteCancellationSignal,
                    transport, mContext.getPackageName(), mContext.getAttributionTag(),
                    transport.getListenerId())) {
            ICancellationSignal cancelRemote = mService.getCurrentLocation(
                    currentLocationRequest, transport, mContext.getPackageName(),
                    mContext.getAttributionTag(), transport.getListenerId());
            if (cancelRemote != null) {
                transport.register(mContext.getSystemService(AlarmManager.class),
                        remoteCancellationSignal);
                        cancellationSignal);
                if (cancellationSignal != null) {
                    cancellationSignal.setOnCancelListener(transport::cancel);
                    cancellationSignal.setRemote(cancelRemote);
                }
            } else {
                transport.fail();
@@ -2540,7 +2539,7 @@ public class LocationManager {
    }

    private static class GetCurrentLocationTransport extends ILocationListener.Stub implements
            AlarmManager.OnAlarmListener {
            AlarmManager.OnAlarmListener, CancellationSignal.OnCancelListener {

        @GuardedBy("this")
        @Nullable
@@ -2572,7 +2571,7 @@ public class LocationManager {
        }

        public synchronized void register(AlarmManager alarmManager,
                ICancellationSignal remoteCancellationSignal) {
                CancellationSignal cancellationSignal) {
            if (mConsumer == null) {
                return;
            }
@@ -2585,16 +2584,18 @@ public class LocationManager {
                    this,
                    null);

            mRemoteCancellationSignal = remoteCancellationSignal;
            if (cancellationSignal != null) {
                cancellationSignal.setOnCancelListener(this);
            }
        }

        public void cancel() {
        @Override
        public void onCancel() {
            remove();
        }

        private Consumer<Location> remove() {
            Consumer<Location> consumer;
            ICancellationSignal cancellationSignal;
            synchronized (this) {
                mExecutor = null;
                consumer = mConsumer;
@@ -2604,18 +2605,6 @@ public class LocationManager {
                    mAlarmManager.cancel(this);
                    mAlarmManager = null;
                }

                // ensure only one cancel event will go through
                cancellationSignal = mRemoteCancellationSignal;
                mRemoteCancellationSignal = null;
            }

            if (cancellationSignal != null) {
                try {
                    cancellationSignal.cancel();
                } catch (RemoteException e) {
                    // ignore
                }
            }

            return consumer;
@@ -2637,11 +2626,6 @@ public class LocationManager {

        @Override
        public void onLocationChanged(Location location) {
            synchronized (this) {
                // save ourselves a pointless x-process call to cancel the location request
                mRemoteCancellationSignal = null;
            }

            deliverResult(location);
        }

+10 −11
Original line number Diff line number Diff line
@@ -2064,10 +2064,12 @@ public class LocationManagerService extends ILocationManager.Stub {
        }
    }

    @Nullable
    @Override
    public boolean getCurrentLocation(LocationRequest locationRequest,
            ICancellationSignal remoteCancellationSignal, ILocationListener listener,
            String packageName, String featureId, String listenerId) {
    public ICancellationSignal getCurrentLocation(LocationRequest locationRequest,
            ILocationListener listener, String packageName, String featureId, String listenerId) {
        ICancellationSignal remoteCancellationSignal = CancellationSignal.createTransport();

        // side effect of validating locationRequest and packageName
        Location lastLocation = getLastLocation(locationRequest, packageName, featureId);
        if (lastLocation != null) {
@@ -2077,17 +2079,17 @@ public class LocationManagerService extends ILocationManager.Stub {
            if (locationAgeMs < MAX_CURRENT_LOCATION_AGE_MS) {
                try {
                    listener.onLocationChanged(lastLocation);
                    return true;
                    return remoteCancellationSignal;
                } catch (RemoteException e) {
                    Log.w(TAG, e);
                    return false;
                    return null;
                }
            }

            if (!mAppForegroundHelper.isAppForeground(Binder.getCallingUid())) {
                if (locationAgeMs < mSettingsHelper.getBackgroundThrottleIntervalMs()) {
                    // not allowed to request new locations, so we can't return anything
                    return false;
                    return null;
                }
            }
        }
@@ -2095,11 +2097,8 @@ public class LocationManagerService extends ILocationManager.Stub {
        requestLocationUpdates(locationRequest, listener, null, packageName, featureId, listenerId);
        CancellationSignal cancellationSignal = CancellationSignal.fromTransport(
                remoteCancellationSignal);
        if (cancellationSignal != null) {
            cancellationSignal.setOnCancelListener(
                    () -> removeUpdates(listener, null));
        }
        return true;
        cancellationSignal.setOnCancelListener(() -> removeUpdates(listener, null));
        return remoteCancellationSignal;
    }

    @Override