Merge "Remove route features from RoutingSessionInfo related APIs"

This commit is contained in:
Hyundo Moon
2020-01-17 01:32:14 +00:00
committed by Android (Google) Code Review
13 changed files with 85 additions and 228 deletions

View File

@@ -24,8 +24,7 @@ import android.media.IMediaRoute2ProviderClient;
*/
oneway interface IMediaRoute2Provider {
void setClient(IMediaRoute2ProviderClient client);
void requestCreateSession(String packageName, String routeId,
String routeFeature, long requestId);
void requestCreateSession(String packageName, String routeId, long requestId);
void releaseSession(String sessionId);
void selectRoute(String sessionId, String routeId);

View File

@@ -47,12 +47,12 @@ interface IMediaRouterService {
List<MediaRoute2Info> getSystemRoutes();
void registerClient2(IMediaRouter2Client client, String packageName);
void unregisterClient2(IMediaRouter2Client client);
void sendControlRequest(IMediaRouter2Client client, in MediaRoute2Info route, in Intent request);
void sendControlRequest(IMediaRouter2Client client, in MediaRoute2Info route,
in Intent request);
void requestSetVolume2(IMediaRouter2Client client, in MediaRoute2Info route, int volume);
void requestUpdateVolume2(IMediaRouter2Client client, in MediaRoute2Info route, int direction);
void requestCreateSession(IMediaRouter2Client client, in MediaRoute2Info route,
String routeFeature, int requestId);
void requestCreateSession(IMediaRouter2Client client, in MediaRoute2Info route, int requestId);
void setDiscoveryRequest2(IMediaRouter2Client client, in RouteDiscoveryPreference preference);
void selectRoute(IMediaRouter2Client client, String sessionId, in MediaRoute2Info route);
void deselectRoute(IMediaRouter2Client client, String sessionId, in MediaRoute2Info route);

View File

@@ -161,8 +161,8 @@ public abstract class MediaRoute2ProviderService extends Service {
* @param sessionInfo information of the new session.
* The {@link RoutingSessionInfo#getId() id} of the session must be unique.
* @param requestId id of the previous request to create this session provided in
* {@link #onCreateSession(String, String, String, long)}
* @see #onCreateSession(String, String, String, long)
* {@link #onCreateSession(String, String, long)}
* @see #onCreateSession(String, String, long)
* @hide
*/
public final void notifySessionCreated(@NonNull RoutingSessionInfo sessionInfo,
@@ -196,8 +196,8 @@ public abstract class MediaRoute2ProviderService extends Service {
* Notifies clients of that the session could not be created.
*
* @param requestId id of the previous request to create the session provided in
* {@link #onCreateSession(String, String, String, long)}.
* @see #onCreateSession(String, String, String, long)
* {@link #onCreateSession(String, String, long)}.
* @see #onCreateSession(String, String, long)
* @hide
*/
public final void notifySessionCreationFailed(long requestId) {
@@ -289,16 +289,15 @@ public abstract class MediaRoute2ProviderService extends Service {
*
* @param packageName the package name of the application that selected the route
* @param routeId the id of the route initially being connected
* @param routeFeature the route feature of the new session
* @param requestId the id of this session creation request
*
* @see RoutingSessionInfo.Builder#Builder(String, String, String)
* @see RoutingSessionInfo.Builder#Builder(String, String)
* @see RoutingSessionInfo.Builder#addSelectedRoute(String)
* @see RoutingSessionInfo.Builder#setControlHints(Bundle)
* @hide
*/
public abstract void onCreateSession(@NonNull String packageName, @NonNull String routeId,
@NonNull String routeFeature, long requestId);
long requestId);
/**
* Called when the session should be released. A client of the session or system can request
@@ -433,14 +432,12 @@ public abstract class MediaRoute2ProviderService extends Service {
}
@Override
public void requestCreateSession(String packageName, String routeId,
String routeFeature, long requestId) {
public void requestCreateSession(String packageName, String routeId, long requestId) {
if (!checkCallerisSystem()) {
return;
}
mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onCreateSession,
MediaRoute2ProviderService.this, packageName, routeId, routeFeature,
requestId));
MediaRoute2ProviderService.this, packageName, routeId, requestId));
}
@Override

View File

@@ -284,26 +284,20 @@ public class MediaRouter2 {
* Requests the media route provider service to create a session with the given route.
*
* @param route the route you want to create a session with.
* @param routeFeature the route feature of the session. Should not be empty.
*
* @see SessionCallback#onSessionCreated
* @see SessionCallback#onSessionCreationFailed
* @hide
*/
@NonNull
public void requestCreateSession(@NonNull MediaRoute2Info route,
@NonNull String routeFeature) {
public void requestCreateSession(@NonNull MediaRoute2Info route) {
Objects.requireNonNull(route, "route must not be null");
if (TextUtils.isEmpty(routeFeature)) {
throw new IllegalArgumentException("routeFeature must not be empty");
}
// TODO: Check the given route exists
// TODO: Check the route supports the given routeFeature
final int requestId;
requestId = mSessionCreationRequestCnt.getAndIncrement();
SessionCreationRequest request = new SessionCreationRequest(requestId, route, routeFeature);
SessionCreationRequest request = new SessionCreationRequest(requestId, route);
mSessionCreationRequests.add(request);
Client2 client;
@@ -312,7 +306,7 @@ public class MediaRouter2 {
}
if (client != null) {
try {
mMediaRouterService.requestCreateSession(client, route, routeFeature, requestId);
mMediaRouterService.requestCreateSession(client, route, requestId);
} catch (RemoteException ex) {
Log.e(TAG, "Unable to request to create session.", ex);
mHandler.sendMessage(obtainMessage(MediaRouter2::createControllerOnHandler,
@@ -468,27 +462,18 @@ public class MediaRouter2 {
mSessionCreationRequests.remove(matchingRequest);
MediaRoute2Info requestedRoute = matchingRequest.mRoute;
String requestedRouteFeature = matchingRequest.mRouteFeature;
if (sessionInfo == null) {
// TODO: We may need to distinguish between failure and rejection.
// One way can be introducing 'reason'.
notifySessionCreationFailed(requestedRoute, requestedRouteFeature);
return;
} else if (!TextUtils.equals(requestedRouteFeature,
sessionInfo.getRouteFeature())) {
Log.w(TAG, "The session has different route feature from what we requested. "
+ "(requested=" + requestedRouteFeature
+ ", actual=" + sessionInfo.getRouteFeature()
+ ")");
notifySessionCreationFailed(requestedRoute, requestedRouteFeature);
notifySessionCreationFailed(requestedRoute);
return;
} else if (!sessionInfo.getSelectedRoutes().contains(requestedRoute.getId())) {
Log.w(TAG, "The session does not contain the requested route. "
+ "(requestedRouteId=" + requestedRoute.getId()
+ ", actualRoutes=" + sessionInfo.getSelectedRoutes()
+ ")");
notifySessionCreationFailed(requestedRoute, requestedRouteFeature);
notifySessionCreationFailed(requestedRoute);
return;
} else if (!TextUtils.equals(requestedRoute.getProviderId(),
sessionInfo.getProviderId())) {
@@ -496,7 +481,7 @@ public class MediaRouter2 {
+ "(requested route's providerId=" + requestedRoute.getProviderId()
+ ", actual providerId=" + sessionInfo.getProviderId()
+ ")");
notifySessionCreationFailed(requestedRoute, requestedRouteFeature);
notifySessionCreationFailed(requestedRoute);
return;
}
}
@@ -617,10 +602,10 @@ public class MediaRouter2 {
}
}
private void notifySessionCreationFailed(MediaRoute2Info route, String routeFeature) {
private void notifySessionCreationFailed(MediaRoute2Info route) {
for (SessionCallbackRecord record: mSessionCallbackRecords) {
record.mExecutor.execute(
() -> record.mSessionCallback.onSessionCreationFailed(route, routeFeature));
() -> record.mSessionCallback.onSessionCreationFailed(route));
}
}
@@ -688,10 +673,8 @@ public class MediaRouter2 {
* Called when the session creation request failed.
*
* @param requestedRoute the route info which was used for the request
* @param requestedRouteFeature the route feature which was used for the request
*/
public void onSessionCreationFailed(@NonNull MediaRoute2Info requestedRoute,
@NonNull String requestedRouteFeature) {}
public void onSessionCreationFailed(@NonNull MediaRoute2Info requestedRoute) {}
/**
* Called when the session info has changed.
@@ -752,16 +735,6 @@ public class MediaRouter2 {
}
}
/**
* @return the feature which is used by the session mainly.
*/
@NonNull
public String getRouteFeature() {
synchronized (mControllerLock) {
return mSessionInfo.getRouteFeature();
}
}
/**
* @return the control hints used to control routing session if available.
*/
@@ -1012,7 +985,6 @@ public class MediaRouter2 {
StringBuilder result = new StringBuilder()
.append("RoutingController{ ")
.append("sessionId=").append(getSessionId())
.append(", routeFeature=").append(getRouteFeature())
.append(", selectedRoutes={")
.append(selectedRoutes)
.append("}")
@@ -1122,13 +1094,10 @@ public class MediaRouter2 {
final class SessionCreationRequest {
public final MediaRoute2Info mRoute;
public final String mRouteFeature;
public final int mRequestId;
SessionCreationRequest(int requestId, @NonNull MediaRoute2Info route,
@NonNull String routeFeature) {
SessionCreationRequest(int requestId, @NonNull MediaRoute2Info route) {
mRoute = route;
mRouteFeature = routeFeature;
mRequestId = requestId;
}
}

View File

@@ -51,7 +51,6 @@ public final class RoutingSessionInfo implements Parcelable {
final String mId;
final String mClientPackageName;
final String mRouteFeature;
@Nullable
final String mProviderId;
final List<String> mSelectedRoutes;
@@ -66,7 +65,6 @@ public final class RoutingSessionInfo implements Parcelable {
mId = builder.mId;
mClientPackageName = builder.mClientPackageName;
mRouteFeature = builder.mRouteFeature;
mProviderId = builder.mProviderId;
// TODO: Needs to check that the routes already have unique IDs.
@@ -87,7 +85,6 @@ public final class RoutingSessionInfo implements Parcelable {
mId = ensureString(src.readString());
mClientPackageName = ensureString(src.readString());
mRouteFeature = ensureString(src.readString());
mProviderId = src.readString();
mSelectedRoutes = ensureList(src.createStringArrayList());
@@ -119,7 +116,7 @@ public final class RoutingSessionInfo implements Parcelable {
* 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 Builder#Builder(String, String, String)
* @see Builder#Builder(String, String)
*/
@NonNull
public String getId() {
@@ -131,7 +128,7 @@ public final class RoutingSessionInfo implements Parcelable {
}
/**
* Gets the original id set by {@link Builder#Builder(String, String, String)}.
* Gets the original id set by {@link Builder#Builder(String, String)}.
* @hide
*/
@NonNull
@@ -147,15 +144,6 @@ public final class RoutingSessionInfo implements Parcelable {
return mClientPackageName;
}
/**
* Gets the route feature of the session.
* Routes that don't have the feature can't be selected into the session.
*/
@NonNull
public String getRouteFeature() {
return mRouteFeature;
}
/**
* Gets the provider id of the session.
* @hide
@@ -214,7 +202,6 @@ public final class RoutingSessionInfo implements Parcelable {
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeString(mId);
dest.writeString(mClientPackageName);
dest.writeString(mRouteFeature);
dest.writeString(mProviderId);
dest.writeStringList(mSelectedRoutes);
dest.writeStringList(mSelectableRoutes);
@@ -235,7 +222,6 @@ public final class RoutingSessionInfo implements Parcelable {
RoutingSessionInfo other = (RoutingSessionInfo) obj;
return Objects.equals(mId, other.mId)
&& Objects.equals(mClientPackageName, other.mClientPackageName)
&& Objects.equals(mRouteFeature, other.mRouteFeature)
&& Objects.equals(mProviderId, other.mProviderId)
&& Objects.equals(mSelectedRoutes, other.mSelectedRoutes)
&& Objects.equals(mSelectableRoutes, other.mSelectableRoutes)
@@ -245,7 +231,7 @@ public final class RoutingSessionInfo implements Parcelable {
@Override
public int hashCode() {
return Objects.hash(mId, mClientPackageName, mRouteFeature, mProviderId,
return Objects.hash(mId, mClientPackageName, mProviderId,
mSelectedRoutes, mSelectableRoutes, mDeselectableRoutes, mTransferrableRoutes);
}
@@ -254,7 +240,6 @@ public final class RoutingSessionInfo implements Parcelable {
StringBuilder result = new StringBuilder()
.append("RoutingSessionInfo{ ")
.append("sessionId=").append(mId)
.append(", routeFeature=").append(mRouteFeature)
.append(", selectedRoutes={")
.append(String.join(",", mSelectedRoutes))
.append("}")
@@ -295,7 +280,6 @@ public final class RoutingSessionInfo implements Parcelable {
public static final class Builder {
final String mId;
final String mClientPackageName;
final String mRouteFeature;
String mProviderId;
final List<String> mSelectedRoutes;
final List<String> mSelectableRoutes;
@@ -314,22 +298,16 @@ public final class RoutingSessionInfo implements Parcelable {
* @param id ID of the session. Must not be empty.
* @param clientPackageName package name of the client app which uses this session.
* If is is unknown, then just use an empty string.
* @param routeFeature the route feature of session. Must not be empty.
* @see MediaRoute2Info#getId()
*/
public Builder(@NonNull String id, @NonNull String clientPackageName,
@NonNull String routeFeature) {
public Builder(@NonNull String id, @NonNull String clientPackageName) {
if (TextUtils.isEmpty(id)) {
throw new IllegalArgumentException("id must not be empty");
}
Objects.requireNonNull(clientPackageName, "clientPackageName must not be null");
if (TextUtils.isEmpty(routeFeature)) {
throw new IllegalArgumentException("routeFeature must not be empty");
}
mId = id;
mClientPackageName = clientPackageName;
mRouteFeature = routeFeature;
mSelectedRoutes = new ArrayList<>();
mSelectableRoutes = new ArrayList<>();
mDeselectableRoutes = new ArrayList<>();
@@ -347,7 +325,6 @@ public final class RoutingSessionInfo implements Parcelable {
mId = sessionInfo.mId;
mClientPackageName = sessionInfo.mClientPackageName;
mRouteFeature = sessionInfo.mRouteFeature;
mProviderId = sessionInfo.mProviderId;
mSelectedRoutes = new ArrayList<>(sessionInfo.mSelectedRoutes);

View File

@@ -167,8 +167,7 @@ public class SampleMediaRoute2ProviderService extends MediaRoute2ProviderService
}
@Override
public void onCreateSession(String packageName, String routeId, String routeFeature,
long requestId) {
public void onCreateSession(String packageName, String routeId, long requestId) {
MediaRoute2Info route = mRoutes.get(routeId);
if (route == null || TextUtils.equals(ROUTE_ID3_SESSION_CREATION_FAILED, routeId)) {
// Tell the router that session cannot be created by passing null as sessionInfo.
@@ -185,8 +184,7 @@ public class SampleMediaRoute2ProviderService extends MediaRoute2ProviderService
.build());
mRouteIdToSessionId.put(routeId, sessionId);
RoutingSessionInfo sessionInfo = new RoutingSessionInfo.Builder(
sessionId, packageName, routeFeature)
RoutingSessionInfo sessionInfo = new RoutingSessionInfo.Builder(sessionId, packageName)
.addSelectedRoute(routeId)
.addSelectableRoute(ROUTE_ID4_TO_SELECT_AND_DESELECT)
.addTransferrableRoute(ROUTE_ID5_TO_TRANSFER_TO)

View File

@@ -172,21 +172,8 @@ public class MediaRouter2Test {
}
@Test
public void testRequestCreateSessionWithInvalidArguments() {
String routeFeature = "routeFeature";
MediaRoute2Info route = new MediaRoute2Info.Builder("id", "name")
.addFeature(routeFeature)
.build();
// Tests null route
assertThrows(NullPointerException.class,
() -> mRouter2.requestCreateSession(null, routeFeature));
// Tests null or empty route feature
assertThrows(IllegalArgumentException.class,
() -> mRouter2.requestCreateSession(route, null));
assertThrows(IllegalArgumentException.class,
() -> mRouter2.requestCreateSession(route, ""));
public void testRequestCreateSessionWithNullRoute() {
assertThrows(NullPointerException.class, () -> mRouter2.requestCreateSession(null));
}
@Test
@@ -208,14 +195,12 @@ public class MediaRouter2Test {
public void onSessionCreated(RoutingController controller) {
assertNotNull(controller);
assertTrue(createRouteMap(controller.getSelectedRoutes()).containsKey(ROUTE_ID1));
assertTrue(TextUtils.equals(FEATURE_SAMPLE, controller.getRouteFeature()));
controllers.add(controller);
successLatch.countDown();
}
@Override
public void onSessionCreationFailed(MediaRoute2Info requestedRoute,
String requestedRouteFeature) {
public void onSessionCreationFailed(MediaRoute2Info requestedRoute) {
failureLatch.countDown();
}
};
@@ -226,7 +211,7 @@ public class MediaRouter2Test {
try {
mRouter2.registerSessionCallback(mExecutor, sessionCallback);
mRouter2.requestCreateSession(route, FEATURE_SAMPLE);
mRouter2.requestCreateSession(route);
assertTrue(successLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
// onSessionCreationFailed should not be called.
@@ -260,10 +245,8 @@ public class MediaRouter2Test {
}
@Override
public void onSessionCreationFailed(MediaRoute2Info requestedRoute,
String requestedRouteFeature) {
public void onSessionCreationFailed(MediaRoute2Info requestedRoute) {
assertEquals(route, requestedRoute);
assertTrue(TextUtils.equals(FEATURE_SAMPLE, requestedRouteFeature));
failureLatch.countDown();
}
};
@@ -274,7 +257,7 @@ public class MediaRouter2Test {
try {
mRouter2.registerSessionCallback(mExecutor, sessionCallback);
mRouter2.requestCreateSession(route, FEATURE_SAMPLE);
mRouter2.requestCreateSession(route);
assertTrue(failureLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
// onSessionCreated should not be called.
@@ -304,8 +287,7 @@ public class MediaRouter2Test {
}
@Override
public void onSessionCreationFailed(MediaRoute2Info requestedRoute,
String requestedRouteFeature) {
public void onSessionCreationFailed(MediaRoute2Info requestedRoute) {
failureLatch.countDown();
}
};
@@ -322,8 +304,8 @@ public class MediaRouter2Test {
try {
mRouter2.registerSessionCallback(mExecutor, sessionCallback);
mRouter2.requestCreateSession(route1, FEATURE_SAMPLE);
mRouter2.requestCreateSession(route2, FEATURE_SAMPLE);
mRouter2.requestCreateSession(route1);
mRouter2.requestCreateSession(route2);
assertTrue(successLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
// onSessionCreationFailed should not be called.
@@ -337,8 +319,6 @@ public class MediaRouter2Test {
assertNotEquals(controller1.getSessionId(), controller2.getSessionId());
assertTrue(createRouteMap(controller1.getSelectedRoutes()).containsKey(ROUTE_ID1));
assertTrue(createRouteMap(controller2.getSelectedRoutes()).containsKey(ROUTE_ID2));
assertTrue(TextUtils.equals(FEATURE_SAMPLE, controller1.getRouteFeature()));
assertTrue(TextUtils.equals(FEATURE_SAMPLE, controller2.getRouteFeature()));
} finally {
releaseControllers(createdControllers);
@@ -369,8 +349,7 @@ public class MediaRouter2Test {
}
@Override
public void onSessionCreationFailed(MediaRoute2Info requestedRoute,
String requestedRouteFeature) {
public void onSessionCreationFailed(MediaRoute2Info requestedRoute) {
failureLatch.countDown();
}
};
@@ -381,7 +360,7 @@ public class MediaRouter2Test {
try {
mRouter2.registerSessionCallback(mExecutor, sessionCallback);
mRouter2.requestCreateSession(route, FEATURE_SAMPLE);
mRouter2.requestCreateSession(route);
// Unregisters session callback
mRouter2.unregisterSessionCallback(sessionCallback);
@@ -417,7 +396,6 @@ public class MediaRouter2Test {
public void onSessionCreated(RoutingController controller) {
assertNotNull(controller);
assertTrue(getRouteIds(controller.getSelectedRoutes()).contains(ROUTE_ID1));
assertTrue(TextUtils.equals(FEATURE_SAMPLE, controller.getRouteFeature()));
controllers.add(controller);
onSessionCreatedLatch.countDown();
}
@@ -470,7 +448,7 @@ public class MediaRouter2Test {
try {
mRouter2.registerSessionCallback(mExecutor, sessionCallback);
mRouter2.requestCreateSession(routeToCreateSessionWith, FEATURE_SAMPLE);
mRouter2.requestCreateSession(routeToCreateSessionWith);
assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
assertEquals(1, controllers.size());
@@ -515,7 +493,6 @@ public class MediaRouter2Test {
public void onSessionCreated(RoutingController controller) {
assertNotNull(controller);
assertTrue(getRouteIds(controller.getSelectedRoutes()).contains(ROUTE_ID1));
assertTrue(TextUtils.equals(FEATURE_SAMPLE, controller.getRouteFeature()));
controllers.add(controller);
onSessionCreatedLatch.countDown();
}
@@ -552,7 +529,7 @@ public class MediaRouter2Test {
try {
mRouter2.registerSessionCallback(mExecutor, sessionCallback);
mRouter2.requestCreateSession(routeToCreateSessionWith, FEATURE_SAMPLE);
mRouter2.requestCreateSession(routeToCreateSessionWith);
assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
assertEquals(1, controllers.size());
@@ -594,7 +571,6 @@ public class MediaRouter2Test {
public void onSessionCreated(RoutingController controller) {
assertNotNull(controller);
assertTrue(getRouteIds(controller.getSelectedRoutes()).contains(ROUTE_ID1));
assertTrue(TextUtils.equals(FEATURE_SAMPLE, controller.getRouteFeature()));
controllers.add(controller);
onSessionCreatedLatch.countDown();
}
@@ -617,7 +593,7 @@ public class MediaRouter2Test {
try {
mRouter2.registerSessionCallback(mExecutor, sessionCallback);
mRouter2.requestCreateSession(routeToCreateSessionWith, FEATURE_SAMPLE);
mRouter2.requestCreateSession(routeToCreateSessionWith);
assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
assertEquals(1, controllers.size());

View File

@@ -57,65 +57,32 @@ public class RoutingSessionInfoTest {
public void testBuilderConstructorWithInvalidValues() {
final String nullId = null;
final String nullClientPackageName = null;
final String nullRouteFeature = null;
final String emptyId = "";
// Note: An empty string as client package name is valid.
final String emptyRouteFeature = "";
final String validId = TEST_ID;
final String validClientPackageName = TEST_CLIENT_PACKAGE_NAME;
final String validRouteFeature = TEST_ROUTE_FEATURE;
// ID is invalid
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
nullId, validClientPackageName, validRouteFeature));
nullId, validClientPackageName));
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
emptyId, validClientPackageName, validRouteFeature));
emptyId, validClientPackageName));
// client package name is invalid (null)
assertThrows(NullPointerException.class, () -> new RoutingSessionInfo.Builder(
validId, nullClientPackageName, validRouteFeature));
validId, nullClientPackageName));
// route feature is invalid
// Both are invalid
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
validId, validClientPackageName, nullRouteFeature));
nullId, nullClientPackageName));
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
validId, validClientPackageName, emptyRouteFeature));
// Two arguments are invalid - (1) ID and clientPackageName
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
nullId, nullClientPackageName, validRouteFeature));
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
emptyId, nullClientPackageName, validRouteFeature));
// Two arguments are invalid - (2) ID and routeFeature
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
nullId, validClientPackageName, nullRouteFeature));
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
nullId, validClientPackageName, emptyRouteFeature));
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
emptyId, validClientPackageName, nullRouteFeature));
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
emptyId, validClientPackageName, emptyRouteFeature));
// Two arguments are invalid - (3) clientPackageName and routeFeature
// Note that this throws NullPointerException.
assertThrows(NullPointerException.class, () -> new RoutingSessionInfo.Builder(
validId, nullClientPackageName, nullRouteFeature));
assertThrows(NullPointerException.class, () -> new RoutingSessionInfo.Builder(
validId, nullClientPackageName, emptyRouteFeature));
// All arguments are invalid
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
nullId, nullClientPackageName, nullRouteFeature));
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
nullId, nullClientPackageName, emptyRouteFeature));
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
emptyId, nullClientPackageName, nullRouteFeature));
assertThrows(IllegalArgumentException.class, () -> new RoutingSessionInfo.Builder(
emptyId, nullClientPackageName, emptyRouteFeature));
emptyId, nullClientPackageName));
}
@Test
public void testBuilderCopyConstructorWithNull() {
// Null RouteInfo (1-argument constructor)
final RoutingSessionInfo nullRoutingSessionInfo = null;
assertThrows(NullPointerException.class,
@@ -127,13 +94,13 @@ public class RoutingSessionInfoTest {
// An empty string for client package name is valid. (for unknown cases)
// Creating builder with it should not throw any exception.
RoutingSessionInfo.Builder builder = new RoutingSessionInfo.Builder(
TEST_ID, "" /* clientPackageName*/, TEST_ROUTE_FEATURE);
TEST_ID, "" /* clientPackageName*/);
}
@Test
public void testBuilderBuildWithEmptySelectedRoutesThrowsIAE() {
RoutingSessionInfo.Builder builder = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE);
TEST_ID, TEST_CLIENT_PACKAGE_NAME);
// Note: Calling build() without adding any selected routes.
assertThrows(IllegalArgumentException.class, () -> builder.build());
}
@@ -141,7 +108,7 @@ public class RoutingSessionInfoTest {
@Test
public void testBuilderAddRouteMethodsWithIllegalArgumentsThrowsIAE() {
RoutingSessionInfo.Builder builder = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE);
TEST_ID, TEST_CLIENT_PACKAGE_NAME);
final String nullRouteId = null;
final String emptyRouteId = "";
@@ -168,7 +135,7 @@ public class RoutingSessionInfoTest {
@Test
public void testBuilderRemoveRouteMethodsWithIllegalArgumentsThrowsIAE() {
RoutingSessionInfo.Builder builder = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE);
TEST_ID, TEST_CLIENT_PACKAGE_NAME);
final String nullRouteId = null;
final String emptyRouteId = "";
@@ -198,7 +165,7 @@ public class RoutingSessionInfoTest {
controlHints.putString(TEST_KEY, TEST_VALUE);
RoutingSessionInfo sessionInfo = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE)
TEST_ID, TEST_CLIENT_PACKAGE_NAME)
.addSelectedRoute(TEST_ROUTE_ID_0)
.addSelectedRoute(TEST_ROUTE_ID_1)
.addSelectableRoute(TEST_ROUTE_ID_2)
@@ -212,7 +179,6 @@ public class RoutingSessionInfoTest {
assertEquals(TEST_ID, sessionInfo.getId());
assertEquals(TEST_CLIENT_PACKAGE_NAME, sessionInfo.getClientPackageName());
assertEquals(TEST_ROUTE_FEATURE, sessionInfo.getRouteFeature());
assertEquals(2, sessionInfo.getSelectedRoutes().size());
assertEquals(TEST_ROUTE_ID_0, sessionInfo.getSelectedRoutes().get(0));
@@ -239,7 +205,7 @@ public class RoutingSessionInfoTest {
@Test
public void testBuilderAddRouteMethodsWithBuilderCopyConstructor() {
RoutingSessionInfo sessionInfo = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE)
TEST_ID, TEST_CLIENT_PACKAGE_NAME)
.addSelectedRoute(TEST_ROUTE_ID_0)
.addSelectableRoute(TEST_ROUTE_ID_2)
.addDeselectableRoute(TEST_ROUTE_ID_4)
@@ -273,7 +239,7 @@ public class RoutingSessionInfoTest {
@Test
public void testBuilderRemoveRouteMethods() {
RoutingSessionInfo sessionInfo = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE)
TEST_ID, TEST_CLIENT_PACKAGE_NAME)
.addSelectedRoute(TEST_ROUTE_ID_0)
.addSelectedRoute(TEST_ROUTE_ID_1)
.removeSelectedRoute(TEST_ROUTE_ID_1)
@@ -308,7 +274,7 @@ public class RoutingSessionInfoTest {
@Test
public void testBuilderRemoveRouteMethodsWithBuilderCopyConstructor() {
RoutingSessionInfo sessionInfo = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE)
TEST_ID, TEST_CLIENT_PACKAGE_NAME)
.addSelectedRoute(TEST_ROUTE_ID_0)
.addSelectedRoute(TEST_ROUTE_ID_1)
.addSelectableRoute(TEST_ROUTE_ID_2)
@@ -342,7 +308,7 @@ public class RoutingSessionInfoTest {
@Test
public void testBuilderClearRouteMethods() {
RoutingSessionInfo sessionInfo = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE)
TEST_ID, TEST_CLIENT_PACKAGE_NAME)
.addSelectedRoute(TEST_ROUTE_ID_0)
.addSelectedRoute(TEST_ROUTE_ID_1)
.clearSelectedRoutes()
@@ -374,7 +340,7 @@ public class RoutingSessionInfoTest {
@Test
public void testBuilderClearRouteMethodsWithBuilderCopyConstructor() {
RoutingSessionInfo sessionInfo = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE)
TEST_ID, TEST_CLIENT_PACKAGE_NAME)
.addSelectedRoute(TEST_ROUTE_ID_0)
.addSelectedRoute(TEST_ROUTE_ID_1)
.addSelectableRoute(TEST_ROUTE_ID_2)
@@ -408,7 +374,7 @@ public class RoutingSessionInfoTest {
controlHints.putString(TEST_KEY, TEST_VALUE);
RoutingSessionInfo sessionInfo1 = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE)
TEST_ID, TEST_CLIENT_PACKAGE_NAME)
.addSelectedRoute(TEST_ROUTE_ID_0)
.addSelectedRoute(TEST_ROUTE_ID_1)
.addSelectableRoute(TEST_ROUTE_ID_2)
@@ -421,7 +387,7 @@ public class RoutingSessionInfoTest {
.build();
RoutingSessionInfo sessionInfo2 = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE)
TEST_ID, TEST_CLIENT_PACKAGE_NAME)
.addSelectedRoute(TEST_ROUTE_ID_0)
.addSelectedRoute(TEST_ROUTE_ID_1)
.addSelectableRoute(TEST_ROUTE_ID_2)
@@ -443,7 +409,7 @@ public class RoutingSessionInfoTest {
controlHints.putString(TEST_KEY, TEST_VALUE);
RoutingSessionInfo sessionInfo1 = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE)
TEST_ID, TEST_CLIENT_PACKAGE_NAME)
.addSelectedRoute(TEST_ROUTE_ID_0)
.addSelectedRoute(TEST_ROUTE_ID_1)
.addSelectableRoute(TEST_ROUTE_ID_2)
@@ -467,7 +433,7 @@ public class RoutingSessionInfoTest {
controlHints.putString(TEST_KEY, TEST_VALUE);
RoutingSessionInfo sessionInfo = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE)
TEST_ID, TEST_CLIENT_PACKAGE_NAME)
.addSelectedRoute(TEST_ROUTE_ID_0)
.addSelectedRoute(TEST_ROUTE_ID_1)
.addSelectableRoute(TEST_ROUTE_ID_2)
@@ -530,7 +496,7 @@ public class RoutingSessionInfoTest {
controlHints.putString(TEST_KEY, TEST_VALUE);
RoutingSessionInfo sessionInfo = new RoutingSessionInfo.Builder(
TEST_ID, TEST_CLIENT_PACKAGE_NAME, TEST_ROUTE_FEATURE)
TEST_ID, TEST_CLIENT_PACKAGE_NAME)
.addSelectedRoute(TEST_ROUTE_ID_0)
.addSelectedRoute(TEST_ROUTE_ID_1)
.addSelectableRoute(TEST_ROUTE_ID_2)

View File

@@ -49,8 +49,7 @@ abstract class MediaRoute2Provider {
mCallback = callback;
}
public abstract void requestCreateSession(String packageName, String routeId,
String routeType, long requestId);
public abstract void requestCreateSession(String packageName, String routeId, long requestId);
public abstract void releaseSession(String sessionId);
public abstract void selectRoute(String sessionId, String routeId);

View File

@@ -73,11 +73,9 @@ final class MediaRoute2ProviderProxy extends MediaRoute2Provider implements Serv
}
@Override
public void requestCreateSession(String packageName, String routeId, String routeType,
long requestId) {
public void requestCreateSession(String packageName, String routeId, long requestId) {
if (mConnectionReady) {
mActiveConnection.requestCreateSession(packageName, routeId, routeType,
requestId);
mActiveConnection.requestCreateSession(packageName, routeId, requestId);
updateBinding();
}
}
@@ -429,11 +427,9 @@ final class MediaRoute2ProviderProxy extends MediaRoute2Provider implements Serv
mClient.dispose();
}
public void requestCreateSession(String packageName, String routeId, String routeType,
long requestId) {
public void requestCreateSession(String packageName, String routeId, long requestId) {
try {
mProvider.requestCreateSession(packageName, routeId,
routeType, requestId);
mProvider.requestCreateSession(packageName, routeId, requestId);
} catch (RemoteException ex) {
Slog.e(TAG, "Failed to deliver request to create a session.", ex);
}

View File

@@ -178,18 +178,14 @@ class MediaRouter2ServiceImpl {
}
public void requestCreateSession(IMediaRouter2Client client, MediaRoute2Info route,
String routeFeature, int requestId) {
int requestId) {
Objects.requireNonNull(client, "client must not be null");
Objects.requireNonNull(route, "route must not be null");
if (TextUtils.isEmpty(routeFeature)) {
throw new IllegalArgumentException("routeFeature must not be empty");
}
final long token = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
requestCreateSessionLocked(client, route, routeFeature, requestId);
requestCreateSessionLocked(client, route, requestId);
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -450,7 +446,7 @@ class MediaRouter2ServiceImpl {
}
private void requestCreateSessionLocked(@NonNull IMediaRouter2Client client,
@NonNull MediaRoute2Info route, @NonNull String routeFeature, long requestId) {
@NonNull MediaRoute2Info route, long requestId) {
final IBinder binder = client.asBinder();
final Client2Record clientRecord = mAllClientRecords.get(binder);
@@ -462,8 +458,7 @@ class MediaRouter2ServiceImpl {
if (clientRecord != null) {
clientRecord.mUserRecord.mHandler.sendMessage(
obtainMessage(UserHandler::requestCreateSessionOnHandler,
clientRecord.mUserRecord.mHandler,
clientRecord, route, routeFeature, requestId));
clientRecord.mUserRecord.mHandler, clientRecord, route, requestId));
}
}
@@ -624,7 +619,7 @@ class MediaRouter2ServiceImpl {
if (clientRecord != null && managerRecord.mTrusted) {
//TODO: select route feature properly
requestCreateSessionLocked(clientRecord.mClient, route,
route.getFeatures().get(0), uniqueRequestId);
uniqueRequestId);
}
}
}
@@ -985,7 +980,7 @@ class MediaRouter2ServiceImpl {
}
private void requestCreateSessionOnHandler(Client2Record clientRecord,
MediaRoute2Info route, String routeFeature, long requestId) {
MediaRoute2Info route, long requestId) {
final MediaRoute2Provider provider = findProvider(route.getProviderId());
if (provider == null) {
@@ -995,20 +990,13 @@ class MediaRouter2ServiceImpl {
return;
}
if (!route.getFeatures().contains(routeFeature)) {
Slog.w(TAG, "Ignoring session creation request since the given route=" + route
+ " doesn't support the given feature=" + routeFeature);
notifySessionCreationFailed(clientRecord, toClientRequestId(requestId));
return;
}
// TODO: Apply timeout for each request (How many seconds should we wait?)
SessionCreationRequest request = new SessionCreationRequest(
clientRecord, route, routeFeature, requestId);
SessionCreationRequest request =
new SessionCreationRequest(clientRecord, route, requestId);
mSessionCreationRequests.add(request);
provider.requestCreateSession(clientRecord.mPackageName, route.getOriginalId(),
routeFeature, requestId);
requestId);
}
private void selectRouteOnHandler(@NonNull Client2Record clientRecord,
@@ -1173,15 +1161,11 @@ class MediaRouter2ServiceImpl {
}
String originalRouteId = matchingRequest.mRoute.getId();
String originalRouteFeature = matchingRequest.mRouteFeature;
Client2Record client2Record = matchingRequest.mClientRecord;
if (!sessionInfo.getSelectedRoutes().contains(originalRouteId)
|| !TextUtils.equals(originalRouteFeature,
sessionInfo.getRouteFeature())) {
if (!sessionInfo.getSelectedRoutes().contains(originalRouteId)) {
Slog.w(TAG, "Created session doesn't match the original request."
+ " originalRouteId=" + originalRouteId
+ ", originalRouteFeature=" + originalRouteFeature
+ ", requestId=" + requestId + ", sessionInfo=" + sessionInfo);
notifySessionCreationFailed(matchingRequest.mClientRecord,
toClientRequestId(requestId));
@@ -1470,15 +1454,12 @@ class MediaRouter2ServiceImpl {
final class SessionCreationRequest {
public final Client2Record mClientRecord;
public final MediaRoute2Info mRoute;
public final String mRouteFeature;
public final long mRequestId;
SessionCreationRequest(@NonNull Client2Record clientRecord,
@NonNull MediaRoute2Info route,
@NonNull String routeFeature, long requestId) {
@NonNull MediaRoute2Info route, long requestId) {
mClientRecord = clientRecord;
mRoute = route;
mRouteFeature = routeFeature;
mRequestId = requestId;
}
}

View File

@@ -460,8 +460,8 @@ public final class MediaRouterService extends IMediaRouterService.Stub
// Binder call
@Override
public void requestCreateSession(IMediaRouter2Client client, MediaRoute2Info route,
String routeType, int requestId) {
mService2.requestCreateSession(client, route, routeType, requestId);
int requestId) {
mService2.requestCreateSession(client, route, requestId);
}
// Binder call

View File

@@ -96,8 +96,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
}
@Override
public void requestCreateSession(String packageName, String routeId, String routeType,
long requestId) {
public void requestCreateSession(String packageName, String routeId, long requestId) {
// Do nothing
}