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..2737df4682dda61a930a3d755ec60a5fdd66cde0 100644 |
--- a/chrome/browser/ui/toolbar/media_router_action.cc |
+++ b/chrome/browser/ui/toolbar/media_router_action.cc |
@@ -5,10 +5,16 @@ |
#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/ui/toolbar/media_router_action_platform_delegate.h" |
#include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h" |
#include "chrome/grit/generated_resources.h" |
+#include "content/public/browser/web_contents.h" |
#include "grit/theme_resources.h" |
#include "ui/base/l10n/l10n_util.h" |
#include "ui/base/resource/resource_bundle.h" |
@@ -16,17 +22,54 @@ |
using media_router::MediaRouterDialogController; |
+ActionIssuesObserver::ActionIssuesObserver(media_router::MediaRouter* router, |
+ MediaRouterAction* action) |
Kevin M
2015/07/31 18:18:39
alignment & DCHECK the ptrs for non-nullness
apacible
2015/08/01 02:05:29
Done.
|
+ : media_router::IssuesObserver(router), |
+ action_(action) { |
+} |
+ |
+ActionIssuesObserver::~ActionIssuesObserver() {} |
+ |
+void ActionIssuesObserver::OnIssueUpdated(const media_router::Issue* issue) { |
+ action_->UpdateCurrentIssue(issue); |
+} |
+ |
+ActionMediaRoutesObserver::ActionMediaRoutesObserver( |
+ media_router::MediaRouter* router, |
+ MediaRouterAction* action) |
+ : media_router::MediaRoutesObserver(router), |
+ action_(action) { |
+} |
+ |
+ActionMediaRoutesObserver::~ActionMediaRoutesObserver() {} |
+ |
+void ActionMediaRoutesObserver::OnRoutesUpdated( |
+ const std::vector<media_router::MediaRoute>& routes) { |
+ action_->UpdateCurrentRoutes(routes); |
+} |
+ |
MediaRouterAction::MediaRouterAction(Browser* 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)), |
+ state_(MEDIA_ROUTER_ACTION_IDLE), |
+ issue_(nullptr), |
+ local_active_route_exists_(false), |
delegate_(nullptr), |
platform_delegate_(MediaRouterActionPlatformDelegate::Create(browser)), |
contextual_menu_(browser) { |
} |
MediaRouterAction::~MediaRouterAction() { |
+ issues_observer_.reset(); |
+ routes_observer_.reset(); |
Kevin M
2015/07/31 18:18:39
Unnecessary
apacible
2015/08/01 02:05:29
Done.
|
} |
const std::string& MediaRouterAction::GetId() const { |
@@ -35,12 +78,35 @@ const std::string& MediaRouterAction::GetId() const { |
void MediaRouterAction::SetDelegate(ToolbarActionViewDelegate* delegate) { |
delegate_ = delegate; |
+ |
+ if (delegate_) { |
+ media_router::MediaRouter* media_router = GetMediaRouter(); |
+ if (media_router) { |
+ issues_observer_.reset(new ActionIssuesObserver(media_router, this)); |
+ routes_observer_.reset(new ActionMediaRoutesObserver(media_router, |
+ this)); |
+ } |
+ } else { |
+ issues_observer_.reset(); |
+ routes_observer_.reset(); |
+ } |
} |
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_; |
+ switch (state_) { |
+ case MEDIA_ROUTER_ACTION_IDLE: |
+ return media_router_idle_icon_; |
+ case MEDIA_ROUTER_ACTION_ACTIVE: |
+ return media_router_active_icon_; |
+ case MEDIA_ROUTER_ACTION_ERROR: |
+ return media_router_error_icon_; |
+ case MEDIA_ROUTER_ACTION_WARNING: |
+ return media_router_warning_icon_; |
+ default: |
+ NOTREACHED(); |
+ return media_router_idle_icon_; |
+ } |
} |
base::string16 MediaRouterAction::GetActionName() const { |
@@ -98,6 +164,32 @@ bool MediaRouterAction::ExecuteAction(bool by_user) { |
void MediaRouterAction::UpdateState() { |
} |
+bool MediaRouterAction::DisabledClickOpensMenu() const { |
+ return false; |
+} |
+ |
+void MediaRouterAction::UpdateCurrentIssue(const media_router::Issue* issue) { |
+ if (issue) |
+ issue_.reset(new media_router::Issue(*issue)); |
+ else |
+ issue_.reset(); |
+ |
+ MaybeUpdateIcon(); |
+} |
+ |
+void MediaRouterAction::UpdateCurrentRoutes( |
+ const std::vector<media_router::MediaRoute>& routes) { |
+ // Check if any of the routes are local. |
+ auto it = std::find_if(routes.begin(), routes.end(), |
+ [](const media_router::MediaRoute& route) { |
+ return route.is_local(); |
+ }); |
+ |
+ local_active_route_exists_ = it != routes.end(); |
+ |
+ MaybeUpdateIcon(); |
+} |
+ |
MediaRouterDialogController* |
MediaRouterAction::GetMediaRouterDialogController() { |
DCHECK(delegate_); |
@@ -106,6 +198,38 @@ MediaRouterAction::GetMediaRouterDialogController() { |
return MediaRouterDialogController::GetOrCreateForWebContents(web_contents); |
} |
-bool MediaRouterAction::DisabledClickOpensMenu() const { |
- return false; |
+media_router::MediaRouter* MediaRouterAction::GetMediaRouter() { |
+ DCHECK(delegate_); |
+ content::WebContents* web_contents = delegate_->GetCurrentWebContents(); |
+ return web_contents ? static_cast<media_router::MediaRouterMojoImpl*>( |
Kevin M
2015/07/31 18:18:39
No need to static_cast here
apacible
2015/08/01 02:05:29
Done.
|
+ media_router::MediaRouterFactory::GetApiForBrowserContext( |
+ web_contents->GetBrowserContext())) : nullptr; |
+} |
+ |
+void MediaRouterAction::MaybeUpdateIcon() { |
+ MediaRouterActionState new_state = GetUpdatedMediaRouterActionState(); |
+ |
+ // Update the current state if it has changed. |
+ if (new_state != state_) { |
+ state_ = new_state; |
+ |
+ // Update the icon to reflect the new state. |
+ if (delegate_) |
+ delegate_->UpdateState(); |
+ } |
+} |
+ |
+MediaRouterActionState MediaRouterAction::GetUpdatedMediaRouterActionState() { |
+ // Highest priority is to indicate whether there's an issue. |
+ if (issue_) { |
+ if (issue_.get()->severity() == media_router::Issue::FATAL) |
+ return MEDIA_ROUTER_ACTION_ERROR; |
+ else if (issue_.get()->severity() == media_router::Issue::WARNING) |
+ return MEDIA_ROUTER_ACTION_WARNING; |
+ } |
+ |
+ if (local_active_route_exists_) |
+ return MEDIA_ROUTER_ACTION_ACTIVE; |
+ |
+ return MEDIA_ROUTER_ACTION_IDLE; |
} |