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") { ...@@ -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_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",
...@@ -465,6 +466,7 @@ junit_binary("chrome_junit_tests") { ...@@ -465,6 +466,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",
...@@ -542,6 +544,7 @@ android_library("chrome_test_java") { ...@@ -542,6 +544,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",
......
...@@ -175,6 +175,12 @@ by a child template that "extends" this file. ...@@ -175,6 +175,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;
......
...@@ -11,11 +11,16 @@ import android.support.v7.media.MediaRouteSelector; ...@@ -11,11 +11,16 @@ import android.support.v7.media.MediaRouteSelector;
import android.support.v7.media.MediaRouter; import android.support.v7.media.MediaRouter;
import android.support.v7.media.MediaRouter.RouteInfo; 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.base.Log;
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.DiscoveryCallback; import org.chromium.chrome.browser.media.router.DiscoveryCallback;
import org.chromium.chrome.browser.media.router.DiscoveryDelegate; import org.chromium.chrome.browser.media.router.DiscoveryDelegate;
import org.chromium.chrome.browser.media.router.FlingingController; 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.MediaRouteManager;
import org.chromium.chrome.browser.media.router.MediaRouteProvider; import org.chromium.chrome.browser.media.router.MediaRouteProvider;
import org.chromium.chrome.browser.media.router.MediaSink; import org.chromium.chrome.browser.media.router.MediaSink;
...@@ -27,13 +32,18 @@ import java.util.Collections; ...@@ -27,13 +32,18 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* A {@link MediaRouteProvider} implementation for Cast devices and applications, using Cast v3 API. * 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 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 static final List<MediaSink> NO_SINKS = Collections.emptyList();
protected final MediaRouter mAndroidMediaRouter; protected final MediaRouter mAndroidMediaRouter;
...@@ -41,6 +51,12 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg ...@@ -41,6 +51,12 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg
protected final Map<String, DiscoveryCallback> mDiscoveryCallbacks = protected final Map<String, DiscoveryCallback> mDiscoveryCallbacks =
new HashMap<String, DiscoveryCallback>(); new HashMap<String, DiscoveryCallback>();
protected Handler mHandler = new Handler(); 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) { private CafMediaRouteProvider(MediaRouter androidMediaRouter, MediaRouteManager manager) {
mAndroidMediaRouter = androidMediaRouter; mAndroidMediaRouter = androidMediaRouter;
...@@ -51,6 +67,14 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg ...@@ -51,6 +67,14 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg
return new CafMediaRouteProvider(ChromeMediaRouter.getAndroidMediaRouter(), manager); return new CafMediaRouteProvider(ChromeMediaRouter.getAndroidMediaRouter(), manager);
} }
public Map<String, ClientRecord> getClientRecords() {
return mClientRecords;
}
public Set<String> getClientIds() {
return mClientRecords.keySet();
}
@Override @Override
public boolean supportsSource(String sourceId) { public boolean supportsSource(String sourceId) {
return getSourceFromId(sourceId) != null; return getSourceFromId(sourceId) != null;
...@@ -170,23 +194,95 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg ...@@ -170,23 +194,95 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg
@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) {
// 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 @Override
public void joinRoute( public void joinRoute(
String sourceId, String presentationId, String origin, int tabId, int nativeRequestId) { 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 @Override
public void closeRoute(String routeId) { 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 @Override
public void detachRoute(String routeId) { public void detachRoute(String routeId) {
// Not implemented. mRoutes.remove(routeId);
removeClient(getClientRecordByRouteId(routeId));
} }
@Override @Override
...@@ -204,4 +300,200 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg ...@@ -204,4 +300,200 @@ public class CafMediaRouteProvider implements MediaRouteProvider, DiscoveryDeleg
private MediaSource getSourceFromId(String sourceId) { private MediaSource getSourceFromId(String sourceId) {
return CastMediaSource.from(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 ...@@ -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;
......
...@@ -35,6 +35,7 @@ import javax.annotation.Nullable; ...@@ -35,6 +35,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>,
......
...@@ -731,6 +731,7 @@ chrome_java_sources = [ ...@@ -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/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",
...@@ -749,7 +750,11 @@ chrome_java_sources = [ ...@@ -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/MediaStatusBridge.java",
"java/src/org/chromium/chrome/browser/media/router/MediaStatusObserver.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/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",
...@@ -760,7 +765,6 @@ chrome_java_sources = [ ...@@ -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/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