Merge "Catch and ignore `IllegalArgumentException` thrown by `unbindService`" into main
diff --git a/services/backup/java/com/android/server/backup/transport/TransportConnection.java b/services/backup/java/com/android/server/backup/transport/TransportConnection.java
index 1009787..67ebb3e 100644
--- a/services/backup/java/com/android/server/backup/transport/TransportConnection.java
+++ b/services/backup/java/com/android/server/backup/transport/TransportConnection.java
@@ -658,11 +658,13 @@
      * This class is a proxy to TransportClient methods that doesn't hold a strong reference to the
      * TransportClient, allowing it to be GC'ed. If the reference was lost it logs a message.
      */
-    private static class TransportConnectionMonitor implements ServiceConnection {
+    @VisibleForTesting
+    static class TransportConnectionMonitor implements ServiceConnection {
         private final Context mContext;
         private final WeakReference<TransportConnection> mTransportClientRef;
 
-        private TransportConnectionMonitor(Context context,
+        @VisibleForTesting
+        TransportConnectionMonitor(Context context,
                 TransportConnection transportConnection) {
             mContext = context;
             mTransportClientRef = new WeakReference<>(transportConnection);
@@ -704,7 +706,13 @@
 
         /** @see TransportConnection#finalize() */
         private void referenceLost(String caller) {
-            mContext.unbindService(this);
+            try {
+                mContext.unbindService(this);
+            } catch (IllegalArgumentException e) {
+                TransportUtils.log(Priority.WARN, TAG,
+                        caller + " called but unbindService failed: " + e.getMessage());
+                return;
+            }
             TransportUtils.log(
                     Priority.INFO,
                     TAG,
diff --git a/services/robotests/backup/src/com/android/server/backup/transport/TransportConnectionTest.java b/services/robotests/backup/src/com/android/server/backup/transport/TransportConnectionTest.java
index 6a82f16..3e87c6f 100644
--- a/services/robotests/backup/src/com/android/server/backup/transport/TransportConnectionTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/transport/TransportConnectionTest.java
@@ -28,6 +28,7 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -543,6 +544,18 @@
         return future.get();
     }
 
+    @Test
+    public void onBindingDied_referenceLost_doesNotThrow() {
+        TransportConnection.TransportConnectionMonitor transportConnectionMonitor =
+                new TransportConnection.TransportConnectionMonitor(
+                        mContext, /* transportConnection= */ null);
+        doThrow(new IllegalArgumentException("Service not registered")).when(
+                mContext).unbindService(any());
+
+        // Test no exception is thrown
+        transportConnectionMonitor.onBindingDied(mTransportComponent);
+    }
+
     private ServiceConnection verifyBindServiceAsUserAndCaptureServiceConnection(Context context) {
         ArgumentCaptor<ServiceConnection> connectionCaptor =
                 ArgumentCaptor.forClass(ServiceConnection.class);