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

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: 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 ActionIssuesObserver::ActionIssuesObserver(media_router::MediaRouter* router,
26 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.
27 : media_router::IssuesObserver(router),
28 action_(action) {
29 }
30
31 ActionIssuesObserver::~ActionIssuesObserver() {}
32
33 void ActionIssuesObserver::OnIssueUpdated(const media_router::Issue* issue) {
34 action_->UpdateCurrentIssue(issue);
35 }
36
37 ActionMediaRoutesObserver::ActionMediaRoutesObserver(
38 media_router::MediaRouter* router,
39 MediaRouterAction* action)
40 : media_router::MediaRoutesObserver(router),
41 action_(action) {
42 }
43
44 ActionMediaRoutesObserver::~ActionMediaRoutesObserver() {}
45
46 void ActionMediaRoutesObserver::OnRoutesUpdated(
47 const std::vector<media_router::MediaRoute>& routes) {
48 action_->UpdateCurrentRoutes(routes);
49 }
50
19 MediaRouterAction::MediaRouterAction(Browser* browser) 51 MediaRouterAction::MediaRouterAction(Browser* browser)
20 : id_("media_router_action"), 52 : id_("media_router_action"),
21 name_(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_TITLE)), 53 name_(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_TITLE)),
54 media_router_active_icon_(ui::ResourceBundle::GetSharedInstance().
55 GetImageNamed(IDR_MEDIA_ROUTER_ACTIVE_ICON)),
56 media_router_error_icon_(ui::ResourceBundle::GetSharedInstance().
57 GetImageNamed(IDR_MEDIA_ROUTER_ERROR_ICON)),
22 media_router_idle_icon_(ui::ResourceBundle::GetSharedInstance(). 58 media_router_idle_icon_(ui::ResourceBundle::GetSharedInstance().
23 GetImageNamed(IDR_MEDIA_ROUTER_IDLE_ICON)), 59 GetImageNamed(IDR_MEDIA_ROUTER_IDLE_ICON)),
60 media_router_warning_icon_(ui::ResourceBundle::GetSharedInstance().
61 GetImageNamed(IDR_MEDIA_ROUTER_WARNING_ICON)),
62 state_(MEDIA_ROUTER_ACTION_IDLE),
63 issue_(nullptr),
64 local_active_route_exists_(false),
24 delegate_(nullptr), 65 delegate_(nullptr),
25 platform_delegate_(MediaRouterActionPlatformDelegate::Create(browser)), 66 platform_delegate_(MediaRouterActionPlatformDelegate::Create(browser)),
26 contextual_menu_(browser) { 67 contextual_menu_(browser) {
27 } 68 }
28 69
29 MediaRouterAction::~MediaRouterAction() { 70 MediaRouterAction::~MediaRouterAction() {
71 issues_observer_.reset();
72 routes_observer_.reset();
Kevin M 2015/07/31 18:18:39 Unnecessary
apacible 2015/08/01 02:05:29 Done.
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) {
85 issues_observer_.reset(new ActionIssuesObserver(media_router, this));
86 routes_observer_.reset(new ActionMediaRoutesObserver(media_router,
87 this));
88 }
89 } else {
90 issues_observer_.reset();
91 routes_observer_.reset();
92 }
38 } 93 }
39 94
40 gfx::Image MediaRouterAction::GetIcon(content::WebContents* web_contents, 95 gfx::Image MediaRouterAction::GetIcon(content::WebContents* web_contents,
41 const gfx::Size& size) { 96 const gfx::Size& size) {
42 // TODO(apacible): Return icon based on casting state. 97 switch (state_) {
43 return media_router_idle_icon_; 98 case MEDIA_ROUTER_ACTION_IDLE:
99 return media_router_idle_icon_;
100 case MEDIA_ROUTER_ACTION_ACTIVE:
101 return media_router_active_icon_;
102 case MEDIA_ROUTER_ACTION_ERROR:
103 return media_router_error_icon_;
104 case MEDIA_ROUTER_ACTION_WARNING:
105 return media_router_warning_icon_;
106 default:
107 NOTREACHED();
108 return media_router_idle_icon_;
109 }
44 } 110 }
45 111
46 base::string16 MediaRouterAction::GetActionName() const { 112 base::string16 MediaRouterAction::GetActionName() const {
47 return name_; 113 return name_;
48 } 114 }
49 115
50 base::string16 MediaRouterAction::GetAccessibleName( 116 base::string16 MediaRouterAction::GetAccessibleName(
51 content::WebContents* web_contents) const { 117 content::WebContents* web_contents) const {
52 return GetTooltip(web_contents); 118 return GetTooltip(web_contents);
53 } 119 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 bool MediaRouterAction::ExecuteAction(bool by_user) { 157 bool MediaRouterAction::ExecuteAction(bool by_user) {
92 GetMediaRouterDialogController()->ShowMediaRouterDialog(); 158 GetMediaRouterDialogController()->ShowMediaRouterDialog();
93 if (platform_delegate_) 159 if (platform_delegate_)
94 platform_delegate_->CloseOverflowMenuIfOpen(); 160 platform_delegate_->CloseOverflowMenuIfOpen();
95 return true; 161 return true;
96 } 162 }
97 163
98 void MediaRouterAction::UpdateState() { 164 void MediaRouterAction::UpdateState() {
99 } 165 }
100 166
167 bool MediaRouterAction::DisabledClickOpensMenu() const {
168 return false;
169 }
170
171 void MediaRouterAction::UpdateCurrentIssue(const media_router::Issue* issue) {
172 if (issue)
173 issue_.reset(new media_router::Issue(*issue));
174 else
175 issue_.reset();
176
177 MaybeUpdateIcon();
178 }
179
180 void MediaRouterAction::UpdateCurrentRoutes(
181 const std::vector<media_router::MediaRoute>& routes) {
182 // Check if any of the routes are local.
183 auto it = std::find_if(routes.begin(), routes.end(),
184 [](const media_router::MediaRoute& route) {
185 return route.is_local();
186 });
187
188 local_active_route_exists_ = it != routes.end();
189
190 MaybeUpdateIcon();
191 }
192
101 MediaRouterDialogController* 193 MediaRouterDialogController*
102 MediaRouterAction::GetMediaRouterDialogController() { 194 MediaRouterAction::GetMediaRouterDialogController() {
103 DCHECK(delegate_); 195 DCHECK(delegate_);
104 content::WebContents* web_contents = delegate_->GetCurrentWebContents(); 196 content::WebContents* web_contents = delegate_->GetCurrentWebContents();
105 DCHECK(web_contents); 197 DCHECK(web_contents);
106 return MediaRouterDialogController::GetOrCreateForWebContents(web_contents); 198 return MediaRouterDialogController::GetOrCreateForWebContents(web_contents);
107 } 199 }
108 200
109 bool MediaRouterAction::DisabledClickOpensMenu() const { 201 media_router::MediaRouter* MediaRouterAction::GetMediaRouter() {
110 return false; 202 DCHECK(delegate_);
203 content::WebContents* web_contents = delegate_->GetCurrentWebContents();
204 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.
205 media_router::MediaRouterFactory::GetApiForBrowserContext(
206 web_contents->GetBrowserContext())) : nullptr;
111 } 207 }
208
209 void MediaRouterAction::MaybeUpdateIcon() {
210 MediaRouterActionState new_state = GetUpdatedMediaRouterActionState();
211
212 // Update the current state if it has changed.
213 if (new_state != state_) {
214 state_ = new_state;
215
216 // Update the icon to reflect the new state.
217 if (delegate_)
218 delegate_->UpdateState();
219 }
220 }
221
222 MediaRouterActionState MediaRouterAction::GetUpdatedMediaRouterActionState() {
223 // Highest priority is to indicate whether there's an issue.
224 if (issue_) {
225 if (issue_.get()->severity() == media_router::Issue::FATAL)
226 return MEDIA_ROUTER_ACTION_ERROR;
227 else if (issue_.get()->severity() == media_router::Issue::WARNING)
228 return MEDIA_ROUTER_ACTION_WARNING;
229 }
230
231 if (local_active_route_exists_)
232 return MEDIA_ROUTER_ACTION_ACTIVE;
233
234 return MEDIA_ROUTER_ACTION_IDLE;
235 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698