Merge "Merge notifySessionCreationFailed into notifyRequestFailed" into rvc-dev

This commit is contained in:
TreeHugger Robot
2020-03-06 06:52:21 +00:00
committed by Android (Google) Code Review
7 changed files with 69 additions and 101 deletions

View File

@@ -26909,7 +26909,6 @@ package android.media {
method public final void notifyRequestFailed(long, int); method public final void notifyRequestFailed(long, int);
method public final void notifyRoutes(@NonNull java.util.Collection<android.media.MediaRoute2Info>); method public final void notifyRoutes(@NonNull java.util.Collection<android.media.MediaRoute2Info>);
method public final void notifySessionCreated(@NonNull android.media.RoutingSessionInfo, long); method public final void notifySessionCreated(@NonNull android.media.RoutingSessionInfo, long);
method public final void notifySessionCreationFailed(long);
method public final void notifySessionReleased(@NonNull String); method public final void notifySessionReleased(@NonNull String);
method public final void notifySessionUpdated(@NonNull android.media.RoutingSessionInfo); method public final void notifySessionUpdated(@NonNull android.media.RoutingSessionInfo);
method @CallSuper @Nullable public android.os.IBinder onBind(@NonNull android.content.Intent); method @CallSuper @Nullable public android.os.IBinder onBind(@NonNull android.content.Intent);

View File

@@ -28,7 +28,6 @@ oneway interface IMediaRoute2ProviderServiceCallback {
// TODO: Change it to updateRoutes? // TODO: Change it to updateRoutes?
void updateState(in MediaRoute2ProviderInfo providerInfo); void updateState(in MediaRoute2ProviderInfo providerInfo);
void notifySessionCreated(in RoutingSessionInfo sessionInfo, long requestId); void notifySessionCreated(in RoutingSessionInfo sessionInfo, long requestId);
void notifySessionCreationFailed(long requestId);
void notifySessionUpdated(in RoutingSessionInfo sessionInfo); void notifySessionUpdated(in RoutingSessionInfo sessionInfo);
void notifySessionReleased(in RoutingSessionInfo sessionInfo); void notifySessionReleased(in RoutingSessionInfo sessionInfo);
void notifyRequestFailed(long requestId, int reason); void notifyRequestFailed(long requestId, int reason);

View File

@@ -233,6 +233,7 @@ public abstract class MediaRoute2ProviderService extends Service {
String sessionId = sessionInfo.getId(); String sessionId = sessionInfo.getId();
synchronized (mSessionLock) { synchronized (mSessionLock) {
if (mSessionInfo.containsKey(sessionId)) { if (mSessionInfo.containsKey(sessionId)) {
// TODO: Notify failure to the requester, and throw exception if needed.
Log.w(TAG, "Ignoring duplicate session id."); Log.w(TAG, "Ignoring duplicate session id.");
return; return;
} }
@@ -252,24 +253,6 @@ 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(long, String, String, Bundle)}.
* @see #onCreateSession(long, String, String, Bundle)
*/
public final void notifySessionCreationFailed(long requestId) {
if (mRemoteCallback == null) {
return;
}
try {
mRemoteCallback.notifySessionCreationFailed(requestId);
} catch (RemoteException ex) {
Log.w(TAG, "Failed to notify session creation failed.");
}
}
/** /**
* Notifies the existing session is updated. For example, when * Notifies the existing session is updated. For example, when
* {@link RoutingSessionInfo#getSelectedRoutes() selected routes} are changed. * {@link RoutingSessionInfo#getSelectedRoutes() selected routes} are changed.
@@ -364,7 +347,7 @@ public abstract class MediaRoute2ProviderService extends Service {
* {@link Bundle} which contains how to control the session. * {@link Bundle} which contains how to control the session.
* <p> * <p>
* If you can't create the session or want to reject the request, call * If you can't create the session or want to reject the request, call
* {@link #notifySessionCreationFailed(long)} with the given {@code requestId}. * {@link #notifyRequestFailed(long, int)} with the given {@code requestId}.
* *
* @param requestId the id of this request * @param requestId the id of this request
* @param packageName the package name of the application that selected the route * @param packageName the package name of the application that selected the route

View File

@@ -216,8 +216,7 @@ public class SampleMediaRoute2ProviderService extends MediaRoute2ProviderService
@Nullable Bundle sessionHints) { @Nullable Bundle sessionHints) {
MediaRoute2Info route = mRoutes.get(routeId); MediaRoute2Info route = mRoutes.get(routeId);
if (route == null || TextUtils.equals(ROUTE_ID3_SESSION_CREATION_FAILED, 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. notifyRequestFailed(requestId, REASON_UNKNOWN_ERROR);
notifySessionCreationFailed(requestId);
return; return;
} }
maybeDeselectRoute(routeId); maybeDeselectRoute(routeId);

View File

@@ -111,7 +111,6 @@ abstract class MediaRoute2Provider {
void onProviderStateChanged(@Nullable MediaRoute2Provider provider); void onProviderStateChanged(@Nullable MediaRoute2Provider provider);
void onSessionCreated(@NonNull MediaRoute2Provider provider, void onSessionCreated(@NonNull MediaRoute2Provider provider,
@Nullable RoutingSessionInfo sessionInfo, long requestId); @Nullable RoutingSessionInfo sessionInfo, long requestId);
void onSessionCreationFailed(@NonNull MediaRoute2Provider provider, long requestId);
void onSessionUpdated(@NonNull MediaRoute2Provider provider, void onSessionUpdated(@NonNull MediaRoute2Provider provider,
@NonNull RoutingSessionInfo sessionInfo); @NonNull RoutingSessionInfo sessionInfo);
void onSessionReleased(@NonNull MediaRoute2Provider provider, void onSessionReleased(@NonNull MediaRoute2Provider provider,

View File

@@ -328,19 +328,6 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider
mCallback.onSessionCreated(this, sessionInfo, requestId); mCallback.onSessionCreated(this, sessionInfo, requestId);
} }
private void onSessionCreationFailed(Connection connection, long requestId) {
if (mActiveConnection != connection) {
return;
}
if (requestId == MediaRoute2ProviderService.REQUEST_ID_NONE) {
Slog.w(TAG, "onSessionCreationFailed: Ignoring requestId REQUEST_ID_NONE");
return;
}
mCallback.onSessionCreationFailed(this, requestId);
}
private void onSessionUpdated(Connection connection, RoutingSessionInfo sessionInfo) { private void onSessionUpdated(Connection connection, RoutingSessionInfo sessionInfo) {
if (mActiveConnection != connection) { if (mActiveConnection != connection) {
return; return;
@@ -543,10 +530,6 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider
mHandler.post(() -> onSessionCreated(Connection.this, sessionInfo, requestId)); mHandler.post(() -> onSessionCreated(Connection.this, sessionInfo, requestId));
} }
void postSessionCreationFailed(long requestId) {
mHandler.post(() -> onSessionCreationFailed(Connection.this, requestId));
}
void postSessionUpdated(RoutingSessionInfo sessionInfo) { void postSessionUpdated(RoutingSessionInfo sessionInfo) {
mHandler.post(() -> onSessionUpdated(Connection.this, sessionInfo)); mHandler.post(() -> onSessionUpdated(Connection.this, sessionInfo));
} }
@@ -555,7 +538,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider
mHandler.post(() -> onSessionReleased(Connection.this, sessionInfo)); mHandler.post(() -> onSessionReleased(Connection.this, sessionInfo));
} }
void postSessionReleased(long requestId, int reason) { void postRequestFailed(long requestId, int reason) {
mHandler.post(() -> onRequestFailed(Connection.this, requestId, reason)); mHandler.post(() -> onRequestFailed(Connection.this, requestId, reason));
} }
} }
@@ -588,14 +571,6 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider
} }
} }
@Override
public void notifySessionCreationFailed(long requestId) {
Connection connection = mConnectionRef.get();
if (connection != null) {
connection.postSessionCreationFailed(requestId);
}
}
@Override @Override
public void notifySessionUpdated(RoutingSessionInfo sessionInfo) { public void notifySessionUpdated(RoutingSessionInfo sessionInfo) {
Connection connection = mConnectionRef.get(); Connection connection = mConnectionRef.get();
@@ -616,7 +591,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider
public void notifyRequestFailed(long requestId, int reason) { public void notifyRequestFailed(long requestId, int reason) {
Connection connection = mConnectionRef.get(); Connection connection = mConnectionRef.get();
if (connection != null) { if (connection != null) {
connection.postSessionReleased(requestId, reason); connection.postRequestFailed(requestId, reason);
} }
} }
} }

View File

@@ -608,7 +608,8 @@ class MediaRouter2ServiceImpl {
routerRecord.mUserRecord.mHandler.sendMessage( routerRecord.mUserRecord.mHandler.sendMessage(
obtainMessage(UserHandler::requestCreateSessionOnHandler, obtainMessage(UserHandler::requestCreateSessionOnHandler,
routerRecord.mUserRecord.mHandler, routerRecord.mUserRecord.mHandler,
routerRecord, route, uniqueRequestId, sessionHints)); routerRecord, /* managerRecord= */ null, route, uniqueRequestId,
sessionHints));
} }
private void selectRouteWithRouter2Locked(@NonNull IMediaRouter2 router, private void selectRouteWithRouter2Locked(@NonNull IMediaRouter2 router,
@@ -788,7 +789,8 @@ class MediaRouter2ServiceImpl {
routerRecord.mUserRecord.mHandler.sendMessage( routerRecord.mUserRecord.mHandler.sendMessage(
obtainMessage(UserHandler::requestCreateSessionOnHandler, obtainMessage(UserHandler::requestCreateSessionOnHandler,
routerRecord.mUserRecord.mHandler, routerRecord.mUserRecord.mHandler,
routerRecord, route, uniqueRequestId, null /* sessionHints */)); routerRecord, managerRecord, route, uniqueRequestId,
/* sessionHints= */ null));
} }
private void selectRouteWithManagerLocked(@NonNull IMediaRouter2Manager manager, private void selectRouteWithManagerLocked(@NonNull IMediaRouter2Manager manager,
@@ -927,7 +929,7 @@ class MediaRouter2ServiceImpl {
return ((long) routerOrManagerId << 32) | originalRequestId; return ((long) routerOrManagerId << 32) | originalRequestId;
} }
static int toRouterOrManagerId(long uniqueRequestId) { static int toRequesterId(long uniqueRequestId) {
return (int) (uniqueRequestId >> 32); return (int) (uniqueRequestId >> 32);
} }
@@ -1107,11 +1109,6 @@ class MediaRouter2ServiceImpl {
this, provider, sessionInfo, requestId)); this, provider, sessionInfo, requestId));
} }
@Override
public void onSessionCreationFailed(@NonNull MediaRoute2Provider provider, long requestId) {
sendMessage(PooledLambda.obtainMessage(UserHandler::onSessionCreationFailedOnHandler,
this, provider, requestId));
}
@Override @Override
public void onSessionUpdated(@NonNull MediaRoute2Provider provider, public void onSessionUpdated(@NonNull MediaRoute2Provider provider,
@@ -1223,7 +1220,8 @@ class MediaRouter2ServiceImpl {
} }
private void requestCreateSessionOnHandler(@NonNull RouterRecord routerRecord, private void requestCreateSessionOnHandler(@NonNull RouterRecord routerRecord,
@NonNull MediaRoute2Info route, long requestId, @Nullable Bundle sessionHints) { @Nullable ManagerRecord managerRecord, @NonNull MediaRoute2Info route,
long requestId, @Nullable Bundle sessionHints) {
final MediaRoute2Provider provider = findProvider(route.getProviderId()); final MediaRoute2Provider provider = findProvider(route.getProviderId());
if (provider == null) { if (provider == null) {
@@ -1235,7 +1233,7 @@ class MediaRouter2ServiceImpl {
// TODO: Apply timeout for each request (How many seconds should we wait?) // TODO: Apply timeout for each request (How many seconds should we wait?)
SessionCreationRequest request = SessionCreationRequest request =
new SessionCreationRequest(routerRecord, route, requestId); new SessionCreationRequest(routerRecord, managerRecord, route, requestId);
mSessionCreationRequests.add(request); mSessionCreationRequests.add(request);
provider.requestCreateSession(routerRecord.mPackageName, route.getOriginalId(), provider.requestCreateSession(routerRecord.mPackageName, route.getOriginalId(),
@@ -1421,30 +1419,6 @@ class MediaRouter2ServiceImpl {
mSessionToRouterMap.put(sessionInfo.getId(), routerRecord); mSessionToRouterMap.put(sessionInfo.getId(), routerRecord);
} }
private void onSessionCreationFailedOnHandler(@NonNull MediaRoute2Provider provider,
long requestId) {
SessionCreationRequest matchingRequest = null;
for (SessionCreationRequest request : mSessionCreationRequests) {
if (request.mRequestId == requestId
&& TextUtils.equals(
request.mRoute.getProviderId(), provider.getUniqueId())) {
matchingRequest = request;
break;
}
}
if (matchingRequest == null) {
Slog.w(TAG, "Ignoring session creation failed result for unknown request. "
+ "requestId=" + requestId);
return;
}
mSessionCreationRequests.remove(matchingRequest);
notifySessionCreationFailedToRouter(matchingRequest.mRouterRecord,
toOriginalRequestId(requestId));
}
private void onSessionInfoChangedOnHandler(@NonNull MediaRoute2Provider provider, private void onSessionInfoChangedOnHandler(@NonNull MediaRoute2Provider provider,
@NonNull RoutingSessionInfo sessionInfo) { @NonNull RoutingSessionInfo sessionInfo) {
List<IMediaRouter2Manager> managers = getManagers(); List<IMediaRouter2Manager> managers = getManagers();
@@ -1483,30 +1457,56 @@ class MediaRouter2ServiceImpl {
private void onRequestFailedOnHandler(@NonNull MediaRoute2Provider provider, private void onRequestFailedOnHandler(@NonNull MediaRoute2Provider provider,
long requestId, int reason) { long requestId, int reason) {
final int managerId = toRouterOrManagerId(requestId); if (handleSessionCreationRequestFailed(provider, requestId, reason)) {
MediaRouter2ServiceImpl service = mServiceRef.get();
if (service == null) {
return; return;
} }
ManagerRecord managerToNotifyFailure = null; final int requesterId = toRequesterId(requestId);
synchronized (service.mLock) { for (ManagerRecord manager : getManagerRecords()) {
for (ManagerRecord manager : mUserRecord.mManagerRecords) { if (manager.mManagerId == requesterId) {
if (manager.mManagerId == managerId) { notifyRequestFailedToManager(
managerToNotifyFailure = manager; manager.mManager, toOriginalRequestId(requestId), reason);
break; return;
}
} }
} }
if (managerToNotifyFailure == null) { // Currently, only the manager can get notified of failures.
Slog.w(TAG, "No matching managerRecord found for managerId=" + managerId); // TODO: Notify router too when the related callback is introduced.
return; }
// TODO: Find a way to prevent providers from notifying error on random requestId.
// Solutions can be:
// 1) Record the other type of requests too (not only session creation request)
// 2) Throw exception on providers when they try to notify error on random requestId.
private boolean handleSessionCreationRequestFailed(@NonNull MediaRoute2Provider provider,
long requestId, int reason) {
// Check whether the failure is about creating a session
SessionCreationRequest matchingRequest = null;
for (SessionCreationRequest request : mSessionCreationRequests) {
if (request.mRequestId == requestId && TextUtils.equals(
request.mRoute.getProviderId(), provider.getUniqueId())) {
matchingRequest = request;
break;
}
} }
notifyRequestFailedToManager( if (matchingRequest == null) {
managerToNotifyFailure.mManager, toOriginalRequestId(requestId), reason); // The failure is not about creating a session.
return false;
}
mSessionCreationRequests.remove(matchingRequest);
// Notify the requester about the failure.
// The call should be made by either MediaRouter2 or MediaRouter2Manager.
if (matchingRequest.mRequestedManagerRecord == null) {
notifySessionCreationFailedToRouter(
matchingRequest.mRouterRecord, toOriginalRequestId(requestId));
} else {
notifyRequestFailedToManager(matchingRequest.mRequestedManagerRecord.mManager,
toOriginalRequestId(requestId), reason);
}
return true;
} }
private void notifySessionCreatedToRouter(@NonNull RouterRecord routerRecord, private void notifySessionCreatedToRouter(@NonNull RouterRecord routerRecord,
@@ -1596,6 +1596,16 @@ class MediaRouter2ServiceImpl {
return managers; return managers;
} }
private List<ManagerRecord> getManagerRecords() {
MediaRouter2ServiceImpl service = mServiceRef.get();
if (service == null) {
return new ArrayList<>();
}
synchronized (service.mLock) {
return new ArrayList<>(mUserRecord.mManagerRecords);
}
}
private void notifyRoutesToRouter(@NonNull IMediaRouter2 router) { private void notifyRoutesToRouter(@NonNull IMediaRouter2 router) {
List<MediaRoute2Info> routes = new ArrayList<>(); List<MediaRoute2Info> routes = new ArrayList<>();
for (MediaRoute2ProviderInfo providerInfo : mLastProviderInfos) { for (MediaRoute2ProviderInfo providerInfo : mLastProviderInfos) {
@@ -1789,12 +1799,16 @@ class MediaRouter2ServiceImpl {
final class SessionCreationRequest { final class SessionCreationRequest {
public final RouterRecord mRouterRecord; public final RouterRecord mRouterRecord;
public final ManagerRecord mRequestedManagerRecord;
public final MediaRoute2Info mRoute; public final MediaRoute2Info mRoute;
public final long mRequestId; public final long mRequestId;
// requestedManagerRecord is not null only when the request is made by manager.
SessionCreationRequest(@NonNull RouterRecord routerRecord, SessionCreationRequest(@NonNull RouterRecord routerRecord,
@Nullable ManagerRecord requestedManagerRecord,
@NonNull MediaRoute2Info route, long requestId) { @NonNull MediaRoute2Info route, long requestId) {
mRouterRecord = routerRecord; mRouterRecord = routerRecord;
mRequestedManagerRecord = requestedManagerRecord;
mRoute = route; mRoute = route;
mRequestId = requestId; mRequestId = requestId;
} }