diff options
Diffstat (limited to 'location')
-rw-r--r-- | location/java/android/location/ILocationManager.aidl | 6 | ||||
-rw-r--r-- | location/java/android/location/LocationManager.java | 33 |
2 files changed, 21 insertions, 18 deletions
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl index 75ea0cbada92..7ed5b579ebb4 100644 --- a/location/java/android/location/ILocationManager.aidl +++ b/location/java/android/location/ILocationManager.aidl @@ -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); diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 0c7d96d9f136..33c69511d273 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -724,16 +724,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, cancelRemote); if (cancellationSignal != null) { - cancellationSignal.setOnCancelListener(transport::cancel); + cancellationSignal.setRemote(cancelRemote); } } else { transport.fail(); @@ -2535,7 +2534,7 @@ public class LocationManager { } private static class GetCurrentLocationTransport extends ILocationListener.Stub implements - AlarmManager.OnAlarmListener { + AlarmManager.OnAlarmListener, CancellationSignal.OnCancelListener { @GuardedBy("this") @Nullable @@ -2567,6 +2566,7 @@ public class LocationManager { } public synchronized void register(AlarmManager alarmManager, + CancellationSignal cancellationSignal, ICancellationSignal remoteCancellationSignal) { if (mConsumer == null) { return; @@ -2580,10 +2580,18 @@ public class LocationManager { this, null); + if (cancellationSignal != null) { + cancellationSignal.setOnCancelListener(this); + } + mRemoteCancellationSignal = remoteCancellationSignal; } - public void cancel() { + @Override + public void onCancel() { + synchronized (this) { + mRemoteCancellationSignal = null; + } remove(); } @@ -2632,11 +2640,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); } @@ -3034,7 +3037,7 @@ public class LocationManager { protected GnssRequest merge(@NonNull List<GnssRequest> requests) { Preconditions.checkArgument(!requests.isEmpty()); for (GnssRequest request : requests) { - if (request.isFullTracking()) { + if (request != null && request.isFullTracking()) { return request; } } |