Loading media/java/android/media/IMediaRoute2Provider.aidl +5 −6 Original line number Diff line number Diff line Loading @@ -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); Loading media/java/android/media/MediaRoute2Info.java +2 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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} Loading media/java/android/media/MediaRoute2ProviderService.java +42 −18 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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()); Loading Loading @@ -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); } Loading Loading @@ -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; Loading @@ -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); Loading @@ -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 Loading @@ -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(); } Loading @@ -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) { Loading Loading @@ -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 /** Loading @@ -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 /** Loading @@ -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 /** Loading @@ -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. Loading Loading @@ -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)); } Loading media/java/android/media/MediaRouter2.java +15 −27 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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, Loading Loading @@ -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); } Loading @@ -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; } Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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(); } } Loading Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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) { Loading media/java/android/media/MediaRouter2Utils.java 0 → 100644 +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
media/java/android/media/IMediaRoute2Provider.aidl +5 −6 Original line number Diff line number Diff line Loading @@ -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); Loading
media/java/android/media/MediaRoute2Info.java +2 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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} Loading
media/java/android/media/MediaRoute2ProviderService.java +42 −18 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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()); Loading Loading @@ -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); } Loading Loading @@ -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; Loading @@ -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); Loading @@ -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 Loading @@ -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(); } Loading @@ -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) { Loading Loading @@ -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 /** Loading @@ -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 /** Loading @@ -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 /** Loading @@ -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. Loading Loading @@ -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)); } Loading
media/java/android/media/MediaRouter2.java +15 −27 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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, Loading Loading @@ -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); } Loading @@ -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; } Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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(); } } Loading Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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) { Loading
media/java/android/media/MediaRouter2Utils.java 0 → 100644 +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; } }