summaryrefslogtreecommitdiff
path: root/packages/SettingsLib/src
diff options
context:
space:
mode:
author Shenqiu Zhang <shenqiuz@google.com> 2025-01-15 04:02:29 +0000
committer Shenqiu Zhang <shenqiuz@google.com> 2025-01-31 23:16:57 +0000
commit14ceac3c3da240934f161b6e7840c4181c26981f (patch)
tree94839003caebffe3d8ea8cd7c30e3ddae803ce53 /packages/SettingsLib/src
parentec28bbfb6a315a5122a4ae770c5bd06f0ba8bb9c (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')
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java24
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java11
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java11
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java38
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());
}