Merge "Correct SystemMediaRoute2Provider#requestCreateSession" into rvc-dev am: 61b20fd6e7 am: df1db278e6 am: 0171b86937
Change-Id: I099e5a24b226a60641250ecf829e378548c92c22
This commit is contained in:
@@ -519,6 +519,7 @@ public abstract class MediaRoute2ProviderService extends Service {
|
|||||||
requestCreateSession));
|
requestCreateSession));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: Ignore requests with unknown session ID.
|
||||||
@Override
|
@Override
|
||||||
public void selectRoute(long requestId, String sessionId, String routeId) {
|
public void selectRoute(long requestId, String sessionId, String routeId) {
|
||||||
if (!checkCallerisSystem()) {
|
if (!checkCallerisSystem()) {
|
||||||
|
|||||||
@@ -604,7 +604,8 @@ public final class MediaRouter2 {
|
|||||||
|
|
||||||
RoutingController oldController = getCurrentController();
|
RoutingController oldController = getCurrentController();
|
||||||
if (!oldController.releaseInternal(
|
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.
|
// Could not release the controller since it was just released by other thread.
|
||||||
oldController = getSystemController();
|
oldController = getSystemController();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -314,7 +314,6 @@ public final class MediaRouter2Manager {
|
|||||||
|
|
||||||
//TODO: Ignore unknown route.
|
//TODO: Ignore unknown route.
|
||||||
if (sessionInfo.getTransferableRoutes().contains(route.getId())) {
|
if (sessionInfo.getTransferableRoutes().contains(route.getId())) {
|
||||||
//TODO: callbacks must be called after this.
|
|
||||||
transferToRoute(sessionInfo, route);
|
transferToRoute(sessionInfo, route);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -340,7 +339,6 @@ public final class MediaRouter2Manager {
|
|||||||
} catch (RemoteException ex) {
|
} catch (RemoteException ex) {
|
||||||
Log.e(TAG, "Unable to select media route", ex);
|
Log.e(TAG, "Unable to select media route", ex);
|
||||||
}
|
}
|
||||||
releaseSession(sessionInfo);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -489,6 +487,7 @@ public final class MediaRouter2Manager {
|
|||||||
notifyTransferFailed(matchingRequest.mOldSessionInfo, requestedRoute);
|
notifyTransferFailed(matchingRequest.mOldSessionInfo, requestedRoute);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
releaseSession(matchingRequest.mOldSessionInfo);
|
||||||
notifyTransferred(matchingRequest.mOldSessionInfo, sessionInfo);
|
notifyTransferred(matchingRequest.mOldSessionInfo, sessionInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1574,8 +1574,15 @@ class MediaRouter2ServiceImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Succeeded
|
// Succeeded
|
||||||
notifySessionCreatedToRouter(matchingRequest.mRouterRecord,
|
if (sessionInfo.isSystemSession()
|
||||||
toOriginalRequestId(uniqueRequestId), sessionInfo);
|
&& !matchingRequest.mRouterRecord.mHasModifyAudioRoutingPermission) {
|
||||||
|
notifySessionCreatedToRouter(matchingRequest.mRouterRecord,
|
||||||
|
toOriginalRequestId(uniqueRequestId),
|
||||||
|
mSystemProvider.getDefaultSessionInfo());
|
||||||
|
} else {
|
||||||
|
notifySessionCreatedToRouter(matchingRequest.mRouterRecord,
|
||||||
|
toOriginalRequestId(uniqueRequestId), sessionInfo);
|
||||||
|
}
|
||||||
mSessionToRouterMap.put(sessionInfo.getId(), routerRecord);
|
mSessionToRouterMap.put(sessionInfo.getId(), routerRecord);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import android.media.IAudioRoutesObserver;
|
|||||||
import android.media.IAudioService;
|
import android.media.IAudioService;
|
||||||
import android.media.MediaRoute2Info;
|
import android.media.MediaRoute2Info;
|
||||||
import android.media.MediaRoute2ProviderInfo;
|
import android.media.MediaRoute2ProviderInfo;
|
||||||
|
import android.media.MediaRoute2ProviderService;
|
||||||
import android.media.RouteDiscoveryPreference;
|
import android.media.RouteDiscoveryPreference;
|
||||||
import android.media.RoutingSessionInfo;
|
import android.media.RoutingSessionInfo;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -47,6 +48,7 @@ import android.text.TextUtils;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.android.internal.R;
|
import com.android.internal.R;
|
||||||
|
import com.android.internal.annotations.GuardedBy;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@@ -80,6 +82,10 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
|||||||
RoutingSessionInfo mDefaultSessionInfo;
|
RoutingSessionInfo mDefaultSessionInfo;
|
||||||
final AudioRoutesInfo mCurAudioRoutesInfo = new AudioRoutesInfo();
|
final AudioRoutesInfo mCurAudioRoutesInfo = new AudioRoutesInfo();
|
||||||
|
|
||||||
|
private final Object mRequestLock = new Object();
|
||||||
|
@GuardedBy("mRequestLock")
|
||||||
|
private volatile SessionCreationRequest mPendingSessionCreationRequest;
|
||||||
|
|
||||||
final IAudioRoutesObserver.Stub mAudioRoutesObserver = new IAudioRoutesObserver.Stub() {
|
final IAudioRoutesObserver.Stub mAudioRoutesObserver = new IAudioRoutesObserver.Stub() {
|
||||||
@Override
|
@Override
|
||||||
public void dispatchAudioRoutesChanged(final AudioRoutesInfo newRoutes) {
|
public void dispatchAudioRoutesChanged(final AudioRoutesInfo newRoutes) {
|
||||||
@@ -135,10 +141,27 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
|||||||
@Override
|
@Override
|
||||||
public void requestCreateSession(long requestId, String packageName, String routeId,
|
public void requestCreateSession(long requestId, String packageName, String routeId,
|
||||||
Bundle sessionHints) {
|
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);
|
transferToRoute(requestId, SYSTEM_SESSION_ID, routeId);
|
||||||
mCallback.onSessionCreated(this, requestId, mSessionInfos.get(0));
|
|
||||||
//TODO: We should call after the session info is changed.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -280,6 +303,24 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RoutingSessionInfo newSessionInfo = builder.setProviderId(mUniqueId).build();
|
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)) {
|
if (Objects.equals(oldSessionInfo, newSessionInfo)) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
@@ -310,6 +351,16 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
|
|||||||
mCallback.onSessionUpdated(this, sessionInfo);
|
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 {
|
private class VolumeChangeReceiver extends BroadcastReceiver {
|
||||||
// This will be called in the main thread.
|
// This will be called in the main thread.
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user