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

Side by Side 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: Changes per kmarshall@'s comments. Created 5 years, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/toolbar/media_router_action.h" 5 #include "chrome/browser/ui/toolbar/media_router_action.h"
6 6
7 #include "base/strings/utf_string_conversions.h" 7 #include "base/strings/utf_string_conversions.h"
8 #include "chrome/browser/media/router/issue.h"
9 #include "chrome/browser/media/router/media_route.h"
10 #include "chrome/browser/media/router/media_router.h"
8 #include "chrome/browser/media/router/media_router_dialog_controller.h" 11 #include "chrome/browser/media/router/media_router_dialog_controller.h"
12 #include "chrome/browser/media/router/media_router_factory.h"
13 #include "chrome/browser/media/router/media_router_mojo_impl.h"
9 #include "chrome/browser/ui/toolbar/media_router_action_platform_delegate.h" 14 #include "chrome/browser/ui/toolbar/media_router_action_platform_delegate.h"
10 #include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h" 15 #include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h"
11 #include "chrome/grit/generated_resources.h" 16 #include "chrome/grit/generated_resources.h"
17 #include "content/public/browser/web_contents.h"
12 #include "grit/theme_resources.h" 18 #include "grit/theme_resources.h"
13 #include "ui/base/l10n/l10n_util.h" 19 #include "ui/base/l10n/l10n_util.h"
14 #include "ui/base/resource/resource_bundle.h" 20 #include "ui/base/resource/resource_bundle.h"
15 #include "ui/gfx/image/image_skia.h" 21 #include "ui/gfx/image/image_skia.h"
16 22
17 using media_router::MediaRouterDialogController; 23 using media_router::MediaRouterDialogController;
18 24
25 MediaRouterActionObserver::MediaRouterActionObserver(
26 media_router::MediaRouter* router,
27 MediaRouterAction* action)
28 : media_router::IssuesObserver(router),
29 media_router::MediaRoutesObserver(router),
30 action_(action) {
31 DCHECK(router);
32 DCHECK(action);
33 }
34
35 MediaRouterActionObserver::~MediaRouterActionObserver() {}
36
37 void MediaRouterActionObserver::OnIssueUpdated(
38 const media_router::Issue* issue) {
39 action_->SetCurrentIssue(issue);
40 }
41
42 void MediaRouterActionObserver::OnRoutesUpdated(
43 const std::vector<media_router::MediaRoute>& routes) {
44 // Check if any of the routes are local.
45 auto it = std::find_if(routes.begin(), routes.end(),
46 [](const media_router::MediaRoute& route) {
47 return route.is_local();
48 });
49
50 action_->SetHasLocalRoutes(it != routes.end());
51 }
52
19 MediaRouterAction::MediaRouterAction(Browser* browser) 53 MediaRouterAction::MediaRouterAction(Browser* browser)
20 : id_("media_router_action"), 54 : id_("media_router_action"),
21 name_(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_TITLE)), 55 name_(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_TITLE)),
56 media_router_active_icon_(ui::ResourceBundle::GetSharedInstance().
57 GetImageNamed(IDR_MEDIA_ROUTER_ACTIVE_ICON)),
58 media_router_error_icon_(ui::ResourceBundle::GetSharedInstance().
59 GetImageNamed(IDR_MEDIA_ROUTER_ERROR_ICON)),
22 media_router_idle_icon_(ui::ResourceBundle::GetSharedInstance(). 60 media_router_idle_icon_(ui::ResourceBundle::GetSharedInstance().
23 GetImageNamed(IDR_MEDIA_ROUTER_IDLE_ICON)), 61 GetImageNamed(IDR_MEDIA_ROUTER_IDLE_ICON)),
62 media_router_warning_icon_(ui::ResourceBundle::GetSharedInstance().
63 GetImageNamed(IDR_MEDIA_ROUTER_WARNING_ICON)),
64 state_(MEDIA_ROUTER_ACTION_IDLE),
65 issue_(nullptr),
66 has_local_routes_(false),
24 delegate_(nullptr), 67 delegate_(nullptr),
25 platform_delegate_(MediaRouterActionPlatformDelegate::Create(browser)), 68 platform_delegate_(MediaRouterActionPlatformDelegate::Create(browser)),
26 contextual_menu_(browser) { 69 contextual_menu_(browser) {
27 } 70 }
28 71
29 MediaRouterAction::~MediaRouterAction() { 72 MediaRouterAction::~MediaRouterAction() {
30 } 73 }
31 74
32 const std::string& MediaRouterAction::GetId() const { 75 const std::string& MediaRouterAction::GetId() const {
33 return id_; 76 return id_;
34 } 77 }
35 78
36 void MediaRouterAction::SetDelegate(ToolbarActionViewDelegate* delegate) { 79 void MediaRouterAction::SetDelegate(ToolbarActionViewDelegate* delegate) {
37 delegate_ = delegate; 80 delegate_ = delegate;
81
82 if (delegate_) {
83 media_router::MediaRouter* media_router = GetMediaRouter();
84 if (media_router)
Kevin M 2015/08/03 17:15:37 You can DCHECK for this, but it's a pretty sure th
apacible 2015/08/03 20:47:22 Acknowledged.
85 action_observer_.reset(new MediaRouterActionObserver(media_router, this));
86 } else {
87 action_observer_.reset();
88 }
38 } 89 }
39 90
40 gfx::Image MediaRouterAction::GetIcon(content::WebContents* web_contents, 91 gfx::Image MediaRouterAction::GetIcon(content::WebContents* web_contents,
41 const gfx::Size& size) { 92 const gfx::Size& size) {
42 // TODO(apacible): Return icon based on casting state. 93 switch (state_) {
43 return media_router_idle_icon_; 94 case MEDIA_ROUTER_ACTION_IDLE:
95 return media_router_idle_icon_;
96 case MEDIA_ROUTER_ACTION_ACTIVE:
97 return media_router_active_icon_;
98 case MEDIA_ROUTER_ACTION_ERROR:
99 return media_router_error_icon_;
100 case MEDIA_ROUTER_ACTION_WARNING:
101 return media_router_warning_icon_;
102 default:
103 NOTREACHED();
104 return media_router_idle_icon_;
105 }
44 } 106 }
45 107
46 base::string16 MediaRouterAction::GetActionName() const { 108 base::string16 MediaRouterAction::GetActionName() const {
47 return name_; 109 return name_;
48 } 110 }
49 111
50 base::string16 MediaRouterAction::GetAccessibleName( 112 base::string16 MediaRouterAction::GetAccessibleName(
51 content::WebContents* web_contents) const { 113 content::WebContents* web_contents) const {
52 return GetTooltip(web_contents); 114 return GetTooltip(web_contents);
53 } 115 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 bool MediaRouterAction::ExecuteAction(bool by_user) { 153 bool MediaRouterAction::ExecuteAction(bool by_user) {
92 GetMediaRouterDialogController()->ShowMediaRouterDialog(); 154 GetMediaRouterDialogController()->ShowMediaRouterDialog();
93 if (platform_delegate_) 155 if (platform_delegate_)
94 platform_delegate_->CloseOverflowMenuIfOpen(); 156 platform_delegate_->CloseOverflowMenuIfOpen();
95 return true; 157 return true;
96 } 158 }
97 159
98 void MediaRouterAction::UpdateState() { 160 void MediaRouterAction::UpdateState() {
99 } 161 }
100 162
163 bool MediaRouterAction::DisabledClickOpensMenu() const {
164 return false;
165 }
166
167 void MediaRouterAction::SetCurrentIssue(const media_router::Issue* issue) {
168 if (issue)
169 issue_.reset(new media_router::Issue(*issue));
170 else
171 issue_.reset();
172
173 MaybeUpdateIcon();
174 }
175
176 void MediaRouterAction::SetHasLocalRoutes(bool has_local_routes) {
177 has_local_routes_ = has_local_routes;
178 MaybeUpdateIcon();
179 }
180
101 MediaRouterDialogController* 181 MediaRouterDialogController*
102 MediaRouterAction::GetMediaRouterDialogController() { 182 MediaRouterAction::GetMediaRouterDialogController() {
103 DCHECK(delegate_); 183 DCHECK(delegate_);
104 content::WebContents* web_contents = delegate_->GetCurrentWebContents(); 184 content::WebContents* web_contents = delegate_->GetCurrentWebContents();
105 DCHECK(web_contents); 185 DCHECK(web_contents);
106 return MediaRouterDialogController::GetOrCreateForWebContents(web_contents); 186 return MediaRouterDialogController::GetOrCreateForWebContents(web_contents);
107 } 187 }
108 188
109 bool MediaRouterAction::DisabledClickOpensMenu() const { 189 media_router::MediaRouter* MediaRouterAction::GetMediaRouter() {
110 return false; 190 DCHECK(delegate_);
191 content::WebContents* web_contents = delegate_->GetCurrentWebContents();
192 return web_contents ?
193 media_router::MediaRouterFactory::GetApiForBrowserContext(
194 web_contents->GetBrowserContext()) : nullptr;
111 } 195 }
196
197 void MediaRouterAction::MaybeUpdateIcon() {
198 MediaRouterActionState new_state = GetMediaRouterActionState();
199
200 // Update the current state if it has changed.
201 if (new_state != state_) {
202 state_ = new_state;
203
204 // Update the icon to reflect the new state.
205 if (delegate_)
206 delegate_->UpdateState();
207 }
208 }
209
210 MediaRouterActionState MediaRouterAction::GetMediaRouterActionState() {
211 // Highest priority is to indicate whether there's an issue.
212 if (issue_) {
213 if (issue_.get()->severity() == media_router::Issue::FATAL)
214 return MEDIA_ROUTER_ACTION_ERROR;
215 else if (issue_.get()->severity() == media_router::Issue::WARNING)
216 return MEDIA_ROUTER_ACTION_WARNING;
217 }
218
219 if (has_local_routes_)
220 return MEDIA_ROUTER_ACTION_ACTIVE;
221
222 return MEDIA_ROUTER_ACTION_IDLE;
223 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698