Always assign a free ID to the new MediaPlayer
It used current size plus 1 as the new MediaPlayer's ID in previous
design and if a player was removed before, the ID of size+1 maybe was
still in used but a ID < size+1 was freed.
This change finds a free ID by checking if the number is not in the
mMediaPlayerIds so we never use same ID in two player.
Bug: 110511529
Test: manually switching players by force-stop / disabled
runtest bluetooth -c com.android.bluetooth.avrcp.MediaPlayerWrapperTest
Change-Id: Ia9e67a34b5915ad615746e6b334c1596ee639c1a
(cherry picked from commit e2da76c960a90d9d9e52ef2cc92a5e7a00c122d1)
diff --git a/src/com/android/bluetooth/newavrcp/MediaPlayerList.java b/src/com/android/bluetooth/newavrcp/MediaPlayerList.java
index 1a10979..74ea039 100644
--- a/src/com/android/bluetooth/newavrcp/MediaPlayerList.java
+++ b/src/com/android/bluetooth/newavrcp/MediaPlayerList.java
@@ -152,7 +152,7 @@
for (BrowsedPlayerWrapper wrapper : players) {
// Generate new id and add the browsable player
if (!mMediaPlayerIds.containsKey(wrapper.getPackageName())) {
- mMediaPlayerIds.put(wrapper.getPackageName(), mMediaPlayerIds.size() + 1);
+ mMediaPlayerIds.put(wrapper.getPackageName(), getFreeMediaPlayerId());
}
d("Adding Browser Wrapper for " + wrapper.getPackageName() + " with id "
@@ -206,6 +206,12 @@
return BLUETOOTH_PLAYER_ID;
}
+ int getFreeMediaPlayerId() {
+ int id = 0;
+ while (mMediaPlayerIds.containsValue(++id)) {}
+ return id;
+ }
+
MediaPlayerWrapper getActivePlayer() {
return mMediaPlayers.get(mActivePlayerId);
}
@@ -405,7 +411,7 @@
// that key.
String packageName = controller.getPackageName();
if (!mMediaPlayerIds.containsKey(packageName)) {
- mMediaPlayerIds.put(packageName, mMediaPlayerIds.size() + 1);
+ mMediaPlayerIds.put(packageName, getFreeMediaPlayerId());
}
int playerId = mMediaPlayerIds.get(packageName);