OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/chromeos/status/volume_menu_button.h" | 5 #include "chrome/browser/chromeos/status/volume_menu_button.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
| 9 #include "base/command_line.h" |
9 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
10 #include "chrome/browser/chromeos/audio/audio_handler.h" | |
11 #include "chrome/browser/chromeos/status/status_area_bubble.h" | 11 #include "chrome/browser/chromeos/status/status_area_bubble.h" |
| 12 #include "chrome/browser/chromeos/system/runtime_environment.h" |
12 #include "chrome/browser/chromeos/view_ids.h" | 13 #include "chrome/browser/chromeos/view_ids.h" |
| 14 #include "chrome/common/chrome_switches.h" |
13 #include "grit/generated_resources.h" | 15 #include "grit/generated_resources.h" |
14 #include "grit/theme_resources.h" | 16 #include "grit/theme_resources.h" |
15 #include "ui/base/l10n/l10n_util.h" | 17 #include "ui/base/l10n/l10n_util.h" |
16 #include "ui/base/resource/resource_bundle.h" | 18 #include "ui/base/resource/resource_bundle.h" |
17 #include "ui/gfx/canvas.h" | 19 #include "ui/gfx/canvas.h" |
18 #include "ui/gfx/canvas_skia.h" | 20 #include "ui/gfx/canvas_skia.h" |
19 #include "ui/gfx/image/image.h" | 21 #include "ui/gfx/image/image.h" |
20 #include "ui/views/controls/menu/menu_item_view.h" | 22 #include "ui/views/controls/menu/menu_item_view.h" |
21 #include "ui/views/controls/menu/menu_runner.h" | 23 #include "ui/views/controls/menu/menu_runner.h" |
22 #include "ui/views/controls/menu/submenu_view.h" | 24 #include "ui/views/controls/menu/submenu_view.h" |
23 | 25 |
| 26 namespace chromeos { |
| 27 |
24 namespace { | 28 namespace { |
25 | 29 |
26 static const int kMenuItemId = 100; // arbitrary menu id. | 30 const int kMenuItemId = 100; // arbitrary menu id. |
27 // TODO(achuith): Minimum width of MenuItemView is 27, which is too wide. | 31 // TODO(achuith): Minimum width of MenuItemView is 27, which is too wide. |
28 static const int kVolumeMenuWidth = 27; | 32 const int kVolumeMenuWidth = 27; |
29 static const int kVolumeIconWidth = 20; | 33 const int kVolumeIconWidth = 20; |
| 34 |
| 35 bool ShouldShowStatusAreaVolume() { |
| 36 return CommandLine::ForCurrentProcess()-> |
| 37 HasSwitch(switches::kShowVolumeStatus); |
| 38 } |
30 | 39 |
31 //////////////////////////////////////////////////////////////////////////////// | 40 //////////////////////////////////////////////////////////////////////////////// |
32 // AudioHandler helpers | 41 // AudioHandler helpers |
33 | 42 |
34 // Used when not running on a ChromeOS device. | 43 // Used when not running on a ChromeOS device. |
35 static int g_volume_percent = 0; | 44 static int g_volume_percent = 0; |
36 | 45 |
37 chromeos::AudioHandler* GetAudioHandler() { | |
38 chromeos::AudioHandler* audio_handler = chromeos::AudioHandler::GetInstance(); | |
39 return audio_handler && audio_handler->IsInitialized() ? | |
40 audio_handler : NULL; | |
41 } | |
42 | |
43 int GetVolumePercent() { | 46 int GetVolumePercent() { |
44 chromeos::AudioHandler* audio_handler = GetAudioHandler(); | 47 AudioHandler* audio_handler = AudioHandler::GetInstanceIfInitialized(); |
45 return audio_handler ? audio_handler->GetVolumePercent() : g_volume_percent; | 48 if (audio_handler) |
| 49 return audio_handler->IsMuted() ? 0 : audio_handler->GetVolumePercent(); |
| 50 return g_volume_percent; |
46 } | 51 } |
47 | 52 |
48 void SetVolumePercent(int percent) { | 53 void SetVolumePercent(int percent) { |
49 chromeos::AudioHandler* audio_handler = GetAudioHandler(); | 54 AudioHandler* audio_handler = AudioHandler::GetInstanceIfInitialized(); |
50 if (audio_handler) | 55 if (audio_handler) |
51 audio_handler->SetVolumePercent(percent); | 56 audio_handler->SetVolumePercent(percent); |
52 g_volume_percent = percent; | 57 g_volume_percent = percent; |
53 } | 58 } |
54 | 59 |
| 60 void AddVolumeObserver(AudioHandler::VolumeObserver* volume_observer) { |
| 61 if (system::runtime_environment::IsRunningOnChromeOS()) |
| 62 AudioHandler::GetInstance()->AddVolumeObserver(volume_observer); |
| 63 } |
| 64 |
| 65 void RemoveVolumeObserver(AudioHandler::VolumeObserver* volume_observer) { |
| 66 if (system::runtime_environment::IsRunningOnChromeOS()) |
| 67 AudioHandler::GetInstance()->RemoveVolumeObserver(volume_observer); |
| 68 } |
| 69 |
55 //////////////////////////////////////////////////////////////////////////////// | 70 //////////////////////////////////////////////////////////////////////////////// |
56 // SkBitmap helpers | 71 // SkBitmap helpers |
57 | 72 |
58 const SkBitmap* GetImageNamed(int image_index) { | 73 const SkBitmap* GetImageNamed(int image_index) { |
59 return ResourceBundle::GetSharedInstance(). | 74 return ResourceBundle::GetSharedInstance(). |
60 GetImageNamed(image_index).ToSkBitmap(); | 75 GetImageNamed(image_index).ToSkBitmap(); |
61 } | 76 } |
62 | 77 |
63 const SkBitmap* GetIcon() { | 78 const SkBitmap* GetIcon() { |
64 const int volume_percent = GetVolumePercent(); | 79 const int volume_percent = GetVolumePercent(); |
65 int image_index = IDR_STATUSBAR_VOLUME_ICON_MUTE; | 80 int image_index = IDR_STATUSBAR_VOLUME_ICON_MUTE; |
66 | 81 |
67 if (volume_percent > 67) | 82 if (volume_percent > 67) |
68 image_index = IDR_STATUSBAR_VOLUME_ICON3; | 83 image_index = IDR_STATUSBAR_VOLUME_ICON3; |
69 else if (volume_percent > 33) | 84 else if (volume_percent > 33) |
70 image_index = IDR_STATUSBAR_VOLUME_ICON2; | 85 image_index = IDR_STATUSBAR_VOLUME_ICON2; |
71 else if (volume_percent > 0) | 86 else if (volume_percent > 0) |
72 image_index = IDR_STATUSBAR_VOLUME_ICON1; | 87 image_index = IDR_STATUSBAR_VOLUME_ICON1; |
73 | 88 |
74 return GetImageNamed(image_index); | 89 return GetImageNamed(image_index); |
75 } | 90 } |
76 | 91 |
77 //////////////////////////////////////////////////////////////////////////////// | 92 //////////////////////////////////////////////////////////////////////////////// |
78 // VolumeControlView | 93 // VolumeControlView |
79 | 94 |
80 class VolumeControlView : public views::View { | 95 class VolumeControlView : public views::View, |
| 96 public AudioHandler::VolumeObserver { |
81 public: | 97 public: |
82 explicit VolumeControlView(chromeos::VolumeMenuButton* volume_menu_button); | 98 explicit VolumeControlView(VolumeMenuButton* volume_menu_button); |
| 99 virtual ~VolumeControlView(); |
83 | 100 |
84 private: | 101 private: |
85 // views::View overrides: | 102 // views::View overrides: |
86 virtual gfx::Size GetPreferredSize() OVERRIDE; | 103 virtual gfx::Size GetPreferredSize() OVERRIDE; |
87 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; | 104 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; |
88 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; | 105 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; |
89 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; | 106 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; |
90 | 107 |
91 chromeos::VolumeMenuButton* volume_menu_button_; | 108 // AudioHandler::VolumeObserver overrides: |
| 109 virtual void OnVolumeChanged() OVERRIDE; |
| 110 |
| 111 VolumeMenuButton* volume_menu_button_; // not owned. |
92 | 112 |
93 const SkBitmap* slider_empty_; | 113 const SkBitmap* slider_empty_; |
94 const SkBitmap* slider_full_; | 114 const SkBitmap* slider_full_; |
95 const SkBitmap* thumb_; | 115 const SkBitmap* thumb_; |
96 | 116 |
97 int slider_w_; | 117 int slider_w_; |
98 int slider_h_; | 118 int slider_h_; |
99 int thumb_h_; | 119 int thumb_h_; |
100 | 120 |
101 DISALLOW_COPY_AND_ASSIGN(VolumeControlView); | 121 DISALLOW_COPY_AND_ASSIGN(VolumeControlView); |
102 }; | 122 }; |
103 | 123 |
104 VolumeControlView::VolumeControlView( | 124 VolumeControlView::VolumeControlView( |
105 chromeos::VolumeMenuButton* volume_menu_button) | 125 VolumeMenuButton* volume_menu_button) |
106 : volume_menu_button_(volume_menu_button), | 126 : volume_menu_button_(volume_menu_button), |
107 slider_empty_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_EMPTY)), | 127 slider_empty_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_EMPTY)), |
108 slider_full_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_FULL)), | 128 slider_full_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_FULL)), |
109 thumb_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_THUMB)), | 129 thumb_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_THUMB)), |
110 slider_w_(slider_empty_->width()), | 130 slider_w_(slider_empty_->width()), |
111 slider_h_(slider_empty_->height()), | 131 slider_h_(slider_empty_->height()), |
112 thumb_h_(thumb_->height()) { | 132 thumb_h_(thumb_->height()) { |
113 DCHECK_EQ(slider_w_, slider_full_->width()); | 133 DCHECK_EQ(slider_w_, slider_full_->width()); |
| 134 AddVolumeObserver(this); |
| 135 } |
| 136 |
| 137 VolumeControlView::~VolumeControlView() { |
| 138 RemoveVolumeObserver(this); |
114 } | 139 } |
115 | 140 |
116 gfx::Size VolumeControlView::GetPreferredSize() { | 141 gfx::Size VolumeControlView::GetPreferredSize() { |
117 return gfx::Size(kVolumeMenuWidth, slider_h_ + thumb_h_); | 142 return gfx::Size(kVolumeMenuWidth, slider_h_ + thumb_h_); |
118 } | 143 } |
119 | 144 |
120 void VolumeControlView::OnPaint(gfx::Canvas* canvas) { | 145 void VolumeControlView::OnPaint(gfx::Canvas* canvas) { |
121 const int slider_x = (width() - slider_w_) / 2; | 146 const int slider_x = (width() - slider_w_) / 2; |
122 const int thumb_x = (width() - thumb_->width()) / 2; | 147 const int thumb_x = (width() - thumb_->width()) / 2; |
123 const int slider_empty_y = thumb_->height() / 2.0; | 148 const int slider_empty_y = thumb_->height() / 2.0; |
(...skipping 30 matching lines...) Expand all Loading... |
154 const int new_volume = 100 - (std::max(std::min((event.y() - slider_empty_y), | 179 const int new_volume = 100 - (std::max(std::min((event.y() - slider_empty_y), |
155 slider_h_), 0) * 100 / slider_h_); | 180 slider_h_), 0) * 100 / slider_h_); |
156 if (new_volume != GetVolumePercent()) { | 181 if (new_volume != GetVolumePercent()) { |
157 SetVolumePercent(new_volume); | 182 SetVolumePercent(new_volume); |
158 SchedulePaint(); | 183 SchedulePaint(); |
159 volume_menu_button_->UpdateIcon(); | 184 volume_menu_button_->UpdateIcon(); |
160 } | 185 } |
161 return true; | 186 return true; |
162 } | 187 } |
163 | 188 |
| 189 void VolumeControlView::OnVolumeChanged() { |
| 190 SchedulePaint(); |
| 191 } |
| 192 |
164 } // namespace | 193 } // namespace |
165 | 194 |
166 namespace chromeos { | |
167 | |
168 //////////////////////////////////////////////////////////////////////////////// | 195 //////////////////////////////////////////////////////////////////////////////// |
169 // VolumeMenuButton | 196 // VolumeMenuButton |
170 | 197 |
171 VolumeMenuButton::VolumeMenuButton(StatusAreaButton::Delegate* delegate) | 198 VolumeMenuButton::VolumeMenuButton(StatusAreaButton::Delegate* delegate) |
172 : StatusAreaButton(delegate, this) { | 199 : StatusAreaButton(delegate, this) { |
173 set_id(VIEW_ID_STATUS_BUTTON_VOLUME); | 200 set_id(VIEW_ID_STATUS_BUTTON_VOLUME); |
174 UpdateIcon(); | 201 UpdateIcon(); |
175 // TODO(achuith): Query SystemKeyEventListener to determine when we | 202 SetVisible(ShouldShowStatusAreaVolume()); |
176 // can show statusbar volume controls. | 203 AddVolumeObserver(this); |
177 SetVisible(false); | |
178 } | 204 } |
179 | 205 |
180 VolumeMenuButton::~VolumeMenuButton() { | 206 VolumeMenuButton::~VolumeMenuButton() { |
| 207 RemoveVolumeObserver(this); |
181 } | 208 } |
182 | 209 |
183 int VolumeMenuButton::icon_width() { | 210 int VolumeMenuButton::icon_width() { |
184 return kVolumeIconWidth; | 211 return kVolumeIconWidth; |
185 } | 212 } |
186 | 213 |
187 void VolumeMenuButton::UpdateIcon() { | 214 void VolumeMenuButton::UpdateIcon() { |
188 const int volume_percent = GetVolumePercent(); | 215 const int volume_percent = GetVolumePercent(); |
189 string16 tooltip_text = (volume_percent == 0) | 216 string16 tooltip_text = (volume_percent == 0) |
190 ? l10n_util::GetStringUTF16(IDS_STATUSBAR_VOLUME_MUTE) | 217 ? l10n_util::GetStringUTF16(IDS_STATUSBAR_VOLUME_MUTE) |
191 : l10n_util::GetStringFUTF16(IDS_STATUSBAR_VOLUME_PERCENTAGE, | 218 : l10n_util::GetStringFUTF16(IDS_STATUSBAR_VOLUME_PERCENTAGE, |
192 base::IntToString16(volume_percent)); | 219 base::IntToString16(volume_percent)); |
193 SetTooltipText(tooltip_text); | 220 SetTooltipText(tooltip_text); |
194 SetAccessibleName(tooltip_text); | 221 SetAccessibleName(tooltip_text); |
195 | 222 |
196 SetIcon(*GetIcon()); | 223 SetIcon(*GetIcon()); |
197 SchedulePaint(); | 224 SchedulePaint(); |
198 } | 225 } |
199 | 226 |
200 void VolumeMenuButton::OnLocaleChanged() { | 227 void VolumeMenuButton::OnLocaleChanged() { |
201 UpdateIcon(); | 228 UpdateIcon(); |
202 } | 229 } |
203 | 230 |
| 231 void VolumeMenuButton::OnVolumeChanged() { |
| 232 UpdateIcon(); |
| 233 } |
| 234 |
204 void VolumeMenuButton::RunMenu(views::View* source, const gfx::Point& pt) { | 235 void VolumeMenuButton::RunMenu(views::View* source, const gfx::Point& pt) { |
205 // TODO(achuith): Minimum width of MenuItemView is 27 pix which is too wide | 236 // TODO(achuith): Minimum width of MenuItemView is 27 pix which is too wide |
206 // for our purposes here. | 237 // for our purposes here. |
207 views::MenuItemView* menu = new views::MenuItemView(this); | 238 views::MenuItemView* menu = new views::MenuItemView(this); |
208 // MenuRunner takes ownership of |menu|. | 239 // MenuRunner takes ownership of |menu|. |
209 views::MenuRunner* menu_runner = new views::MenuRunner(menu); | 240 views::MenuRunner* menu_runner = new views::MenuRunner(menu); |
210 views::MenuItemView* submenu = menu->AppendMenuItem( | 241 views::MenuItemView* submenu = menu->AppendMenuItem( |
211 kMenuItemId, | 242 kMenuItemId, |
212 string16(), | 243 string16(), |
213 views::MenuItemView::NORMAL); | 244 views::MenuItemView::NORMAL); |
(...skipping 13 matching lines...) Expand all Loading... |
227 this, | 258 this, |
228 bounds, | 259 bounds, |
229 views::MenuItemView::TOPRIGHT, | 260 views::MenuItemView::TOPRIGHT, |
230 views::MenuRunner::HAS_MNEMONICS); | 261 views::MenuRunner::HAS_MNEMONICS); |
231 | 262 |
232 if (result != views::MenuRunner::MENU_DELETED) | 263 if (result != views::MenuRunner::MENU_DELETED) |
233 delete menu_runner; | 264 delete menu_runner; |
234 } | 265 } |
235 | 266 |
236 } // namespace chromeos | 267 } // namespace chromeos |
OLD | NEW |