tray_audio.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ash/system/audio/tray_audio.h" 6 7#include <cmath> 8 9#include "ash/ash_constants.h" 10#include "ash/metrics/user_metrics_recorder.h" 11#include "ash/shell.h" 12#include "ash/system/audio/tray_audio_delegate.h" 13#include "ash/system/audio/volume_view.h" 14#include "ash/system/tray/actionable_view.h" 15#include "ash/system/tray/fixed_sized_scroll_view.h" 16#include "ash/system/tray/hover_highlight_view.h" 17#include "ash/system/tray/system_tray.h" 18#include "ash/system/tray/system_tray_delegate.h" 19#include "ash/system/tray/system_tray_notifier.h" 20#include "ash/system/tray/tray_constants.h" 21#include "ash/volume_control_delegate.h" 22#include "base/strings/utf_string_conversions.h" 23#include "grit/ash_resources.h" 24#include "grit/ash_strings.h" 25#include "third_party/skia/include/core/SkCanvas.h" 26#include "third_party/skia/include/core/SkPaint.h" 27#include "third_party/skia/include/core/SkRect.h" 28#include "third_party/skia/include/effects/SkGradientShader.h" 29#include "ui/base/l10n/l10n_util.h" 30#include "ui/base/resource/resource_bundle.h" 31#include "ui/gfx/canvas.h" 32#include "ui/gfx/font_list.h" 33#include "ui/gfx/image/image.h" 34#include "ui/gfx/image/image_skia_operations.h" 35#include "ui/views/controls/button/image_button.h" 36#include "ui/views/controls/image_view.h" 37#include "ui/views/controls/label.h" 38#include "ui/views/controls/slider.h" 39#include "ui/views/layout/box_layout.h" 40#include "ui/views/view.h" 41 42namespace ash { 43namespace internal { 44 45TrayAudio::TrayAudio(SystemTray* system_tray, 46 scoped_ptr<system::TrayAudioDelegate> audio_delegate) 47 : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_VOLUME_MUTE), 48 audio_delegate_(audio_delegate.Pass()), 49 volume_view_(NULL), 50 pop_up_volume_view_(false) { 51 Shell::GetInstance()->system_tray_notifier()->AddAudioObserver(this); 52} 53 54TrayAudio::~TrayAudio() { 55 Shell::GetInstance()->system_tray_notifier()->RemoveAudioObserver(this); 56} 57 58// static 59bool TrayAudio::ShowAudioDeviceMenu() { 60#if defined(OS_CHROMEOS) 61 return true; 62#else 63 return false; 64#endif 65} 66 67bool TrayAudio::GetInitialVisibility() { 68 return audio_delegate_->IsOutputAudioMuted(); 69} 70 71views::View* TrayAudio::CreateDefaultView(user::LoginStatus status) { 72 volume_view_ = new tray::VolumeView(this, audio_delegate_.get(), true); 73 return volume_view_; 74} 75 76views::View* TrayAudio::CreateDetailedView(user::LoginStatus status) { 77 volume_view_ = new tray::VolumeView(this, audio_delegate_.get(), false); 78 return volume_view_; 79} 80 81void TrayAudio::DestroyDefaultView() { 82 volume_view_ = NULL; 83} 84 85void TrayAudio::DestroyDetailedView() { 86 if (volume_view_) { 87 volume_view_ = NULL; 88 pop_up_volume_view_ = false; 89 } 90} 91 92bool TrayAudio::ShouldHideArrow() const { 93 return true; 94} 95 96bool TrayAudio::ShouldShowShelf() const { 97 return TrayAudio::ShowAudioDeviceMenu() && !pop_up_volume_view_; 98} 99 100void TrayAudio::OnOutputVolumeChanged() { 101 float percent = 102 static_cast<float>(audio_delegate_->GetOutputVolumeLevel()) / 100.0f; 103 if (tray_view()) 104 tray_view()->SetVisible(GetInitialVisibility()); 105 106 if (volume_view_) { 107 volume_view_->SetVolumeLevel(percent); 108 SetDetailedViewCloseDelay(kTrayPopupAutoCloseDelayInSeconds); 109 return; 110 } 111 pop_up_volume_view_ = true; 112 PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); 113} 114 115void TrayAudio::OnOutputMuteChanged() { 116 if (tray_view()) 117 tray_view()->SetVisible(GetInitialVisibility()); 118 119 if (volume_view_) { 120 volume_view_->Update(); 121 SetDetailedViewCloseDelay(kTrayPopupAutoCloseDelayInSeconds); 122 } else { 123 pop_up_volume_view_ = true; 124 PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); 125 } 126} 127 128void TrayAudio::OnAudioNodesChanged() { 129 Update(); 130} 131 132void TrayAudio::OnActiveOutputNodeChanged() { 133 Update(); 134} 135 136void TrayAudio::OnActiveInputNodeChanged() { 137 Update(); 138} 139 140void TrayAudio::Update() { 141 if (tray_view()) 142 tray_view()->SetVisible(GetInitialVisibility()); 143 if (volume_view_) { 144 volume_view_->SetVolumeLevel( 145 static_cast<float>(audio_delegate_->GetOutputVolumeLevel()) / 100.0f); 146 volume_view_->Update(); 147 } 148} 149 150} // namespace internal 151} // namespace ash 152