Merge "Correct SystemMediaRoute2Provider#requestCreateSession" into rvc-dev am: 61b20fd6e7 am: df1db278e6
Change-Id: Ic87c79c345ae61b2fbea59e46a0e0ea14c03a70e
This commit is contained in:
@@ -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()) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user