diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index e112915cecd77..c7bfe12b3838d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -182,6 +182,11 @@ public class InfoMediaManager extends MediaManager { return false; } + boolean preferRouteListingOrdering() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE + && Api34Impl.preferRouteListingOrdering(mRouterManager, mPackageName); + } + /** * Remove a {@code device} from current media. * @@ -616,7 +621,6 @@ public class InfoMediaManager extends MediaManager { return finalizedItemList; } - @DoNotInline static synchronized List filterDuplicatedIds(List infos) { List filteredInfos = new ArrayList<>(); @@ -653,5 +657,14 @@ public class InfoMediaManager extends MediaManager { } return sortedInfoList; } + + @DoNotInline + static boolean preferRouteListingOrdering(MediaRouter2Manager mediaRouter2Manager, + String packageName) { + RouteListingPreference routeListingPreference = + mediaRouter2Manager.getRouteListingPreference(packageName); + return routeListingPreference != null + && !routeListingPreference.getUseSystemOrdering(); + } } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index e8d9212a1bc7c..5c97f374153f0 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -209,6 +209,15 @@ public class LocalMediaManager implements BluetoothCallback { return mInfoMediaManager.isRoutingSessionAvailableForVolumeControl(); } + /** + * Returns if media app establishes a preferred route listing order. + * + * @return True if route list ordering exist and not using system ordering, false otherwise. + */ + public boolean isPreferenceRouteListingExist() { + return mInfoMediaManager.preferRouteListingOrdering(); + } + /** * Start scan connected MediaDevice */ 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 2820a132162be..92600131b0762 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 @@ -340,6 +340,33 @@ public class InfoMediaManagerTest { assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size()); } + @Test + public void hasPreferenceRouteListing_oldSdkVersion_returnsFalse() { + assertThat(mInfoMediaManager.preferRouteListingOrdering()).isFalse(); + } + + @Test + public void hasPreferenceRouteListing_newSdkVersionWithPreferenceExist_returnsTrue() { + ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", + Build.VERSION_CODES.UPSIDE_DOWN_CAKE); + when(mRouterManager.getRouteListingPreference(any())).thenReturn( + new RouteListingPreference.Builder().setItems( + ImmutableList.of()).setUseSystemOrdering(false).build()); + mInfoMediaManager.mRouterManager = mRouterManager; + + assertThat(mInfoMediaManager.preferRouteListingOrdering()).isTrue(); + } + + @Test + public void hasPreferenceRouteListing_newSdkVersionWithPreferenceNotExist_returnsFalse() { + ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", + Build.VERSION_CODES.UPSIDE_DOWN_CAKE); + + when(mRouterManager.getRouteListingPreference(any())).thenReturn(null); + + assertThat(mInfoMediaManager.preferRouteListingOrdering()).isFalse(); + } + private List getRoutesListWithDuplicatedIds() { final List routes = new ArrayList<>(); final MediaRoute2Info info = mock(MediaRoute2Info.class); diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java index 8eb25c4c24957..316b64209f838 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java @@ -630,10 +630,11 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, private void buildMediaItems(List devices) { synchronized (mMediaDevicesLock) { - //TODO(b/257851968): do the organization only when there's no suggested sorted order - // we get from application - attachRangeInfo(devices); - Collections.sort(devices, Comparator.naturalOrder()); + if (!isRouteProcessSupported() || (isRouteProcessSupported() + && !mLocalMediaManager.isPreferenceRouteListingExist())) { + attachRangeInfo(devices); + Collections.sort(devices, Comparator.naturalOrder()); + } // For the first time building list, to make sure the top device is the connected // device. if (mMediaItemList.isEmpty()) { @@ -751,6 +752,10 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return mFeatureFlags.isEnabled(Flags.OUTPUT_SWITCHER_ADVANCED_LAYOUT); } + public boolean isRouteProcessSupported() { + return mFeatureFlags.isEnabled(Flags.OUTPUT_SWITCHER_ROUTES_PROCESSING); + } + List getGroupMediaDevices() { final List selectedDevices = getSelectedMediaDevice(); final List selectableDevices = getSelectableMediaDevice();