[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.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<MediaRoute2Info> selectedRouteInfos, List<MediaRoute2Info> infolist,
List<RouteListingPreference.Item> preferenceRouteListing) {
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 (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;
}

View File

@@ -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

View File

@@ -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<RoutingSessionInfo> 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;
}