tray_audio.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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 { 43 44TrayAudio::TrayAudio(SystemTray* system_tray, 45 scoped_ptr<system::TrayAudioDelegate> audio_delegate) 46 : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_VOLUME_MUTE), 47 audio_delegate_(audio_delegate.Pass()), 48 volume_view_(NULL), 49 pop_up_volume_view_(false) { 50 Shell::GetInstance()->system_tray_notifier()->AddAudioObserver(this); 51} 52 53TrayAudio::~TrayAudio() { 54 Shell::GetInstance()->system_tray_notifier()->RemoveAudioObserver(this); 55} 56 57// static 58bool TrayAudio::ShowAudioDeviceMenu() { 59#if defined(OS_CHROMEOS) 60 return true; 61#else 62 return false; 63#endif 64} 65 66bool TrayAudio::GetInitialVisibility() { 67 return audio_delegate_->IsOutputAudioMuted(); 68} 69 70views::View* TrayAudio::CreateDefaultView(user::LoginStatus status) { 71 volume_view_ = new tray::VolumeView(this, audio_delegate_.get(), true); 72 return volume_view_; 73} 74 75views::View* TrayAudio::CreateDetailedView(user::LoginStatus status) { 76 volume_view_ = new tray::VolumeView(this, audio_delegate_.get(), false); 77 return volume_view_; 78} 79 80void TrayAudio::DestroyDefaultView() { 81 volume_view_ = NULL; 82} 83 84void TrayAudio::DestroyDetailedView() { 85 if (volume_view_) { 86 volume_view_ = NULL; 87 pop_up_volume_view_ = false; 88 } 89} 90 91bool TrayAudio::ShouldHideArrow() const { 92 return true; 93} 94 95bool TrayAudio::ShouldShowShelf() const { 96 return TrayAudio::ShowAudioDeviceMenu() && !pop_up_volume_view_; 97} 98 99void TrayAudio::OnOutputVolumeChanged() { 100 float percent = 101 static_cast<float>(audio_delegate_->GetOutputVolumeLevel()) / 100.0f; 102 if (tray_view()) 103 tray_view()->SetVisible(GetInitialVisibility()); 104 105 if (volume_view_) { 106 volume_view_->SetVolumeLevel(percent); 107 SetDetailedViewCloseDelay(kTrayPopupAutoCloseDelayInSeconds); 108 return; 109 } 110 pop_up_volume_view_ = true; 111 PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); 112} 113 114void TrayAudio::OnOutputMuteChanged() { 115 if (tray_view()) 116 tray_view()->SetVisible(GetInitialVisibility()); 117 118 if (volume_view_) { 119 volume_view_->Update(); 120 SetDetailedViewCloseDelay(kTrayPopupAutoCloseDelayInSeconds); 121 } else { 122 pop_up_volume_view_ = true; 123 PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false); 124 } 125} 126 127void TrayAudio::OnAudioNodesChanged() { 128 Update(); 129} 130 131void TrayAudio::OnActiveOutputNodeChanged() { 132 Update(); 133} 134 135void TrayAudio::OnActiveInputNodeChanged() { 136 Update(); 137} 138 139void TrayAudio::Update() { 140 if (tray_view()) 141 tray_view()->SetVisible(GetInitialVisibility()); 142 if (volume_view_) { 143 volume_view_->SetVolumeLevel( 144 static_cast<float>(audio_delegate_->GetOutputVolumeLevel()) / 100.0f); 145 volume_view_->Update(); 146 } 147} 148 149} // namespace ash 150