| Index: chrome/browser/ui/toolbar/media_router_action.cc
|
| diff --git a/chrome/browser/ui/toolbar/media_router_action.cc b/chrome/browser/ui/toolbar/media_router_action.cc
|
| index cc9425e2e29181180028cb4d9f5b94a518816b76..cdfa0ae4332f52ecbd3896b00414eba81a706c43 100644
|
| --- a/chrome/browser/ui/toolbar/media_router_action.cc
|
| +++ b/chrome/browser/ui/toolbar/media_router_action.cc
|
| @@ -5,7 +5,14 @@
|
| #include "chrome/browser/ui/toolbar/media_router_action.h"
|
|
|
| #include "base/strings/utf_string_conversions.h"
|
| +#include "chrome/browser/media/router/issue.h"
|
| +#include "chrome/browser/media/router/media_route.h"
|
| +#include "chrome/browser/media/router/media_router.h"
|
| #include "chrome/browser/media/router/media_router_dialog_controller.h"
|
| +#include "chrome/browser/media/router/media_router_factory.h"
|
| +#include "chrome/browser/media/router/media_router_mojo_impl.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| #include "chrome/browser/ui/toolbar/media_router_action_platform_delegate.h"
|
| #include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h"
|
| #include "chrome/grit/generated_resources.h"
|
| @@ -17,10 +24,20 @@
|
| using media_router::MediaRouterDialogController;
|
|
|
| MediaRouterAction::MediaRouterAction(Browser* browser)
|
| - : id_("media_router_action"),
|
| + : media_router::IssuesObserver(GetMediaRouter(browser)),
|
| + media_router::MediaRoutesObserver(GetMediaRouter(browser)),
|
| + id_("media_router_action"),
|
| name_(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_TITLE)),
|
| + media_router_active_icon_(ui::ResourceBundle::GetSharedInstance().
|
| + GetImageNamed(IDR_MEDIA_ROUTER_ACTIVE_ICON)),
|
| + media_router_error_icon_(ui::ResourceBundle::GetSharedInstance().
|
| + GetImageNamed(IDR_MEDIA_ROUTER_ERROR_ICON)),
|
| media_router_idle_icon_(ui::ResourceBundle::GetSharedInstance().
|
| GetImageNamed(IDR_MEDIA_ROUTER_IDLE_ICON)),
|
| + media_router_warning_icon_(ui::ResourceBundle::GetSharedInstance().
|
| + GetImageNamed(IDR_MEDIA_ROUTER_WARNING_ICON)),
|
| + current_icon_(&media_router_idle_icon_),
|
| + has_local_route_(false),
|
| delegate_(nullptr),
|
| platform_delegate_(MediaRouterActionPlatformDelegate::Create(browser)),
|
| contextual_menu_(browser) {
|
| @@ -39,8 +56,7 @@ void MediaRouterAction::SetDelegate(ToolbarActionViewDelegate* delegate) {
|
|
|
| gfx::Image MediaRouterAction::GetIcon(content::WebContents* web_contents,
|
| const gfx::Size& size) {
|
| - // TODO(apacible): Return icon based on casting state.
|
| - return media_router_idle_icon_;
|
| + return *current_icon_;
|
| }
|
|
|
| base::string16 MediaRouterAction::GetActionName() const {
|
| @@ -98,6 +114,26 @@ bool MediaRouterAction::ExecuteAction(bool by_user) {
|
| void MediaRouterAction::UpdateState() {
|
| }
|
|
|
| +bool MediaRouterAction::DisabledClickOpensMenu() const {
|
| + return false;
|
| +}
|
| +
|
| +void MediaRouterAction::OnIssueUpdated(const media_router::Issue* issue) {
|
| + issue_.reset(issue ? new media_router::Issue(*issue) : nullptr);
|
| +
|
| + MaybeUpdateIcon();
|
| +}
|
| +
|
| +void MediaRouterAction::OnRoutesUpdated(
|
| + const std::vector<media_router::MediaRoute>& routes) {
|
| + has_local_route_ =
|
| + std::find_if(routes.begin(), routes.end(),
|
| + [](const media_router::MediaRoute& route) {
|
| + return route.is_local(); }) !=
|
| + routes.end();
|
| + MaybeUpdateIcon();
|
| +}
|
| +
|
| MediaRouterDialogController*
|
| MediaRouterAction::GetMediaRouterDialogController() {
|
| DCHECK(delegate_);
|
| @@ -106,6 +142,34 @@ MediaRouterAction::GetMediaRouterDialogController() {
|
| return MediaRouterDialogController::GetOrCreateForWebContents(web_contents);
|
| }
|
|
|
| -bool MediaRouterAction::DisabledClickOpensMenu() const {
|
| - return false;
|
| +media_router::MediaRouter* MediaRouterAction::GetMediaRouter(Browser* browser) {
|
| + return media_router::MediaRouterFactory::GetApiForBrowserContext(
|
| + static_cast<content::BrowserContext*>(browser->profile()));
|
| +}
|
| +
|
| +void MediaRouterAction::MaybeUpdateIcon() {
|
| + const gfx::Image* new_icon = GetCurrentIcon();
|
| +
|
| + // Update the current state if it has changed.
|
| + if (new_icon != current_icon_) {
|
| + current_icon_ = new_icon;
|
| +
|
| + // Tell the associated view to update its icon to reflect the change made
|
| + // above.
|
| + if (delegate_)
|
| + delegate_->UpdateState();
|
| + }
|
| +}
|
| +
|
| +const gfx::Image* MediaRouterAction::GetCurrentIcon() const {
|
| + // Highest priority is to indicate whether there's an issue.
|
| + if (issue_) {
|
| + if (issue_->severity() == media_router::Issue::FATAL)
|
| + return &media_router_error_icon_;
|
| + if (issue_->severity() == media_router::Issue::WARNING)
|
| + return &media_router_warning_icon_;
|
| + }
|
| +
|
| + return has_local_route_ ?
|
| + &media_router_active_icon_ : &media_router_idle_icon_;
|
| }
|
|
|