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

Commit 13bc105b authored by Kyunglyul Hyun's avatar Kyunglyul Hyun
Browse files

MediaRouter: Make MR2M.CB.onRouteSelected to be called

With this, MediaRouter2Manager.Callback.onRouteSelected will be called properly.

This CL also adds provider id to MediaRoute2Info to distinguish routes
with the same id from different providers.

Test: atest mediaroutertest

Change-Id: If353a4decad489576a39b1a93c7d99c7fe238abe
parent 00c3a02a
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