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,
<< session_id_.value_or("<missing>")
<< ", new session_id = " << session.session_id();
route_.set_description(session.GetRouteDescription());
sink_ = sink;
if (session_id_) {
DCHECK_EQ(*session_id_, session.session_id());
} else {
session_id_ = session.session_id();
OnSessionSet();
if (on_session_set_)
std::move(on_session_set_).Run();
}
}
void ActivityRecord::OnSessionSet() {}
} // namespace media_router
......@@ -13,6 +13,7 @@
#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_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/mojo/media_router.mojom.h"
#include "chrome/common/media_router/providers/cast/cast_media_source.h"
......@@ -47,6 +48,8 @@ class ActivityRecord {
const MediaRoute& route() const { return route_; }
const std::string& app_id() const { return app_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,
// notifies all connected clients that the session has been updated. In both
......@@ -138,15 +141,16 @@ class ActivityRecord {
virtual void TerminatePresentationConnections() = 0;
protected:
// Function called the first time session_id_ has been set.
virtual void OnSessionSet();
CastSession* GetSession() const;
MediaRoute route_;
std::string app_id_;
base::Optional<int> mirroring_tab_id_;
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
// known parameters (sink, client ID, session transport ID) and passing them
// to objects that need to send messages to the receiver.
......@@ -157,6 +161,8 @@ class ActivityRecord {
// Set by CastActivityManager after the session is launched successfully.
base::Optional<std::string> session_id_;
MediaSinkInternal sink_;
};
} // namespace media_router
......
......@@ -89,6 +89,8 @@ void CastActivityManager::LaunchSession(
MediaRoute route(route_id, source, sink_id, /* description */ std::string(),
/* is_local */ true, /* for_display */ true);
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,
std::move(callback));
// If there is currently a session on the sink, it must be terminated before
......@@ -261,9 +263,12 @@ void CastActivityManager::JoinSession(
activity = FindActivityForAutoJoin(cast_source, origin, tab_id);
if (!activity && cast_source.default_action_policy() !=
DefaultActionPolicy::kCastThisTab) {
// TODO(crbug.com/951057): Try to convert a mirroring route matching the
// tab to a Cast route.
DLOG(ERROR) << "Conversion to a Cast route is not implemented.";
auto sink = ConvertMirrorToCast(tab_id);
if (sink) {
LaunchSession(cast_source, *sink, presentation_id, origin, tab_id,
incognito, std::move(callback));
return;
}
}
} else {
activity = FindActivityForSessionJoin(cast_source, presentation_id);
......@@ -668,7 +673,7 @@ void CastActivityManager::HandleStopSessionResponse(
void CastActivityManager::SendFailedToCastIssue(
const MediaSink::Id& sink_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::Action::DISMISS, IssueInfo::Severity::WARNING);
info.sink_id = sink_id;
......@@ -676,6 +681,17 @@ void CastActivityManager::SendFailedToCastIssue(
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(
const MediaRoute& route,
const CastMediaSource& cast_source,
......
......@@ -240,6 +240,10 @@ class CastActivityManager : public CastActivityManagerBase,
int tab_id,
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_;
base::flat_set<MediaSource::Id> route_queries_;
......
......@@ -65,6 +65,8 @@ MirroringActivityRecord::MirroringActivityRecord(
on_stop_(std::move(callback)) {
// TODO(jrw): Detect and report errors.
mirroring_tab_id_ = target_tab_id;
// Get a reference to the mirroring service host.
media_router->GetMirroringServiceHostForTab(target_tab_id,
mojo::MakeRequest(&host_));
......@@ -250,10 +252,6 @@ void MirroringActivityRecord::OnInternalMessage(
channel_to_service_->Send(std::move(ptr));
}
void MirroringActivityRecord::OnSessionSet() {
std::move(on_session_set_).Run();
}
void MirroringActivityRecord::StopMirroring() {
// Running the callback will cause this object to be deleted.
if (on_stop_)
......
......@@ -76,9 +76,6 @@ class MirroringActivityRecord : public ActivityRecord,
void OnAppMessage(const cast_channel::CastMessage& message) override;
void OnInternalMessage(const cast_channel::InternalMessage& message) override;
protected:
void OnSessionSet() override;
private:
enum class MirroringType {
kTab, // Mirror a single tab.
......@@ -103,7 +100,6 @@ class MirroringActivityRecord : public ActivityRecord,
const int channel_id_;
const MirroringType mirroring_type_;
OnStopCallback on_stop_;
base::OnceCallback<void()> on_session_set_;
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