diff options
11 files changed, 125 insertions, 91 deletions
diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java index 506d6165bbfa..4e6b4af56597 100644 --- a/media/java/android/media/MediaRoute2Info.java +++ b/media/java/android/media/MediaRoute2Info.java @@ -156,8 +156,6 @@ public final class MediaRoute2Info implements Parcelable { @Nullable final Bundle mExtras; - private final String mUniqueId; - MediaRoute2Info(@NonNull Builder builder) { mId = builder.mId; mProviderId = builder.mProviderId; @@ -172,7 +170,6 @@ public final class MediaRoute2Info implements Parcelable { mVolumeHandling = builder.mVolumeHandling; mDeviceType = builder.mDeviceType; mExtras = builder.mExtras; - mUniqueId = createUniqueId(); } MediaRoute2Info(@NonNull Parcel in) { @@ -189,18 +186,12 @@ public final class MediaRoute2Info implements Parcelable { mVolumeHandling = in.readInt(); mDeviceType = in.readInt(); mExtras = in.readBundle(); - mUniqueId = createUniqueId(); - } - - private String createUniqueId() { - String uniqueId = null; - if (mProviderId != null) { - uniqueId = toUniqueId(mProviderId, mId); - } - return uniqueId; } - static String toUniqueId(String providerId, String routeId) { + /** + * @hide + */ + public static String toUniqueId(String providerId, String routeId) { return providerId + ":" + routeId; } @@ -251,25 +242,30 @@ public final class MediaRoute2Info implements Parcelable { } /** - * Gets the id of the route. - * Use {@link #getUniqueId()} if you need a unique identifier. + * Gets the id of the route. The routes which are given by {@link MediaRouter2} will have + * unique IDs. + * <p> + * In order to ensure uniqueness in {@link MediaRouter2} side, the value of this method + * can be different from what was set in {@link MediaRoute2ProviderService}. * - * @see #getUniqueId() + * @see Builder#setId(String) */ @NonNull public String getId() { - return mId; + if (mProviderId != null) { + return toUniqueId(mProviderId, mId); + } else { + return mId; + } } /** - * Gets the unique id of the route. A route obtained from - * {@link com.android.server.media.MediaRouterService} always has a unique id. - * - * @return unique id of the route or null if it has no unique id. + * Gets the original id set by {@link Builder#setId(String)}. + * @hide */ - @Nullable - public String getUniqueId() { - return mUniqueId; + @NonNull + public String getOriginalId() { + return mId; } /** @@ -499,7 +495,15 @@ public final class MediaRoute2Info implements Parcelable { } /** - * Sets the unique id of the route. + * Sets the unique id of the route. The value given here must be unique for each of your + * route. + * <p> + * In order to ensure uniqueness in {@link MediaRouter2} side, the value of + * {@link MediaRoute2Info#getId()} can be different from what was set in + * {@link MediaRoute2ProviderService}. + * </p> + * + * @see MediaRoute2Info#getId() */ @NonNull public Builder setId(@NonNull String id) { diff --git a/media/java/android/media/MediaRoute2ProviderInfo.java b/media/java/android/media/MediaRoute2ProviderInfo.java index 7078d4a0b568..e2f246cae8c2 100644 --- a/media/java/android/media/MediaRoute2ProviderInfo.java +++ b/media/java/android/media/MediaRoute2ProviderInfo.java @@ -25,6 +25,7 @@ import android.util.ArrayMap; import java.util.Arrays; import java.util.Collection; +import java.util.Map; import java.util.Objects; /** @@ -161,14 +162,17 @@ public final class MediaRoute2ProviderInfo implements Parcelable { 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) + + final ArrayMap<String, MediaRoute2Info> newRoutes = new ArrayMap<>(); + for (Map.Entry<String, MediaRoute2Info> entry : mRoutes.entrySet()) { + MediaRoute2Info routeWithProviderId = new MediaRoute2Info.Builder(entry.getValue()) .setProviderId(mUniqueId) - .build()); + .build(); + newRoutes.put(routeWithProviderId.getId(), routeWithProviderId); } + mRoutes.clear(); + mRoutes.putAll(newRoutes); return this; } diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index f5cfde4b968b..bddfa6930b11 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -177,9 +177,9 @@ public class MediaRouter2 { * @hide */ public static boolean checkRouteListContainsRouteId(@NonNull List<MediaRoute2Info> routeList, - @NonNull String uniqueRouteId) { + @NonNull String routeId) { for (MediaRoute2Info info : routeList) { - if (TextUtils.equals(uniqueRouteId, info.getUniqueId())) { + if (TextUtils.equals(routeId, info.getId())) { return true; } } @@ -499,7 +499,7 @@ public class MediaRouter2 { List<MediaRoute2Info> addedRoutes = new ArrayList<>(); synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { - mRoutes.put(route.getUniqueId(), route); + mRoutes.put(route.getId(), route); if (route.supportsControlCategories(mControlCategories)) { addedRoutes.add(route); } @@ -515,7 +515,7 @@ public class MediaRouter2 { List<MediaRoute2Info> removedRoutes = new ArrayList<>(); synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { - mRoutes.remove(route.getUniqueId()); + mRoutes.remove(route.getId()); if (route.supportsControlCategories(mControlCategories)) { removedRoutes.add(route); } @@ -531,7 +531,7 @@ public class MediaRouter2 { List<MediaRoute2Info> changedRoutes = new ArrayList<>(); synchronized (sRouterLock) { for (MediaRoute2Info route : routes) { - mRoutes.put(route.getUniqueId(), route); + mRoutes.put(route.getId(), route); if (route.supportsControlCategories(mControlCategories)) { changedRoutes.add(route); } @@ -935,13 +935,13 @@ public class MediaRouter2 { } List<MediaRoute2Info> selectedRoutes = getSelectedRoutes(); - if (checkRouteListContainsRouteId(selectedRoutes, route.getUniqueId())) { + if (checkRouteListContainsRouteId(selectedRoutes, route.getId())) { Log.w(TAG, "Ignoring selecting a route that is already selected. route=" + route); return; } List<MediaRoute2Info> selectableRoutes = getSelectableRoutes(); - if (!checkRouteListContainsRouteId(selectableRoutes, route.getUniqueId())) { + if (!checkRouteListContainsRouteId(selectableRoutes, route.getId())) { Log.w(TAG, "Ignoring selecting a non-selectable route=" + route); return; } @@ -982,13 +982,13 @@ public class MediaRouter2 { } List<MediaRoute2Info> selectedRoutes = getSelectedRoutes(); - if (!checkRouteListContainsRouteId(selectedRoutes, route.getUniqueId())) { + if (!checkRouteListContainsRouteId(selectedRoutes, route.getId())) { Log.w(TAG, "Ignoring deselecting a route that is not selected. route=" + route); return; } List<MediaRoute2Info> deselectableRoutes = getDeselectableRoutes(); - if (!checkRouteListContainsRouteId(deselectableRoutes, route.getUniqueId())) { + if (!checkRouteListContainsRouteId(deselectableRoutes, route.getId())) { Log.w(TAG, "Ignoring deselecting a non-deselectable route=" + route); return; } @@ -1029,14 +1029,14 @@ public class MediaRouter2 { } List<MediaRoute2Info> selectedRoutes = getSelectedRoutes(); - if (checkRouteListContainsRouteId(selectedRoutes, route.getUniqueId())) { + if (checkRouteListContainsRouteId(selectedRoutes, route.getId())) { Log.w(TAG, "Ignoring transferring to a route that is already added. route=" + route); return; } List<MediaRoute2Info> transferrableRoutes = getTransferrableRoutes(); - if (!checkRouteListContainsRouteId(transferrableRoutes, route.getUniqueId())) { + if (!checkRouteListContainsRouteId(transferrableRoutes, route.getId())) { Log.w(TAG, "Ignoring transferring to a non-transferrable route=" + route); return; } @@ -1084,8 +1084,12 @@ public class MediaRouter2 { } } + /** + * TODO: Change this to package private. (Hidden for debugging purposes) + * @hide + */ @NonNull - RouteSessionInfo getRouteSessionInfo() { + public RouteSessionInfo getRouteSessionInfo() { synchronized (mControllerLock) { return mSessionInfo; } diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java index 2e68e42e714f..3cbbea1f3c07 100644 --- a/media/java/android/media/MediaRouter2Manager.java +++ b/media/java/android/media/MediaRouter2Manager.java @@ -295,7 +295,7 @@ public class MediaRouter2Manager { void addRoutesOnHandler(List<MediaRoute2Info> routes) { synchronized (mRoutesLock) { for (MediaRoute2Info route : routes) { - mRoutes.put(route.getUniqueId(), route); + mRoutes.put(route.getId(), route); } } if (routes.size() > 0) { @@ -306,7 +306,7 @@ public class MediaRouter2Manager { void removeRoutesOnHandler(List<MediaRoute2Info> routes) { synchronized (mRoutesLock) { for (MediaRoute2Info route : routes) { - mRoutes.remove(route.getUniqueId()); + mRoutes.remove(route.getId()); } } if (routes.size() > 0) { @@ -317,7 +317,7 @@ public class MediaRouter2Manager { void changeRoutesOnHandler(List<MediaRoute2Info> routes) { synchronized (mRoutesLock) { for (MediaRoute2Info route : routes) { - mRoutes.put(route.getUniqueId(), route); + mRoutes.put(route.getId(), route); } } if (routes.size() > 0) { diff --git a/media/java/android/media/RouteSessionInfo.java b/media/java/android/media/RouteSessionInfo.java index 2d7bc24ae7a2..4a9298ac64be 100644 --- a/media/java/android/media/RouteSessionInfo.java +++ b/media/java/android/media/RouteSessionInfo.java @@ -327,14 +327,30 @@ public class RouteSessionInfo implements Parcelable { } /** - * Sets the provider id of the session. + * Sets the provider ID of the session. + * Also, calling this method will make all type of route IDs be unique by adding + * {@code providerId:} as a prefix. So do NOT call this method twice on same instance. + * + * @hide */ @NonNull public Builder setProviderId(String providerId) { mProviderId = providerId; + convertToUniqueRouteIds(providerId, mSelectedRoutes); + convertToUniqueRouteIds(providerId, mSelectableRoutes); + convertToUniqueRouteIds(providerId, mDeselectableRoutes); + convertToUniqueRouteIds(providerId, mTransferrableRoutes); return this; } + private void convertToUniqueRouteIds(@NonNull String providerId, + @NonNull List<String> routeIds) { + for (int i = 0; i < routeIds.size(); i++) { + String routeId = routeIds.get(i); + routeIds.set(i, MediaRoute2Info.toUniqueId(providerId, routeId)); + } + } + /** * Clears the selected routes. */ diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java index 6fe847bf5f3a..86b9706bf590 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java @@ -701,7 +701,6 @@ public class MediaRouter2Test { static Map<String, MediaRoute2Info> createRouteMap(List<MediaRoute2Info> routes) { Map<String, MediaRoute2Info> routeMap = new HashMap<>(); for (MediaRoute2Info route : routes) { - // intentionally not using route.getUniqueId() for convenience. routeMap.put(route.getId(), route); } return routeMap; @@ -741,7 +740,7 @@ public class MediaRouter2Test { } /** - * Returns a list of IDs (not uniqueId) of the given route list. + * Returns a list of IDs of the given route list. */ List<String> getRouteIds(@NonNull List<MediaRoute2Info> routes) { List<String> result = new ArrayList<>(); diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java index 83c7c173e8e8..1fd014113299 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java @@ -57,30 +57,37 @@ import java.util.function.Predicate; public class MediaRouterManagerTest { private static final String TAG = "MediaRouterManagerTest"; - // Must be the same as SampleMediaRoute2ProviderService - public static final String ROUTE_ID1 = "route_id1"; + public static final String SAMPLE_PROVIDER_ROUTES_ID_PREFIX = + "com.android.mediarouteprovider.example/.SampleMediaRoute2ProviderService:"; + + // Must be the same as SampleMediaRoute2ProviderService except the prefix of IDs. + public static final String ROUTE_ID1 = SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_id1"; public static final String ROUTE_NAME1 = "Sample Route 1"; - public static final String ROUTE_ID2 = "route_id2"; + public static final String ROUTE_ID2 = SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_id2"; public static final String ROUTE_NAME2 = "Sample Route 2"; public static final String ROUTE_ID3_SESSION_CREATION_FAILED = - "route_id3_session_creation_failed"; + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_id3_session_creation_failed"; public static final String ROUTE_NAME3 = "Sample Route 3 - Session creation failed"; public static final String ROUTE_ID4_TO_SELECT_AND_DESELECT = - "route_id4_to_select_and_deselect"; + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_id4_to_select_and_deselect"; public static final String ROUTE_NAME4 = "Sample Route 4 - Route to select and deselect"; - public static final String ROUTE_ID5_TO_TRANSFER_TO = "route_id5_to_transfer_to"; + public static final String ROUTE_ID5_TO_TRANSFER_TO = + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_id5_to_transfer_to"; public static final String ROUTE_NAME5 = "Sample Route 5 - Route to transfer to"; - public static final String ROUTE_ID_SPECIAL_CATEGORY = "route_special_category"; + public static final String ROUTE_ID_SPECIAL_CATEGORY = + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_special_category"; public static final String ROUTE_NAME_SPECIAL_CATEGORY = "Special Category Route"; public static final String SYSTEM_PROVIDER_ID = "com.android.server.media/.SystemMediaRoute2Provider"; public static final int VOLUME_MAX = 100; - public static final String ROUTE_ID_FIXED_VOLUME = "route_fixed_volume"; + public static final String ROUTE_ID_FIXED_VOLUME = + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_fixed_volume"; public static final String ROUTE_NAME_FIXED_VOLUME = "Fixed Volume Route"; - public static final String ROUTE_ID_VARIABLE_VOLUME = "route_variable_volume"; + public static final String ROUTE_ID_VARIABLE_VOLUME = + SAMPLE_PROVIDER_ROUTES_ID_PREFIX + "route_variable_volume"; public static final String ROUTE_NAME_VARIABLE_VOLUME = "Variable Volume Route"; public static final String ACTION_REMOVE_ROUTE = @@ -430,7 +437,6 @@ public class MediaRouterManagerTest { static Map<String, MediaRoute2Info> createRouteMap(List<MediaRoute2Info> routes) { Map<String, MediaRoute2Info> routeMap = new HashMap<>(); for (MediaRoute2Info route : routes) { - // intentionally not using route.getUniqueId() for convenience. routeMap.put(route.getId(), route); } return routeMap; diff --git a/services/core/java/com/android/server/media/MediaRoute2Provider.java b/services/core/java/com/android/server/media/MediaRoute2Provider.java index 115155ce24b5..55c4e21dd830 100644 --- a/services/core/java/com/android/server/media/MediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/MediaRoute2Provider.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Intent; -import android.media.MediaRoute2Info; import android.media.MediaRoute2ProviderInfo; import android.media.RouteSessionInfo; @@ -50,13 +49,13 @@ abstract class MediaRoute2Provider { String controlCategory, long requestId); public abstract void releaseSession(int sessionId); - public abstract void selectRoute(int sessionId, MediaRoute2Info route); - public abstract void deselectRoute(int sessionId, MediaRoute2Info route); - public abstract void transferToRoute(int sessionId, MediaRoute2Info route); + public abstract void selectRoute(int sessionId, String routeId); + public abstract void deselectRoute(int sessionId, String routeId); + public abstract void transferToRoute(int sessionId, String routeId); - public abstract void sendControlRequest(MediaRoute2Info route, Intent request); - public abstract void requestSetVolume(MediaRoute2Info route, int volume); - public abstract void requestUpdateVolume(MediaRoute2Info route, int delta); + public abstract void sendControlRequest(String routeId, Intent request); + public abstract void requestSetVolume(String routeId, int volume); + public abstract void requestUpdateVolume(String routeId, int delta); @NonNull public String getUniqueId() { diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java index f8d8f9fd5fbd..28bb034b33f7 100644 --- a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java +++ b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java @@ -24,7 +24,6 @@ import android.content.Intent; import android.content.ServiceConnection; import android.media.IMediaRoute2Provider; import android.media.IMediaRoute2ProviderClient; -import android.media.MediaRoute2Info; import android.media.MediaRoute2ProviderInfo; import android.media.MediaRoute2ProviderService; import android.media.RouteSessionInfo; @@ -95,46 +94,46 @@ final class MediaRoute2ProviderProxy extends MediaRoute2Provider implements Serv } @Override - public void selectRoute(int sessionId, MediaRoute2Info route) { + public void selectRoute(int sessionId, String routeId) { if (mConnectionReady) { - mActiveConnection.selectRoute(sessionId, route.getId()); + mActiveConnection.selectRoute(sessionId, routeId); } } @Override - public void deselectRoute(int sessionId, MediaRoute2Info route) { + public void deselectRoute(int sessionId, String routeId) { if (mConnectionReady) { - mActiveConnection.deselectRoute(sessionId, route.getId()); + mActiveConnection.deselectRoute(sessionId, routeId); } } @Override - public void transferToRoute(int sessionId, MediaRoute2Info route) { + public void transferToRoute(int sessionId, String routeId) { if (mConnectionReady) { - mActiveConnection.transferToRoute(sessionId, route.getId()); + mActiveConnection.transferToRoute(sessionId, routeId); } } @Override - public void sendControlRequest(MediaRoute2Info route, Intent request) { + public void sendControlRequest(String routeId, Intent request) { if (mConnectionReady) { - mActiveConnection.sendControlRequest(route.getId(), request); + mActiveConnection.sendControlRequest(routeId, request); updateBinding(); } } @Override - public void requestSetVolume(MediaRoute2Info route, int volume) { + public void requestSetVolume(String routeId, int volume) { if (mConnectionReady) { - mActiveConnection.requestSetVolume(route.getId(), volume); + mActiveConnection.requestSetVolume(routeId, volume); updateBinding(); } } @Override - public void requestUpdateVolume(MediaRoute2Info route, int delta) { + public void requestUpdateVolume(String routeId, int delta) { if (mConnectionReady) { - mActiveConnection.requestUpdateVolume(route.getId(), delta); + mActiveConnection.requestUpdateVolume(routeId, delta); updateBinding(); } } diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index 562a7200fb38..a5ffbb8f60e4 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -983,7 +983,7 @@ class MediaRouter2ServiceImpl { clientRecord, route, controlCategory, requestId); mSessionCreationRequests.add(request); - provider.requestCreateSession(clientRecord.mPackageName, route.getId(), + provider.requestCreateSession(clientRecord.mPackageName, route.getOriginalId(), controlCategory, requestId); } @@ -1000,7 +1000,8 @@ class MediaRouter2ServiceImpl { if (provider == null) { return; } - provider.selectRoute(RouteSessionInfo.getSessionId(uniqueSessionId), route); + provider.selectRoute(RouteSessionInfo.getSessionId(uniqueSessionId), + route.getOriginalId()); } private void deselectRouteOnHandler(@NonNull Client2Record clientRecord, @@ -1016,7 +1017,8 @@ class MediaRouter2ServiceImpl { if (provider == null) { return; } - provider.deselectRoute(RouteSessionInfo.getSessionId(uniqueSessionId), route); + provider.deselectRoute(RouteSessionInfo.getSessionId(uniqueSessionId), + route.getOriginalId()); } private void transferToRouteOnHandler(@NonNull Client2Record clientRecord, @@ -1032,7 +1034,8 @@ class MediaRouter2ServiceImpl { if (provider == null) { return; } - provider.transferToRoute(RouteSessionInfo.getSessionId(uniqueSessionId), route); + provider.transferToRoute(RouteSessionInfo.getSessionId(uniqueSessionId), + route.getOriginalId()); } private boolean checkArgumentsForSessionControl(@NonNull Client2Record clientRecord, @@ -1239,21 +1242,21 @@ class MediaRouter2ServiceImpl { private void sendControlRequest(MediaRoute2Info route, Intent request) { final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { - provider.sendControlRequest(route, request); + provider.sendControlRequest(route.getOriginalId(), request); } } private void requestSetVolume(MediaRoute2Info route, int volume) { final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { - provider.requestSetVolume(route, volume); + provider.requestSetVolume(route.getOriginalId(), volume); } } private void requestUpdateVolume(MediaRoute2Info route, int delta) { final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { - provider.requestUpdateVolume(route, delta); + provider.requestUpdateVolume(route.getOriginalId(), delta); } } diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java index 8fdfcbfb2ad9..53027655390b 100644 --- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java @@ -102,33 +102,33 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } @Override - public void selectRoute(int sessionId, MediaRoute2Info route) { + public void selectRoute(int sessionId, String routeId) { //TODO: implement method } @Override - public void deselectRoute(int sessionId, MediaRoute2Info route) { + public void deselectRoute(int sessionId, String routeId) { //TODO: implement method } @Override - public void transferToRoute(int sessionId, MediaRoute2Info route) { + public void transferToRoute(int sessionId, String routeId) { //TODO: implement method } //TODO: implement method @Override - public void sendControlRequest(@NonNull MediaRoute2Info route, @NonNull Intent request) { + public void sendControlRequest(@NonNull String routeId, @NonNull Intent request) { } //TODO: implement method @Override - public void requestSetVolume(MediaRoute2Info route, int volume) { + public void requestSetVolume(String routeId, int volume) { } //TODO: implement method @Override - public void requestUpdateVolume(MediaRoute2Info route, int delta) { + public void requestUpdateVolume(String routeId, int delta) { } void initializeRoutes() { |