Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2466)

Unified Diff: chrome/browser/ui/toolbar/media_router_action.cc

Issue 1268553002: Reflect the current state in Media Router Action icon. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698