[Output Switcher] Fix list order for preference

Add system route to the top even Preference been set.
add check for isScanning to prevent exception

Bug: 286593457
Bug: 260055330
Test: make -j64 RunSettingsLibRoboTests ROBOTEST_FILTER="com.android.settingslib.media.InfoMediaManagerTest"
Change-Id: Ic7245f9c4169eabf63aa8eabac9b6a57fbc4ea7b
This commit is contained in:
shaoweishen
2023-06-15 16:38:49 +00:00
committed by Shaowei Shen
parent 2b20d86c73
commit 68d80b545e
3 changed files with 46 additions and 16 deletions

View File

@@ -71,6 +71,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/** InfoMediaManager provide interface to get InfoMediaDevice list. */ /** InfoMediaManager provide interface to get InfoMediaDevice list. */
@RequiresApi(Build.VERSION_CODES.R) @RequiresApi(Build.VERSION_CODES.R)
@@ -719,20 +720,19 @@ public abstract class InfoMediaManager extends MediaManager {
List<MediaRoute2Info> selectedRouteInfos, List<MediaRoute2Info> infolist, List<MediaRoute2Info> selectedRouteInfos, List<MediaRoute2Info> infolist,
List<RouteListingPreference.Item> preferenceRouteListing) { List<RouteListingPreference.Item> preferenceRouteListing) {
final List<MediaRoute2Info> sortedInfoList = new ArrayList<>(selectedRouteInfos); final List<MediaRoute2Info> sortedInfoList = new ArrayList<>(selectedRouteInfos);
infolist.removeAll(selectedRouteInfos);
sortedInfoList.addAll(infolist.stream().filter(
MediaRoute2Info::isSystemRoute).collect(Collectors.toList()));
for (RouteListingPreference.Item item : preferenceRouteListing) { for (RouteListingPreference.Item item : preferenceRouteListing) {
for (MediaRoute2Info info : infolist) { for (MediaRoute2Info info : infolist) {
if (item.getRouteId().equals(info.getId()) if (item.getRouteId().equals(info.getId())
&& !selectedRouteInfos.contains(info)) { && !selectedRouteInfos.contains(info)
&& !info.isSystemRoute()) {
sortedInfoList.add(info); sortedInfoList.add(info);
break; break;
} }
} }
} }
if (sortedInfoList.size() != infolist.size()) {
infolist.removeAll(sortedInfoList);
sortedInfoList.addAll(infolist.stream().filter(
MediaRoute2Info::isSystemRoute).toList());
}
return sortedInfoList; return sortedInfoList;
} }

View File

@@ -43,6 +43,7 @@ public class ManagerInfoMediaManager extends InfoMediaManager {
/* package */ final RouterManagerCallback mMediaRouterCallback = new RouterManagerCallback(); /* package */ final RouterManagerCallback mMediaRouterCallback = new RouterManagerCallback();
@VisibleForTesting @VisibleForTesting
/* package */ MediaRouter2Manager mRouterManager; /* package */ MediaRouter2Manager mRouterManager;
boolean mIsScanning = false;
private final Executor mExecutor = Executors.newSingleThreadExecutor(); private final Executor mExecutor = Executors.newSingleThreadExecutor();
@@ -58,14 +59,20 @@ public class ManagerInfoMediaManager extends InfoMediaManager {
@Override @Override
protected void startScanOnRouter() { protected void startScanOnRouter() {
if (!mIsScanning) {
mRouterManager.registerCallback(mExecutor, mMediaRouterCallback); mRouterManager.registerCallback(mExecutor, mMediaRouterCallback);
mRouterManager.registerScanRequest(); mRouterManager.registerScanRequest();
mIsScanning = true;
}
} }
@Override @Override
public void stopScan() { public void stopScan() {
if (mIsScanning) {
mRouterManager.unregisterCallback(mMediaRouterCallback); mRouterManager.unregisterCallback(mMediaRouterCallback);
mRouterManager.unregisterScanRequest(); mRouterManager.unregisterScanRequest();
mIsScanning = false;
}
} }
@Override @Override

View File

@@ -114,6 +114,23 @@ public class InfoMediaManagerTest {
mInfoMediaManager.mRouterManager = MediaRouter2Manager.getInstance(mContext); 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 @Test
public void onRouteAdded_getAvailableRoutes_shouldAddMediaDevice() { public void onRouteAdded_getAvailableRoutes_shouldAddMediaDevice() {
final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>(); final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
@@ -328,11 +345,12 @@ public class InfoMediaManagerTest {
routeListingPreference); routeListingPreference);
mInfoMediaManager.mMediaRouterCallback.onRoutesUpdated(); 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(0).getId()).isEqualTo(TEST_ID);
assertThat(mInfoMediaManager.mMediaDevices.get(1).getId()).isEqualTo(TEST_ID_4); assertThat(mInfoMediaManager.mMediaDevices.get(1).getId()).isEqualTo(TEST_ID_1);
assertThat(mInfoMediaManager.mMediaDevices.get(1).isSuggestedDevice()).isTrue(); assertThat(mInfoMediaManager.mMediaDevices.get(2).getId()).isEqualTo(TEST_ID_4);
assertThat(mInfoMediaManager.mMediaDevices.get(2).getId()).isEqualTo(TEST_ID_3); assertThat(mInfoMediaManager.mMediaDevices.get(2).isSuggestedDevice()).isTrue();
assertThat(mInfoMediaManager.mMediaDevices.get(3).getId()).isEqualTo(TEST_ID_3);
} }
@Test @Test
@@ -406,8 +424,13 @@ public class InfoMediaManagerTest {
when(availableInfo3.getClientPackageName()).thenReturn(packageName); when(availableInfo3.getClientPackageName()).thenReturn(packageName);
availableRoutes.add(availableInfo3); availableRoutes.add(availableInfo3);
when(mRouterManager.getAvailableRoutes(packageName)).thenReturn( final MediaRoute2Info availableInfo4 = mock(MediaRoute2Info.class);
availableRoutes); 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; return availableRoutes;
} }