Commit 9ca21585 authored by Zhiqiang Zhang's avatar Zhiqiang Zhang Committed by Commit Bot

Reland "[Android MR] Migrate session management"

This reverts commit 5b9084f8.

Reason for revert: Reland after trimming out unused SDK features in dex file

Original change's description:
> Revert "[Android MR] Migrate session management"
> 
> This reverts commit 40d02af1.
> 
> Reason for revert: Broke downstream release builders, and caused
> large binary size regression.
> 
> Original change's description:
> > [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/1006358
> > Reviewed-by: David Trainor <dtrainor@chromium.org>
> > Reviewed-by: Thomas Guilbert <tguilbert@chromium.org>
> > Commit-Queue: Zhiqiang Zhang <zqzhang@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#569080}
> 
> TBR=dtrainor@chromium.org,zqzhang@chromium.org,tguilbert@chromium.org
> 
> Change-Id: I8fae7d4492f873223b5efb3fc3e5d6acef37f981
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: 855081, 855025
> Reviewed-on: https://chromium-review.googlesource.com/1109981
> Reviewed-by: agrieve <agrieve@chromium.org>
> Commit-Queue: agrieve <agrieve@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#569314}

TBR=dtrainor@chromium.org,agrieve@chromium.org,zqzhang@chromium.org,tguilbert@chromium.org

# Not skipping CQ checks because original CL landed > 1 day ago.

Bug: 855081, 855025
Change-Id: I8fcdf97d32b57f6011be1dbd322365ceeaf3f442
Reviewed-on: https://chromium-review.googlesource.com/1132356
Commit-Queue: Zhiqiang Zhang <zqzhang@chromium.org>
Reviewed-by: default avatarZhiqiang Zhang <zqzhang@chromium.org>
Reviewed-by: default avatarThomas Guilbert <tguilbert@chromium.org>
Cr-Commit-Position: refs/heads/master@{#579941}
parent 1d9987e8
......@@ -207,6 +207,7 @@ android_library("chrome_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_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_fido_java",
"$google_play_services_package:google_play_services_gcm_java",
......@@ -465,6 +466,7 @@ junit_binary("chrome_junit_tests") {
":partner_location_descriptor_proto_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_cast_framework_java",
"$google_play_services_package:google_play_services_cast_java",
"$google_play_services_package:google_play_services_fido_java",
"//base:base_java",
......@@ -542,6 +544,7 @@ android_library("chrome_test_java") {
":partner_location_descriptor_proto_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_cast_framework_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_gcm_java",
......
......@@ -175,6 +175,12 @@ by a child template that "extends" this file.
android:value="180226000"/>
{% 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
must specify android:hardwareAccelerated="false".
......
......@@ -2,9 +2,7 @@
// 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.cast;
import org.chromium.chrome.browser.media.router.MediaRoute;
package org.chromium.chrome.browser.media.router;
import java.util.ArrayList;
import java.util.List;
......@@ -53,13 +51,8 @@ public class ClientRecord {
*/
public List<String> pendingMessages = new ArrayList<String>();
ClientRecord(
String routeId,
String clientId,
String appId,
String autoJoinPolicy,
String origin,
int tabId) {
public ClientRecord(String routeId, String clientId, String appId, String autoJoinPolicy,
String origin, int tabId) {
this.routeId = routeId;
this.clientId = clientId;
this.appId = appId;
......
......@@ -11,11 +11,16 @@ import android.support.v7.media.MediaRouteSelector;
import android.support.v7.media.MediaRouter;
import android.support.v7.media.MediaRouter.RouteInfo;
import com.google.android.gms.cast.framework.CastSession;
import com.google.android.gms.cast.framework.SessionManagerListener;
import org.chromium.base.Log;
import org.chromium.chrome.browser.media.router.ChromeMediaRouter;
import org.chromium.chrome.browser.media.router.ClientRecord;
import org.chromium.chrome.browser.media.router.DiscoveryCallback;
import org.chromium.chrome.browser.media.router.DiscoveryDelegate;
import org.chromium.chrome.browser.media.router.FlingingController;
import org.chromium.chrome.browser.media.router.MediaRoute;
import org.chromium.chrome.browser.media.router.MediaRouteManager;
import org.chromium.chrome.browser.media.router.MediaRouteProvider;
import org.chromium.chrome.browser.media.router.MediaSink;
......@@ -27,13 +32,18 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* A {@link MediaRouteProvider} implementation for Cast devices and applications, using Cast v3 API.
*/
public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDelegate {
public class CafMediaRouteProvider
implements MediaRouteProvider, DiscoveryDelegate, SessionManagerListener<CastSession> {
private static final String TAG = "cr_CafMRP";
private static final String AUTO_JOIN_PRESENTATION_ID = "auto-join";
private static final String PRESENTATION_ID_SESSION_ID_PREFIX = "cast-session_";
protected static final List<MediaSink> NO_SINKS = Collections.emptyList();
protected final MediaRouter mAndroidMediaRouter;
......@@ -41,6 +51,12 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg
protected final Map<String, DiscoveryCallback> mDiscoveryCallbacks =
new HashMap<String, DiscoveryCallback>();
protected Handler mHandler = new Handler();
protected final Map<String, MediaRoute> mRoutes = new HashMap<String, MediaRoute>();
private CreateRouteRequestInfo mPendingCreateRouteRequestInfo;
private CastSessionController mSessionController;
private ClientRecord mLastRemovedRouteRecord;
private final Map<String, ClientRecord> mClientRecords = new HashMap<String, ClientRecord>();
private CafMediaRouteProvider(MediaRouter androidMediaRouter, MediaRouteManager manager) {
mAndroidMediaRouter = androidMediaRouter;
......@@ -51,6 +67,14 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg
return new CafMediaRouteProvider(ChromeMediaRouter.getAndroidMediaRouter(), manager);
}
public Map<String, ClientRecord> getClientRecords() {
return mClientRecords;
}
public Set<String> getClientIds() {
return mClientRecords.keySet();
}
@Override
public boolean supportsSource(String sourceId) {
return getSourceFromId(sourceId) != null;
......@@ -170,23 +194,95 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg
@Override
public void createRoute(String sourceId, String sinkId, String presentationId, String origin,
int tabId, boolean isIncognito, int nativeRequestId) {
// Not implemented.
Log.d(TAG, "createRoute");
if (mPendingCreateRouteRequestInfo != null) {
// TODO(zqzhang): do something.
}
if (mAndroidMediaRouter == null) {
mManager.onRouteRequestError("Not supported", nativeRequestId);
return;
}
MediaSink sink = MediaSink.fromSinkId(sinkId, mAndroidMediaRouter);
if (sink == null) {
mManager.onRouteRequestError("No sink", nativeRequestId);
return;
}
MediaSource source = CastMediaSource.from(sourceId);
if (source == null) {
mManager.onRouteRequestError("Unsupported presentation URL", nativeRequestId);
return;
}
mPendingCreateRouteRequestInfo = new CreateRouteRequestInfo(
source, sink, presentationId, origin, tabId, isIncognito, nativeRequestId);
CastUtils.getCastContext().setReceiverApplicationId(source.getApplicationId());
for (MediaRouter.RouteInfo routeInfo : mAndroidMediaRouter.getRoutes()) {
if (routeInfo.getId().equals(sink.getId())) {
// Unselect and then select so that CAF will get notified of the selection.
mAndroidMediaRouter.unselect(0);
routeInfo.select();
break;
}
}
}
@Override
public void joinRoute(
String sourceId, String presentationId, String origin, int tabId, int nativeRequestId) {
// Not implemented.
CastMediaSource source = CastMediaSource.from(sourceId);
if (source == null || source.getClientId() == null) {
mManager.onRouteRequestError("Unsupported presentation URL", nativeRequestId);
return;
}
if (!hasSession()) {
mManager.onRouteRequestError("No presentation", nativeRequestId);
return;
}
if (!canJoinExistingSession(presentationId, origin, tabId, source)) {
mManager.onRouteRequestError("No matching route", nativeRequestId);
return;
}
MediaRoute route =
new MediaRoute(mSessionController.getSink().getId(), sourceId, presentationId);
addRoute(route, origin, tabId);
mManager.onRouteCreated(route.id, route.sinkId, nativeRequestId, this, false);
}
@Override
public void closeRoute(String routeId) {
// Not implemented.
MediaRoute route = mRoutes.get(routeId);
if (route == null) return;
if (!hasSession()) {
mRoutes.remove(routeId);
mManager.onRouteClosed(routeId);
return;
}
ClientRecord client = getClientRecordByRouteId(routeId);
if (client != null && mAndroidMediaRouter != null) {
MediaSink sink =
MediaSink.fromSinkId(mSessionController.getSink().getId(), mAndroidMediaRouter);
if (sink != null) {
mSessionController.notifyReceiverAction(routeId, sink, client.clientId, "stop");
}
}
mSessionController.endSession();
}
@Override
public void detachRoute(String routeId) {
// Not implemented.
mRoutes.remove(routeId);
removeClient(getClientRecordByRouteId(routeId));
}
@Override
......@@ -204,4 +300,200 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg
private MediaSource getSourceFromId(String sourceId) {
return CastMediaSource.from(sourceId);
}
///////////////////////////////////////////////
// SessionManagerListener implementation
///////////////////////////////////////////////
@Override
public void onSessionStarting(CastSession session) {
Log.d(TAG, "onSessionStarting");
mSessionController = new CastSessionController(session, this,
mPendingCreateRouteRequestInfo.sink, mPendingCreateRouteRequestInfo.source);
MediaRoute route = new MediaRoute(mPendingCreateRouteRequestInfo.sink.getId(),
mPendingCreateRouteRequestInfo.source.getSourceId(),
mPendingCreateRouteRequestInfo.presentationId);
addRoute(
route, mPendingCreateRouteRequestInfo.origin, mPendingCreateRouteRequestInfo.tabId);
mManager.onRouteCreated(
route.id, route.sinkId, mPendingCreateRouteRequestInfo.nativeRequestId, this, true);
String clientId = ((CastMediaSource) mPendingCreateRouteRequestInfo.source).getClientId();
if (clientId != null) {
ClientRecord clientRecord = mClientRecords.get(clientId);
if (clientRecord != null) {
mSessionController.notifyReceiverAction(clientRecord.routeId,
mPendingCreateRouteRequestInfo.sink, clientId, "cast");
}
}
}
@Override
public void onSessionStarted(CastSession session, String sessionId) {
Log.d(TAG, "onSessionStarted");
mPendingCreateRouteRequestInfo = null;
mSessionController.onSessionStarted();
}
@Override
public void onSessionStartFailed(CastSession session, int error) {
for (String routeId : mRoutes.keySet()) {
mManager.onRouteClosedWithError(routeId, "Launch error");
}
mRoutes.clear();
mClientRecords.clear();
}
@Override
public void onSessionEnding(CastSession session) {
// Not implemented.
}
@Override
public void onSessionEnded(CastSession session, int error) {
if (!hasSession()) return;
if (mClientRecords.isEmpty()) {
for (String routeId : mRoutes.keySet()) mManager.onRouteClosed(routeId);
mRoutes.clear();
} else {
mLastRemovedRouteRecord = mClientRecords.values().iterator().next();
for (ClientRecord client : mClientRecords.values()) {
mManager.onRouteClosed(client.routeId);
mRoutes.remove(client.routeId);
}
mClientRecords.clear();
}
detachFromSession();
if (mAndroidMediaRouter != null) {
mAndroidMediaRouter.selectRoute(mAndroidMediaRouter.getDefaultRoute());
}
}
@Override
public void onSessionResuming(CastSession session, String sessionId) {}
@Override
public void onSessionResumed(CastSession session, boolean wasSuspended) {}
@Override
public void onSessionResumeFailed(CastSession session, int error) {}
@Override
public void onSessionSuspended(CastSession session, int reason) {}
public boolean hasSession() {
return mSessionController != null;
}
private void detachFromSession() {
mSessionController.onSessionEnded();
mSessionController = null;
}
private void addRoute(MediaRoute route, String origin, int tabId) {
mRoutes.put(route.id, route);
CastMediaSource source = CastMediaSource.from(route.sourceId);
final String clientId = source.getClientId();
if (clientId == null || mClientRecords.containsKey(clientId)) return;
mClientRecords.put(clientId,
new ClientRecord(route.id, clientId, source.getApplicationId(),
source.getAutoJoinPolicy(), origin, tabId));
}
private void removeClient(@Nullable ClientRecord client) {
if (client == null) return;
mLastRemovedRouteRecord = client;
mClientRecords.remove(client.clientId);
}
@Nullable
private ClientRecord getClientRecordByRouteId(String routeId) {
for (ClientRecord record : mClientRecords.values()) {
if (record.routeId.equals(routeId)) return record;
}
return null;
}
private static class CreateRouteRequestInfo {
public final MediaSource source;
public final MediaSink sink;
public final String presentationId;
public final String origin;
public final int tabId;
public final boolean isIncognito;
public final int nativeRequestId;
public CreateRouteRequestInfo(MediaSource source, MediaSink sink, String presentationId,
String origin, int tabId, boolean isIncognito, int nativeRequestId) {
this.source = source;
this.sink = sink;
this.presentationId = presentationId;
this.origin = origin;
this.tabId = tabId;
this.isIncognito = isIncognito;
this.nativeRequestId = nativeRequestId;
}
}
private boolean canJoinExistingSession(
String presentationId, String origin, int tabId, CastMediaSource source) {
if (AUTO_JOIN_PRESENTATION_ID.equals(presentationId)) {
return canAutoJoin(source, origin, tabId);
}
if (presentationId.startsWith(PRESENTATION_ID_SESSION_ID_PREFIX)) {
String sessionId = presentationId.substring(PRESENTATION_ID_SESSION_ID_PREFIX.length());
return mSessionController.getSession().getSessionId().equals(sessionId);
}
for (MediaRoute route : mRoutes.values()) {
if (route.presentationId.equals(presentationId)) return true;
}
return false;
}
private boolean canAutoJoin(CastMediaSource source, String origin, int tabId) {
if (source.getAutoJoinPolicy().equals(CastMediaSource.AUTOJOIN_PAGE_SCOPED)) return false;
CastMediaSource currentSource = (CastMediaSource) mSessionController.getSource();
if (!currentSource.getApplicationId().equals(source.getApplicationId())) return false;
if (mClientRecords.isEmpty() && mLastRemovedRouteRecord != null) {
return isSameOrigin(origin, mLastRemovedRouteRecord.origin)
&& tabId == mLastRemovedRouteRecord.tabId;
}
if (mClientRecords.isEmpty()) return false;
ClientRecord client = mClientRecords.values().iterator().next();
if (source.getAutoJoinPolicy().equals(CastMediaSource.AUTOJOIN_ORIGIN_SCOPED)) {
return isSameOrigin(origin, client.origin);
}
if (source.getAutoJoinPolicy().equals(CastMediaSource.AUTOJOIN_TAB_AND_ORIGIN_SCOPED)) {
return isSameOrigin(origin, client.origin) && tabId == client.tabId;
}
return false;
}
/**
* Compares two origins. Empty origin strings correspond to unique origins in
* url::Origin.
*
* @param originA A URL origin.
* @param originB A URL origin.
* @return True if originA and originB represent the same origin, false otherwise.
*/
private static final boolean isSameOrigin(String originA, String originB) {
if (originA == null || originA.isEmpty() || originB == null || originB.isEmpty())
return false;
return originA.equals(originB);
}
}
// 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
}
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override
public void createRoute(String sourceId, String sinkId, String presentationId, String origin,
int tabId, boolean isIncognito, int nativeRequestId) {
......
......@@ -12,6 +12,7 @@ import org.json.JSONObject;
import org.chromium.base.Log;
import org.chromium.base.VisibleForTesting;
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.MediaRouteManager;
import org.chromium.chrome.browser.media.router.MediaRouteProvider;
......@@ -44,18 +45,21 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
return new CastMediaRouteProvider(ChromeMediaRouter.getAndroidMediaRouter(), manager);
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override
public void onSessionStartFailed() {
super.onSessionStartFailed();
mClientRecords.clear();
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override
public void onSessionStarted(CastSession session) {
super.onSessionStarted(session);
mMessageHandler.onSessionCreated(mSession);
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override
public void onSessionEnded() {
if (mSession == null) return;
......@@ -102,10 +106,12 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
return mMessageHandler;
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
public Set<String> getClients() {
return mClientRecords.keySet();
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
public Map<String, ClientRecord> getClientRecords() {
return mClientRecords;
}
......@@ -124,6 +130,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
mMessageHandler);
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override
public void onSessionStarting(
ChromeCastSessionManager.CastSessionLaunchRequest sessionLaunchRequest) {
......@@ -146,6 +153,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
}
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override
public void joinRoute(String sourceId, String presentationId, String origin, int tabId,
int nativeRequestId) {
......@@ -170,6 +178,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
mManager.onRouteCreated(route.id, route.sinkId, nativeRequestId, this, false);
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Override
public void closeRoute(String routeId) {
MediaRoute route = mRoutes.get(routeId);
......@@ -312,6 +321,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
mMessageHandler = new CastMessageHandler(this);
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
private boolean canAutoJoin(CastMediaSource source, String origin, int tabId) {
if (source.getAutoJoinPolicy().equals(CastMediaSource.AUTOJOIN_PAGE_SCOPED)) return false;
......@@ -338,6 +348,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
return false;
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
private boolean canJoinExistingSession(
String presentationId, String origin, int tabId, CastMediaSource source) {
if (AUTO_JOIN_PRESENTATION_ID.equals(presentationId)) {
......@@ -353,6 +364,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
return false;
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@Nullable
private ClientRecord getClientRecordByRouteId(String routeId) {
for (ClientRecord record : mClientRecords.values()) {
......@@ -361,6 +373,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
return null;
}
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
@VisibleForTesting
void addRoute(MediaRoute route, String origin, int tabId) {
mRoutes.put(route.id, route);
......@@ -425,6 +438,7 @@ public class CastMediaRouteProvider extends BaseMediaRouteProvider {
* @param originB A URL origin.
* @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) {
if (originA == null || originA.isEmpty() || originB == null || originB.isEmpty())
return false;
......
......@@ -14,6 +14,7 @@ import org.json.JSONObject;
import org.chromium.base.Log;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.media.router.ClientRecord;
import java.util.ArrayDeque;
import java.util.Arrays;
......
......@@ -35,6 +35,7 @@ import javax.annotation.Nullable;
* Since there're numerous asynchronous calls involved in getting the application to launch
* the class is implemented as a state machine.
*/
// Migrated to CafMediaRouteProvider. See https://crbug.com/711860.
public class CreateRouteRequest implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
ResultCallback<Cast.ApplicationConnectionResult>,
......
......@@ -731,6 +731,7 @@ chrome_java_sources = [
"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/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/ChromeMediaRouterDialogController.java",
"java/src/org/chromium/chrome/browser/media/router/DiscoveryCallback.java",
......@@ -749,7 +750,11 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java",
"java/src/org/chromium/chrome/browser/media/router/MediaStatusObserver.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/CastMessageHandler.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/CastMediaSource.java",
......@@ -760,7 +765,6 @@ chrome_java_sources = [
"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/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/remoting/RemotingCastSession.java",
"java/src/org/chromium/chrome/browser/media/router/cast/remoting/RemotingMediaRouteProvider.java",
......
......@@ -35,6 +35,7 @@ import org.robolectric.shadows.ShadowLog;
import org.chromium.base.test.BaseRobolectricTestRunner;
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.JSONTestUtils.JSONObjectLike;
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