From 76a75f865eadb26afff8432dcfd6d15a838b41c2 Mon Sep 17 00:00:00 2001 From: Derek Jedral Date: Wed, 8 Jan 2025 00:01:32 +0000 Subject: 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 --- .../settingslib/media/InfoMediaManager.java | 55 +++++++++++++++++----- 1 file changed, 44 insertions(+), 11 deletions(-) (limited to 'packages/SettingsLib/src') 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 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 composePreferenceRouteListing( RouteListingPreference routeListingPreference) { + boolean preferRouteListingOrdering = + com.android.media.flags.Flags.enableOutputSwitcherSessionGrouping() + && preferRouteListingOrdering(routeListingPreference); List finalizedItemList = new ArrayList<>(); List 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}. * - *

The result has the following order: + *

The resulting order if enableOutputSwitcherSessionGrouping is disabled is: * *

    *
  1. Selected routes. @@ -800,22 +801,54 @@ public abstract class InfoMediaManager { *
  2. Not-selected, non-system, available routes sorted by route listing preference. *
* + *

The resulting order if enableOutputSwitcherSessionGrouping is enabled is: + * + *

    + *
  1. Selected routes sorted by route listing preference. + *
  2. Selected routes not defined by route listing preference. + *
  3. Not-selected system routes. + *
  4. Not-selected, non-system, available routes sorted by route listing preference. + *
+ * + * * @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 arrangeRouteListByPreference( List selectedRoutes, List availableRoutes, - List routeListingPreferenceItems) { + RouteListingPreference routeListingPreference) { + final List routeListingPreferenceItems = + Api34Impl.composePreferenceRouteListing(routeListingPreference); + Set sortedRouteIds = new LinkedHashSet<>(); + boolean addSelectedRlpItemsFirst = + com.android.media.flags.Flags.enableOutputSwitcherSessionGrouping() + && preferRouteListingOrdering(routeListingPreference); + Set 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. -- cgit v1.2.3-59-g8ed1b