From 3b437045ae371de01bc0e26c72d027133055fcbe Mon Sep 17 00:00:00 2001 From: Santiago Seifert Date: Fri, 28 Apr 2023 10:55:22 +0000 Subject: [PATCH] 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 --- .../settingslib/media/InfoMediaManager.java | 6 +++ .../media/InfoMediaManagerTest.java | 50 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index c9e831256cf41..6cf6825e61e07 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -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, diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java index 270fda89c212b..096932706c884 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java @@ -140,6 +140,56 @@ public class InfoMediaManagerTest { assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size()); } + @Test + public void onSessionReleased_shouldUpdateConnectedDevice() { + final List routingSessionInfos = new ArrayList<>(); + final RoutingSessionInfo sessionInfo1 = mock(RoutingSessionInfo.class); + routingSessionInfos.add(sessionInfo1); + final RoutingSessionInfo sessionInfo2 = mock(RoutingSessionInfo.class); + routingSessionInfos.add(sessionInfo2); + + final List selectedRoutesSession1 = new ArrayList<>(); + selectedRoutesSession1.add(TEST_ID_1); + when(sessionInfo1.getSelectedRoutes()).thenReturn(selectedRoutesSession1); + + final List 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 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);