Move reserved offer teardown into a function

This function will also be called from the ReservedServerOffer itself
when it encounters an error that should release the reservation.

Test: TH
Change-Id: Icf49147dd5f1335e9a3b8706da5bbba03c556758
diff --git a/service/src/com/android/server/L2capNetworkProvider.java b/service/src/com/android/server/L2capNetworkProvider.java
index e710461..787cab5 100644
--- a/service/src/com/android/server/L2capNetworkProvider.java
+++ b/service/src/com/android/server/L2capNetworkProvider.java
@@ -209,12 +209,19 @@
 
             // Note that the reserved offer gets torn down when the reservation goes away, even if
             // there are active (non-reservation) requests for said offer.
-            mReservedServerOffers.remove(reservedOffer);
-            reservedOffer.tearDown();
-            mProvider.unregisterNetworkOffer(reservedOffer);
+            destroyAndUnregisterReservedOffer(reservedOffer);
         }
     }
 
+    private void destroyAndUnregisterReservedOffer(ReservedServerOffer reservedOffer) {
+        // Ensure the offer still exists if this was posted on the handler.
+        if (!mReservedServerOffers.contains(reservedOffer)) return;
+        mReservedServerOffers.remove(reservedOffer);
+
+        reservedOffer.tearDown();
+        mProvider.unregisterNetworkOffer(reservedOffer);
+    }
+
     private class ReservedServerOffer implements NetworkOfferCallback {
         private final NetworkCapabilities mReservedCapabilities;
         private final BluetoothServerSocket mServerSocket;