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

Side by Side Diff: ash/common/system/chromeos/bluetooth/tray_bluetooth.cc

Issue 2289223002: Make TrayDetailsView a ViewClickListener and ButtonListener (Closed)
Patch Set: rebase Created 4 years, 3 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/common/system/chromeos/bluetooth/tray_bluetooth.h" 5 #include "ash/common/system/chromeos/bluetooth/tray_bluetooth.h"
6 6
7 #include "ash/common/material_design/material_design_controller.h" 7 #include "ash/common/material_design/material_design_controller.h"
8 #include "ash/common/session/session_state_delegate.h" 8 #include "ash/common/session/session_state_delegate.h"
9 #include "ash/common/system/tray/fixed_sized_scroll_view.h" 9 #include "ash/common/system/tray/fixed_sized_scroll_view.h"
10 #include "ash/common/system/tray/hover_highlight_view.h" 10 #include "ash/common/system/tray/hover_highlight_view.h"
11 #include "ash/common/system/tray/system_tray.h" 11 #include "ash/common/system/tray/system_tray.h"
12 #include "ash/common/system/tray/system_tray_delegate.h" 12 #include "ash/common/system/tray/system_tray_delegate.h"
13 #include "ash/common/system/tray/system_tray_notifier.h" 13 #include "ash/common/system/tray/system_tray_notifier.h"
14 #include "ash/common/system/tray/throbber_view.h" 14 #include "ash/common/system/tray/throbber_view.h"
15 #include "ash/common/system/tray/tray_constants.h" 15 #include "ash/common/system/tray/tray_constants.h"
16 #include "ash/common/system/tray/tray_details_view.h" 16 #include "ash/common/system/tray/tray_details_view.h"
17 #include "ash/common/system/tray/tray_item_more.h" 17 #include "ash/common/system/tray/tray_item_more.h"
18 #include "ash/common/system/tray/tray_popup_header_button.h" 18 #include "ash/common/system/tray/tray_popup_header_button.h"
19 #include "ash/common/system/tray/view_click_listener.h"
20 #include "ash/common/wm_shell.h" 19 #include "ash/common/wm_shell.h"
21 #include "grit/ash_resources.h" 20 #include "grit/ash_resources.h"
22 #include "grit/ash_strings.h" 21 #include "grit/ash_strings.h"
23 #include "ui/base/l10n/l10n_util.h" 22 #include "ui/base/l10n/l10n_util.h"
24 #include "ui/base/resource/resource_bundle.h" 23 #include "ui/base/resource/resource_bundle.h"
25 #include "ui/gfx/image/image.h" 24 #include "ui/gfx/image/image.h"
26 #include "ui/gfx/paint_vector_icon.h" 25 #include "ui/gfx/paint_vector_icon.h"
27 #include "ui/gfx/vector_icons_public.h" 26 #include "ui/gfx/vector_icons_public.h"
28 #include "ui/views/controls/image_view.h" 27 #include "ui/views/controls/image_view.h"
29 #include "ui/views/controls/label.h" 28 #include "ui/views/controls/label.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 SetVisible(true); 99 SetVisible(true);
101 } else { 100 } else {
102 SetVisible(false); 101 SetVisible(false);
103 } 102 }
104 } 103 }
105 104
106 private: 105 private:
107 DISALLOW_COPY_AND_ASSIGN(BluetoothDefaultView); 106 DISALLOW_COPY_AND_ASSIGN(BluetoothDefaultView);
108 }; 107 };
109 108
110 class BluetoothDetailedView : public TrayDetailsView, 109 class BluetoothDetailedView : public TrayDetailsView {
111 public ViewClickListener,
112 public views::ButtonListener {
113 public: 110 public:
114 BluetoothDetailedView(SystemTrayItem* owner, LoginStatus login) 111 BluetoothDetailedView(SystemTrayItem* owner, LoginStatus login)
115 : TrayDetailsView(owner), 112 : TrayDetailsView(owner),
116 login_(login), 113 login_(login),
117 manage_devices_(NULL), 114 manage_devices_(nullptr),
118 toggle_bluetooth_(NULL), 115 toggle_bluetooth_(nullptr),
119 enable_bluetooth_(NULL) { 116 enable_bluetooth_(nullptr) {
120 CreateItems(); 117 CreateItems();
121 } 118 }
122 119
123 ~BluetoothDetailedView() override { 120 ~BluetoothDetailedView() override {
124 // Stop discovering bluetooth devices when exiting BT detailed view. 121 // Stop discovering bluetooth devices when exiting BT detailed view.
125 BluetoothStopDiscovering(); 122 BluetoothStopDiscovering();
126 } 123 }
127 124
128 void Update() { 125 void Update() {
129 BluetoothStartDiscovering(); 126 BluetoothStartDiscovering();
130 UpdateBluetoothDeviceList(); 127 UpdateBluetoothDeviceList();
131 128
132 // Update UI. 129 // Update UI.
133 UpdateDeviceScrollList(); 130 UpdateDeviceScrollList();
134 UpdateHeaderEntry(); 131 UpdateHeaderEntry();
135 Layout(); 132 Layout();
136 } 133 }
137 134
138 private: 135 private:
139 void CreateItems() { 136 void CreateItems() {
140 CreateScrollableList(); 137 CreateScrollableList();
141 AppendSettingsEntries(); 138 AppendSettingsEntries();
142 AppendHeaderEntry(); 139 CreateTitleRow(IDS_ASH_STATUS_TRAY_BLUETOOTH, this);
143 } 140 }
144 141
145 void BluetoothStartDiscovering() { 142 void BluetoothStartDiscovering() {
143 // TODO(tdanderson|fukino): The material design version of the detailed
144 // view should use an infinite loader bar instead of a throbber. See
145 // crbug.com/632128.
146 const bool md = MaterialDesignController::IsSystemTrayMenuMaterial();
varkha 2016/08/31 20:28:13 nit: s/md/material for consistency and I thought w
tdanderson 2016/08/31 22:24:15 Removed.
146 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate(); 147 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
147 bool bluetooth_enabled = delegate->GetBluetoothEnabled(); 148 if (delegate->GetBluetoothDiscovering()) {
148 bool bluetooth_discovering = delegate->GetBluetoothDiscovering(); 149 if (!md)
varkha 2016/08/31 20:28:14 What do you think about replacing this with "if (t
tdanderson 2016/08/31 22:24:15 Good idea, changed.
149 if (bluetooth_discovering) { 150 throbber_->Start();
150 throbber_->Start();
151 return; 151 return;
152 } 152 }
153 throbber_->Stop(); 153 if (!md)
varkha 2016/08/31 20:28:14 ditto.
tdanderson 2016/08/31 22:24:15 Done.
154 if (bluetooth_enabled) { 154 throbber_->Stop();
155 if (delegate->GetBluetoothEnabled())
155 delegate->BluetoothStartDiscovering(); 156 delegate->BluetoothStartDiscovering();
156 }
157 } 157 }
158 158
159 void BluetoothStopDiscovering() { 159 void BluetoothStopDiscovering() {
160 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate(); 160 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
161 if (delegate && delegate->GetBluetoothDiscovering()) { 161 if (delegate && delegate->GetBluetoothDiscovering()) {
162 delegate->BluetoothStopDiscovering(); 162 delegate->BluetoothStopDiscovering();
163 throbber_->Stop(); 163 if (!MaterialDesignController::IsSystemTrayMenuMaterial())
varkha 2016/08/31 20:28:14 ditto.
tdanderson 2016/08/31 22:24:15 Done.
164 throbber_->Stop();
164 } 165 }
165 } 166 }
166 167
167 void UpdateBluetoothDeviceList() { 168 void UpdateBluetoothDeviceList() {
168 std::set<std::string> new_connecting_devices; 169 std::set<std::string> new_connecting_devices;
169 std::set<std::string> new_connected_devices; 170 std::set<std::string> new_connected_devices;
170 std::set<std::string> new_paired_not_connected_devices; 171 std::set<std::string> new_paired_not_connected_devices;
171 std::set<std::string> new_discovered_not_paired_devices; 172 std::set<std::string> new_discovered_not_paired_devices;
172 173
173 BluetoothDeviceList list; 174 BluetoothDeviceList list;
(...skipping 20 matching lines...) Expand all
194 RemoveObsoleteBluetoothDevicesFromList(&connecting_devices_, 195 RemoveObsoleteBluetoothDevicesFromList(&connecting_devices_,
195 new_connecting_devices); 196 new_connecting_devices);
196 RemoveObsoleteBluetoothDevicesFromList(&connected_devices_, 197 RemoveObsoleteBluetoothDevicesFromList(&connected_devices_,
197 new_connected_devices); 198 new_connected_devices);
198 RemoveObsoleteBluetoothDevicesFromList(&paired_not_connected_devices_, 199 RemoveObsoleteBluetoothDevicesFromList(&paired_not_connected_devices_,
199 new_paired_not_connected_devices); 200 new_paired_not_connected_devices);
200 RemoveObsoleteBluetoothDevicesFromList(&discovered_not_paired_devices_, 201 RemoveObsoleteBluetoothDevicesFromList(&discovered_not_paired_devices_,
201 new_discovered_not_paired_devices); 202 new_discovered_not_paired_devices);
202 } 203 }
203 204
204 void AppendHeaderEntry() {
205 CreateSpecialRow(IDS_ASH_STATUS_TRAY_BLUETOOTH, this);
206
207 if (login_ == LoginStatus::LOCKED)
208 return;
209
210 throbber_ = new ThrobberView;
211 throbber_->SetTooltipText(
212 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH_DISCOVERING));
213 footer()->AddView(throbber_, false /* separator */);
214
215 // Do not allow toggling bluetooth in the lock screen.
216 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
217 toggle_bluetooth_ =
218 new TrayPopupHeaderButton(this, IDR_AURA_UBER_TRAY_BLUETOOTH_ENABLED,
219 IDR_AURA_UBER_TRAY_BLUETOOTH_DISABLED,
220 IDR_AURA_UBER_TRAY_BLUETOOTH_ENABLED_HOVER,
221 IDR_AURA_UBER_TRAY_BLUETOOTH_DISABLED_HOVER,
222 IDS_ASH_STATUS_TRAY_BLUETOOTH);
223 toggle_bluetooth_->SetToggled(!delegate->GetBluetoothEnabled());
224 toggle_bluetooth_->SetTooltipText(
225 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_BLUETOOTH));
226 toggle_bluetooth_->SetToggledTooltipText(
227 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_BLUETOOTH));
228 toggle_bluetooth_->EnableCanvasFlippingForRTLUI(false);
229 footer()->AddButton(toggle_bluetooth_);
230 }
231
232 void UpdateHeaderEntry() { 205 void UpdateHeaderEntry() {
233 if (toggle_bluetooth_) { 206 if (toggle_bluetooth_) {
234 toggle_bluetooth_->SetToggled( 207 toggle_bluetooth_->SetToggled(
235 !WmShell::Get()->system_tray_delegate()->GetBluetoothEnabled()); 208 !WmShell::Get()->system_tray_delegate()->GetBluetoothEnabled());
236 } 209 }
237 } 210 }
238 211
239 void UpdateDeviceScrollList() { 212 void UpdateDeviceScrollList() {
240 device_map_.clear(); 213 device_map_.clear();
241 scroll_content()->RemoveAllChildViews(true); 214 scroll_content()->RemoveAllChildViews(true);
242 enable_bluetooth_ = NULL; 215 enable_bluetooth_ = nullptr;
243 216
244 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate(); 217 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
245 bool bluetooth_enabled = delegate->GetBluetoothEnabled(); 218 bool bluetooth_enabled = delegate->GetBluetoothEnabled();
246 bool blueooth_available = delegate->GetBluetoothAvailable(); 219 bool blueooth_available = delegate->GetBluetoothAvailable();
247 if (blueooth_available && !bluetooth_enabled && toggle_bluetooth_) { 220 if (blueooth_available && !bluetooth_enabled && toggle_bluetooth_) {
248 enable_bluetooth_ = AddScrollListItem( 221 enable_bluetooth_ = AddScrollListItem(
249 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_BLUETOOTH), 222 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_BLUETOOTH),
250 false /* highlight */, false /* checked */, true /* enabled */); 223 false /* highlight */, false /* checked */, true /* enabled */);
251 } 224 }
252 225
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 IDS_ASH_STATUS_TRAY_BLUETOOTH_CONNECTING, display_name); 319 IDS_ASH_STATUS_TRAY_BLUETOOTH_CONNECTING, display_name);
347 320
348 item_container->RemoveAllChildViews(true); 321 item_container->RemoveAllChildViews(true);
349 static_cast<HoverHighlightView*>(item_container) 322 static_cast<HoverHighlightView*>(item_container)
350 ->AddCheckableLabel(display_name, true /* highlight */, false); 323 ->AddCheckableLabel(display_name, true /* highlight */, false);
351 scroll_content()->SizeToPreferredSize(); 324 scroll_content()->SizeToPreferredSize();
352 static_cast<views::View*>(scroller())->Layout(); 325 static_cast<views::View*>(scroller())->Layout();
353 } 326 }
354 } 327 }
355 328
356 // Overridden from ViewClickListener. 329 // TrayDetailsView:
357 void OnViewClicked(views::View* sender) override { 330 void HandleViewClicked(views::View* view) override {
358 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate(); 331 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
359 if (sender == footer()->content()) { 332 if (view == manage_devices_) {
360 TransitionToDefaultView();
361 } else if (sender == manage_devices_) {
362 delegate->ManageBluetoothDevices(); 333 delegate->ManageBluetoothDevices();
363 } else if (sender == enable_bluetooth_) { 334 return;
335 }
336
337 if (view == enable_bluetooth_) {
364 WmShell::Get()->RecordUserMetricsAction( 338 WmShell::Get()->RecordUserMetricsAction(
365 delegate->GetBluetoothEnabled() ? UMA_STATUS_AREA_BLUETOOTH_DISABLED 339 delegate->GetBluetoothEnabled() ? UMA_STATUS_AREA_BLUETOOTH_DISABLED
366 : UMA_STATUS_AREA_BLUETOOTH_ENABLED); 340 : UMA_STATUS_AREA_BLUETOOTH_ENABLED);
367 delegate->ToggleBluetooth(); 341 delegate->ToggleBluetooth();
368 } else { 342 return;
369 if (!delegate->GetBluetoothEnabled())
370 return;
371 std::map<views::View*, std::string>::iterator find;
372 find = device_map_.find(sender);
373 if (find == device_map_.end())
374 return;
375 const std::string device_id = find->second;
376 if (FoundDevice(device_id, connecting_devices_, NULL))
377 return;
378 UpdateClickedDevice(device_id, sender);
379 delegate->ConnectToBluetoothDevice(device_id);
380 } 343 }
344
345 if (!delegate->GetBluetoothEnabled())
346 return;
347
348 std::map<views::View*, std::string>::iterator find;
349 find = device_map_.find(view);
350 if (find == device_map_.end())
351 return;
352
353 const std::string device_id = find->second;
354 if (FoundDevice(device_id, connecting_devices_, nullptr))
355 return;
356
357 UpdateClickedDevice(device_id, view);
358 delegate->ConnectToBluetoothDevice(device_id);
381 } 359 }
382 360
383 // Overridden from ButtonListener. 361 void HandleButtonPressed(views::Button* sender,
384 void ButtonPressed(views::Button* sender, const ui::Event& event) override { 362 const ui::Event& event) override {
363 if (MaterialDesignController::IsSystemTrayMenuMaterial())
364 return;
365
385 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate(); 366 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
386 if (sender == toggle_bluetooth_) 367 if (sender == toggle_bluetooth_)
387 delegate->ToggleBluetooth(); 368 delegate->ToggleBluetooth();
388 else 369 else
389 NOTREACHED(); 370 NOTREACHED();
390 } 371 }
391 372
373 void CreateExtraTitleRowButtons() override {
374 // TODO(tdanderson|fukino): The material design version of the detailed
375 // view requires different buttons. See crbug.com/632128.
376 if (MaterialDesignController::IsSystemTrayMenuMaterial())
377 return;
378
379 if (login_ == LoginStatus::LOCKED)
380 return;
381
382 throbber_ = new ThrobberView;
383 throbber_->SetTooltipText(
384 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH_DISCOVERING));
385 title_row()->AddView(throbber_, false /* separator */);
386
387 // Do not allow toggling bluetooth in the lock screen.
388 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
389 toggle_bluetooth_ =
390 new TrayPopupHeaderButton(this, IDR_AURA_UBER_TRAY_BLUETOOTH_ENABLED,
391 IDR_AURA_UBER_TRAY_BLUETOOTH_DISABLED,
392 IDR_AURA_UBER_TRAY_BLUETOOTH_ENABLED_HOVER,
393 IDR_AURA_UBER_TRAY_BLUETOOTH_DISABLED_HOVER,
394 IDS_ASH_STATUS_TRAY_BLUETOOTH);
395 toggle_bluetooth_->SetToggled(!delegate->GetBluetoothEnabled());
396 toggle_bluetooth_->SetTooltipText(
397 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_BLUETOOTH));
398 toggle_bluetooth_->SetToggledTooltipText(
399 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_BLUETOOTH));
400 toggle_bluetooth_->EnableCanvasFlippingForRTLUI(false);
401 title_row()->AddButton(toggle_bluetooth_);
402 }
403
392 LoginStatus login_; 404 LoginStatus login_;
393 405
394 std::map<views::View*, std::string> device_map_; 406 std::map<views::View*, std::string> device_map_;
395 views::View* manage_devices_; 407 views::View* manage_devices_;
408
409 // Not used in material design.
396 ThrobberView* throbber_; 410 ThrobberView* throbber_;
411
412 // Not used in material design.
397 TrayPopupHeaderButton* toggle_bluetooth_; 413 TrayPopupHeaderButton* toggle_bluetooth_;
414
398 HoverHighlightView* enable_bluetooth_; 415 HoverHighlightView* enable_bluetooth_;
399 BluetoothDeviceList connected_devices_; 416 BluetoothDeviceList connected_devices_;
400 BluetoothDeviceList connecting_devices_; 417 BluetoothDeviceList connecting_devices_;
401 BluetoothDeviceList paired_not_connected_devices_; 418 BluetoothDeviceList paired_not_connected_devices_;
402 BluetoothDeviceList discovered_not_paired_devices_; 419 BluetoothDeviceList discovered_not_paired_devices_;
403 420
404 DISALLOW_COPY_AND_ASSIGN(BluetoothDetailedView); 421 DISALLOW_COPY_AND_ASSIGN(BluetoothDetailedView);
405 }; 422 };
406 423
407 } // namespace tray 424 } // namespace tray
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 detailed_->Update(); 475 detailed_->Update();
459 } 476 }
460 477
461 void TrayBluetooth::OnBluetoothDiscoveringChanged() { 478 void TrayBluetooth::OnBluetoothDiscoveringChanged() {
462 if (!detailed_) 479 if (!detailed_)
463 return; 480 return;
464 detailed_->Update(); 481 detailed_->Update();
465 } 482 }
466 483
467 } // namespace ash 484 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698