Index: ash/system/audio/tray_volume.cc |
diff --git a/ash/system/audio/tray_volume.cc b/ash/system/audio/tray_volume.cc |
index f395be6d67e46a6f932f76363ffcdfac71e25b9b..0d63a8e50d8ca0508ccc51608040b0058ae08dab 100644 |
--- a/ash/system/audio/tray_volume.cc |
+++ b/ash/system/audio/tray_volume.cc |
@@ -63,8 +63,8 @@ class VolumeButton : public views::ToggleImageButton { |
float level = delegate->GetVolumeLevel(); |
int image_index = delegate->IsAudioMuted() ? |
0 : (level == 1.0 ? |
- kVolumeLevels : std::ceil(level * (kVolumeLevels - 1))); |
- |
+ kVolumeLevels : |
+ std::max(1, int(std::ceil(level * (kVolumeLevels - 1))))); |
if (image_index != image_index_) { |
gfx::Rect region(0, image_index * kVolumeImageHeight, |
kVolumeImageWidth, kVolumeImageHeight); |
@@ -110,6 +110,26 @@ class MuteButton : public ash::internal::TrayBarButtonWithTitle { |
DISALLOW_COPY_AND_ASSIGN(MuteButton); |
}; |
+class VolumeSlider : public views::Slider { |
+ public: |
+ explicit VolumeSlider(views::SliderListener* listener) |
+ : views::Slider(listener, views::Slider::HORIZONTAL) { |
+ set_focus_border_color(kFocusBorderColor); |
+ SetValue(ash::Shell::GetInstance()->tray_delegate()->GetVolumeLevel()); |
+ SetAccessibleName( |
+ ui::ResourceBundle::GetSharedInstance().GetLocalizedString( |
+ IDS_ASH_STATUS_TRAY_VOLUME)); |
+ Update(); |
+ } |
+ virtual ~VolumeSlider() {} |
+ |
+ void Update() { |
+ UpdateState(!ash::Shell::GetInstance()->tray_delegate()->IsAudioMuted()); |
+ } |
+ |
+ DISALLOW_COPY_AND_ASSIGN(VolumeSlider); |
+}; |
+ |
class VolumeView : public views::View, |
public views::ButtonListener, |
public views::SliderListener { |
@@ -124,20 +144,18 @@ class VolumeView : public views::View, |
mute_ = new MuteButton(this); |
AddChildView(mute_); |
- ash::SystemTrayDelegate* delegate = |
- ash::Shell::GetInstance()->tray_delegate(); |
- slider_ = new views::Slider(this, views::Slider::HORIZONTAL); |
- slider_->set_focus_border_color(kFocusBorderColor); |
- slider_->SetValue( |
- delegate->IsAudioMuted() ? 0.0 : delegate->GetVolumeLevel()); |
- slider_->SetAccessibleName( |
- ui::ResourceBundle::GetSharedInstance().GetLocalizedString( |
- IDS_ASH_STATUS_TRAY_VOLUME)); |
+ slider_ = new VolumeSlider(this); |
AddChildView(slider_); |
} |
virtual ~VolumeView() {} |
+ void Update() { |
+ icon_->Update(); |
+ mute_->Update(); |
+ slider_->Update(); |
+ } |
+ |
void SetVolumeLevel(float percent) { |
// The change in volume will be reflected via accessibility system events, |
// so we prevent the UI event from being sent here. |
@@ -146,8 +164,7 @@ class VolumeView : public views::View, |
// It is possible that the volume was (un)muted, but the actual volume level |
// did not change. In that case, setting the value of the slider won't |
// trigger an update. So explicitly trigger an update. |
- icon_->Update(); |
- mute_->Update(); |
+ Update(); |
slider_->set_enable_accessibility_events(true); |
} |
@@ -182,7 +199,7 @@ class VolumeView : public views::View, |
VolumeButton* icon_; |
MuteButton* mute_; |
- views::Slider* slider_; |
+ VolumeSlider* slider_; |
DISALLOW_COPY_AND_ASSIGN(VolumeView); |
}; |
@@ -201,7 +218,7 @@ TrayVolume::~TrayVolume() { |
bool TrayVolume::GetInitialVisibility() { |
ash::SystemTrayDelegate* delegate = |
ash::Shell::GetInstance()->tray_delegate(); |
- return delegate->GetVolumeLevel() == 0.0 || delegate->IsAudioMuted(); |
+ return delegate->IsAudioMuted(); |
} |
views::View* TrayVolume::CreateDefaultView(user::LoginStatus status) { |
@@ -240,5 +257,13 @@ void TrayVolume::OnVolumeChanged(float percent) { |
PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); |
} |
+void TrayVolume::OnMuteToggled() { |
+ if (tray_view()) |
+ tray_view()->SetVisible(GetInitialVisibility()); |
+ |
+ if (volume_view_) |
+ volume_view_->Update(); |
+} |
+ |
} // namespace internal |
} // namespace ash |