diff options
author | Soonil Nagarkar <sooniln@google.com> | 2020-09-24 09:35:49 -0700 |
---|---|---|
committer | Soonil Nagarkar <sooniln@google.com> | 2020-09-24 09:41:24 -0700 |
commit | 2d6bcbecd3db5a2983f1a17b4c75641f6b2fee1b (patch) | |
tree | 3fbaa4c2582743c23c165955513501888fb07b12 | |
parent | c231992ac3b068c3068619550bf95203e3bc2dc2 (diff) |
DO NOT MERGE Local timeout should cancel remote work
Ensure that when getCurrentLocation() times out locally, remote work in
system server is also canceled.
Bug: 168666216
Test: manual
Change-Id: Idde2156323c3fca0ed94ff886a4277122c598753
-rw-r--r-- | location/java/android/location/LocationManager.java | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 6bf6034bbbf4..b77a249d0fe9 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -732,7 +732,7 @@ public class LocationManager { mContext.getAttributionTag(), transport.getListenerId()); if (cancelRemote != null) { transport.register(mContext.getSystemService(AlarmManager.class), - cancellationSignal); + cancellationSignal, cancelRemote); if (cancellationSignal != null) { cancellationSignal.setRemote(cancelRemote); } @@ -2571,7 +2571,8 @@ public class LocationManager { } public synchronized void register(AlarmManager alarmManager, - CancellationSignal cancellationSignal) { + CancellationSignal cancellationSignal, + ICancellationSignal remoteCancellationSignal) { if (mConsumer == null) { return; } @@ -2587,15 +2588,21 @@ public class LocationManager { if (cancellationSignal != null) { cancellationSignal.setOnCancelListener(this); } + + mRemoteCancellationSignal = remoteCancellationSignal; } @Override public void onCancel() { + synchronized (this) { + mRemoteCancellationSignal = null; + } remove(); } private Consumer<Location> remove() { Consumer<Location> consumer; + ICancellationSignal cancellationSignal; synchronized (this) { mExecutor = null; consumer = mConsumer; @@ -2605,6 +2612,18 @@ 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; |