| Index: chrome/browser/chromeos/status/volume_menu_button.cc
|
| ===================================================================
|
| --- chrome/browser/chromeos/status/volume_menu_button.cc (revision 119932)
|
| +++ chrome/browser/chromeos/status/volume_menu_button.cc (working copy)
|
| @@ -6,10 +6,12 @@
|
|
|
| #include <algorithm>
|
|
|
| +#include "base/command_line.h"
|
| #include "base/string_number_conversions.h"
|
| -#include "chrome/browser/chromeos/audio/audio_handler.h"
|
| #include "chrome/browser/chromeos/status/status_area_bubble.h"
|
| +#include "chrome/browser/chromeos/system/runtime_environment.h"
|
| #include "chrome/browser/chromeos/view_ids.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| #include "grit/generated_resources.h"
|
| #include "grit/theme_resources.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
| @@ -21,37 +23,50 @@
|
| #include "ui/views/controls/menu/menu_runner.h"
|
| #include "ui/views/controls/menu/submenu_view.h"
|
|
|
| +namespace chromeos {
|
| +
|
| namespace {
|
|
|
| -static const int kMenuItemId = 100; // arbitrary menu id.
|
| +const int kMenuItemId = 100; // arbitrary menu id.
|
| // TODO(achuith): Minimum width of MenuItemView is 27, which is too wide.
|
| -static const int kVolumeMenuWidth = 27;
|
| -static const int kVolumeIconWidth = 20;
|
| +const int kVolumeMenuWidth = 27;
|
| +const int kVolumeIconWidth = 20;
|
|
|
| +bool ShouldShowStatusAreaVolume() {
|
| + return CommandLine::ForCurrentProcess()->
|
| + HasSwitch(switches::kShowVolumeStatus);
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // AudioHandler helpers
|
|
|
| // Used when not running on a ChromeOS device.
|
| static int g_volume_percent = 0;
|
|
|
| -chromeos::AudioHandler* GetAudioHandler() {
|
| - chromeos::AudioHandler* audio_handler = chromeos::AudioHandler::GetInstance();
|
| - return audio_handler && audio_handler->IsInitialized() ?
|
| - audio_handler : NULL;
|
| -}
|
| -
|
| int GetVolumePercent() {
|
| - chromeos::AudioHandler* audio_handler = GetAudioHandler();
|
| - return audio_handler ? audio_handler->GetVolumePercent() : g_volume_percent;
|
| + AudioHandler* audio_handler = AudioHandler::GetInstanceIfInitialized();
|
| + if (audio_handler)
|
| + return audio_handler->IsMuted() ? 0 : audio_handler->GetVolumePercent();
|
| + return g_volume_percent;
|
| }
|
|
|
| void SetVolumePercent(int percent) {
|
| - chromeos::AudioHandler* audio_handler = GetAudioHandler();
|
| + AudioHandler* audio_handler = AudioHandler::GetInstanceIfInitialized();
|
| if (audio_handler)
|
| audio_handler->SetVolumePercent(percent);
|
| g_volume_percent = percent;
|
| }
|
|
|
| +void AddVolumeObserver(AudioHandler::VolumeObserver* volume_observer) {
|
| + if (system::runtime_environment::IsRunningOnChromeOS())
|
| + AudioHandler::GetInstance()->AddVolumeObserver(volume_observer);
|
| +}
|
| +
|
| +void RemoveVolumeObserver(AudioHandler::VolumeObserver* volume_observer) {
|
| + if (system::runtime_environment::IsRunningOnChromeOS())
|
| + AudioHandler::GetInstance()->RemoveVolumeObserver(volume_observer);
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // SkBitmap helpers
|
|
|
| @@ -77,9 +92,11 @@
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // VolumeControlView
|
|
|
| -class VolumeControlView : public views::View {
|
| +class VolumeControlView : public views::View,
|
| + public AudioHandler::VolumeObserver {
|
| public:
|
| - explicit VolumeControlView(chromeos::VolumeMenuButton* volume_menu_button);
|
| + explicit VolumeControlView(VolumeMenuButton* volume_menu_button);
|
| + virtual ~VolumeControlView();
|
|
|
| private:
|
| // views::View overrides:
|
| @@ -88,8 +105,11 @@
|
| virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE;
|
| virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE;
|
|
|
| - chromeos::VolumeMenuButton* volume_menu_button_;
|
| + // AudioHandler::VolumeObserver overrides:
|
| + virtual void OnVolumeChanged() OVERRIDE;
|
|
|
| + VolumeMenuButton* volume_menu_button_; // not owned.
|
| +
|
| const SkBitmap* slider_empty_;
|
| const SkBitmap* slider_full_;
|
| const SkBitmap* thumb_;
|
| @@ -102,7 +122,7 @@
|
| };
|
|
|
| VolumeControlView::VolumeControlView(
|
| - chromeos::VolumeMenuButton* volume_menu_button)
|
| + VolumeMenuButton* volume_menu_button)
|
| : volume_menu_button_(volume_menu_button),
|
| slider_empty_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_EMPTY)),
|
| slider_full_(GetImageNamed(IDR_STATUSBAR_VOLUME_SLIDER_FULL)),
|
| @@ -111,8 +131,13 @@
|
| slider_h_(slider_empty_->height()),
|
| thumb_h_(thumb_->height()) {
|
| DCHECK_EQ(slider_w_, slider_full_->width());
|
| + AddVolumeObserver(this);
|
| }
|
|
|
| +VolumeControlView::~VolumeControlView() {
|
| + RemoveVolumeObserver(this);
|
| +}
|
| +
|
| gfx::Size VolumeControlView::GetPreferredSize() {
|
| return gfx::Size(kVolumeMenuWidth, slider_h_ + thumb_h_);
|
| }
|
| @@ -161,10 +186,12 @@
|
| return true;
|
| }
|
|
|
| +void VolumeControlView::OnVolumeChanged() {
|
| + SchedulePaint();
|
| +}
|
| +
|
| } // namespace
|
|
|
| -namespace chromeos {
|
| -
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // VolumeMenuButton
|
|
|
| @@ -172,12 +199,12 @@
|
| : StatusAreaButton(delegate, this) {
|
| set_id(VIEW_ID_STATUS_BUTTON_VOLUME);
|
| UpdateIcon();
|
| - // TODO(achuith): Query SystemKeyEventListener to determine when we
|
| - // can show statusbar volume controls.
|
| - SetVisible(false);
|
| + SetVisible(ShouldShowStatusAreaVolume());
|
| + AddVolumeObserver(this);
|
| }
|
|
|
| VolumeMenuButton::~VolumeMenuButton() {
|
| + RemoveVolumeObserver(this);
|
| }
|
|
|
| int VolumeMenuButton::icon_width() {
|
| @@ -201,6 +228,10 @@
|
| UpdateIcon();
|
| }
|
|
|
| +void VolumeMenuButton::OnVolumeChanged() {
|
| + UpdateIcon();
|
| +}
|
| +
|
| void VolumeMenuButton::RunMenu(views::View* source, const gfx::Point& pt) {
|
| // TODO(achuith): Minimum width of MenuItemView is 27 pix which is too wide
|
| // for our purposes here.
|
|
|