Loading location/java/android/location/ILocationManager.aidl +3 −3 Original line number Diff line number Diff line Loading @@ -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); Loading location/java/android/location/LocationManager.java +13 −29 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -2540,7 +2539,7 @@ public class LocationManager { } private static class GetCurrentLocationTransport extends ILocationListener.Stub implements AlarmManager.OnAlarmListener { AlarmManager.OnAlarmListener, CancellationSignal.OnCancelListener { @GuardedBy("this") @Nullable Loading Loading @@ -2572,7 +2571,7 @@ public class LocationManager { } public synchronized void register(AlarmManager alarmManager, ICancellationSignal remoteCancellationSignal) { CancellationSignal cancellationSignal) { if (mConsumer == null) { return; } Loading @@ -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; Loading @@ -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; Loading @@ -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); } Loading services/core/java/com/android/server/location/LocationManagerService.java +10 −11 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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; } } } Loading @@ -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 Loading Loading
location/java/android/location/ILocationManager.aidl +3 −3 Original line number Diff line number Diff line Loading @@ -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); Loading
location/java/android/location/LocationManager.java +13 −29 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -2540,7 +2539,7 @@ public class LocationManager { } private static class GetCurrentLocationTransport extends ILocationListener.Stub implements AlarmManager.OnAlarmListener { AlarmManager.OnAlarmListener, CancellationSignal.OnCancelListener { @GuardedBy("this") @Nullable Loading Loading @@ -2572,7 +2571,7 @@ public class LocationManager { } public synchronized void register(AlarmManager alarmManager, ICancellationSignal remoteCancellationSignal) { CancellationSignal cancellationSignal) { if (mConsumer == null) { return; } Loading @@ -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; Loading @@ -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; Loading @@ -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); } Loading
services/core/java/com/android/server/location/LocationManagerService.java +10 −11 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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; } } } Loading @@ -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 Loading