summaryrefslogtreecommitdiff
path: root/location
diff options
context:
space:
mode:
authorSoonil Nagarkar <sooniln@google.com>2020-09-24 09:35:49 -0700
committerSoonil Nagarkar <sooniln@google.com>2020-09-24 09:41:24 -0700
commit2d6bcbecd3db5a2983f1a17b4c75641f6b2fee1b (patch)
tree3fbaa4c2582743c23c165955513501888fb07b12 /location
parentc231992ac3b068c3068619550bf95203e3bc2dc2 (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
Diffstat (limited to 'location')
-rw-r--r--location/java/android/location/LocationManager.java23
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;