Commit 40d02af1 authored by Zhiqiang Zhang's avatar Zhiqiang Zhang Committed by Commit Bot

[Android MR] Migrate session management

This CL migrates the session management part of MediaRouter.
CreateRouteRequest is not used and we are using route selection
to let CAF start sessions automatically.

Change-Id: I58d267418d9afd11f4f44520e8ca8ad94e82388b
Reviewed-on: https://chromium-review.googlesource.com/1006358Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarThomas Guilbert <tguilbert@chromium.org>
Commit-Queue: Zhiqiang Zhang <zqzhang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#569080}
parent f94187dc
...@@ -211,6 +211,7 @@ android_library("chrome_java") { ...@@ -211,6 +211,7 @@ android_library("chrome_java") {
"$google_play_services_package:google_play_services_auth_base_java", "$google_play_services_package:google_play_services_auth_base_java",
"$google_play_services_package:google_play_services_base_java", "$google_play_services_package:google_play_services_base_java",
"$google_play_services_package:google_play_services_basement_java", "$google_play_services_package:google_play_services_basement_java",
"$google_play_services_package:google_play_services_cast_framework_java",
"$google_play_services_package:google_play_services_cast_java", "$google_play_services_package:google_play_services_cast_java",
"$google_play_services_package:google_play_services_fido_java", "$google_play_services_package:google_play_services_fido_java",
"$google_play_services_package:google_play_services_gcm_java", "$google_play_services_package:google_play_services_gcm_java",
...@@ -457,6 +458,7 @@ junit_binary("chrome_junit_tests") { ...@@ -457,6 +458,7 @@ junit_binary("chrome_junit_tests") {
":partner_location_descriptor_proto_java", ":partner_location_descriptor_proto_java",
"$google_play_services_package:google_play_services_base_java", "$google_play_services_package:google_play_services_base_java",
"$google_play_services_package:google_play_services_basement_java", "$google_play_services_package:google_play_services_basement_java",
"$google_play_services_package:google_play_services_cast_framework_java",
"$google_play_services_package:google_play_services_cast_java", "$google_play_services_package:google_play_services_cast_java",
"$google_play_services_package:google_play_services_fido_java", "$google_play_services_package:google_play_services_fido_java",
"//base:base_java", "//base:base_java",
...@@ -534,6 +536,7 @@ android_library("chrome_test_java") { ...@@ -534,6 +536,7 @@ android_library("chrome_test_java") {
":partner_location_descriptor_proto_java", ":partner_location_descriptor_proto_java",
"$google_play_services_package:google_play_services_base_java", "$google_play_services_package:google_play_services_base_java",
"$google_play_services_package:google_play_services_basement_java", "$google_play_services_package:google_play_services_basement_java",
"$google_play_services_package:google_play_services_cast_framework_java",
"$google_play_services_package:google_play_services_cast_java", "$google_play_services_package:google_play_services_cast_java",
"$google_play_services_package:google_play_services_fido_java", "$google_play_services_package:google_play_services_fido_java",
"$google_play_services_package:google_play_services_gcm_java", "$google_play_services_package:google_play_services_gcm_java",
......
...@@ -172,6 +172,12 @@ by a child template that "extends" this file. ...@@ -172,6 +172,12 @@ by a child template that "extends" this file.
android:value="180226000"/> android:value="180226000"/>
{% endif %} {% endif %}
<!-- Cast support -->
<meta-data
android:name=
"com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="org.chromium.chrome.browser.media.router.caf.CastOptionsProvider"/>
<!-- Note: All activities directly or indirectly derived from ChromeActivity <!-- Note: All activities directly or indirectly derived from ChromeActivity
must specify android:hardwareAccelerated="false". must specify android:hardwareAccelerated="false".
......
...@@ -2,9 +2,7 @@ ...@@ -2,9 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser.media.router.cast; package org.chromium.chrome.browser.media.router;
import org.chromium.chrome.browser.media.router.MediaRoute;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -53,13 +51,8 @@ public class ClientRecord { ...@@ -53,13 +51,8 @@ public class ClientRecord {
*/ */
public List<String> pendingMessages = new ArrayList<String>(); public List<String> pendingMessages = new ArrayList<String>();
ClientRecord( public ClientRecord(String routeId, String clientId, String appId, String autoJoinPolicy,
String routeId, String origin, int tabId) {
String clientId,
String appId,
String autoJoinPolicy,
String origin,
int tabId) {
this.routeId = routeId; this.routeId = routeId;
this.clientId = clientId; this.clientId = clientId;
this.appId = appId; this.appId = appId;
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.media.router.caf;
/**
* The handler for cast messages. It receives events between the Cast SDK and the page, process and
* dispatch the messages accordingly. The handler talks to the Cast SDK via CastSession, and
* talks to the pages via the media router.
*/
public class CastMessageHandler {
// Sequence number used when no sequence number is required or was initially passed.
static final int INVALID_SEQUENCE_NUMBER = -1;
}
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.media.router.caf;
import android.content.Context;
import com.google.android.gms.cast.framework.CastOptions;
import com.google.android.gms.cast.framework.OptionsProvider;
import com.google.android.gms.cast.framework.SessionProvider;
import java.util.List;
/** {@link OptionsProvider} implementation for Chrome MR. */
public class CastOptionsProvider implements OptionsProvider {
@Override
public CastOptions getCastOptions(Context context) {
return new CastOptions.Builder().setCastMediaOptions(null).build();
}
@Override
public List<SessionProvider> getAdditionalSessionProviders(Context context) {
return null;
}
}
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.media.router.caf;
import com.google.android.gms.cast.framework.CastSession;
import org.chromium.chrome.browser.media.router.ClientRecord;
import org.chromium.chrome.browser.media.router.MediaSink;
import org.chromium.chrome.browser.media.router.MediaSource;
/**
* A wrapper for {@link CastSession}, extending its functionality for Chrome MediaRouter.
*
* Has the same lifecycle with CastSession.
*/
public class CastSessionController {
private static final String TAG = "CastSessionController";
private final CastSession mCastSession;
private final CafMediaRouteProvider mProvider;
private final MediaSink mSink;
private final MediaSource mSource;
public CastSessionController(CastSession castSession, CafMediaRouteProvider provider,
MediaSink sink, MediaSource source) {
mCastSession = castSession;
mProvider = provider;
mSink = sink;
mSource = source;
}
public MediaSource getSource() {
return mSource;
}
public MediaSink getSink() {
return mSink;
}
public CastSession getSession() {
return mCastSession;
}
public void onSessionStarted() {
for (ClientRecord client : mProvider.getClientRecords().values()) {
if (!client.isConnected) continue;
onClientConnected(client.clientId);
}
// TODO(zqzhang): register necessary listeners and attach to RemoteMediaClient.
}
public void onSessionEnded() {
// Not implemented.
}
public void endSession() {
CastSession currentCastSession =
CastUtils.getCastContext().getSessionManager().getCurrentCastSession();
if (currentCastSession == mCastSession) {
CastUtils.getCastContext().getSessionManager().endCurrentSession(true);
}
}
public void notifyReceiverAction(
String routeId, MediaSink sink, String clientId, String action) {
// Not implemented.
}
private void onClientConnected(String clientId) {
// Not implemented.
}
}
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.media.router.caf;
import com.google.android.gms.cast.framework.CastContext;
import org.chromium.base.ContextUtils;
/** Utility methods for Cast. */
public class CastUtils {
public static CastContext getCastContext() {
return CastContext.getSharedInstance(ContextUtils.getApplicationContext());
}
}
...@@ -164,6 +164,7 @@ public abstract class BaseMediaRouteProvider ...@@ -164,6 +164,7 @@ public abstract class BaseMediaRouteProvider
} }
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override @Override
public void createRoute(String sourceId, String sinkId, String presentationId, String origin, public void createRoute(String sourceId, String sinkId, String presentationId, String origin,
int tabId, boolean isIncognito, int nativeRequestId) { int tabId, boolean isIncognito, int nativeRequestId) {
......
...@@ -12,6 +12,7 @@ import org.json.JSONObject; ...@@ -12,6 +12,7 @@ import org.json.JSONObject;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.media.router.ChromeMediaRouter; import org.chromium.chrome.browser.media.router.ChromeMediaRouter;
import org.chromium.chrome.browser.media.router.ClientRecord;
import org.chromium.chrome.browser.media.router.MediaRoute; import org.chromium.chrome.browser.media.router.MediaRoute;
import org.chromium.chrome.browser.media.router.MediaRouteManager; import org.chromium.chrome.browser.media.router.MediaRouteManager;
import org.chromium.chrome.browser.media.router.MediaRouteProvider; import org.chromium.chrome.browser.media.router.MediaRouteProvider;
...@@ -44,18 +45,21 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider { ...@@ -44,18 +45,21 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
return new CastMediaRouteProvider(ChromeMediaRouter.getAndroidMediaRouter(), manager); return new CastMediaRouteProvider(ChromeMediaRouter.getAndroidMediaRouter(), manager);
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override @Override
public void onSessionStartFailed() { public void onSessionStartFailed() {
super.onSessionStartFailed(); super.onSessionStartFailed();
mClientRecords.clear(); mClientRecords.clear();
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override @Override
public void onSessionStarted(CastSession session) { public void onSessionStarted(CastSession session) {
super.onSessionStarted(session); super.onSessionStarted(session);
mMessageHandler.onSessionCreated(mSession); mMessageHandler.onSessionCreated(mSession);
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override @Override
public void onSessionEnded() { public void onSessionEnded() {
if (mSession == null) return; if (mSession == null) return;
...@@ -102,10 +106,12 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider { ...@@ -102,10 +106,12 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
return mMessageHandler; return mMessageHandler;
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
public Set<String> getClients() { public Set<String> getClients() {
return mClientRecords.keySet(); return mClientRecords.keySet();
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
public Map<String, ClientRecord> getClientRecords() { public Map<String, ClientRecord> getClientRecords() {
return mClientRecords; return mClientRecords;
} }
...@@ -124,6 +130,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider { ...@@ -124,6 +130,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
mMessageHandler); mMessageHandler);
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override @Override
public void onSessionStarting( public void onSessionStarting(
ChromeCastSessionManager.CastSessionLaunchRequest sessionLaunchRequest) { ChromeCastSessionManager.CastSessionLaunchRequest sessionLaunchRequest) {
...@@ -146,6 +153,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider { ...@@ -146,6 +153,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
} }
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override @Override
public void joinRoute(String sourceId, String presentationId, String origin, int tabId, public void joinRoute(String sourceId, String presentationId, String origin, int tabId,
int nativeRequestId) { int nativeRequestId) {
...@@ -170,6 +178,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider { ...@@ -170,6 +178,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
mManager.onRouteCreated(route.id, route.sinkId, nativeRequestId, this, false); mManager.onRouteCreated(route.id, route.sinkId, nativeRequestId, this, false);
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override @Override
public void closeRoute(String routeId) { public void closeRoute(String routeId) {
MediaRoute route = mRoutes.get(routeId); MediaRoute route = mRoutes.get(routeId);
...@@ -312,6 +321,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider { ...@@ -312,6 +321,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
mMessageHandler = new CastMessageHandler(this); mMessageHandler = new CastMessageHandler(this);
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
private boolean canAutoJoin(CastMediaSource source, String origin, int tabId) { private boolean canAutoJoin(CastMediaSource source, String origin, int tabId) {
if (source.getAutoJoinPolicy().equals(CastMediaSource.AUTOJOIN_PAGE_SCOPED)) return false; if (source.getAutoJoinPolicy().equals(CastMediaSource.AUTOJOIN_PAGE_SCOPED)) return false;
...@@ -338,6 +348,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider { ...@@ -338,6 +348,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
return false; return false;
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
private boolean canJoinExistingSession( private boolean canJoinExistingSession(
String presentationId, String origin, int tabId, CastMediaSource source) { String presentationId, String origin, int tabId, CastMediaSource source) {
if (AUTO_JOIN_PRESENTATION_ID.equals(presentationId)) { if (AUTO_JOIN_PRESENTATION_ID.equals(presentationId)) {
...@@ -353,6 +364,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider { ...@@ -353,6 +364,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
return false; return false;
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Nullable @Nullable
private ClientRecord getClientRecordByRouteId(String routeId) { private ClientRecord getClientRecordByRouteId(String routeId) {
for (ClientRecord record : mClientRecords.values()) { for (ClientRecord record : mClientRecords.values()) {
...@@ -361,6 +373,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider { ...@@ -361,6 +373,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
return null; return null;
} }
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@VisibleForTesting @VisibleForTesting
void addRoute(MediaRoute route, String origin, int tabId) { void addRoute(MediaRoute route, String origin, int tabId) {
mRoutes.put(route.id, route); mRoutes.put(route.id, route);
...@@ -425,6 +438,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider { ...@@ -425,6 +438,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
* @param originB A URL origin. * @param originB A URL origin.
* @return True if originA and originB represent the same origin, false otherwise. * @return True if originA and originB represent the same origin, false otherwise.
*/ */
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
private static final boolean isSameOrigin(String originA, String originB) { private static final boolean isSameOrigin(String originA, String originB) {
if (originA == null || originA.isEmpty() || originB == null || originB.isEmpty()) if (originA == null || originA.isEmpty() || originB == null || originB.isEmpty())
return false; return false;
......
...@@ -14,6 +14,7 @@ import org.json.JSONObject; ...@@ -14,6 +14,7 @@ import org.json.JSONObject;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.media.router.ClientRecord;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.Arrays; import java.util.Arrays;
......
...@@ -31,6 +31,7 @@ import javax.annotation.Nullable; ...@@ -31,6 +31,7 @@ import javax.annotation.Nullable;
* Since there're numerous asynchronous calls involved in getting the application to launch * Since there're numerous asynchronous calls involved in getting the application to launch
* the class is implemented as a state machine. * the class is implemented as a state machine.
*/ */
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
public class CreateRouteRequest implements GoogleApiClient.ConnectionCallbacks, public class CreateRouteRequest implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.OnConnectionFailedListener,
ResultCallback<Cast.ApplicationConnectionResult>, ResultCallback<Cast.ApplicationConnectionResult>,
......
...@@ -700,6 +700,7 @@ chrome_java_sources = [ ...@@ -700,6 +700,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/media/remote/RemoteVideoInfo.java", "java/src/org/chromium/chrome/browser/media/remote/RemoteVideoInfo.java",
"java/src/org/chromium/chrome/browser/media/remote/PositionExtrapolator.java", "java/src/org/chromium/chrome/browser/media/remote/PositionExtrapolator.java",
"java/src/org/chromium/chrome/browser/media/router/BaseMediaRouteDialogManager.java", "java/src/org/chromium/chrome/browser/media/router/BaseMediaRouteDialogManager.java",
"java/src/org/chromium/chrome/browser/media/router/ClientRecord.java",
"java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java", "java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java",
"java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java", "java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java",
"java/src/org/chromium/chrome/browser/media/router/DiscoveryCallback.java", "java/src/org/chromium/chrome/browser/media/router/DiscoveryCallback.java",
...@@ -715,7 +716,11 @@ chrome_java_sources = [ ...@@ -715,7 +716,11 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/media/router/MediaRouteProvider.java", "java/src/org/chromium/chrome/browser/media/router/MediaRouteProvider.java",
"java/src/org/chromium/chrome/browser/media/router/MediaSource.java", "java/src/org/chromium/chrome/browser/media/router/MediaSource.java",
"java/src/org/chromium/chrome/browser/media/router/MediaSink.java", "java/src/org/chromium/chrome/browser/media/router/MediaSink.java",
"java/src/org/chromium/chrome/browser/media/router/caf/CastOptionsProvider.java",
"java/src/org/chromium/chrome/browser/media/router/caf/CastSessionController.java",
"java/src/org/chromium/chrome/browser/media/router/caf/CastUtils.java",
"java/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProvider.java", "java/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProvider.java",
"java/src/org/chromium/chrome/browser/media/router/caf/CastMessageHandler.java",
"java/src/org/chromium/chrome/browser/media/router/cast/BaseMediaRouteProvider.java", "java/src/org/chromium/chrome/browser/media/router/cast/BaseMediaRouteProvider.java",
"java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java", "java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java",
"java/src/org/chromium/chrome/browser/media/router/cast/CastMediaSource.java", "java/src/org/chromium/chrome/browser/media/router/cast/CastMediaSource.java",
...@@ -726,7 +731,6 @@ chrome_java_sources = [ ...@@ -726,7 +731,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/media/router/cast/CastSessionInfo.java", "java/src/org/chromium/chrome/browser/media/router/cast/CastSessionInfo.java",
"java/src/org/chromium/chrome/browser/media/router/cast/CastSessionUtil.java", "java/src/org/chromium/chrome/browser/media/router/cast/CastSessionUtil.java",
"java/src/org/chromium/chrome/browser/media/router/cast/ChromeCastSessionManager.java", "java/src/org/chromium/chrome/browser/media/router/cast/ChromeCastSessionManager.java",
"java/src/org/chromium/chrome/browser/media/router/cast/ClientRecord.java",
"java/src/org/chromium/chrome/browser/media/router/cast/CreateRouteRequest.java", "java/src/org/chromium/chrome/browser/media/router/cast/CreateRouteRequest.java",
"java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingCastSession.java", "java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingCastSession.java",
"java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingMediaRouteProvider.java", "java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingMediaRouteProvider.java",
......
...@@ -35,6 +35,7 @@ import org.robolectric.shadows.ShadowLog; ...@@ -35,6 +35,7 @@ import org.robolectric.shadows.ShadowLog;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.media.router.ClientRecord;
import org.chromium.chrome.browser.media.router.cast.CastMessageHandler.RequestRecord; import org.chromium.chrome.browser.media.router.cast.CastMessageHandler.RequestRecord;
import org.chromium.chrome.browser.media.router.cast.JSONTestUtils.JSONObjectLike; import org.chromium.chrome.browser.media.router.cast.JSONTestUtils.JSONObjectLike;
import org.chromium.chrome.browser.media.router.cast.JSONTestUtils.JSONStringLike; import org.chromium.chrome.browser.media.router.cast.JSONTestUtils.JSONStringLike;
......
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