Commit 2c6d1ac4 authored by Zhiqiang Zhang's avatar Zhiqiang Zhang Committed by Commit Bot

[Android MR] Fix a crasher when registering/unregistering callback

The crasher happens when the session is connected/disconnected. The code
registers/unregisters RemoteMediaClient callback upon
connecting/disconnecting. However it should check the availability of
RemoteMediaClient of the current session.

Bug: 711860
Change-Id: Ie4b29f507a0044ac8649b52b37f1541e4dc9b4ee
Reviewed-on: https://chromium-review.googlesource.com/c/1350211
Commit-Queue: Zhiqiang Zhang <zqzhang@chromium.org>
Reviewed-by: default avatarThomas Guilbert <tguilbert@chromium.org>
Cr-Commit-Position: refs/heads/master@{#611030}
parent cb43d716
...@@ -128,14 +128,20 @@ public class BaseSessionController { ...@@ -128,14 +128,20 @@ public class BaseSessionController {
/** Attaches the controller to the current {@link CastSession}. */ /** Attaches the controller to the current {@link CastSession}. */
public void attachToCastSession(CastSession session) { public void attachToCastSession(CastSession session) {
mCastSession = session; mCastSession = session;
getRemoteMediaClient().registerCallback(mRemoteMediaClientCallback); RemoteMediaClient uncheckedRemoteMediaClient = mCastSession.getRemoteMediaClient();
if (uncheckedRemoteMediaClient != null) {
uncheckedRemoteMediaClient.registerCallback(mRemoteMediaClientCallback);
}
} }
/** Detaches the controller from any {@link CastSession}. */ /** Detaches the controller from any {@link CastSession}. */
public void detachFromCastSession() { public void detachFromCastSession() {
if (mCastSession == null) return; if (mCastSession == null) return;
getRemoteMediaClient().unregisterCallback(mRemoteMediaClientCallback); RemoteMediaClient uncheckedRemoteMediaClient = mCastSession.getRemoteMediaClient();
if (uncheckedRemoteMediaClient != null) {
uncheckedRemoteMediaClient.unregisterCallback(mRemoteMediaClientCallback);
}
mCastSession = null; mCastSession = null;
} }
......
...@@ -14,6 +14,7 @@ import static org.mockito.Mockito.anyInt; ...@@ -14,6 +14,7 @@ import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
...@@ -32,6 +33,7 @@ import org.junit.Before; ...@@ -32,6 +33,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
...@@ -167,13 +169,27 @@ public class BaseSessionControllerTest { ...@@ -167,13 +169,27 @@ public class BaseSessionControllerTest {
@Test @Test
public void testSessionAttachment() { public void testSessionAttachment() {
InOrder inOrder = inOrder(mRemoteMediaClient);
mController.attachToCastSession(mCastSession);
assertSame(mController.getSession(), mCastSession);
inOrder.verify(mRemoteMediaClient).registerCallback(any(RemoteMediaClient.Callback.class));
mController.detachFromCastSession();
assertNull(mController.getSession());
inOrder.verify(mRemoteMediaClient)
.unregisterCallback(any(RemoteMediaClient.Callback.class));
// Attaching/detaching while the session is disconnected.
doReturn(false).when(mCastSession).isConnected();
mController.attachToCastSession(mCastSession); mController.attachToCastSession(mCastSession);
assertSame(mController.getSession(), mCastSession); assertSame(mController.getSession(), mCastSession);
verify(mRemoteMediaClient).registerCallback(any(RemoteMediaClient.Callback.class)); inOrder.verify(mRemoteMediaClient).registerCallback(any(RemoteMediaClient.Callback.class));
mController.detachFromCastSession(); mController.detachFromCastSession();
assertNull(mController.getSession()); assertNull(mController.getSession());
verify(mRemoteMediaClient).unregisterCallback(any(RemoteMediaClient.Callback.class)); inOrder.verify(mRemoteMediaClient)
.unregisterCallback(any(RemoteMediaClient.Callback.class));
} }
@Test @Test
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment