diff options
author | 2025-01-08 00:01:32 +0000 | |
---|---|---|
committer | 2025-01-29 16:28:51 +0000 | |
commit | 76a75f865eadb26afff8432dcfd6d15a838b41c2 (patch) | |
tree | db7e59d6ec47aa977f0e39caa58f94be1174ae2f /packages/SettingsLib/src | |
parent | 8ee3a09473aa5db9d734252084ebbe041c7a0e9d (diff) |
Group session MediaItems together in OutputSwitcher
If multiple routes are selected, they will be initially grouped
together, with a carat that allows expansion. The volume seekbar and
icon controls the sesion volume, and the name of the entry is the
session name.
There must already be an existing session before opening the output
switcher for them to be grouped. If a device is added to the session, it
will maintain its existing position until the output switcher is
reopened.
Bug: 388347018
Test: Tested locally, atest
Flag: com.android.media.flags.enable_output_switcher_session_grouping
Change-Id: I7763783ddf4cf66d35dbe34a5f7620fa82ead7cc
Diffstat (limited to 'packages/SettingsLib/src')
-rw-r--r-- | packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index ad196b8c1f7b..4ee9ff059502 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -658,12 +658,9 @@ public abstract class InfoMediaManager { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { RouteListingPreference routeListingPreference = getRouteListingPreference(); if (routeListingPreference != null) { - final List<RouteListingPreference.Item> preferenceRouteListing = - Api34Impl.composePreferenceRouteListing( - routeListingPreference); availableRoutes = Api34Impl.arrangeRouteListByPreference(selectedRoutes, getAvailableRoutesFromRouter(), - preferenceRouteListing); + routeListingPreference); } return Api34Impl.filterDuplicatedIds(availableRoutes); } else { @@ -760,11 +757,15 @@ public abstract class InfoMediaManager { @DoNotInline static List<RouteListingPreference.Item> composePreferenceRouteListing( RouteListingPreference routeListingPreference) { + boolean preferRouteListingOrdering = + com.android.media.flags.Flags.enableOutputSwitcherSessionGrouping() + && preferRouteListingOrdering(routeListingPreference); List<RouteListingPreference.Item> finalizedItemList = new ArrayList<>(); List<RouteListingPreference.Item> itemList = routeListingPreference.getItems(); for (RouteListingPreference.Item item : itemList) { // Put suggested devices on the top first before further organization - if ((item.getFlags() & RouteListingPreference.Item.FLAG_SUGGESTED) != 0) { + if (!preferRouteListingOrdering + && (item.getFlags() & RouteListingPreference.Item.FLAG_SUGGESTED) != 0) { finalizedItemList.add(0, item); } else { finalizedItemList.add(item); @@ -792,7 +793,7 @@ public abstract class InfoMediaManager { * Returns an ordered list of available devices based on the provided {@code * routeListingPreferenceItems}. * - * <p>The result has the following order: + * <p>The resulting order if enableOutputSwitcherSessionGrouping is disabled is: * * <ol> * <li>Selected routes. @@ -800,22 +801,54 @@ public abstract class InfoMediaManager { * <li>Not-selected, non-system, available routes sorted by route listing preference. * </ol> * + * <p>The resulting order if enableOutputSwitcherSessionGrouping is enabled is: + * + * <ol> + * <li>Selected routes sorted by route listing preference. + * <li>Selected routes not defined by route listing preference. + * <li>Not-selected system routes. + * <li>Not-selected, non-system, available routes sorted by route listing preference. + * </ol> + * + * * @param selectedRoutes List of currently selected routes. * @param availableRoutes List of available routes that match the app's requested route * features. - * @param routeListingPreferenceItems Ordered list of {@link RouteListingPreference.Item} to - * sort routes with. + * @param routeListingPreference Preferences provided by the app to determine route order. */ @DoNotInline static List<MediaRoute2Info> arrangeRouteListByPreference( List<MediaRoute2Info> selectedRoutes, List<MediaRoute2Info> availableRoutes, - List<RouteListingPreference.Item> routeListingPreferenceItems) { + RouteListingPreference routeListingPreference) { + final List<RouteListingPreference.Item> routeListingPreferenceItems = + Api34Impl.composePreferenceRouteListing(routeListingPreference); + Set<String> sortedRouteIds = new LinkedHashSet<>(); + boolean addSelectedRlpItemsFirst = + com.android.media.flags.Flags.enableOutputSwitcherSessionGrouping() + && preferRouteListingOrdering(routeListingPreference); + Set<String> selectedRouteIds = new HashSet<>(); + + if (addSelectedRlpItemsFirst) { + // Add selected RLP items first + for (MediaRoute2Info selectedRoute : selectedRoutes) { + selectedRouteIds.add(selectedRoute.getId()); + } + for (RouteListingPreference.Item item: routeListingPreferenceItems) { + if (selectedRouteIds.contains(item.getRouteId())) { + sortedRouteIds.add(item.getRouteId()); + } + } + } + // Add selected routes first. - for (MediaRoute2Info selectedRoute : selectedRoutes) { - sortedRouteIds.add(selectedRoute.getId()); + if (com.android.media.flags.Flags.enableOutputSwitcherSessionGrouping() + && sortedRouteIds.size() != selectedRoutes.size()) { + for (MediaRoute2Info selectedRoute : selectedRoutes) { + sortedRouteIds.add(selectedRoute.getId()); + } } // Add not-yet-added system routes. |