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

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

Merge "MediaRouter: Make MR2M.CB.onRouteSelected to be called"

parents cc327c3c 13bc105b
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -17,12 +17,13 @@
package android.media;

import android.media.MediaRoute2ProviderInfo;
import android.media.MediaRoute2Info;

/**
 * {@hide}
 */
oneway interface IMediaRouter2Manager {
    void notifyRouteSelected(int uid, String routeId);
    void notifyRouteSelected(int uid, in MediaRoute2Info route);
    void notifyControlCategoriesChanged(int uid, in List<String> categories);
    void notifyProviderInfosUpdated(in List<MediaRoute2ProviderInfo> providers);
}
+16 −2
Original line number Diff line number Diff line
@@ -45,11 +45,25 @@ interface IMediaRouterService {
    void registerClient2AsUser(IMediaRouter2Client client, String packageName, int userId);
    void unregisterClient2(IMediaRouter2Client client);
    void sendControlRequest(IMediaRouter2Client client, in MediaRoute2Info route, in Intent request);
    /**
     * Changes the selected route of the client.
     *
     * @param client Client to change it's selected route.
     * @param route Route to be selected.
     */
    void selectRoute2(IMediaRouter2Client client, in @nullable MediaRoute2Info route);
    void setControlCategories(IMediaRouter2Client client, in List<String> categories);

    void registerManagerAsUser(IMediaRouter2Manager manager,
            String packageName, int userId);
    void unregisterManager(IMediaRouter2Manager manager);
    void setRemoteRoute(IMediaRouter2Manager manager,
            int uid, String routeId, boolean explicit);
    /**
     * Changes the selected route of an application.
     *
     * @param manager Manager that calls the method
     * @param uid UID of the client that will change the selected route.
     * @param route Route to be selected.
     */
    void selectClientRoute2(IMediaRouter2Manager manager, int clientUid,
            in @nullable MediaRoute2Info route);
}
+74 −2
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;

import java.util.Objects;

