Store reserved offers in a Set instead

ReservedOffers should be identified by the reservationId, not the
requestId. Furthermore, a reserved offer can be torn down outside of
onNetworkUnneeded() at which point there is not request to reference.

This change replaces the Map of requestId -> reservedOffer to a Set of
reservedOffers.

Test: TH
Change-Id: I622c86fe238b2412664add55ce491eb5baf6033f
diff --git a/service/src/com/android/server/L2capNetworkProvider.java b/service/src/com/android/server/L2capNetworkProvider.java
index 5816e8b..e710461 100644
--- a/service/src/com/android/server/L2capNetworkProvider.java
+++ b/service/src/com/android/server/L2capNetworkProvider.java
@@ -48,13 +48,13 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
-import android.util.ArrayMap;
+import android.util.ArraySet;
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.io.IOException;
-import java.util.Map;
+import java.util.Set;
 
 
 public class L2capNetworkProvider {
@@ -79,7 +79,7 @@
     private final Handler mHandler;
     private final NetworkProvider mProvider;
     private final BlanketReservationOffer mBlanketOffer;
-    private final Map<Integer, ReservedServerOffer> mReservedServerOffers = new ArrayMap<>();
+    private final Set<ReservedServerOffer> mReservedServerOffers = new ArraySet<>();
     // mBluetoothManager guaranteed non-null when read on handler thread after start() is called
     @Nullable
     private BluetoothManager mBluetoothManager;
@@ -152,7 +152,7 @@
 
             final NetworkCapabilities reservedCaps = reservedOffer.getReservedCapabilities();
             mProvider.registerNetworkOffer(SCORE, reservedCaps, mHandler::post, reservedOffer);
-            mReservedServerOffers.put(request.requestId, reservedOffer);
+            mReservedServerOffers.add(reservedOffer);
         }
 
         @Nullable
@@ -190,19 +190,29 @@
             return new ReservedServerOffer(reservedNc, serverSocket);
         }
 
+        @Nullable
+        private ReservedServerOffer getReservedOfferForRequest(NetworkRequest request) {
+            final int rId = request.networkCapabilities.getReservationId();
+            for (ReservedServerOffer offer : mReservedServerOffers) {
+                // Comparing by reservationId is more explicit then using canBeSatisfiedBy() or the
+                // requestId.
+                if (offer.getReservedCapabilities().getReservationId() != rId) continue;
+                return offer;
+            }
+            return null;
+        }
+
         @Override
         public void onNetworkUnneeded(NetworkRequest request) {
-            if (!mReservedServerOffers.containsKey(request.requestId)) {
-                return;
-            }
+            final ReservedServerOffer reservedOffer = getReservedOfferForRequest(request);
+            if (reservedOffer == null) return;
 
-            final ReservedServerOffer reservedOffer = mReservedServerOffers.remove(request.requestId);
             // Note that the reserved offer gets torn down when the reservation goes away, even if
-            // there are lingering requests.
+            // there are active (non-reservation) requests for said offer.
+            mReservedServerOffers.remove(reservedOffer);
             reservedOffer.tearDown();
             mProvider.unregisterNetworkOffer(reservedOffer);
         }
-
     }
 
     private class ReservedServerOffer implements NetworkOfferCallback {