diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index a1beed8569d98..34362d9ced914 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -71,6 +71,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; /** InfoMediaManager provide interface to get InfoMediaDevice list. */ @RequiresApi(Build.VERSION_CODES.R) @@ -719,20 +720,19 @@ public abstract class InfoMediaManager extends MediaManager { List selectedRouteInfos, List infolist, List preferenceRouteListing) { final List sortedInfoList = new ArrayList<>(selectedRouteInfos); + infolist.removeAll(selectedRouteInfos); + sortedInfoList.addAll(infolist.stream().filter( + MediaRoute2Info::isSystemRoute).collect(Collectors.toList())); for (RouteListingPreference.Item item : preferenceRouteListing) { for (MediaRoute2Info info : infolist) { if (item.getRouteId().equals(info.getId()) - && !selectedRouteInfos.contains(info)) { + && !selectedRouteInfos.contains(info) + && !info.isSystemRoute()) { sortedInfoList.add(info); break; } } } - if (sortedInfoList.size() != infolist.size()) { - infolist.removeAll(sortedInfoList); - sortedInfoList.addAll(infolist.stream().filter( - MediaRoute2Info::isSystemRoute).toList()); - } return sortedInfoList; } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java index 4f081369f5bf5..fc77cd6ae4349 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java @@ -43,6 +43,7 @@ public class ManagerInfoMediaManager extends InfoMediaManager { /* package */ final RouterManagerCallback mMediaRouterCallback = new RouterManagerCallback(); @VisibleForTesting /* package */ MediaRouter2Manager mRouterManager; + boolean mIsScanning = false; private final Executor mExecutor = Executors.newSingleThreadExecutor(); @@ -58,14 +59,20 @@ public class ManagerInfoMediaManager extends InfoMediaManager { @Override protected void startScanOnRouter() { - mRouterManager.registerCallback(mExecutor, mMediaRouterCallback); - mRouterManager.registerScanRequest(); + if (!mIsScanning) { + mRouterManager.registerCallback(mExecutor, mMediaRouterCallback); + mRouterManager.registerScanRequest(); + mIsScanning = true; + } } @Override public void stopScan() { - mRouterManager.unregisterCallback(mMediaRouterCallback); - mRouterManager.unregisterScanRequest(); + if (mIsScanning) { + mRouterManager.unregisterCallback(mMediaRouterCallback); + mRouterManager.unregisterScanRequest(); + mIsScanning = false; + } } @Override 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 ce1744dd415e1..ee68fc2fa00dd 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 @@ -114,6 +114,23 @@ public class InfoMediaManagerTest { mInfoMediaManager.mRouterManager = MediaRouter2Manager.getInstance(mContext); } + @Test + public void stopScan_notStartFirst_notCallsUnregister() { + mInfoMediaManager.mRouterManager = mRouterManager; + mInfoMediaManager.stopScan(); + + verify(mRouterManager, never()).unregisterScanRequest(); + } + + @Test + public void stopScan_startFirst_callsUnregister() { + mInfoMediaManager.mRouterManager = mRouterManager; + mInfoMediaManager.startScan(); + mInfoMediaManager.stopScan(); + + verify(mRouterManager).unregisterScanRequest(); + } + @Test public void onRouteAdded_getAvailableRoutes_shouldAddMediaDevice() { final List routingSessionInfos = new ArrayList<>(); @@ -328,11 +345,12 @@ public class InfoMediaManagerTest { routeListingPreference); mInfoMediaManager.mMediaRouterCallback.onRoutesUpdated(); - assertThat(mInfoMediaManager.mMediaDevices).hasSize(3); + assertThat(mInfoMediaManager.mMediaDevices).hasSize(4); assertThat(mInfoMediaManager.mMediaDevices.get(0).getId()).isEqualTo(TEST_ID); - assertThat(mInfoMediaManager.mMediaDevices.get(1).getId()).isEqualTo(TEST_ID_4); - assertThat(mInfoMediaManager.mMediaDevices.get(1).isSuggestedDevice()).isTrue(); - assertThat(mInfoMediaManager.mMediaDevices.get(2).getId()).isEqualTo(TEST_ID_3); + assertThat(mInfoMediaManager.mMediaDevices.get(1).getId()).isEqualTo(TEST_ID_1); + assertThat(mInfoMediaManager.mMediaDevices.get(2).getId()).isEqualTo(TEST_ID_4); + assertThat(mInfoMediaManager.mMediaDevices.get(2).isSuggestedDevice()).isTrue(); + assertThat(mInfoMediaManager.mMediaDevices.get(3).getId()).isEqualTo(TEST_ID_3); } @Test @@ -406,8 +424,13 @@ public class InfoMediaManagerTest { when(availableInfo3.getClientPackageName()).thenReturn(packageName); availableRoutes.add(availableInfo3); - when(mRouterManager.getAvailableRoutes(packageName)).thenReturn( - availableRoutes); + final MediaRoute2Info availableInfo4 = mock(MediaRoute2Info.class); + when(availableInfo4.getId()).thenReturn(TEST_ID_1); + when(availableInfo4.isSystemRoute()).thenReturn(true); + when(availableInfo4.getClientPackageName()).thenReturn(packageName); + availableRoutes.add(availableInfo4); + + when(mRouterManager.getAvailableRoutes(packageName)).thenReturn(availableRoutes); return availableRoutes; }