/**
 * Describes the properties of a route.
 * @hide
@@ -43,6 +45,8 @@ public final class MediaRoute2Info implements Parcelable {

    @NonNull
    final String mId;
    @Nullable
    final String mProviderId;
    @NonNull
    final String mName;
    @Nullable
@@ -52,6 +56,7 @@ public final class MediaRoute2Info implements Parcelable {

    MediaRoute2Info(@NonNull Builder builder) {
        mId = builder.mId;
        mProviderId = builder.mProviderId;
        mName = builder.mName;
        mDescription = builder.mDescription;
        mExtras = builder.mExtras;
@@ -59,28 +64,63 @@ public final class MediaRoute2Info implements Parcelable {

    MediaRoute2Info(@NonNull Parcel in) {
        mId = in.readString();
        mProviderId = in.readString();
        mName = in.readString();
        mDescription = in.readString();
        mExtras = in.readBundle();
    }

    /**
     * Returns true if the route info has all of the required field
     * Returns true if the route info has all of the required field.
     * A route info only obtained from {@link com.android.server.media.MediaRouterService}
     * is valid.
     * @hide
     */
    //TODO: Reconsider the validity of a route info when fields are added.
    public boolean isValid() {
        if (TextUtils.isEmpty(getId()) || TextUtils.isEmpty(getName())) {
        if (TextUtils.isEmpty(getId()) || TextUtils.isEmpty(getName())
                || TextUtils.isEmpty(getProviderId())) {
            return false;
        }
        return true;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof MediaRoute2Info)) {
            return false;
        }
        MediaRoute2Info other = (MediaRoute2Info) obj;
        return Objects.equals(mId, other.mId)
                && Objects.equals(mProviderId, other.mProviderId)
                && Objects.equals(mName, other.mName)
                && Objects.equals(mDescription, other.mDescription)
                //TODO: This will be evaluated as false in most cases. Try not to.
                && Objects.equals(mExtras, other.mExtras);
    }

    @Override
    public int hashCode() {
        return Objects.hash(mId, mName, mDescription);
    }

    @NonNull
    public String getId() {
        return mId;
    }

    /**
     * Gets the provider id of the route.
     * @hide
     */
    @Nullable
    public String getProviderId() {
        return mProviderId;
    }

    @NonNull
    public String getName() {
        return mName;
@@ -104,6 +144,7 @@ public final class MediaRoute2Info implements Parcelable {
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mId);
        dest.writeString(mProviderId);
        dest.writeString(mName);
        dest.writeString(mDescription);
        dest.writeBundle(mExtras);
@@ -115,6 +156,8 @@ public final class MediaRoute2Info implements Parcelable {
                .append("MediaRouteInfo{ ")
                .append("id=").append(getId())
                .append(", name=").append(getName())
                .append(", description=").append(getDescription())
                .append(", providerId=").append(getProviderId())
                .append(" }");
        return result.toString();
    }
@@ -124,6 +167,7 @@ public final class MediaRoute2Info implements Parcelable {
     */
    public static final class Builder {
        String mId;
        String mProviderId;
        String mName;
        String mDescription;
        Bundle mExtras;
@@ -145,8 +189,14 @@ public final class MediaRoute2Info implements Parcelable {
            }

            setId(routeInfo.mId);
            if (!TextUtils.isEmpty(routeInfo.mProviderId)) {
                setProviderId(routeInfo.mProviderId);
            }
            setName(routeInfo.mName);
            mDescription = routeInfo.mDescription;
            if (routeInfo.mExtras != null) {
                mExtras = new Bundle(routeInfo.mExtras);
            }
        }

        /**
@@ -161,6 +211,19 @@ public final class MediaRoute2Info implements Parcelable {
            return this;
        }

        /**
         * Sets the provider id of the route.
         * @hide
         */
        @NonNull
        public Builder setProviderId(@NonNull String providerId) {
            if (TextUtils.isEmpty(providerId)) {
                throw new IllegalArgumentException("id must not be null or empty");
            }
            mProviderId = providerId;
            return this;
        }

        /**
         * Sets the user-visible name of the route.
         */
@@ -182,6 +245,15 @@ public final class MediaRoute2Info implements Parcelable {
            return this;
        }

        /**
         * Sets a bundle of extras for the route.
         */
        @NonNull
        public Builder setExtras(@Nullable Bundle extras) {
            mExtras = extras;
            return this;
        }

        /**
         * Builds the {@link MediaRoute2Info media route info}.
         */
+23 −2
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.ArrayMap;

import java.util.Arrays;
@@ -82,8 +83,11 @@ public final class MediaRoute2ProviderInfo implements Parcelable {
        return true;
    }

    /**
     * @hide
     */
    @Nullable
    String getUniqueId() {
    public String getUniqueId() {
        return mUniqueId;
    }

@@ -149,9 +153,21 @@ public final class MediaRoute2ProviderInfo implements Parcelable {
         * {@link com.android.server.media.MediaRouterService} and used to identify providers.
         * The id set by {@link MediaRoute2ProviderService} will be ignored.
         * </p>
         * @hide
         */
        public Builder setUniqueId(@Nullable String uniqueId) {
            if (TextUtils.equals(mUniqueId, uniqueId)) {
                return this;
            }
            mUniqueId = uniqueId;
            final int count = mRoutes.size();
            for (int i = 0; i < count; i++) {
                MediaRoute2Info route = mRoutes.valueAt(i);
                mRoutes.setValueAt(i, new MediaRoute2Info.Builder(route)
                        .setProviderId(mUniqueId)
                        .build());
            }

            return this;
        }

@@ -164,7 +180,12 @@ public final class MediaRoute2ProviderInfo implements Parcelable {
            if (mRoutes.containsValue(route)) {
                throw new IllegalArgumentException("route descriptor already added");
            }
            if (mUniqueId != null) {
                mRoutes.put(route.getId(),
                        new MediaRoute2Info.Builder(route).setProviderId(mUniqueId).build());
            } else {
                mRoutes.put(route.getId(), route);
            }
            return this;
        }

+17 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.media;

import android.annotation.MainThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.Intent;
import android.os.Looper;
@@ -168,6 +169,22 @@ public class MediaRouter2 {
        return -1;
    }

    /**
     * Selects the specified route.
     *
     * @param route The route to select.
     */
    //TODO: add a parameter for category (e.g. mirroring/casting)
    public void selectRoute(@Nullable MediaRoute2Info route) {
        if (mClient != null) {
            try {
                mMediaRouterService.selectRoute2(mClient, route);
            } catch (RemoteException ex) {
                Log.e(TAG, "Unable to select route.", ex);
            }
        }
    }

    /**
     * Sends a media control request to be performed asynchronously by the route's destination.
     * @param route the route that will receive the control request
Loading