Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6e1d3101 authored by Kyunglyul Hyun's avatar Kyunglyul Hyun Committed by Android (Google) Code Review
Browse files

Merge "Unhide MediaRouter2 and MediaRoute2ProviderService"

parents 2d27522e 616096e8
Loading
Loading
Loading
Loading
+83 −0
Original line number Diff line number Diff line
@@ -26297,6 +26297,59 @@ package android.media {
    field public static final int SURFACE = 2; // 0x2
  }
  public final class MediaRoute2Info implements android.os.Parcelable {
    method public int describeContents();
    method public int getConnectionState();
    method @Nullable public CharSequence getDescription();
    method public int getDeviceType();
    method @Nullable public android.os.Bundle getExtras();
    method @NonNull public java.util.List<java.lang.String> getFeatures();
    method @Nullable public android.net.Uri getIconUri();
    method @NonNull public String getId();
    method @NonNull public CharSequence getName();
    method public int getVolume();
    method public int getVolumeHandling();
    method public int getVolumeMax();
    method public boolean hasAnyFeatures(@NonNull java.util.Collection<java.lang.String>);
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field public static final int CONNECTION_STATE_CONNECTED = 2; // 0x2
    field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1
    field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0
    field @NonNull public static final android.os.Parcelable.Creator<android.media.MediaRoute2Info> CREATOR;
    field public static final int DEVICE_TYPE_BLUETOOTH = 3; // 0x3
    field public static final int DEVICE_TYPE_REMOTE_SPEAKER = 2; // 0x2
    field public static final int DEVICE_TYPE_REMOTE_TV = 1; // 0x1
    field public static final int DEVICE_TYPE_UNKNOWN = 0; // 0x0
    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
  }
  public static final class MediaRoute2Info.Builder {
    ctor public MediaRoute2Info.Builder(@NonNull String, @NonNull CharSequence);
    ctor public MediaRoute2Info.Builder(@NonNull android.media.MediaRoute2Info);
    method @NonNull public android.media.MediaRoute2Info.Builder addFeature(@NonNull String);
    method @NonNull public android.media.MediaRoute2Info.Builder addFeatures(@NonNull java.util.Collection<java.lang.String>);
    method @NonNull public android.media.MediaRoute2Info build();
    method @NonNull public android.media.MediaRoute2Info.Builder clearFeatures();
    method @NonNull public android.media.MediaRoute2Info.Builder setClientPackageName(@Nullable String);
    method @NonNull public android.media.MediaRoute2Info.Builder setConnectionState(int);
    method @NonNull public android.media.MediaRoute2Info.Builder setDescription(@Nullable CharSequence);
    method @NonNull public android.media.MediaRoute2Info.Builder setDeviceType(int);
    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 @NonNull public android.media.MediaRoute2Info.Builder setVolume(int);
    method @NonNull public android.media.MediaRoute2Info.Builder setVolumeHandling(int);
    method @NonNull public android.media.MediaRoute2Info.Builder setVolumeMax(int);
  }
  public abstract class MediaRoute2ProviderService extends android.app.Service {
    ctor public MediaRoute2ProviderService();
    method public final void notifyRoutes(@NonNull java.util.Collection<android.media.MediaRoute2Info>);
    method @NonNull public android.os.IBinder onBind(@NonNull android.content.Intent);
    method public void onDiscoveryPreferenceChanged(@NonNull android.media.RouteDiscoveryPreference);
    field public static final String SERVICE_INTERFACE = "android.media.MediaRoute2ProviderService";
  }
  public class MediaRouter {
    method public void addCallback(int, android.media.MediaRouter.Callback);
    method public void addCallback(int, android.media.MediaRouter.Callback, int);
@@ -26420,6 +26473,20 @@ package android.media {
    method public abstract void onVolumeUpdateRequest(android.media.MediaRouter.RouteInfo, int);
  }
  public class MediaRouter2 {
    method @NonNull public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context);
    method @NonNull public java.util.List<android.media.MediaRoute2Info> getRoutes();
    method public void registerRouteCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaRouter2.RouteCallback, @NonNull android.media.RouteDiscoveryPreference);
    method public void unregisterRouteCallback(@NonNull android.media.MediaRouter2.RouteCallback);
  }
  public static class MediaRouter2.RouteCallback {
    ctor public MediaRouter2.RouteCallback();
    method public void onRoutesAdded(@NonNull java.util.List<android.media.MediaRoute2Info>);
    method public void onRoutesChanged(@NonNull java.util.List<android.media.MediaRoute2Info>);
    method public void onRoutesRemoved(@NonNull java.util.List<android.media.MediaRoute2Info>);
  }
  public class MediaScannerConnection implements android.content.ServiceConnection {
    ctor public MediaScannerConnection(android.content.Context, android.media.MediaScannerConnection.MediaScannerConnectionClient);
    method public void connect();
@@ -26778,6 +26845,22 @@ package android.media {
    field public static final int URI_COLUMN_INDEX = 2; // 0x2
  }
  public final class RouteDiscoveryPreference implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public java.util.List<java.lang.String> getPreferredFeatures();
    method public boolean isActiveScan();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.media.RouteDiscoveryPreference> CREATOR;
  }
  public static final class RouteDiscoveryPreference.Builder {
    ctor public RouteDiscoveryPreference.Builder(@NonNull java.util.List<java.lang.String>, boolean);
    ctor public RouteDiscoveryPreference.Builder(@NonNull android.media.RouteDiscoveryPreference);
    method @NonNull public android.media.RouteDiscoveryPreference build();
    method @NonNull public android.media.RouteDiscoveryPreference.Builder setActiveScan(boolean);
    method @NonNull public android.media.RouteDiscoveryPreference.Builder setPreferredFeatures(@NonNull java.util.List<java.lang.String>);
  }
  public final class Session2Command implements android.os.Parcelable {
    ctor public Session2Command(int);
    ctor public Session2Command(@NonNull String, @Nullable android.os.Bundle);
+2 −1
Original line number Diff line number Diff line
@@ -24,7 +24,8 @@ import android.media.IMediaRoute2ProviderClient;
 */
oneway interface IMediaRoute2Provider {
    void setClient(IMediaRoute2ProviderClient client);
    void requestCreateSession(String packageName, String routeId, String routeType, long requestId);
    void requestCreateSession(String packageName, String routeId,
            String routeFeature, long requestId);
    void releaseSession(String sessionId);

    void selectRoute(String sessionId, String routeId);
+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ import android.media.MediaRoute2Info;
 */
oneway interface IMediaRouter2Manager {
    void notifyRouteSelected(String packageName, in MediaRoute2Info route);
    void notifyRouteTypesChanged(String packageName, in List<String> routeTypes);
    void notifyPreferredFeaturesChanged(String packageName, in List<String> preferredFeatures);
    void notifyRoutesAdded(in List<MediaRoute2Info> routes);
    void notifyRoutesRemoved(in List<MediaRoute2Info> routes);
    void notifyRoutesChanged(in List<MediaRoute2Info> routes);
+3 −3
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import android.media.IMediaRouter2Manager;
import android.media.IMediaRouterClient;
import android.media.MediaRoute2Info;
import android.media.MediaRouterClientState;
import android.media.RouteDiscoveryRequest;
import android.media.RouteDiscoveryPreference;
import android.media.RouteSessionInfo;

/**
@@ -52,8 +52,8 @@ interface IMediaRouterService {
    void requestUpdateVolume2(IMediaRouter2Client client, in MediaRoute2Info route, int direction);

    void requestCreateSession(IMediaRouter2Client client, in MediaRoute2Info route,
            String routeType, int requestId);
    void setDiscoveryRequest2(IMediaRouter2Client client, in RouteDiscoveryRequest request);
            String routeFeature, int requestId);
    void setDiscoveryRequest2(IMediaRouter2Client client, in RouteDiscoveryPreference preference);
    void selectRoute(IMediaRouter2Client client, String sessionId, in MediaRoute2Info route);
    void deselectRoute(IMediaRouter2Client client, String sessionId, in MediaRoute2Info route);
    void transferToRoute(IMediaRouter2Client client, String sessionId, in MediaRoute2Info route);
+66 −83
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import java.util.Objects;

/**
 * Describes the properties of a route.
 * @hide
 */
public final class MediaRoute2Info implements Parcelable {
    @NonNull
@@ -56,7 +55,7 @@ public final class MediaRoute2Info implements Parcelable {
    @IntDef({CONNECTION_STATE_DISCONNECTED, CONNECTION_STATE_CONNECTING,
            CONNECTION_STATE_CONNECTED})
    @Retention(RetentionPolicy.SOURCE)
    private @interface ConnectionState {}
    public @interface ConnectionState {}

    /**
     * The default connection state indicating the route is disconnected.
@@ -99,16 +98,15 @@ public final class MediaRoute2Info implements Parcelable {

    /** @hide */
    @IntDef({
            DEVICE_TYPE_UNKNOWN, DEVICE_TYPE_TV,
            DEVICE_TYPE_SPEAKER, DEVICE_TYPE_BLUETOOTH})
            DEVICE_TYPE_UNKNOWN, DEVICE_TYPE_REMOTE_TV,
            DEVICE_TYPE_REMOTE_SPEAKER, DEVICE_TYPE_BLUETOOTH})
    @Retention(RetentionPolicy.SOURCE)
    private @interface DeviceType {}
    public @interface DeviceType {}

    /**
     * The default receiver device type of the route indicating the type is unknown.
     *
     * @see #getDeviceType
     * @hide
     */
    public static final int DEVICE_TYPE_UNKNOWN = 0;

@@ -118,7 +116,7 @@ public final class MediaRoute2Info implements Parcelable {
     *
     * @see #getDeviceType
     */
    public static final int DEVICE_TYPE_TV = 1;
    public static final int DEVICE_TYPE_REMOTE_TV = 1;

    /**
     * A receiver device type of the route indicating the presentation of the media is happening
@@ -126,14 +124,13 @@ public final class MediaRoute2Info implements Parcelable {
     *
     * @see #getDeviceType
     */
    public static final int DEVICE_TYPE_SPEAKER = 2;
    public static final int DEVICE_TYPE_REMOTE_SPEAKER = 2;

    /**
     * A receiver device type of the route indicating the presentation of the media is happening
     * on a bluetooth device such as a bluetooth speaker.
     *
     * @see #getDeviceType
     * @hide
     */
    public static final int DEVICE_TYPE_BLUETOOTH = 3;

@@ -152,7 +149,7 @@ public final class MediaRoute2Info implements Parcelable {
    @Nullable
    final String mClientPackageName;
    @NonNull
    final List<String> mRouteTypes;
    final List<String> mFeatures;
    final int mVolume;
    final int mVolumeMax;
    final int mVolumeHandling;
@@ -168,7 +165,7 @@ public final class MediaRoute2Info implements Parcelable {
        mConnectionState = builder.mConnectionState;
        mIconUri = builder.mIconUri;
        mClientPackageName = builder.mClientPackageName;
        mRouteTypes = builder.mRouteTypes;
        mFeatures = builder.mFeatures;
        mVolume = builder.mVolume;
        mVolumeMax = builder.mVolumeMax;
        mVolumeHandling = builder.mVolumeHandling;
@@ -184,7 +181,7 @@ public final class MediaRoute2Info implements Parcelable {
        mConnectionState = in.readInt();
        mIconUri = in.readParcelable(null);
        mClientPackageName = in.readString();
        mRouteTypes = in.createStringArrayList();
        mFeatures = in.createStringArrayList();
        mVolume = in.readInt();
        mVolumeMax = in.readInt();
        mVolumeHandling = in.readInt();
@@ -223,7 +220,7 @@ public final class MediaRoute2Info implements Parcelable {
                && (mConnectionState == other.mConnectionState)
                && Objects.equals(mIconUri, other.mIconUri)
                && Objects.equals(mClientPackageName, other.mClientPackageName)
                && Objects.equals(mRouteTypes, other.mRouteTypes)
                && Objects.equals(mFeatures, other.mFeatures)
                && (mVolume == other.mVolume)
                && (mVolumeMax == other.mVolumeMax)
                && (mVolumeHandling == other.mVolumeHandling)
@@ -235,7 +232,7 @@ public final class MediaRoute2Info implements Parcelable {
    @Override
    public int hashCode() {
        return Objects.hash(mId, mName, mDescription, mConnectionState, mIconUri,
                mRouteTypes, mVolume, mVolumeMax, mVolumeHandling, mDeviceType);
                mFeatures, mVolume, mVolumeMax, mVolumeHandling, mDeviceType);
    }

    /**
@@ -245,7 +242,7 @@ public final class MediaRoute2Info implements Parcelable {
     * In order to ensure uniqueness in {@link MediaRouter2} side, the value of this method
     * can be different from what was set in {@link MediaRoute2ProviderService}.
     *
     * @see Builder#setId(String)
     * @see Builder#Builder(String, CharSequence)
     */
    @NonNull
    public String getId() {
@@ -257,7 +254,7 @@ public final class MediaRoute2Info implements Parcelable {
    }

    /**
     * Gets the original id set by {@link Builder#setId(String)}.
     * Gets the original id set by {@link Builder#Builder(String, CharSequence)}.
     * @hide
     */
    @NonNull
@@ -324,16 +321,16 @@ public final class MediaRoute2Info implements Parcelable {
     * Gets the supported categories of the route.
     */
    @NonNull
    public List<String> getRouteTypes() {
        return mRouteTypes;
    public List<String> getFeatures() {
        return mFeatures;
    }

    //TODO: once device types are confirmed, reflect those into the comment.
    /**
     * Gets the type of the receiver device associated with this route.
     *
     * @return The type of the receiver device associated with this route:
     * {@link #DEVICE_TYPE_TV} or {@link #DEVICE_TYPE_SPEAKER}.
     * {@link #DEVICE_TYPE_REMOTE_TV}, {@link #DEVICE_TYPE_REMOTE_SPEAKER},
     * {@link #DEVICE_TYPE_BLUETOOTH}.
     */
    @DeviceType
    public int getDeviceType() {
@@ -369,15 +366,15 @@ public final class MediaRoute2Info implements Parcelable {
    }

    /**
     * Returns if the route contains at least one of the specified route types.
     * Returns if the route has at least one of the specified route features.
     *
     * @param routeTypes the list of route types to consider
     * @return true if the route contains at least one type in the list
     * @param features the list of route features to consider
     * @return true if the route has at least one feature in the list
     */
    public boolean containsRouteTypes(@NonNull Collection<String> routeTypes) {
        Objects.requireNonNull(routeTypes, "routeTypes must not be null");
        for (String routeType : routeTypes) {
            if (getRouteTypes().contains(routeType)) {
    public boolean hasAnyFeatures(@NonNull Collection<String> features) {
        Objects.requireNonNull(features, "features must not be null");
        for (String feature : features) {
            if (getFeatures().contains(feature)) {
                return true;
            }
        }
@@ -398,7 +395,7 @@ public final class MediaRoute2Info implements Parcelable {
        dest.writeInt(mConnectionState);
        dest.writeParcelable(mIconUri, flags);
        dest.writeString(mClientPackageName);
        dest.writeStringList(mRouteTypes);
        dest.writeStringList(mFeatures);
        dest.writeInt(mVolume);
        dest.writeInt(mVolumeMax);
        dest.writeInt(mVolumeHandling);
@@ -428,15 +425,15 @@ public final class MediaRoute2Info implements Parcelable {
     * Builder for {@link MediaRoute2Info media route info}.
     */
    public static final class Builder {
        String mId;
        final String mId;
        String mProviderId;
        CharSequence mName;
        final CharSequence mName;
        CharSequence mDescription;
        @ConnectionState
        int mConnectionState;
        Uri mIconUri;
        String mClientPackageName;
        List<String> mRouteTypes;
        List<String> mFeatures;
        int mVolume;
        int mVolumeMax;
        int mVolumeHandling = PLAYBACK_VOLUME_FIXED;
@@ -444,27 +441,43 @@ public final class MediaRoute2Info implements Parcelable {
        int mDeviceType = DEVICE_TYPE_UNKNOWN;
        Bundle mExtras;

        /**
         * Constructor for builder to create {@link MediaRoute2Info}.
         * <p>
         * In order to ensure ID uniqueness, the {@link MediaRoute2Info#getId() ID} of a route info
         * obtained from {@link MediaRouter2} can be different from what was set in
         * {@link MediaRoute2ProviderService}.
         * </p>
         * @param id
         * @param name
         */
        public Builder(@NonNull String id, @NonNull CharSequence name) {
            setId(id);
            setName(name);
            mRouteTypes = new ArrayList<>();
            if (TextUtils.isEmpty(id)) {
                throw new IllegalArgumentException("id must not be empty");
            }
            if (TextUtils.isEmpty(name)) {
                throw new IllegalArgumentException("name must not be empty");
            }
            mId = id;
            mName = name;
            mFeatures = new ArrayList<>();
        }

        public Builder(@NonNull MediaRoute2Info routeInfo) {
            if (routeInfo == null) {
                throw new IllegalArgumentException("route info must not be null");
            }
            mId = routeInfo.mId;
            mName = routeInfo.mName;

            setId(routeInfo.mId);
            if (!TextUtils.isEmpty(routeInfo.mProviderId)) {
                setProviderId(routeInfo.mProviderId);
            }
            setName(routeInfo.mName);
            mDescription = routeInfo.mDescription;
            mConnectionState = routeInfo.mConnectionState;
            mIconUri = routeInfo.mIconUri;
            setClientPackageName(routeInfo.mClientPackageName);
            setRouteTypes(routeInfo.mRouteTypes);
            mFeatures = new ArrayList<>(routeInfo.mFeatures);
            setVolume(routeInfo.mVolume);
            setVolumeMax(routeInfo.mVolumeMax);
            setVolumeHandling(routeInfo.mVolumeHandling);
@@ -474,26 +487,6 @@ public final class MediaRoute2Info implements Parcelable {
            }
        }

        /**
         * Sets the unique id of the route. The value given here must be unique for each of your
         * route.
         * <p>
         * In order to ensure uniqueness in {@link MediaRouter2} side, the value of
         * {@link MediaRoute2Info#getId()} can be different from what was set in
         * {@link MediaRoute2ProviderService}.
         * </p>
         *
         * @see MediaRoute2Info#getId()
         */
        @NonNull
        public Builder setId(@NonNull String id) {
            if (TextUtils.isEmpty(id)) {
                throw new IllegalArgumentException("id must not be null or empty");
            }
            mId = id;
            return this;
        }

        /**
         * Sets the provider id of the route.
         * @hide
@@ -507,21 +500,11 @@ public final class MediaRoute2Info implements Parcelable {
            return this;
        }

        /**
         * Sets the user-visible name of the route.
         */
        @NonNull
        public Builder setName(@NonNull CharSequence name) {
            Objects.requireNonNull(name, "name must not be null");
            mName = name;
            return this;
        }

        /**
         * Sets the user-visible description of the route.
         */
        @NonNull
        public Builder setDescription(@Nullable String description) {
        public Builder setDescription(@Nullable CharSequence description) {
            mDescription = description;
            return this;
        }
@@ -569,35 +552,35 @@ public final class MediaRoute2Info implements Parcelable {
        }

        /**
         * Sets the types of the route.
         * Clears the features of the route.
         */
        @NonNull
        public Builder setRouteTypes(@NonNull Collection<String> routeTypes) {
            mRouteTypes = new ArrayList<>();
            return addRouteTypes(routeTypes);
        public Builder clearFeatures() {
            mFeatures = new ArrayList<>();
            return this;
        }

        /**
         * Adds types for the route.
         * Adds features for the route.
         */
        @NonNull
        public Builder addRouteTypes(@NonNull Collection<String> routeTypes) {
            Objects.requireNonNull(routeTypes, "routeTypes must not be null");
            for (String routeType: routeTypes) {
                addRouteType(routeType);
        public Builder addFeatures(@NonNull Collection<String> features) {
            Objects.requireNonNull(features, "features must not be null");
            for (String feature : features) {
                addFeature(feature);
            }
            return this;
        }

        /**
         * Add a type for the route.
         * Adds a feature for the route.
         */
        @NonNull
        public Builder addRouteType(@NonNull String routeType) {
            if (TextUtils.isEmpty(routeType)) {
                throw new IllegalArgumentException("routeType must not be null or empty");
        public Builder addFeature(@NonNull String feature) {
            if (TextUtils.isEmpty(feature)) {
                throw new IllegalArgumentException("feature must not be null or empty");
            }
            mRouteTypes.add(routeType);
            mFeatures.add(feature);
            return this;
        }

@@ -642,7 +625,7 @@ public final class MediaRoute2Info implements Parcelable {
         */
        @NonNull
        public Builder setExtras(@Nullable Bundle extras) {
            mExtras = extras;
            mExtras = new Bundle(extras);
            return this;
        }

Loading