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

Commit 202bf118 authored by Hyundo Moon's avatar Hyundo Moon Committed by Android (Google) Code Review
Browse files

Merge "Make RouteSessionInfo#getId() return String rather than primitive int"

parents 1c0937ed b26c4b22
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -24,13 +24,12 @@ import android.media.IMediaRoute2ProviderClient;
 */
oneway interface IMediaRoute2Provider {
    void setClient(IMediaRoute2ProviderClient client);
    void requestCreateSession(String packageName, String routeId,
            String routeType, long requestId);
    void releaseSession(int sessionId);
    void requestCreateSession(String packageName, String routeId, String routeType, long requestId);
    void releaseSession(String sessionId);

    void selectRoute(int sessionId, String routeId);
    void deselectRoute(int sessionId, String routeId);
    void transferToRoute(int sessionId, String routeId);
    void selectRoute(String sessionId, String routeId);
    void deselectRoute(String sessionId, String routeId);
    void transferToRoute(String sessionId, String routeId);

    void notifyControlRequestSent(String id, in Intent request);
    void requestSetVolume(String id, int volume);
+2 −7
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.media;

import static android.media.MediaRouter2Utils.toUniqueId;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -190,13 +192,6 @@ public final class MediaRoute2Info implements Parcelable {
        mExtras = in.readBundle();
    }

    /**
     * @hide
     */
    public static String toUniqueId(String providerId, String routeId) {
        return providerId + ":" + routeId;
    }

    /**
     * Returns true if the route info has all of the required field.
     * A route info only obtained from {@link com.android.server.media.MediaRouterService}
+42 −18
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Process;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;

@@ -55,7 +56,7 @@ public abstract class MediaRoute2ProviderService extends Service {
    private MediaRoute2ProviderInfo mProviderInfo;

    @GuardedBy("mSessionLock")
    private ArrayMap<Integer, RouteSessionInfo> mSessionInfo = new ArrayMap<>();
    private ArrayMap<String, RouteSessionInfo> mSessionInfo = new ArrayMap<>();

    public MediaRoute2ProviderService() {
        mHandler = new Handler(Looper.getMainLooper());
@@ -106,7 +107,10 @@ public abstract class MediaRoute2ProviderService extends Service {
     *         null if the session is destroyed or id is not valid.
     */
    @Nullable
    public final RouteSessionInfo getSessionInfo(int sessionId) {
    public final RouteSessionInfo getSessionInfo(@NonNull String sessionId) {
        if (TextUtils.isEmpty(sessionId)) {
            throw new IllegalArgumentException("sessionId must not be empty");
        }
        synchronized (mSessionLock) {
            return mSessionInfo.get(sessionId);
        }
@@ -134,7 +138,7 @@ public abstract class MediaRoute2ProviderService extends Service {
     */
    public final void updateSessionInfo(@NonNull RouteSessionInfo sessionInfo) {
        Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
        int sessionId = sessionInfo.getSessionId();
        String sessionId = sessionInfo.getId();
        if (sessionInfo.getSelectedRoutes().isEmpty()) {
            releaseSession(sessionId);
            return;
@@ -160,7 +164,7 @@ public abstract class MediaRoute2ProviderService extends Service {
    public final void notifySessionInfoChanged(@NonNull RouteSessionInfo sessionInfo) {
        Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");

        int sessionId = sessionInfo.getSessionId();
        String sessionId = sessionInfo.getId();
        synchronized (mSessionLock) {
            if (mSessionInfo.containsKey(sessionId)) {
                mSessionInfo.put(sessionId, sessionInfo);
@@ -185,7 +189,7 @@ public abstract class MediaRoute2ProviderService extends Service {
     * controlled, pass a {@link Bundle} that contains how to control it.
     *
     * @param sessionInfo information of the new session.
     *                    The {@link RouteSessionInfo#getSessionId() id} of the session must be
     *                    The {@link RouteSessionInfo#getId() id} of the session must be
     *                    unique. Pass {@code null} to reject the request or inform clients that
     *                    session creation is failed.
     * @param requestId id of the previous request to create this session
@@ -194,13 +198,13 @@ public abstract class MediaRoute2ProviderService extends Service {
    // TODO: Maybe better to create notifySessionCreationFailed?
    public final void notifySessionCreated(@Nullable RouteSessionInfo sessionInfo, long requestId) {
        if (sessionInfo != null) {
            int sessionId = sessionInfo.getSessionId();
            String sessionId = sessionInfo.getId();
            synchronized (mSessionLock) {
                if (mSessionInfo.containsKey(sessionId)) {
                    Log.w(TAG, "Ignoring duplicate session id.");
                    return;
                }
                mSessionInfo.put(sessionInfo.getSessionId(), sessionInfo);
                mSessionInfo.put(sessionInfo.getId(), sessionInfo);
            }
            schedulePublishState();
        }
@@ -220,9 +224,12 @@ public abstract class MediaRoute2ProviderService extends Service {
     * {@link #onDestroySession} is called if the session is released.
     *
     * @param sessionId id of the session to be released
     * @see #onDestroySession(int, RouteSessionInfo)
     * @see #onDestroySession(String, RouteSessionInfo)
     */
    public final void releaseSession(int sessionId) {
    public final void releaseSession(@NonNull String sessionId) {
        if (TextUtils.isEmpty(sessionId)) {
            throw new IllegalArgumentException("sessionId must not be empty");
        }
        //TODO: notify media router service of release.
        RouteSessionInfo sessionInfo;
        synchronized (mSessionLock) {
@@ -259,9 +266,10 @@ public abstract class MediaRoute2ProviderService extends Service {
     *
     * @param sessionId id of the session being destroyed.
     * @param lastSessionInfo information of the session being destroyed.
     * @see #releaseSession(int)
     * @see #releaseSession(String)
     */
    public abstract void onDestroySession(int sessionId, @NonNull RouteSessionInfo lastSessionInfo);
    public abstract void onDestroySession(@NonNull String sessionId,
            @NonNull RouteSessionInfo lastSessionInfo);

    //TODO: make a way to reject the request
    /**
@@ -274,7 +282,7 @@ public abstract class MediaRoute2ProviderService extends Service {
     * @param routeId id of the route
     * @see #updateSessionInfo(RouteSessionInfo)
     */
    public abstract void onSelectRoute(int sessionId, @NonNull String routeId);
    public abstract void onSelectRoute(@NonNull String sessionId, @NonNull String routeId);

    //TODO: make a way to reject the request
    /**
@@ -286,7 +294,7 @@ public abstract class MediaRoute2ProviderService extends Service {
     * @param sessionId id of the session
     * @param routeId id of the route
     */
    public abstract void onDeselectRoute(int sessionId, @NonNull String routeId);
    public abstract void onDeselectRoute(@NonNull String sessionId, @NonNull String routeId);

    //TODO: make a way to reject the request
    /**
@@ -298,7 +306,7 @@ public abstract class MediaRoute2ProviderService extends Service {
     * @param sessionId id of the session
     * @param routeId id of the route
     */
    public abstract void onTransferToRoute(int sessionId, @NonNull String routeId);
    public abstract void onTransferToRoute(@NonNull String sessionId, @NonNull String routeId);

    /**
     * Called when the {@link RouteDiscoveryRequest discovery request} has changed.
@@ -385,37 +393,53 @@ public abstract class MediaRoute2ProviderService extends Service {
                    requestId));
        }
        @Override
        public void releaseSession(int sessionId) {
        public void releaseSession(@NonNull String sessionId) {
            if (!checkCallerisSystem()) {
                return;
            }
            if (TextUtils.isEmpty(sessionId)) {
                Log.w(TAG, "releaseSession: Ignoring empty sessionId from system service.");
                return;
            }
            mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::releaseSession,
                    MediaRoute2ProviderService.this, sessionId));
        }

        @Override
        public void selectRoute(int sessionId, String routeId) {
        public void selectRoute(@NonNull String sessionId, String routeId) {
            if (!checkCallerisSystem()) {
                return;
            }
            if (TextUtils.isEmpty(sessionId)) {
                Log.w(TAG, "selectRoute: Ignoring empty sessionId from system service.");
                return;
            }
            mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onSelectRoute,
                    MediaRoute2ProviderService.this, sessionId, routeId));
        }

        @Override
        public void deselectRoute(int sessionId, String routeId) {
        public void deselectRoute(@NonNull String sessionId, String routeId) {
            if (!checkCallerisSystem()) {
                return;
            }
            if (TextUtils.isEmpty(sessionId)) {
                Log.w(TAG, "deselectRoute: Ignoring empty sessionId from system service.");
                return;
            }
            mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onDeselectRoute,
                    MediaRoute2ProviderService.this, sessionId, routeId));
        }

        @Override
        public void transferToRoute(int sessionId, String routeId) {
        public void transferToRoute(@NonNull String sessionId, String routeId) {
            if (!checkCallerisSystem()) {
                return;
            }
            if (TextUtils.isEmpty(sessionId)) {
                Log.w(TAG, "transferToRoute: Ignoring empty sessionId from system service.");
                return;
            }
            mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onTransferToRoute,
                    MediaRoute2ProviderService.this, sessionId, routeId));
        }
+15 −27
Original line number Diff line number Diff line
@@ -342,8 +342,7 @@ public class MediaRouter2 {
        final int requestId;
        requestId = mSessionCreationRequestCnt.getAndIncrement();

        SessionCreationRequest request = new SessionCreationRequest(
                requestId, route, routeType);
        SessionCreationRequest request = new SessionCreationRequest(requestId, route, routeType);
        mSessionCreationRequests.add(request);

        Client2 client;
@@ -352,8 +351,7 @@ public class MediaRouter2 {
        }
        if (client != null) {
            try {
                mMediaRouterService.requestCreateSession(
                        client, route, routeType, requestId);
                mMediaRouterService.requestCreateSession(client, route, routeType, requestId);
            } catch (RemoteException ex) {
                Log.e(TAG, "Unable to request to create session.", ex);
                mHandler.sendMessage(obtainMessage(MediaRouter2::createControllerOnHandler,
@@ -542,7 +540,7 @@ public class MediaRouter2 {
        if (sessionInfo != null) {
            RouteSessionController controller = new RouteSessionController(sessionInfo);
            synchronized (sRouterLock) {
                mSessionControllers.put(controller.getUniqueSessionId(), controller);
                mSessionControllers.put(controller.getSessionId(), controller);
            }
            notifySessionCreated(controller);
        }
@@ -556,12 +554,12 @@ public class MediaRouter2 {

        RouteSessionController matchingController;
        synchronized (sRouterLock) {
            matchingController = mSessionControllers.get(sessionInfo.getUniqueSessionId());
            matchingController = mSessionControllers.get(sessionInfo.getId());
        }

        if (matchingController == null) {
            Log.w(TAG, "changeSessionInfoOnHandler: Matching controller not found. uniqueSessionId="
                    + sessionInfo.getUniqueSessionId());
                    + sessionInfo.getId());
            return;
        }

@@ -582,7 +580,7 @@ public class MediaRouter2 {
            return;
        }

        final String uniqueSessionId = sessionInfo.getUniqueSessionId();
        final String uniqueSessionId = sessionInfo.getId();
        RouteSessionController matchingController;
        synchronized (sRouterLock) {
            matchingController = mSessionControllers.get(uniqueSessionId);
@@ -591,7 +589,7 @@ public class MediaRouter2 {
        if (matchingController == null) {
            if (DEBUG) {
                Log.d(TAG, "releaseControllerOnHandler: Matching controller not found. "
                        + "uniqueSessionId=" + sessionInfo.getUniqueSessionId());
                        + "uniqueSessionId=" + sessionInfo.getId());
            }
            return;
        }
@@ -783,20 +781,9 @@ public class MediaRouter2 {
        /**
         * @return the ID of the session
         */
        public int getSessionId() {
        public String getSessionId() {
            synchronized (mControllerLock) {
                return mSessionInfo.getSessionId();
            }
        }

        /**
         * @return the unique ID of the session
         * @hide
         */
        @NonNull
        public String getUniqueSessionId() {
            synchronized (mControllerLock) {
                return mSessionInfo.getUniqueSessionId();
                return mSessionInfo.getId();
            }
        }

@@ -913,7 +900,7 @@ public class MediaRouter2 {
            }
            if (client != null) {
                try {
                    mMediaRouterService.selectRoute(client, getUniqueSessionId(), route);
                    mMediaRouterService.selectRoute(client, getSessionId(), route);
                } catch (RemoteException ex) {
                    Log.e(TAG, "Unable to select route for session.", ex);
                }
@@ -960,7 +947,7 @@ public class MediaRouter2 {
            }
            if (client != null) {
                try {
                    mMediaRouterService.deselectRoute(client, getUniqueSessionId(), route);
                    mMediaRouterService.deselectRoute(client, getSessionId(), route);
                } catch (RemoteException ex) {
                    Log.e(TAG, "Unable to remove route from session.", ex);
                }
@@ -1008,7 +995,7 @@ public class MediaRouter2 {
            }
            if (client != null) {
                try {
                    mMediaRouterService.transferToRoute(client, getUniqueSessionId(), route);
                    mMediaRouterService.transferToRoute(client, getSessionId(), route);
                } catch (RemoteException ex) {
                    Log.e(TAG, "Unable to transfer to route for session.", ex);
                }
@@ -1033,12 +1020,12 @@ public class MediaRouter2 {

            Client2 client;
            synchronized (sRouterLock) {
                mSessionControllers.remove(getUniqueSessionId(), this);
                mSessionControllers.remove(getSessionId(), this);
                client = mClient;
            }
            if (client != null) {
                try {
                    mMediaRouterService.releaseSession(client, getUniqueSessionId());
                    mMediaRouterService.releaseSession(client, getSessionId());
                } catch (RemoteException ex) {
                    Log.e(TAG, "Unable to notify of controller release", ex);
                }
@@ -1068,6 +1055,7 @@ public class MediaRouter2 {

            List<MediaRoute2Info> routes = new ArrayList<>();
            synchronized (sRouterLock) {
                // TODO: Maybe able to change using Collection.stream()?
                for (String routeId : routeIds) {
                    MediaRoute2Info route = mRoutes.get(routeId);
                    if (route != null) {
+100 −0
Original line number Diff line number Diff line
/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.media;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;

/**
 * @hide
 */
public class MediaRouter2Utils {

    static final String TAG = "MR2Utils";
    static final String SEPARATOR = ":";

    /**
     * @hide
     */
    @NonNull
    public static String toUniqueId(@NonNull String providerId, @NonNull String id) {
        if (TextUtils.isEmpty(providerId)) {
            Log.w(TAG, "toUniqueId: providerId shouldn't be empty");
            return null;
        }
        if (TextUtils.isEmpty(id)) {
            Log.w(TAG, "toUniqueId: id shouldn't be null");
            return null;
        }

        return providerId + SEPARATOR + id;
    }

    /**
     * Gets provider ID from unique ID.
     * If the corresponding provider ID could not be generated, it will return null.
     *
     * @hide
     */
    @Nullable
    public static String getProviderId(@NonNull String uniqueId) {
        if (TextUtils.isEmpty(uniqueId)) {
            Log.w(TAG, "getProviderId: uniqueId shouldn't be empty");
            return null;
        }

        int firstIndexOfSeparator = uniqueId.indexOf(SEPARATOR);
        if (firstIndexOfSeparator == -1) {
            return null;
        }

        String providerId = uniqueId.substring(0, firstIndexOfSeparator);
        if (TextUtils.isEmpty(providerId)) {
            return null;
        }

        return providerId;
    }

    /**
     * Gets the original ID (i.e. non-unique route/session ID) from unique ID.
     * If the corresponding ID could not be generated, it will return null.
     *
     * @hide
     */
    @Nullable
    public static String getOriginalId(@NonNull String uniqueId) {
        if (TextUtils.isEmpty(uniqueId)) {
            Log.w(TAG, "getOriginalId: uniqueId shouldn't be empty");
            return null;
        }

        int firstIndexOfSeparator = uniqueId.indexOf(SEPARATOR);
        if (firstIndexOfSeparator == -1 || firstIndexOfSeparator + 1 >= uniqueId.length()) {
            return null;
        }

        String providerId = uniqueId.substring(firstIndexOfSeparator + 1);
        if (TextUtils.isEmpty(providerId)) {
            return null;
        }

        return providerId;
    }
}
Loading