Merge "Make MediaRoute2Info#getId() unique in client side (MR2/Manager)"

This commit is contained in:
Hyundo Moon
2020-01-08 12:18:42 +00:00
committed by Android (Google) Code Review
11 changed files with 125 additions and 91 deletions

View File

@@ -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) {

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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.
*/

View File

@@ -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<>();

View File

@@ -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;

View File

@@ -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() {

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -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() {