Index: chrome/browser/ui/webui/media_router/media_router_ui.cc |
diff --git a/chrome/browser/ui/webui/media_router/media_router_ui.cc b/chrome/browser/ui/webui/media_router/media_router_ui.cc |
index 8e8e974063672381b1a29e92462627bebf12a0df..8bb7b4cf80c236a42c84a9013a1ff06ac6aa6644 100644 |
--- a/chrome/browser/ui/webui/media_router/media_router_ui.cc |
+++ b/chrome/browser/ui/webui/media_router/media_router_ui.cc |
@@ -29,6 +29,7 @@ |
#include "chrome/browser/media/router/media_sinks_observer.h" |
#include "chrome/browser/media/router/media_source.h" |
#include "chrome/browser/media/router/media_source_helper.h" |
+#include "chrome/browser/media/router/mojo/media_route_controller.h" |
#include "chrome/browser/media/router/mojo/media_router_mojo_impl.h" |
#include "chrome/browser/media/router/presentation_service_delegate_impl.h" |
#include "chrome/browser/media/router/route_request_result.h" |
@@ -153,6 +154,16 @@ void MediaRouterUI::UIMediaRoutesObserver::OnRoutesUpdated( |
callback_.Run(routes, joinable_route_ids); |
} |
+MediaRouterUI::UIMediaRouteStatusObserver::UIMediaRouteStatusObserver( |
+ MediaRouterWebUIMessageHandler* handler) |
+ : handler_(handler) {} |
+MediaRouterUI::UIMediaRouteStatusObserver::~UIMediaRouteStatusObserver() {} |
+ |
+void MediaRouterUI::UIMediaRouteStatusObserver::OnMediaRouteStatusUpdated( |
+ const MediaStatus& status) { |
+ handler_->UpdateMediaRouteStatus(status); |
+} |
+ |
MediaRouterUI::MediaRouterUI(content::WebUI* web_ui) |
: ConstrainedWebDialogUI(web_ui), |
ui_initialized_(false), |
@@ -211,6 +222,8 @@ MediaRouterUI::~MediaRouterUI() { |
"No screens found.")); |
} |
} |
+ if (route_controller_) |
+ route_controller_->RemoveObserver(route_status_observer_.get()); |
} |
void MediaRouterUI::InitWithDefaultMediaSource( |
@@ -615,6 +628,11 @@ void MediaRouterUI::OnRoutesUpdated( |
if (ui_initialized_) |
handler_->UpdateRoutes(routes_, joinable_route_ids_, |
routes_and_cast_modes_); |
+ |
+ if (selected_route_ && !IsValidRouteId(selected_route_.value())) { |
+ selected_route_.reset(); |
+ route_controller_ = nullptr; |
+ } |
} |
void MediaRouterUI::OnRouteResponseReceived( |
@@ -761,6 +779,56 @@ void MediaRouterUI::UpdateMaxDialogHeight(int height) { |
handler_->UpdateMaxDialogHeight(height); |
} |
+void MediaRouterUI::PlayRoute() { |
+ if (route_controller_) |
+ route_controller_->Play(); |
+} |
+ |
+void MediaRouterUI::PauseRoute() { |
+ if (route_controller_) |
+ route_controller_->Pause(); |
+} |
+ |
+void MediaRouterUI::SeekRoute(uint32_t time) { |
+ if (route_controller_) |
+ route_controller_->Seek(time); |
+} |
+ |
+void MediaRouterUI::SetRouteVolume(float volume) { |
+ if (route_controller_) |
+ route_controller_->SetVolume(volume); |
+} |
+ |
+void MediaRouterUI::SetRouteMute(bool mute) { |
+ if (route_controller_) |
+ route_controller_->SetMute(mute); |
+} |
+ |
+void MediaRouterUI::OnUIDetailsViewOpened(MediaRoute::Id route_id) { |
+ if (!IsValidRouteId(route_id)) |
+ return; |
+ selected_route_ = base::Optional<MediaRoute::Id>(route_id); |
+ route_controller_ = router_->GetControllerForRoute(route_id); |
+ route_status_observer_ = |
+ base::MakeUnique<UIMediaRouteStatusObserver>(handler_); |
+ route_controller_->AddObserver(route_status_observer_.get()); |
+} |
+ |
+void MediaRouterUI::OnUIDetailsViewClosed() { |
+ selected_route_.reset(); |
+ if (route_controller_) |
+ route_controller_->RemoveObserver(route_status_observer_.get()); |
+ route_controller_ = nullptr; |
+ route_status_observer_.reset(); |
+} |
+ |
+bool MediaRouterUI::IsValidRouteId(const MediaRoute::Id& route_id) const { |
+ return std::find_if(routes_.begin(), routes_.end(), |
+ [&route_id](const MediaRoute& route) { |
+ return route.media_route_id() == route_id; |
+ }) != routes_.end(); |
+} |
+ |
std::string MediaRouterUI::GetSerializedInitiatorOrigin() const { |
url::Origin origin = initiator_ |
? url::Origin(initiator_->GetLastCommittedURL()) |