Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / ash / system / chromeos / audio / audio_detailed_view.cc
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/chromeos/audio/audio_detailed_view.h"
6
7 #include "ash/system/tray/fixed_sized_scroll_view.h"
8 #include "ash/system/tray/hover_highlight_view.h"
9 #include "ash/system/tray/tray_constants.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "chromeos/audio/cras_audio_handler.h"
12 #include "grit/ash_resources.h"
13 #include "grit/ash_strings.h"
14 #include "ui/base/l10n/l10n_util.h"
15 #include "ui/base/resource/resource_bundle.h"
16 #include "ui/views/border.h"
17 #include "ui/views/controls/label.h"
18
19 namespace {
20
21 base::string16 GetAudioDeviceName(const chromeos::AudioDevice& device) {
22   switch(device.type) {
23     case chromeos::AUDIO_TYPE_HEADPHONE:
24       return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_AUDIO_HEADPHONE);
25     case chromeos::AUDIO_TYPE_INTERNAL_SPEAKER:
26       return l10n_util::GetStringUTF16(
27           IDS_ASH_STATUS_TRAY_AUDIO_INTERNAL_SPEAKER);
28     case chromeos::AUDIO_TYPE_INTERNAL_MIC:
29       return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_AUDIO_INTERNAL_MIC);
30     case chromeos::AUDIO_TYPE_USB:
31       return l10n_util::GetStringFUTF16(
32           IDS_ASH_STATUS_TRAY_AUDIO_USB_DEVICE,
33           base::UTF8ToUTF16(device.display_name));
34     case chromeos::AUDIO_TYPE_BLUETOOTH:
35       return l10n_util::GetStringFUTF16(
36           IDS_ASH_STATUS_TRAY_AUDIO_BLUETOOTH_DEVICE,
37           base::UTF8ToUTF16(device.display_name));
38     case chromeos::AUDIO_TYPE_HDMI:
39       return l10n_util::GetStringFUTF16(
40           IDS_ASH_STATUS_TRAY_AUDIO_HDMI_DEVICE,
41           base::UTF8ToUTF16(device.display_name));
42     default:
43       return base::UTF8ToUTF16(device.display_name);
44   }
45 }
46
47 }  // namespace
48
49 using chromeos::CrasAudioHandler;
50
51 namespace ash {
52 namespace tray {
53
54 AudioDetailedView::AudioDetailedView(SystemTrayItem* owner,
55                                      user::LoginStatus login)
56     : TrayDetailsView(owner),
57       login_(login) {
58   CreateItems();
59   Update();
60 }
61
62 AudioDetailedView::~AudioDetailedView() {
63 }
64
65 void AudioDetailedView::Update() {
66   UpdateAudioDevices();
67   Layout();
68 }
69
70 void AudioDetailedView::AddScrollListInfoItem(const base::string16& text) {
71   views::Label* label = new views::Label(
72       text,
73       ui::ResourceBundle::GetSharedInstance().GetFontList(
74           ui::ResourceBundle::BoldFont));
75
76   //  Align info item with checkbox items
77   int margin = kTrayPopupPaddingHorizontal +
78       kTrayPopupDetailsLabelExtraLeftMargin;
79   int left_margin = 0;
80   int right_margin = 0;
81   if (base::i18n::IsRTL())
82     right_margin = margin;
83   else
84     left_margin = margin;
85
86   label->SetBorder(views::Border::CreateEmptyBorder(
87       ash::kTrayPopupPaddingBetweenItems,
88       left_margin,
89       ash::kTrayPopupPaddingBetweenItems,
90       right_margin));
91   label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
92   label->SetEnabledColor(SkColorSetARGB(192, 0, 0, 0));
93
94   scroll_content()->AddChildView(label);
95 }
96
97 HoverHighlightView* AudioDetailedView::AddScrollListItem(
98     const base::string16& text,
99     gfx::Font::FontStyle style,
100     bool checked) {
101   HoverHighlightView* container = new HoverHighlightView(this);
102   container->AddCheckableLabel(text, style, checked);
103   scroll_content()->AddChildView(container);
104   return container;
105 }
106
107 void AudioDetailedView::CreateHeaderEntry() {
108   CreateSpecialRow(IDS_ASH_STATUS_TRAY_AUDIO, this);
109 }
110
111 void AudioDetailedView::CreateItems() {
112   CreateScrollableList();
113   CreateHeaderEntry();
114 }
115
116 void AudioDetailedView::UpdateAudioDevices() {
117   output_devices_.clear();
118   input_devices_.clear();
119   chromeos::AudioDeviceList devices;
120   CrasAudioHandler::Get()->GetAudioDevices(&devices);
121   for (size_t i = 0; i < devices.size(); ++i) {
122     if (devices[i].is_input)
123       input_devices_.push_back(devices[i]);
124     else
125       output_devices_.push_back(devices[i]);
126   }
127   UpdateScrollableList();
128 }
129
130 void AudioDetailedView::UpdateScrollableList() {
131   scroll_content()->RemoveAllChildViews(true);
132   device_map_.clear();
133
134   // Add audio output devices.
135   AddScrollListInfoItem(
136       l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_AUDIO_OUTPUT));
137   for (size_t i = 0; i < output_devices_.size(); ++i) {
138     HoverHighlightView* container = AddScrollListItem(
139         GetAudioDeviceName(output_devices_[i]),
140         gfx::Font::NORMAL,
141         output_devices_[i].active);  /* checkmark if active */
142     device_map_[container] = output_devices_[i];
143   }
144
145   AddScrollSeparator();
146
147   // Add audio input devices.
148   AddScrollListInfoItem(
149       l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_AUDIO_INPUT));
150   for (size_t i = 0; i < input_devices_.size(); ++i) {
151     HoverHighlightView* container = AddScrollListItem(
152         GetAudioDeviceName(input_devices_[i]),
153         gfx::Font::NORMAL,
154         input_devices_[i].active);  /* checkmark if active */
155     device_map_[container] = input_devices_[i];
156   }
157
158   scroll_content()->SizeToPreferredSize();
159   scroller()->Layout();
160 }
161
162 void AudioDetailedView::OnViewClicked(views::View* sender) {
163   if (sender == footer()->content()) {
164     TransitionToDefaultView();
165   } else {
166     AudioDeviceMap::iterator iter = device_map_.find(sender);
167     if (iter == device_map_.end())
168       return;
169     chromeos::AudioDevice& device = iter->second;
170     CrasAudioHandler::Get()->SwitchToDevice(device);
171   }
172 }
173
174 }  // namespace tray
175 }  // namespace ash