Merge "Prevent MediaRoute2ProviderService#onReleaseSession() from being called twice" into rvc-dev am: f4314e3ae9 am: 37c3f450b2

Change-Id: I1c592bfac1bdd00584cd4d55bce8251409583dd5
This commit is contained in:
Hyundo Moon
2020-04-15 17:43:25 +00:00
committed by Automerger Merge Worker

View File

@@ -409,7 +409,7 @@ public final class MediaRouter2 {
// TODO: Check thread-safety
if (!mRoutes.containsKey(route.getId())) {
notifyTransferFailed(route);
notifyTransferFailure(route);
return;
}
if (controller.getRoutingSessionInfo().getTransferableRoutes().contains(route.getId())) {
@@ -588,14 +588,14 @@ public final class MediaRouter2 {
if (sessionInfo == null) {
// TODO: We may need to distinguish between failure and rejection.
// One way can be introducing 'reason'.
notifyTransferFailed(requestedRoute);
notifyTransferFailure(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()
+ ")");
notifyTransferFailed(requestedRoute);
notifyTransferFailure(requestedRoute);
return;
} else if (!TextUtils.equals(requestedRoute.getProviderId(),
sessionInfo.getProviderId())) {
@@ -603,7 +603,7 @@ public final class MediaRouter2 {
+ "(requested route's providerId=" + requestedRoute.getProviderId()
+ ", actual providerId=" + sessionInfo.getProviderId()
+ ")");
notifyTransferFailed(requestedRoute);
notifyTransferFailure(requestedRoute);
return;
}
}
@@ -619,7 +619,7 @@ public final class MediaRouter2 {
}
}
//TODO: Determine oldController properly when transfer is launched by Output Switcher.
notifyTransferred(matchingRequest != null ? matchingRequest.mController :
notifyTransfer(matchingRequest != null ? matchingRequest.mController :
getSystemController(), newController);
}
}
@@ -687,15 +687,7 @@ public final class MediaRouter2 {
return;
}
boolean removed;
synchronized (sRouterLock) {
removed = mRoutingControllers.remove(uniqueSessionId, matchingController);
}
if (removed) {
matchingController.release();
notifyStopped(matchingController);
}
matchingController.releaseInternal(/* shouldReleaseSession= */ false);
}
private List<MediaRoute2Info> filterRoutes(List<MediaRoute2Info> routes,
@@ -736,22 +728,21 @@ public final class MediaRouter2 {
}
}
private void notifyTransferred(RoutingController oldController,
RoutingController newController) {
private void notifyTransfer(RoutingController oldController, RoutingController newController) {
for (TransferCallbackRecord record: mTransferCallbackRecords) {
record.mExecutor.execute(
() -> record.mTransferCallback.onTransfer(oldController, newController));
}
}
private void notifyTransferFailed(MediaRoute2Info route) {
private void notifyTransferFailure(MediaRoute2Info route) {
for (TransferCallbackRecord record: mTransferCallbackRecords) {
record.mExecutor.execute(
() -> record.mTransferCallback.onTransferFailure(route));
}
}
private void notifyStopped(RoutingController controller) {
private void notifyStop(RoutingController controller) {
for (TransferCallbackRecord record: mTransferCallbackRecords) {
record.mExecutor.execute(
() -> record.mTransferCallback.onStop(controller));
@@ -1189,32 +1180,38 @@ public final class MediaRouter2 {
*/
// TODO: Add tests using {@link MediaRouter2Manager#getActiveSessions()}.
public void release() {
releaseInternal(/* shouldReleaseSession= */ true);
}
void releaseInternal(boolean shouldReleaseSession) {
synchronized (mControllerLock) {
if (mIsReleased) {
Log.w(TAG, "release() called on released controller. Ignoring.");
Log.w(TAG, "releaseInternal() called on released controller. Ignoring.");
return;
}
mIsReleased = true;
}
MediaRouter2Stub stub;
boolean removed;
synchronized (sRouterLock) {
removed = mRoutingControllers.remove(getId(), this);
mRoutingControllers.remove(getId(), this);
stub = mStub;
}
if (removed) {
mHandler.post(() -> notifyStopped(RoutingController.this));
}
if (stub != null) {
if (shouldReleaseSession && stub != null) {
try {
mMediaRouterService.releaseSessionWithRouter2(stub, getId());
} catch (RemoteException ex) {
Log.e(TAG, "Unable to notify of controller release", ex);
Log.e(TAG, "Unable to release session", ex);
}
}
if (Thread.currentThread() == mHandler.getLooper().getThread()) {
notifyStop(this);
} else {
mHandler.sendMessage(obtainMessage(MediaRouter2::notifyStop, MediaRouter2.this,
RoutingController.this));
}
}
@Override