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 {