summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt4
-rw-r--r--media/java/android/media/MediaRoute2Info.java104
2 files changed, 108 insertions, 0 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index 6aef9dd83085..bd5614f54e91 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -24854,6 +24854,7 @@ package android.media {
method @NonNull public String getId();
method @NonNull public CharSequence getName();
method @FlaggedApi("com.android.media.flags.enable_built_in_speaker_route_suitability_statuses") public int getSuitabilityStatus();
+ method @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public int getSupportedRoutingTypes();
method public int getType();
method public int getVolume();
method public int getVolumeHandling();
@@ -24869,6 +24870,8 @@ package android.media {
field public static final String FEATURE_REMOTE_AUDIO_PLAYBACK = "android.media.route.feature.REMOTE_AUDIO_PLAYBACK";
field public static final String FEATURE_REMOTE_PLAYBACK = "android.media.route.feature.REMOTE_PLAYBACK";
field public static final String FEATURE_REMOTE_VIDEO_PLAYBACK = "android.media.route.feature.REMOTE_VIDEO_PLAYBACK";
+ field @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public static final int FLAG_ROUTING_TYPE_REMOTE = 4; // 0x4
+ field @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public static final int FLAG_ROUTING_TYPE_SYSTEM_AUDIO = 1; // 0x1
field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
field @FlaggedApi("com.android.media.flags.enable_built_in_speaker_route_suitability_statuses") public static final int SUITABILITY_STATUS_NOT_SUITABLE_FOR_TRANSFER = 2; // 0x2
@@ -24919,6 +24922,7 @@ package android.media {
method @NonNull public android.media.MediaRoute2Info.Builder setExtras(@Nullable android.os.Bundle);
method @NonNull public android.media.MediaRoute2Info.Builder setIconUri(@Nullable android.net.Uri);
method @FlaggedApi("com.android.media.flags.enable_built_in_speaker_route_suitability_statuses") @NonNull public android.media.MediaRoute2Info.Builder setSuitabilityStatus(int);
+ method @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") @NonNull public android.media.MediaRoute2Info.Builder setSupportedRoutingTypes(int);
method @NonNull public android.media.MediaRoute2Info.Builder setType(int);
method @NonNull public android.media.MediaRoute2Info.Builder setVisibilityPublic();
method @NonNull public android.media.MediaRoute2Info.Builder setVisibilityRestricted(@NonNull java.util.Set<java.lang.String>);
diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java
index 09022782e6c3..d433ec876af9 100644
--- a/media/java/android/media/MediaRoute2Info.java
+++ b/media/java/android/media/MediaRoute2Info.java
@@ -21,6 +21,7 @@ import static android.media.audio.Flags.FLAG_ENABLE_MULTICHANNEL_GROUP_DEVICE;
import static com.android.media.flags.Flags.FLAG_ENABLE_AUDIO_POLICIES_DEVICE_AND_BLUETOOTH_CONTROLLER;
import static com.android.media.flags.Flags.FLAG_ENABLE_BUILT_IN_SPEAKER_ROUTE_SUITABILITY_STATUSES;
+import static com.android.media.flags.Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2;
import static com.android.media.flags.Flags.FLAG_ENABLE_NEW_MEDIA_ROUTE_2_INFO_TYPES;
import static com.android.media.flags.Flags.FLAG_ENABLE_NEW_WIRED_MEDIA_ROUTE_2_INFO_TYPES;
@@ -421,6 +422,51 @@ public final class MediaRoute2Info implements Parcelable {
*/
public static final int TYPE_GROUP = 2000;
+ /** @hide */
+ @IntDef(
+ prefix = {"ROUTING_TYPE_"},
+ value = {
+ FLAG_ROUTING_TYPE_SYSTEM_AUDIO,
+ FLAG_ROUTING_TYPE_SYSTEM_VIDEO,
+ FLAG_ROUTING_TYPE_REMOTE
+ },
+ flag = true)
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface RoutingType {}
+
+ /**
+ * Indicates that a route supports routing of the system audio.
+ *
+ * <p>Providers that support this type of routing require the {@link
+ * android.Manifest.permission#MODIFY_AUDIO_ROUTING} permission.
+ */
+ @FlaggedApi(FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
+ public static final int FLAG_ROUTING_TYPE_SYSTEM_AUDIO = 1;
+
+ /**
+ * Indicates that a route supports routing of the system video.
+ *
+ * @hide
+ */
+ // TODO: b/380431086 - Enable this API once we add support for system video routing.
+ @FlaggedApi(FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
+ public static final int FLAG_ROUTING_TYPE_SYSTEM_VIDEO = 1 << 1;
+
+ /**
+ * Indicates that a route supports routing playback to remote routes through control commands.
+ *
+ * <p>This type of routing does not affect affect this system's audio or video, but instead
+ * relies on the device that corresponds to this route to fetch and play the media. It also
+ * requires the media app to take care of initializing and controlling playback.
+ */
+ @FlaggedApi(FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
+ public static final int FLAG_ROUTING_TYPE_REMOTE = 1 << 2;
+
+ private static final int FLAG_ROUTING_TYPE_ALL =
+ FLAG_ROUTING_TYPE_SYSTEM_AUDIO
+ | FLAG_ROUTING_TYPE_SYSTEM_VIDEO
+ | FLAG_ROUTING_TYPE_REMOTE;
+
/**
* Route feature: Live audio.
* <p>
@@ -553,6 +599,7 @@ public final class MediaRoute2Info implements Parcelable {
private final List<String> mFeatures;
@Type
private final int mType;
+ @RoutingType private final int mRoutingTypeFlags;
private final boolean mIsSystem;
private final Uri mIconUri;
private final CharSequence mDescription;
@@ -576,6 +623,7 @@ public final class MediaRoute2Info implements Parcelable {
mName = builder.mName;
mFeatures = builder.mFeatures;
mType = builder.mType;
+ mRoutingTypeFlags = builder.mRoutingTypeFlags;
mIsSystem = builder.mIsSystem;
mIconUri = builder.mIconUri;
mDescription = builder.mDescription;
@@ -600,6 +648,7 @@ public final class MediaRoute2Info implements Parcelable {
mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
mFeatures = in.createStringArrayList();
mType = in.readInt();
+ mRoutingTypeFlags = validateRoutingTypeFlags(in.readInt());
mIsSystem = in.readBoolean();
mIconUri = in.readParcelable(null, android.net.Uri.class);
mDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
@@ -660,6 +709,13 @@ public final class MediaRoute2Info implements Parcelable {
return mType;
}
+ /** Returns the flags that indicate the routing types supported by this route. */
+ @RoutingType
+ @FlaggedApi(FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
+ public int getSupportedRoutingTypes() {
+ return mRoutingTypeFlags;
+ }
+
/**
* Returns whether the route is a system route or not.
* <p>
@@ -904,6 +960,7 @@ public final class MediaRoute2Info implements Parcelable {
pw.println(indent + "mName=" + mName);
pw.println(indent + "mFeatures=" + mFeatures);
pw.println(indent + "mType=" + getDeviceTypeString(mType));
+ pw.println(indent + "mRoutingTypeFlags=" + getRoutingTypeFlagsString(mRoutingTypeFlags));
pw.println(indent + "mIsSystem=" + mIsSystem);
pw.println(indent + "mIconUri=" + mIconUri);
pw.println(indent + "mDescription=" + mDescription);
@@ -941,6 +998,7 @@ public final class MediaRoute2Info implements Parcelable {
&& Objects.equals(mName, other.mName)
&& Objects.equals(mFeatures, other.mFeatures)
&& (mType == other.mType)
+ && (mRoutingTypeFlags == other.mRoutingTypeFlags)
&& (mIsSystem == other.mIsSystem)
&& Objects.equals(mIconUri, other.mIconUri)
&& Objects.equals(mDescription, other.mDescription)
@@ -966,6 +1024,7 @@ public final class MediaRoute2Info implements Parcelable {
mName,
mFeatures,
mType,
+ mRoutingTypeFlags,
mIsSystem,
mIconUri,
mDescription,
@@ -994,6 +1053,8 @@ public final class MediaRoute2Info implements Parcelable {
.append(getName())
.append(", type=")
.append(getDeviceTypeString(getType()))
+ .append(", routingTypes=")
+ .append(getRoutingTypeFlagsString(getSupportedRoutingTypes()))
.append(", isSystem=")
.append(isSystemRoute())
.append(", features=")
@@ -1035,6 +1096,7 @@ public final class MediaRoute2Info implements Parcelable {
TextUtils.writeToParcel(mName, dest, flags);
dest.writeStringList(mFeatures);
dest.writeInt(mType);
+ dest.writeInt(mRoutingTypeFlags);
dest.writeBoolean(mIsSystem);
dest.writeParcelable(mIconUri, flags);
TextUtils.writeToParcel(mDescription, dest, flags);
@@ -1143,6 +1205,34 @@ public final class MediaRoute2Info implements Parcelable {
}
}
+ /** Returns a human-readable representation of the given {@code routingTypeFlags}. */
+ private static String getRoutingTypeFlagsString(@RoutingType int routingTypeFlags) {
+ List<String> typeStrings = new ArrayList<>();
+ if ((routingTypeFlags & FLAG_ROUTING_TYPE_SYSTEM_AUDIO) != 0) {
+ typeStrings.add("SYSTEM_AUDIO");
+ }
+ if ((routingTypeFlags & FLAG_ROUTING_TYPE_SYSTEM_VIDEO) != 0) {
+ typeStrings.add("SYSTEM_VIDEO");
+ }
+ if ((routingTypeFlags & FLAG_ROUTING_TYPE_REMOTE) != 0) {
+ typeStrings.add("REMOTE");
+ }
+ return String.join(/* delimiter= */ "|", typeStrings);
+ }
+
+ /**
+ * Throws an {@link IllegalArgumentException} if the provided {@code routingTypeFlags} are not
+ * valid. Otherwise, returns the provided value.
+ */
+ private static int validateRoutingTypeFlags(@RoutingType int routingTypeFlags) {
+ if (routingTypeFlags == 0 || (routingTypeFlags & ~FLAG_ROUTING_TYPE_ALL) != 0) {
+ throw new IllegalArgumentException(
+ "Invalid routing type flags: " + Integer.toHexString(routingTypeFlags));
+ } else {
+ return routingTypeFlags;
+ }
+ }
+
/**
* Builder for {@link MediaRoute2Info media route info}.
*/
@@ -1153,6 +1243,7 @@ public final class MediaRoute2Info implements Parcelable {
@Type
private int mType = TYPE_UNKNOWN;
+ @RoutingType private int mRoutingTypeFlags = FLAG_ROUTING_TYPE_REMOTE;
private boolean mIsSystem;
private Uri mIconUri;
private CharSequence mDescription;
@@ -1224,6 +1315,7 @@ public final class MediaRoute2Info implements Parcelable {
mName = routeInfo.mName;
mFeatures = new ArrayList<>(routeInfo.mFeatures);
mType = routeInfo.mType;
+ mRoutingTypeFlags = routeInfo.mRoutingTypeFlags;
mIsSystem = routeInfo.mIsSystem;
mIconUri = routeInfo.mIconUri;
mDescription = routeInfo.mDescription;
@@ -1301,6 +1393,18 @@ public final class MediaRoute2Info implements Parcelable {
}
/**
+ * Sets the routing types that this route supports.
+ *
+ * @see MediaRoute2Info#getSupportedRoutingTypes()
+ */
+ @NonNull
+ @FlaggedApi(FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
+ public Builder setSupportedRoutingTypes(@RoutingType int routingTypeFlags) {
+ mRoutingTypeFlags = validateRoutingTypeFlags(routingTypeFlags);
+ return this;
+ }
+
+ /**
* Sets whether the route is a system route or not.
* @hide
*/