Update InfoMediaManager.devices when a session is released

In order to reflect the fact that the current controller
has changed.

Bug: 279166634
Test: atest InfoMediaManagerTest
Change-Id: I9e9239eb5b861808aaec1f19f327af225246b606
This commit is contained in:
Santiago Seifert
2023-04-28 10:55:22 +00:00
parent 2aa4ac3289
commit 3b437045ae
2 changed files with 56 additions and 0 deletions

View File

@@ -50,6 +50,7 @@ import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.DoNotInline;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import com.android.internal.annotations.VisibleForTesting;
@@ -637,6 +638,11 @@ public class InfoMediaManager extends MediaManager {
refreshDevices();
}
@Override
public void onSessionReleased(@NonNull RoutingSessionInfo session) {
refreshDevices();
}
@Override
public void onRouteListingPreferenceUpdated(
String packageName,

View File

@@ -140,6 +140,56 @@ public class InfoMediaManagerTest {
assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
}
@Test
public void onSessionReleased_shouldUpdateConnectedDevice() {
final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
final RoutingSessionInfo sessionInfo1 = mock(RoutingSessionInfo.class);
routingSessionInfos.add(sessionInfo1);
final RoutingSessionInfo sessionInfo2 = mock(RoutingSessionInfo.class);
routingSessionInfos.add(sessionInfo2);
final List<String> selectedRoutesSession1 = new ArrayList<>();
selectedRoutesSession1.add(TEST_ID_1);
when(sessionInfo1.getSelectedRoutes()).thenReturn(selectedRoutesSession1);
final List<String> selectedRoutesSession2 = new ArrayList<>();
selectedRoutesSession2.add(TEST_ID_2);
when(sessionInfo2.getSelectedRoutes()).thenReturn(selectedRoutesSession2);
mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
final MediaRoute2Info info1 = mock(MediaRoute2Info.class);
when(info1.getId()).thenReturn(TEST_ID_1);
when(info1.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
final MediaRoute2Info info2 = mock(MediaRoute2Info.class);
when(info2.getId()).thenReturn(TEST_ID_2);
when(info2.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
final List<MediaRoute2Info> routes = new ArrayList<>();
routes.add(info1);
routes.add(info2);
mShadowRouter2Manager.setAllRoutes(routes);
mShadowRouter2Manager.setTransferableRoutes(routes);
final MediaDevice mediaDevice1 = mInfoMediaManager.findMediaDevice(TEST_ID_1);
assertThat(mediaDevice1).isNull();
final MediaDevice mediaDevice2 = mInfoMediaManager.findMediaDevice(TEST_ID_2);
assertThat(mediaDevice2).isNull();
mInfoMediaManager.mMediaRouterCallback.onRoutesUpdated();
final MediaDevice infoDevice1 = mInfoMediaManager.mMediaDevices.get(0);
assertThat(infoDevice1.getId()).isEqualTo(TEST_ID_1);
final MediaDevice infoDevice2 = mInfoMediaManager.mMediaDevices.get(1);
assertThat(infoDevice2.getId()).isEqualTo(TEST_ID_2);
// The active routing session is the last one in the list, which maps to infoDevice2.
assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice2);
routingSessionInfos.remove(sessionInfo2);
mInfoMediaManager.mMediaRouterCallback.onSessionReleased(sessionInfo2);
assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice1);
}
@Test
public void onRouteAdded_buildAllRoutes_shouldAddMediaDevice() {
final MediaRoute2Info info = mock(MediaRoute2Info.class);