diff options
author | 2025-01-15 04:02:29 +0000 | |
---|---|---|
committer | 2025-01-31 23:16:57 +0000 | |
commit | 14ceac3c3da240934f161b6e7840c4181c26981f (patch) | |
tree | 94839003caebffe3d8ea8cd7c30e3ddae803ce53 /packages/SettingsLib/src | |
parent | ec28bbfb6a315a5122a4ae770c5bd06f0ba8bb9c (diff) |
Output Switcher shouldn't enable transfer when apps don't support
If a media route provider can support transfer, the route will be marked
as transferable. If the app can support transfer, the app will include
the route in the RouteListingPreference. If neither the media route
provider nor the app could support transfer, then the route can't
support transfer and the full item shouldn't be clickable when the route
is selectable to support expansion.
Flag: com.android.media.flags.disable_transfer_when_apps_do_not_support
Test: presubmit and manually tested with demo app
Bug: b/373404114
Fix: b/373404114
Change-Id: Ic8c41563df4e5e0e6b1ddff557f88dcc765c2f1f
Diffstat (limited to 'packages/SettingsLib/src')
6 files changed, 78 insertions, 18 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index 4ee9ff059502..ceb6f7b080df 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -16,8 +16,6 @@ package com.android.settingslib.media; import static android.media.MediaRoute2Info.TYPE_AUX_LINE; -import static android.media.MediaRoute2Info.TYPE_LINE_ANALOG; -import static android.media.MediaRoute2Info.TYPE_LINE_DIGITAL; import static android.media.MediaRoute2Info.TYPE_BLE_HEADSET; import static android.media.MediaRoute2Info.TYPE_BLUETOOTH_A2DP; import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; @@ -27,6 +25,8 @@ import static android.media.MediaRoute2Info.TYPE_HDMI; import static android.media.MediaRoute2Info.TYPE_HDMI_ARC; import static android.media.MediaRoute2Info.TYPE_HDMI_EARC; import static android.media.MediaRoute2Info.TYPE_HEARING_AID; +import static android.media.MediaRoute2Info.TYPE_LINE_ANALOG; +import static android.media.MediaRoute2Info.TYPE_LINE_DIGITAL; import static android.media.MediaRoute2Info.TYPE_REMOTE_AUDIO_VIDEO_RECEIVER; import static android.media.MediaRoute2Info.TYPE_REMOTE_CAR; import static android.media.MediaRoute2Info.TYPE_REMOTE_COMPUTER; @@ -254,6 +254,10 @@ public abstract class InfoMediaManager { protected abstract List<MediaRoute2Info> getSelectableRoutes(@NonNull RoutingSessionInfo info); @NonNull + protected abstract List<MediaRoute2Info> getTransferableRoutes( + @NonNull RoutingSessionInfo info); + + @NonNull protected abstract List<MediaRoute2Info> getDeselectableRoutes( @NonNull RoutingSessionInfo info); @@ -519,6 +523,22 @@ public abstract class InfoMediaManager { } /** + * Returns the list of {@link MediaDevice media devices} that can be transferred to with the + * current {@link RoutingSessionInfo routing session} by the media route provider. + */ + @NonNull + List<MediaDevice> getTransferableMediaDevices() { + final RoutingSessionInfo info = getActiveRoutingSession(); + + final List<MediaDevice> deviceList = new ArrayList<>(); + for (MediaRoute2Info route : getTransferableRoutes(info)) { + deviceList.add( + new InfoMediaDevice(mContext, route, mPreferenceItemMap.get(route.getId()))); + } + return deviceList; + } + + /** * Returns the list of {@link MediaDevice media devices} that can be deselected from the current * {@link RoutingSessionInfo routing session}. */ diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index fe6659d1dc4f..76f366d3d1b6 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -352,6 +352,17 @@ public class LocalMediaManager implements BluetoothCallback { } /** + * Gets the MediaDevice list that can be transferred to with the current media session by the + * media route provider. + * + * @return list of MediaDevice + */ + @NonNull + public List<MediaDevice> getTransferableMediaDevices() { + return mInfoMediaManager.getTransferableMediaDevices(); + } + + /** * Get the MediaDevice list that can be removed from current media session. * * @return list of MediaDevice diff --git a/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java index 82b197682459..9e511ffb4e34 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java @@ -117,6 +117,12 @@ public class ManagerInfoMediaManager extends InfoMediaManager { @Override @NonNull + protected List<MediaRoute2Info> getTransferableRoutes(@NonNull RoutingSessionInfo info) { + return mRouterManager.getTransferableRoutes(info); + } + + @Override + @NonNull protected List<MediaRoute2Info> getDeselectableRoutes(@NonNull RoutingSessionInfo info) { return mRouterManager.getDeselectableRoutes(info); } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java index b01b7c9048ba..d018d1404623 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java @@ -15,6 +15,7 @@ */ package com.android.settingslib.media; +import static android.media.MediaRoute2Info.TYPE_AUX_LINE; import static android.media.MediaRoute2Info.TYPE_BLE_HEADSET; import static android.media.MediaRoute2Info.TYPE_BLUETOOTH_A2DP; import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; @@ -24,6 +25,8 @@ import static android.media.MediaRoute2Info.TYPE_HDMI; import static android.media.MediaRoute2Info.TYPE_HDMI_ARC; import static android.media.MediaRoute2Info.TYPE_HDMI_EARC; import static android.media.MediaRoute2Info.TYPE_HEARING_AID; +import static android.media.MediaRoute2Info.TYPE_LINE_ANALOG; +import static android.media.MediaRoute2Info.TYPE_LINE_DIGITAL; import static android.media.MediaRoute2Info.TYPE_REMOTE_AUDIO_VIDEO_RECEIVER; import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; import static android.media.MediaRoute2Info.TYPE_REMOTE_TV; @@ -33,9 +36,6 @@ import static android.media.MediaRoute2Info.TYPE_USB_DEVICE; import static android.media.MediaRoute2Info.TYPE_USB_HEADSET; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; -import static android.media.MediaRoute2Info.TYPE_LINE_DIGITAL; -import static android.media.MediaRoute2Info.TYPE_LINE_ANALOG; -import static android.media.MediaRoute2Info.TYPE_AUX_LINE; import static android.media.RouteListingPreference.Item.FLAG_ONGOING_SESSION; import static android.media.RouteListingPreference.Item.FLAG_ONGOING_SESSION_MANAGED; import static android.media.RouteListingPreference.Item.FLAG_SUGGESTED; @@ -244,6 +244,11 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { */ public abstract String getId(); + /** Returns {@code true} if the device has a non-null {@link RouteListingPreference.Item}. */ + public boolean hasRouteListingPreferenceItem() { + return mItem != null; + } + /** * Get selection behavior of device * diff --git a/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java index 2c7ec9302117..9fe5b1d58752 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java @@ -114,6 +114,12 @@ import java.util.List; @NonNull @Override + protected List<MediaRoute2Info> getTransferableRoutes(@NonNull RoutingSessionInfo info) { + return Collections.emptyList(); + } + + @NonNull + @Override protected List<MediaRoute2Info> getDeselectableRoutes(@NonNull RoutingSessionInfo info) { return Collections.emptyList(); } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java index eced7b3a116b..6a2da182dbb1 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java @@ -203,6 +203,13 @@ public final class RouterInfoMediaManager extends InfoMediaManager { @NonNull @Override + protected List<MediaRoute2Info> getTransferableRoutes(@NonNull RoutingSessionInfo info) { + RoutingController controller = getControllerForSession(info); + return getTransferableRoutes(controller); + } + + @NonNull + @Override protected List<MediaRoute2Info> getSelectedRoutes(@NonNull RoutingSessionInfo info) { RoutingController controller = getControllerForSession(info); if (controller == null) { @@ -272,22 +279,27 @@ public final class RouterInfoMediaManager extends InfoMediaManager { protected List<MediaRoute2Info> getTransferableRoutes(@NonNull String packageName) { List<RoutingController> controllers = mRouter.getControllers(); RoutingController activeController = controllers.get(controllers.size() - 1); - HashMap<String, MediaRoute2Info> transferableRoutes = new HashMap<>(); - - activeController - .getTransferableRoutes() - .forEach(route -> transferableRoutes.put(route.getId(), route)); + return getTransferableRoutes(activeController); + } - if (activeController.getRoutingSessionInfo().isSystemSession()) { - mRouter.getRoutes().stream() - .filter(route -> !route.isSystemRoute()) - .forEach(route -> transferableRoutes.put(route.getId(), route)); - } else { - mRouter.getRoutes().stream() - .filter(route -> route.isSystemRoute()) + @NonNull + private List<MediaRoute2Info> getTransferableRoutes(@Nullable RoutingController controller) { + HashMap<String, MediaRoute2Info> transferableRoutes = new HashMap<>(); + if (controller != null) { + controller + .getTransferableRoutes() .forEach(route -> transferableRoutes.put(route.getId(), route)); - } + if (controller.getRoutingSessionInfo().isSystemSession()) { + mRouter.getRoutes().stream() + .filter(route -> !route.isSystemRoute()) + .forEach(route -> transferableRoutes.put(route.getId(), route)); + } else { + mRouter.getRoutes().stream() + .filter(route -> route.isSystemRoute()) + .forEach(route -> transferableRoutes.put(route.getId(), route)); + } + } return new ArrayList<>(transferableRoutes.values()); } |