Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(477)

Side by Side Diff: ash/system/audio/audio_detailed_view.cc

Issue 2831023003: Refactor AddScrollListItem() in system menu detailed views (Closed)
Patch Set: Rebased Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ash/system/audio/audio_detailed_view.h ('k') | ash/system/bluetooth/tray_bluetooth.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/system/audio/audio_detailed_view.h" 5 #include "ash/system/audio/audio_detailed_view.h"
6 6
7 #include "ash/resources/vector_icons/vector_icons.h" 7 #include "ash/resources/vector_icons/vector_icons.h"
8 #include "ash/strings/grit/ash_strings.h" 8 #include "ash/strings/grit/ash_strings.h"
9 #include "ash/system/tray/hover_highlight_view.h" 9 #include "ash/system/tray/hover_highlight_view.h"
10 #include "ash/system/tray/tray_popup_utils.h" 10 #include "ash/system/tray/tray_popup_utils.h"
11 #include "ash/system/tray/tri_view.h" 11 #include "ash/system/tray/tri_view.h"
12 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
13 #include "chromeos/audio/cras_audio_handler.h" 13 #include "chromeos/audio/cras_audio_handler.h"
14 #include "ui/base/l10n/l10n_util.h" 14 #include "ui/base/l10n/l10n_util.h"
15 #include "ui/gfx/color_palette.h" 15 #include "ui/gfx/color_palette.h"
16 #include "ui/gfx/paint_vector_icon.h"
17 #include "ui/native_theme/native_theme.h"
18 #include "ui/views/controls/image_view.h" 16 #include "ui/views/controls/image_view.h"
19 #include "ui/views/controls/label.h"
20 #include "ui/views/controls/scroll_view.h" 17 #include "ui/views/controls/scroll_view.h"
21 #include "ui/views/controls/separator.h" 18 #include "ui/views/controls/separator.h"
22 19
23 namespace { 20 namespace {
24 21
25 base::string16 GetAudioDeviceName(const chromeos::AudioDevice& device) { 22 base::string16 GetAudioDeviceName(const chromeos::AudioDevice& device) {
26 switch (device.type) { 23 switch (device.type) {
27 case chromeos::AUDIO_TYPE_FRONT_MIC: 24 case chromeos::AUDIO_TYPE_FRONT_MIC:
28 return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_AUDIO_FRONT_MIC); 25 return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_AUDIO_FRONT_MIC);
29 case chromeos::AUDIO_TYPE_HEADPHONE: 26 case chromeos::AUDIO_TYPE_HEADPHONE:
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 Update(); 63 Update();
67 } 64 }
68 65
69 AudioDetailedView::~AudioDetailedView() {} 66 AudioDetailedView::~AudioDetailedView() {}
70 67
71 void AudioDetailedView::Update() { 68 void AudioDetailedView::Update() {
72 UpdateAudioDevices(); 69 UpdateAudioDevices();
73 Layout(); 70 Layout();
74 } 71 }
75 72
76 void AudioDetailedView::AddInputHeader() { 73 void AudioDetailedView::AddAudioSubHeader(const gfx::VectorIcon& icon,
77 AddScrollListInfoItem(IDS_ASH_STATUS_TRAY_AUDIO_INPUT, 74 int text_id) {
78 kSystemMenuAudioInputIcon); 75 TriView* header = AddScrollListSubHeader(icon, text_id);
79 }
80
81 void AudioDetailedView::AddOutputHeader() {
82 AddScrollListInfoItem(IDS_ASH_STATUS_TRAY_AUDIO_OUTPUT,
83 kSystemMenuAudioOutputIcon);
84 }
85
86 void AudioDetailedView::AddScrollListInfoItem(int text_id,
87 const gfx::VectorIcon& icon) {
88 TriView* header = TrayPopupUtils::CreateDefaultRowView();
89 TrayPopupUtils::ConfigureAsStickyHeader(header);
90 views::ImageView* image_view = TrayPopupUtils::CreateMainImageView();
91 image_view->SetImage(gfx::CreateVectorIcon(
92 icon, GetNativeTheme()->GetSystemColor(
93 ui::NativeTheme::kColorId_ProminentButtonColor)));
94 header->AddView(TriView::Container::START, image_view);
95
96 views::Label* label = TrayPopupUtils::CreateDefaultLabel();
97 label->SetText(l10n_util::GetStringUTF16(text_id));
98 TrayPopupItemStyle style(TrayPopupItemStyle::FontStyle::SUB_HEADER);
99 style.SetupLabel(label);
100 header->AddView(TriView::Container::CENTER, label);
101
102 header->SetContainerVisible(TriView::Container::END, false); 76 header->SetContainerVisible(TriView::Container::END, false);
103 scroll_content()->AddChildView(header);
104 }
105
106 HoverHighlightView* AudioDetailedView::AddScrollListItem(
107 const base::string16& text,
108 bool highlight,
109 bool checked) {
110 HoverHighlightView* container = new HoverHighlightView(this);
111
112 container->AddLabelRow(text);
113 TrayPopupUtils::InitializeAsCheckableRow(container, checked);
114
115 scroll_content()->AddChildView(container);
116 return container;
117 } 77 }
118 78
119 void AudioDetailedView::CreateItems() { 79 void AudioDetailedView::CreateItems() {
120 CreateScrollableList(); 80 CreateScrollableList();
121 CreateTitleRow(IDS_ASH_STATUS_TRAY_AUDIO); 81 CreateTitleRow(IDS_ASH_STATUS_TRAY_AUDIO);
122 } 82 }
123 83
124 void AudioDetailedView::UpdateAudioDevices() { 84 void AudioDetailedView::UpdateAudioDevices() {
125 output_devices_.clear(); 85 output_devices_.clear();
126 input_devices_.clear(); 86 input_devices_.clear();
127 chromeos::AudioDeviceList devices; 87 chromeos::AudioDeviceList devices;
128 CrasAudioHandler* audio_handler = CrasAudioHandler::Get(); 88 CrasAudioHandler* audio_handler = CrasAudioHandler::Get();
129 audio_handler->GetAudioDevices(&devices); 89 audio_handler->GetAudioDevices(&devices);
130 bool has_dual_internal_mic = audio_handler->HasDualInternalMic(); 90 bool has_dual_internal_mic = audio_handler->HasDualInternalMic();
131 bool is_front_or_rear_mic_active = false; 91 bool is_front_or_rear_mic_active = false;
132 for (size_t i = 0; i < devices.size(); ++i) { 92 for (const auto& device : devices) {
133 // Don't display keyboard mic or aokr type. 93 // Don't display keyboard mic or aokr type.
134 if (!devices[i].is_for_simple_usage()) 94 if (!device.is_for_simple_usage())
135 continue; 95 continue;
136 if (devices[i].is_input) { 96 if (device.is_input) {
137 // Do not expose the internal front and rear mic to UI. 97 // Do not expose the internal front and rear mic to UI.
138 if (has_dual_internal_mic && 98 if (has_dual_internal_mic && audio_handler->IsFrontOrRearMic(device)) {
139 audio_handler->IsFrontOrRearMic(devices[i])) { 99 if (device.active)
140 if (devices[i].active)
141 is_front_or_rear_mic_active = true; 100 is_front_or_rear_mic_active = true;
142 continue; 101 continue;
143 } 102 }
144 input_devices_.push_back(devices[i]); 103 input_devices_.push_back(device);
145 } else { 104 } else {
146 output_devices_.push_back(devices[i]); 105 output_devices_.push_back(device);
147 } 106 }
148 } 107 }
149 108
150 // Expose the dual internal mics as one device (internal mic) to user. 109 // Expose the dual internal mics as one device (internal mic) to user.
151 if (has_dual_internal_mic) { 110 if (has_dual_internal_mic) {
152 // Create stub internal mic entry for UI rendering, which representing 111 // Create stub internal mic entry for UI rendering, which representing
153 // both internal front and rear mics. 112 // both internal front and rear mics.
154 chromeos::AudioDevice internal_mic; 113 chromeos::AudioDevice internal_mic;
155 internal_mic.is_input = true; 114 internal_mic.is_input = true;
156 internal_mic.stable_device_id_version = 2; 115 internal_mic.stable_device_id_version = 2;
157 internal_mic.type = chromeos::AUDIO_TYPE_INTERNAL_MIC; 116 internal_mic.type = chromeos::AUDIO_TYPE_INTERNAL_MIC;
158 internal_mic.active = is_front_or_rear_mic_active; 117 internal_mic.active = is_front_or_rear_mic_active;
159 input_devices_.push_back(internal_mic); 118 input_devices_.push_back(internal_mic);
160 } 119 }
161 120
162 UpdateScrollableList(); 121 UpdateScrollableList();
163 } 122 }
164 123
165 void AudioDetailedView::UpdateScrollableList() { 124 void AudioDetailedView::UpdateScrollableList() {
166 scroll_content()->RemoveAllChildViews(true); 125 scroll_content()->RemoveAllChildViews(true);
167 device_map_.clear(); 126 device_map_.clear();
168 127
169 // Add audio output devices. 128 // Add audio output devices.
170 const bool has_output_devices = output_devices_.size() > 0; 129 const bool has_output_devices = output_devices_.size() > 0;
171 if (has_output_devices) 130 if (has_output_devices) {
172 AddOutputHeader(); 131 AddAudioSubHeader(kSystemMenuAudioOutputIcon,
132 IDS_ASH_STATUS_TRAY_AUDIO_OUTPUT);
133 }
173 134
174 for (size_t i = 0; i < output_devices_.size(); ++i) { 135 for (const auto& device : output_devices_) {
175 HoverHighlightView* container = AddScrollListItem( 136 HoverHighlightView* container =
176 GetAudioDeviceName(output_devices_[i]), false /* highlight */, 137 AddScrollListCheckableItem(GetAudioDeviceName(device), device.active);
177 output_devices_[i].active); /* checkmark if active */ 138 device_map_[container] = device;
178 device_map_[container] = output_devices_[i];
179 } 139 }
180 140
181 if (has_output_devices) { 141 if (has_output_devices) {
182 scroll_content()->AddChildView( 142 scroll_content()->AddChildView(
183 TrayPopupUtils::CreateListSubHeaderSeparator()); 143 TrayPopupUtils::CreateListSubHeaderSeparator());
184 } 144 }
185 145
186 // Add audio input devices. 146 // Add audio input devices.
187 const bool has_input_devices = input_devices_.size() > 0; 147 const bool has_input_devices = input_devices_.size() > 0;
188 if (has_input_devices) 148 if (has_input_devices) {
189 AddInputHeader(); 149 AddAudioSubHeader(kSystemMenuAudioInputIcon,
150 IDS_ASH_STATUS_TRAY_AUDIO_INPUT);
151 }
190 152
191 for (size_t i = 0; i < input_devices_.size(); ++i) { 153 for (const auto& device : input_devices_) {
192 HoverHighlightView* container = AddScrollListItem( 154 HoverHighlightView* container =
193 GetAudioDeviceName(input_devices_[i]), false /* highlight */, 155 AddScrollListCheckableItem(GetAudioDeviceName(device), device.active);
194 input_devices_[i].active); /* checkmark if active */ 156 device_map_[container] = device;
195 device_map_[container] = input_devices_[i];
196 } 157 }
197 158
198 scroll_content()->SizeToPreferredSize(); 159 scroll_content()->SizeToPreferredSize();
199 scroller()->Layout(); 160 scroller()->Layout();
200 } 161 }
201 162
202 void AudioDetailedView::HandleViewClicked(views::View* view) { 163 void AudioDetailedView::HandleViewClicked(views::View* view) {
203 AudioDeviceMap::iterator iter = device_map_.find(view); 164 AudioDeviceMap::iterator iter = device_map_.find(view);
204 if (iter == device_map_.end()) 165 if (iter == device_map_.end())
205 return; 166 return;
206 chromeos::AudioDevice device = iter->second; 167 chromeos::AudioDevice device = iter->second;
207 CrasAudioHandler* audio_handler = CrasAudioHandler::Get(); 168 CrasAudioHandler* audio_handler = CrasAudioHandler::Get();
208 if (device.type == chromeos::AUDIO_TYPE_INTERNAL_MIC && 169 if (device.type == chromeos::AUDIO_TYPE_INTERNAL_MIC &&
209 audio_handler->HasDualInternalMic()) { 170 audio_handler->HasDualInternalMic()) {
210 audio_handler->SwitchToFrontOrRearMic(); 171 audio_handler->SwitchToFrontOrRearMic();
211 } else { 172 } else {
212 audio_handler->SwitchToDevice(device, true, 173 audio_handler->SwitchToDevice(device, true,
213 CrasAudioHandler::ACTIVATE_BY_USER); 174 CrasAudioHandler::ACTIVATE_BY_USER);
214 } 175 }
215 } 176 }
216 177
217 } // namespace tray 178 } // namespace tray
218 } // namespace ash 179 } // namespace ash
OLDNEW
« no previous file with comments | « ash/system/audio/audio_detailed_view.h ('k') | ash/system/bluetooth/tray_bluetooth.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698