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

Commit 5161b37e authored by Kyunglyul Hyun's avatar Kyunglyul Hyun
Browse files

MediaRouter2: Add group volume

Add session volume or group volume info into RoutingSessionInfo.
Group volume can be controlled by MediaRouter2 or MediaRouter2Manager.

This CL includes minor clean up for CTS and MediaRouter2Manager.

Bug: 148994658
Bug: 149200358
Test: atest android.media.cts.MediaRoute2InfoTest
  && atest android.media.cts.MediaRouter2Test
  && atest android.media.cts.RouteDiscoveryPreferenceTest
  && atest android.media.cts.RoutingSessionInfoTest
  && atest android.media.cts.MediaRoute2ProviderServiceTest
  && atest mediaroutertest

Change-Id: If1d3aaae604a3c23d504e620ddb2bd2ffb260602
parent a0000893
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -26816,7 +26816,8 @@ package android.media {
    method public void onDiscoveryPreferenceChanged(@NonNull android.media.RouteDiscoveryPreference);
    method public abstract void onReleaseSession(@NonNull String);
    method public abstract void onSelectRoute(@NonNull String, @NonNull String);
    method public abstract void onSetVolume(@NonNull String, int);
    method public abstract void onSetRouteVolume(@NonNull String, int);
    method public abstract void onSetSessionVolume(@NonNull String, int);
    method public abstract void onTransferToRoute(@NonNull String, @NonNull String);
    field public static final long REQUEST_ID_UNKNOWN = 0L; // 0x0L
    field public static final String SERVICE_INTERFACE = "android.media.MediaRoute2ProviderService";
@@ -26977,9 +26978,13 @@ package android.media {
    method @NonNull public java.util.List<android.media.MediaRoute2Info> getSelectableRoutes();
    method @NonNull public java.util.List<android.media.MediaRoute2Info> getSelectedRoutes();
    method @NonNull public java.util.List<android.media.MediaRoute2Info> getTransferrableRoutes();
    method public int getVolume();
    method public int getVolumeHandling();
    method public int getVolumeMax();
    method public boolean isReleased();
    method public void release();
    method public void selectRoute(@NonNull android.media.MediaRoute2Info);
    method public void setVolume(int);
    method public void transferToRoute(@NonNull android.media.MediaRoute2Info);
  }
@@ -27374,6 +27379,9 @@ package android.media {
    method @NonNull public java.util.List<java.lang.String> getSelectableRoutes();
    method @NonNull public java.util.List<java.lang.String> getSelectedRoutes();
    method @NonNull public java.util.List<java.lang.String> getTransferrableRoutes();
    method public int getVolume();
    method public int getVolumeHandling();
    method public int getVolumeMax();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.media.RoutingSessionInfo> CREATOR;
  }
@@ -27395,6 +27403,9 @@ package android.media {
    method @NonNull public android.media.RoutingSessionInfo.Builder removeSelectedRoute(@NonNull String);
    method @NonNull public android.media.RoutingSessionInfo.Builder removeTransferrableRoute(@NonNull String);
    method @NonNull public android.media.RoutingSessionInfo.Builder setControlHints(@Nullable android.os.Bundle);
    method @NonNull public android.media.RoutingSessionInfo.Builder setVolume(int);
    method @NonNull public android.media.RoutingSessionInfo.Builder setVolumeHandling(int);
    method @NonNull public android.media.RoutingSessionInfo.Builder setVolumeMax(int);
  }
  public final class Session2Command implements android.os.Parcelable {
+2 −1
Original line number Diff line number Diff line
@@ -36,5 +36,6 @@ oneway interface IMediaRoute2Provider {
    void transferToRoute(String sessionId, String routeId);

    void notifyControlRequestSent(String id, in Intent request);
    void requestSetVolume(String id, int volume);
    void setRouteVolume(String routeId, int volume);
    void setSessionVolume(String sessionId, int volume);
}
+5 −2
Original line number Diff line number Diff line
@@ -51,7 +51,8 @@ interface IMediaRouterService {
    void unregisterClient2(IMediaRouter2Client client);
    void sendControlRequest(IMediaRouter2Client client, in MediaRoute2Info route,
            in Intent request);
    void requestSetVolume2(IMediaRouter2Client client, in MediaRoute2Info route, int volume);
    void setRouteVolume2(IMediaRouter2Client client, in MediaRoute2Info route, int volume);
    void setSessionVolume2(IMediaRouter2Client client, String sessionId, int volume);

    void requestCreateSession(IMediaRouter2Client client, in MediaRoute2Info route, int requestId,
            in @nullable Bundle sessionHints);
@@ -67,8 +68,10 @@ interface IMediaRouterService {
    void requestCreateClientSession(IMediaRouter2Manager manager, String packageName,
        in @nullable MediaRoute2Info route, int requestId);

    void requestSetVolume2Manager(IMediaRouter2Manager manager,
    void setRouteVolume2Manager(IMediaRouter2Manager manager,
            in MediaRoute2Info route, int volume);
    void setSessionVolume2Manager(IMediaRouter2Manager manager,
            String sessionId, int volume);

    List<RoutingSessionInfo> getActiveSessions(IMediaRouter2Manager manager);
    void selectClientRoute(IMediaRouter2Manager manager,
+23 −5
Original line number Diff line number Diff line
@@ -122,16 +122,25 @@ public abstract class MediaRoute2ProviderService extends Service {
     * @hide
     */
    //TODO: Discuss what to use for request (e.g., Intent? Request class?)
    public abstract void onControlRequest(@NonNull String routeId, @NonNull Intent request);
    public void onControlRequest(@NonNull String routeId, @NonNull Intent request) {}

    /**
     * Called when requestSetVolume is called on a route of the provider.
     * Called when a volume setting is requested on a route of the provider
     *
     * @param routeId the id of the route
     * @param volume the target volume
     * @see MediaRoute2Info#getVolumeMax()
     */
    public abstract void onSetVolume(@NonNull String routeId, int volume);
    public abstract void onSetRouteVolume(@NonNull String routeId, int volume);

    /**
     * Called when {@link MediaRouter2.RoutingController#setVolume(int)} is called on
     * a routing session of the provider
     *
     * @param sessionId the id of the routing session
     * @param volume the target volume
     */
    public abstract void onSetSessionVolume(@NonNull String sessionId, int volume);

    /**
     * Gets information of the session with the given id.
@@ -513,12 +522,21 @@ public abstract class MediaRoute2ProviderService extends Service {
        }

        @Override
        public void requestSetVolume(String routeId, int volume) {
        public void setRouteVolume(String routeId, int volume) {
            if (!checkCallerisSystem()) {
                return;
            }
            mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onSetVolume,
            mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onSetRouteVolume,
                    MediaRoute2ProviderService.this, routeId, volume));
        }

        @Override
        public void setSessionVolume(String sessionId, int volume) {
            if (!checkCallerisSystem()) {
                return;
            }
            mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onSetSessionVolume,
                    MediaRoute2ProviderService.this, sessionId, volume));
        }
    }
}
+75 −2
Original line number Diff line number Diff line
@@ -446,7 +446,7 @@ public class MediaRouter2 {
     * @param volume The new volume value between 0 and {@link MediaRoute2Info#getVolumeMax}.
     * @hide
     */
    public void requestSetVolume(@NonNull MediaRoute2Info route, int volume) {
    public void setRouteVolume(@NonNull MediaRoute2Info route, int volume) {
        Objects.requireNonNull(route, "route must not be null");

        Client2 client;
@@ -455,7 +455,7 @@ public class MediaRouter2 {
        }
        if (client != null) {
            try {
                mMediaRouterService.requestSetVolume2(client, route, volume);
                mMediaRouterService.setRouteVolume2(client, route, volume);
            } catch (RemoteException ex) {
                Log.e(TAG, "Unable to send control request.", ex);
            }
@@ -884,6 +884,43 @@ public class MediaRouter2 {
            }
        }

        /**
         * Gets information about how volume is handled on the session.
         *
         * @return {@link MediaRoute2Info#PLAYBACK_VOLUME_FIXED} or
         * {@link MediaRoute2Info#PLAYBACK_VOLUME_VARIABLE}
         */
        @MediaRoute2Info.PlaybackVolume
        public int getVolumeHandling() {
            synchronized (mControllerLock) {
                return mSessionInfo.getVolumeHandling();
            }
        }

        /**
         * Gets the maximum volume of the session.
         */
        public int getVolumeMax() {
            synchronized (mControllerLock) {
                return mSessionInfo.getVolumeMax();
            }
        }

        /**
         * Gets the current volume of the session.
         * <p>
         * When it's available, it represents the volume of routing session, which is a group
         * of selected routes. To get the volume of a route,
         * use {@link MediaRoute2Info#getVolume()}.
         * </p>
         * @see MediaRoute2Info#getVolume()
         */
        public int getVolume() {
            synchronized (mControllerLock) {
                return mSessionInfo.getVolume();
            }
        }

        /**
         * Returns true if this controller is released, false otherwise.
         * If it is released, then all other getters from this instance may return invalid values.
@@ -1039,6 +1076,42 @@ public class MediaRouter2 {
            }
        }

        /**
         * Requests a volume change for the remote session asynchronously.
         *
         * @param volume The new volume value between 0 and {@link RoutingController#getVolumeMax}
         *               (inclusive).
         * @see #getVolume()
         */
        public void setVolume(int volume) {
            if (getVolumeHandling() == MediaRoute2Info.PLAYBACK_VOLUME_FIXED) {
                Log.w(TAG, "setVolume: the routing session has fixed volume. Ignoring.");
                return;
            }
            if (volume < 0 || volume > getVolumeMax()) {
                Log.w(TAG, "setVolume: the target volume is out of range. Ignoring");
                return;
            }

            synchronized (mControllerLock) {
                if (mIsReleased) {
                    Log.w(TAG, "setVolume is called on released controller. Ignoring.");
                    return;
                }
            }
            Client2 client;
            synchronized (sRouterLock) {
                client = mClient;
            }
            if (client != null) {
                try {
                    mMediaRouterService.setSessionVolume2(client, getId(), volume);
                } catch (RemoteException ex) {
                    Log.e(TAG, "setVolume: Failed to deliver request.", ex);
                }
            }
        }

        /**
         * Release this controller and corresponding session.
         * Any operations on this controller after calling this method will be ignored.
Loading