From 2d6bcbecd3db5a2983f1a17b4c75641f6b2fee1b Mon Sep 17 00:00:00 2001 From: Soonil Nagarkar Date: Thu, 24 Sep 2020 09:35:49 -0700 Subject: [PATCH] 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 --- .../android/location/LocationManager.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 6bf6034bbbf4e..b77a249d0fe90 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 remove() { Consumer 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;