Chromium Code Reviews| 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..a5c038f5440483b862622827a917f351ecbd2236 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,21 @@ |
| 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_), |
| + issue_(nullptr), |
| + has_local_routes_(false), |
| delegate_(nullptr), |
| platform_delegate_(MediaRouterActionPlatformDelegate::Create(browser)), |
| contextual_menu_(browser) { |
| @@ -39,8 +57,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 +115,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_routes_ = |
| + 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 +143,33 @@ 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() { |
| + gfx::Image* new_icon = GetCurrentIcon(); |
| + |
| + // Update the current state if it has changed. |
| + if (new_icon != current_icon_) { |
| + current_icon_ = new_icon; |
| + |
| + // Update the icon to reflect the new icon. |
| + if (delegate_) |
| + delegate_->UpdateState(); |
| + } |
| +} |
| + |
| +gfx::Image* MediaRouterAction::GetCurrentIcon() { |
|
Kevin M
2015/08/05 20:20:27
Consider returning a const reference if this can't
apacible
2015/08/05 22:13:52
Done.
|
| + // 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_routes_ ? |
| + &media_router_active_icon_ : &media_router_idle_icon_; |
| } |