Merge "Correct SystemMediaRoute2Provider#requestCreateSession" into rvc-dev am: 61b20fd6e7 am: df1db278e6

Change-Id: Ic87c79c345ae61b2fbea59e46a0e0ea14c03a70e
This commit is contained in:
Kyunglyul Hyun
2020-04-28 03:20:32 +00:00
committed by Automerger Merge Worker
5 changed files with 66 additions and 7 deletions

View File

@@ -519,6 +519,7 @@ public abstract class MediaRoute2ProviderService extends Service {
requestCreateSession));
}
//TODO: Ignore requests with unknown session ID.
@Override
public void selectRoute(long requestId, String sessionId, String routeId) {
if (!checkCallerisSystem()) {

View File

@@ -604,7 +604,8 @@ public final class MediaRouter2 {
RoutingController oldController = getCurrentController();
if (!oldController.releaseInternal(
/* shouldReleaseSession= */ true, /* shouldNotifyStop= */ false)) {
/* shouldReleaseSession= */ matchingRequest != null,
/* shouldNotifyStop= */ false)) {
// Could not release the controller since it was just released by other thread.
oldController = getSystemController();
}

View File

@@ -314,7 +314,6 @@ public final class MediaRouter2Manager {
//TODO: Ignore unknown route.
if (sessionInfo.getTransferableRoutes().contains(route.getId())) {
//TODO: callbacks must be called after this.
transferToRoute(sessionInfo, route);
return;
}
@@ -340,7 +339,6 @@ public final class MediaRouter2Manager {
} catch (RemoteException ex) {
Log.e(TAG, "Unable to select media route", ex);
}
releaseSession(sessionInfo);
}
}
@@ -489,6 +487,7 @@ public final class MediaRouter2Manager {
notifyTransferFailed(matchingRequest.mOldSessionInfo, requestedRoute);
return;
}
releaseSession(matchingRequest.mOldSessionInfo);
notifyTransferred(matchingRequest.mOldSessionInfo, sessionInfo);
}

View File

@@ -1574,8 +1574,15 @@ class MediaRouter2ServiceImpl {
}
// Succeeded
notifySessionCreatedToRouter(matchingRequest.mRouterRecord,
toOriginalRequestId(uniqueRequestId), sessionInfo);
if (sessionInfo.isSystemSession()
&& !matchingRequest.mRouterRecord.mHasModifyAudioRoutingPermission) {
notifySessionCreatedToRouter(matchingRequest.mRouterRecord,
toOriginalRequestId(uniqueRequestId),
mSystemProvider.getDefaultSessionInfo());
} else {
notifySessionCreatedToRouter(matchingRequest.mRouterRecord,
toOriginalRequestId(uniqueRequestId), sessionInfo);
}
mSessionToRouterMap.put(sessionInfo.getId(), routerRecord);
}

View File

@@ -36,6 +36,7 @@ import android.media.IAudioRoutesObserver;
import android.media.IAudioService;
import android.media.MediaRoute2Info;
import android.media.MediaRoute2ProviderInfo;
import android.media.MediaRoute2ProviderService;
import android.media.RouteDiscoveryPreference;
import android.media.RoutingSessionInfo;
import android.os.Bundle;
@@ -47,6 +48,7 @@ import android.text.TextUtils;
import android.util.Log;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import java.util.Objects;
@@ -80,6 +82,10 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
RoutingSessionInfo mDefaultSessionInfo;
final AudioRoutesInfo mCurAudioRoutesInfo = new AudioRoutesInfo();
private final Object mRequestLock = new Object();
@GuardedBy("mRequestLock")
private volatile SessionCreationRequest mPendingSessionCreationRequest;
final IAudioRoutesObserver.Stub mAudioRoutesObserver = new IAudioRoutesObserver.Stub() {
@Override
public void dispatchAudioRoutesChanged(final AudioRoutesInfo newRoutes) {
@@ -135,10 +141,27 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
@Override
public void requestCreateSession(long requestId, String packageName, String routeId,
Bundle sessionHints) {
// Assume a router without MODIFY_AUDIO_ROUTING permission can't request with
// a route ID different from the default route ID. The service should've filtered.
if (TextUtils.equals(routeId, DEFAULT_ROUTE_ID)) {
mCallback.onSessionCreated(this, requestId, mDefaultSessionInfo);
return;
}
if (TextUtils.equals(routeId, mSelectedRouteId)) {
mCallback.onSessionCreated(this, requestId, mSessionInfos.get(0));
return;
}
synchronized (mRequestLock) {
// Handle the previous request as a failure if exists.
if (mPendingSessionCreationRequest != null) {
mCallback.onRequestFailed(this, mPendingSessionCreationRequest.mRequestId,
MediaRoute2ProviderService.REASON_UNKNOWN_ERROR);
}
mPendingSessionCreationRequest = new SessionCreationRequest(requestId, routeId);
}
transferToRoute(requestId, SYSTEM_SESSION_ID, routeId);
mCallback.onSessionCreated(this, requestId, mSessionInfos.get(0));
//TODO: We should call after the session info is changed.
}
@Override
@@ -280,6 +303,24 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
}
RoutingSessionInfo newSessionInfo = builder.setProviderId(mUniqueId).build();
if (mPendingSessionCreationRequest != null) {
SessionCreationRequest sessionCreationRequest;
synchronized (mRequestLock) {
sessionCreationRequest = mPendingSessionCreationRequest;
mPendingSessionCreationRequest = null;
}
if (sessionCreationRequest != null) {
if (TextUtils.equals(mSelectedRouteId, sessionCreationRequest.mRouteId)) {
mCallback.onSessionCreated(this,
sessionCreationRequest.mRequestId, newSessionInfo);
} else {
mCallback.onRequestFailed(this, sessionCreationRequest.mRequestId,
MediaRoute2ProviderService.REASON_UNKNOWN_ERROR);
}
}
}
if (Objects.equals(oldSessionInfo, newSessionInfo)) {
return false;
} else {
@@ -310,6 +351,16 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
mCallback.onSessionUpdated(this, sessionInfo);
}
private static class SessionCreationRequest {
final long mRequestId;
final String mRouteId;
SessionCreationRequest(long requestId, String routeId) {
this.mRequestId = requestId;
this.mRouteId = routeId;
}
}
private class VolumeChangeReceiver extends BroadcastReceiver {
// This will be called in the main thread.
@Override