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
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 6bf6034..b77a249 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -732,7 +732,7 @@
                     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 synchronized void register(AlarmManager alarmManager,
-                CancellationSignal cancellationSignal) {
+                CancellationSignal cancellationSignal,
+                ICancellationSignal remoteCancellationSignal) {
             if (mConsumer == null) {
                 return;
             }
@@ -2587,15 +2588,21 @@
             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 @@
                     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;