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_; |
} |