Commit 1d496b33 authored by John Williams's avatar John Williams Committed by Commit Bot

[Cast MRP] Added automatic transition from mirroring to casting.

Bug: 951057
Change-Id: I02be8618b13f3fb185cecb97e03985185758fa3f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1674448
Commit-Queue: John Williams <jrw@chromium.org>
Reviewed-by: default avatarTakumi Fujimoto <takumif@chromium.org>
Cr-Commit-Position: refs/heads/master@{#682497}
parent 88132718
...@@ -42,14 +42,14 @@ void ActivityRecord::SetOrUpdateSession(const CastSession& session, ...@@ -42,14 +42,14 @@ void ActivityRecord::SetOrUpdateSession(const CastSession& session,
<< session_id_.value_or("<missing>") << session_id_.value_or("<missing>")
<< ", new session_id = " << session.session_id(); << ", new session_id = " << session.session_id();
route_.set_description(session.GetRouteDescription()); route_.set_description(session.GetRouteDescription());
sink_ = sink;
if (session_id_) { if (session_id_) {
DCHECK_EQ(*session_id_, session.session_id()); DCHECK_EQ(*session_id_, session.session_id());
} else { } else {
session_id_ = session.session_id(); session_id_ = session.session_id();
OnSessionSet(); if (on_session_set_)
std::move(on_session_set_).Run();
} }
} }
void ActivityRecord::OnSessionSet() {}
} // namespace media_router } // namespace media_router
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "chrome/browser/media/router/providers/cast/cast_internal_message_util.h" #include "chrome/browser/media/router/providers/cast/cast_internal_message_util.h"
#include "chrome/browser/media/router/providers/cast/cast_session_client.h" #include "chrome/browser/media/router/providers/cast/cast_session_client.h"
#include "chrome/browser/media/router/providers/cast/cast_session_tracker.h" #include "chrome/browser/media/router/providers/cast/cast_session_tracker.h"
#include "chrome/common/media_router/discovery/media_sink_internal.h"
#include "chrome/common/media_router/media_route.h" #include "chrome/common/media_router/media_route.h"
#include "chrome/common/media_router/mojo/media_router.mojom.h" #include "chrome/common/media_router/mojo/media_router.mojom.h"
#include "chrome/common/media_router/providers/cast/cast_media_source.h" #include "chrome/common/media_router/providers/cast/cast_media_source.h"
...@@ -47,6 +48,8 @@ class ActivityRecord { ...@@ -47,6 +48,8 @@ class ActivityRecord {
const MediaRoute& route() const { return route_; } const MediaRoute& route() const { return route_; }
const std::string& app_id() const { return app_id_; } const std::string& app_id() const { return app_id_; }
const base::Optional<std::string>& session_id() const { return session_id_; } const base::Optional<std::string>& session_id() const { return session_id_; }
base::Optional<int> mirroring_tab_id() const { return mirroring_tab_id_; }
const MediaSinkInternal sink() const { return sink_; }
// On the first call, saves the ID of |session|. On subsequent calls, // On the first call, saves the ID of |session|. On subsequent calls,
// notifies all connected clients that the session has been updated. In both // notifies all connected clients that the session has been updated. In both
...@@ -138,15 +141,16 @@ class ActivityRecord { ...@@ -138,15 +141,16 @@ class ActivityRecord {
virtual void TerminatePresentationConnections() = 0; virtual void TerminatePresentationConnections() = 0;
protected: protected:
// Function called the first time session_id_ has been set.
virtual void OnSessionSet();
CastSession* GetSession() const; CastSession* GetSession() const;
MediaRoute route_; MediaRoute route_;
std::string app_id_; std::string app_id_;
base::Optional<int> mirroring_tab_id_;
ClientMap connected_clients_; ClientMap connected_clients_;
// Called when a session is initially set from SetOrUpdateSession().
base::OnceCallback<void()> on_session_set_;
// TODO(https://crbug.com/809249): Consider wrapping CastMessageHandler with // TODO(https://crbug.com/809249): Consider wrapping CastMessageHandler with
// known parameters (sink, client ID, session transport ID) and passing them // known parameters (sink, client ID, session transport ID) and passing them
// to objects that need to send messages to the receiver. // to objects that need to send messages to the receiver.
...@@ -157,6 +161,8 @@ class ActivityRecord { ...@@ -157,6 +161,8 @@ class ActivityRecord {
// Set by CastActivityManager after the session is launched successfully. // Set by CastActivityManager after the session is launched successfully.
base::Optional<std::string> session_id_; base::Optional<std::string> session_id_;
MediaSinkInternal sink_;
}; };
} // namespace media_router } // namespace media_router
......
...@@ -89,6 +89,8 @@ void CastActivityManager::LaunchSession( ...@@ -89,6 +89,8 @@ void CastActivityManager::LaunchSession(
MediaRoute route(route_id, source, sink_id, /* description */ std::string(), MediaRoute route(route_id, source, sink_id, /* description */ std::string(),
/* is_local */ true, /* for_display */ true); /* is_local */ true, /* for_display */ true);
route.set_incognito(incognito); route.set_incognito(incognito);
DVLOG(1) << "LaunchSession: source_id=" << cast_source.source_id()
<< ", route_id: " << route_id << ", sink_id=" << sink_id;
DoLaunchSessionParams params(route, cast_source, sink, origin, tab_id, DoLaunchSessionParams params(route, cast_source, sink, origin, tab_id,
std::move(callback)); std::move(callback));
// If there is currently a session on the sink, it must be terminated before // If there is currently a session on the sink, it must be terminated before
...@@ -261,9 +263,12 @@ void CastActivityManager::JoinSession( ...@@ -261,9 +263,12 @@ void CastActivityManager::JoinSession(
activity = FindActivityForAutoJoin(cast_source, origin, tab_id); activity = FindActivityForAutoJoin(cast_source, origin, tab_id);
if (!activity && cast_source.default_action_policy() != if (!activity && cast_source.default_action_policy() !=
DefaultActionPolicy::kCastThisTab) { DefaultActionPolicy::kCastThisTab) {
// TODO(crbug.com/951057): Try to convert a mirroring route matching the auto sink = ConvertMirrorToCast(tab_id);
// tab to a Cast route. if (sink) {
DLOG(ERROR) << "Conversion to a Cast route is not implemented."; LaunchSession(cast_source, *sink, presentation_id, origin, tab_id,
incognito, std::move(callback));
return;
}
} }
} else { } else {
activity = FindActivityForSessionJoin(cast_source, presentation_id); activity = FindActivityForSessionJoin(cast_source, presentation_id);
...@@ -668,7 +673,7 @@ void CastActivityManager::HandleStopSessionResponse( ...@@ -668,7 +673,7 @@ void CastActivityManager::HandleStopSessionResponse(
void CastActivityManager::SendFailedToCastIssue( void CastActivityManager::SendFailedToCastIssue(
const MediaSink::Id& sink_id, const MediaSink::Id& sink_id,
const MediaRoute::Id& route_id) { const MediaRoute::Id& route_id) {
// TODO(imcheng): i18n-ize the title string. // TODO(crbug.com/989237): i18n-ize the title string.
IssueInfo info("Failed to cast. Please try again.", IssueInfo info("Failed to cast. Please try again.",
IssueInfo::Action::DISMISS, IssueInfo::Severity::WARNING); IssueInfo::Action::DISMISS, IssueInfo::Severity::WARNING);
info.sink_id = sink_id; info.sink_id = sink_id;
...@@ -676,6 +681,17 @@ void CastActivityManager::SendFailedToCastIssue( ...@@ -676,6 +681,17 @@ void CastActivityManager::SendFailedToCastIssue(
media_router_->OnIssue(info); media_router_->OnIssue(info);
} }
base::Optional<MediaSinkInternal> CastActivityManager::ConvertMirrorToCast(
int tab_id) {
for (const auto& pair : activities_) {
if (pair.second->mirroring_tab_id() == tab_id) {
return pair.second->sink();
}
}
return base::nullopt;
}
CastActivityManager::DoLaunchSessionParams::DoLaunchSessionParams( CastActivityManager::DoLaunchSessionParams::DoLaunchSessionParams(
const MediaRoute& route, const MediaRoute& route,
const CastMediaSource& cast_source, const CastMediaSource& cast_source,
......
...@@ -240,6 +240,10 @@ class CastActivityManager : public CastActivityManagerBase, ...@@ -240,6 +240,10 @@ class CastActivityManager : public CastActivityManagerBase,
int tab_id, int tab_id,
const CastSinkExtraData& cast_data); const CastSinkExtraData& cast_data);
// Returns a sink used to convert a mirroring activity to a cast activity. If
// no conversion should occur, returns base::nullopt.
base::Optional<MediaSinkInternal> ConvertMirrorToCast(int tab_id);
static CastActivityRecordFactoryForTest* activity_record_factory_; static CastActivityRecordFactoryForTest* activity_record_factory_;
base::flat_set<MediaSource::Id> route_queries_; base::flat_set<MediaSource::Id> route_queries_;
......
...@@ -65,6 +65,8 @@ MirroringActivityRecord::MirroringActivityRecord( ...@@ -65,6 +65,8 @@ MirroringActivityRecord::MirroringActivityRecord(
on_stop_(std::move(callback)) { on_stop_(std::move(callback)) {
// TODO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors.
mirroring_tab_id_ = target_tab_id;
// Get a reference to the mirroring service host. // Get a reference to the mirroring service host.
media_router->GetMirroringServiceHostForTab(target_tab_id, media_router->GetMirroringServiceHostForTab(target_tab_id,
mojo::MakeRequest(&host_)); mojo::MakeRequest(&host_));
...@@ -250,10 +252,6 @@ void MirroringActivityRecord::OnInternalMessage( ...@@ -250,10 +252,6 @@ void MirroringActivityRecord::OnInternalMessage(
channel_to_service_->Send(std::move(ptr)); channel_to_service_->Send(std::move(ptr));
} }
void MirroringActivityRecord::OnSessionSet() {
std::move(on_session_set_).Run();
}
void MirroringActivityRecord::StopMirroring() { void MirroringActivityRecord::StopMirroring() {
// Running the callback will cause this object to be deleted. // Running the callback will cause this object to be deleted.
if (on_stop_) if (on_stop_)
......
...@@ -76,9 +76,6 @@ class MirroringActivityRecord : public ActivityRecord, ...@@ -76,9 +76,6 @@ class MirroringActivityRecord : public ActivityRecord,
void OnAppMessage(const cast_channel::CastMessage& message) override; void OnAppMessage(const cast_channel::CastMessage& message) override;
void OnInternalMessage(const cast_channel::InternalMessage& message) override; void OnInternalMessage(const cast_channel::InternalMessage& message) override;
protected:
void OnSessionSet() override;
private: private:
enum class MirroringType { enum class MirroringType {
kTab, // Mirror a single tab. kTab, // Mirror a single tab.
...@@ -103,7 +100,6 @@ class MirroringActivityRecord : public ActivityRecord, ...@@ -103,7 +100,6 @@ class MirroringActivityRecord : public ActivityRecord,
const int channel_id_; const int channel_id_;
const MirroringType mirroring_type_; const MirroringType mirroring_type_;
OnStopCallback on_stop_; OnStopCallback on_stop_;
base::OnceCallback<void()> on_session_set_;
base::WeakPtrFactory<MirroringActivityRecord> weak_ptr_factory_{this}; base::WeakPtrFactory<MirroringActivityRecord> weak_ptr_factory_{this};
}; };
......
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