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

Commit 67e6f8a6 authored by Soonil Nagarkar's avatar Soonil Nagarkar Committed by Automerger Merge Worker
Browse files

DO NOT MERGE Fix bug in getCurrentLocation cancellation am: 05f32ddf

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12660988

Change-Id: I88c44a53eefc0ecc222526cd4cc921a5e9411f37
parents c85f35d6 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