tray_bluetooth.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/bluetooth/tray_bluetooth.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_scroll_view.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/hover_highlight_view.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/throbber_view.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_details_view.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_more.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDeviceListHeight = 276;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BluetoothDefaultView : public TrayItemMore {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BluetoothDefaultView(SystemTrayItem* owner, bool show_more)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : TrayItemMore(owner, show_more) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_BLUETOOTH).ToImageSkia());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateLabel();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BluetoothDefaultView() {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateLabel() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ash::SystemTrayDelegate* delegate =
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ash::Shell::GetInstance()->system_tray_delegate();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (delegate->GetBluetoothAvailable()) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const string16 label =
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          rb.GetLocalizedString(delegate->GetBluetoothEnabled() ?
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              IDS_ASH_STATUS_TRAY_BLUETOOTH_ENABLED :
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              IDS_ASH_STATUS_TRAY_BLUETOOTH_DISABLED);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetLabel(label);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetAccessibleName(label);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetVisible(true);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetVisible(false);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BluetoothDefaultView);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BluetoothDetailedView : public TrayDetailsView,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              public ViewClickListener,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              public views::ButtonListener {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BluetoothDetailedView(SystemTrayItem* owner, user::LoginStatus login)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : TrayDetailsView(owner),
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        login_(login),
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        add_device_(NULL),
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        toggle_bluetooth_(NULL),
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        enable_bluetooth_(NULL),
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bluetooth_discovering_(false) {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CreateItems();
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Update();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~BluetoothDetailedView() {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Stop discovering bluetooth devices when exiting BT detailed view.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BluetoothStopDiscovering();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Update() {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BluetoothStartDiscovering();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateBlueToothDeviceList();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Update UI.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateDeviceScrollList();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateHeaderEntry();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Layout();
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateItems() {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CreateScrollableList();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppendSettingsEntries();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppendHeaderEntry();
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void BluetoothStartDiscovering() {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::SystemTrayDelegate* delegate =
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ash::Shell::GetInstance()->system_tray_delegate();
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool bluetooth_enabled = delegate->GetBluetoothEnabled();
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!bluetooth_discovering_ && bluetooth_enabled) {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate->BluetoothStartDiscovering();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      throbber_->Start();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if(!bluetooth_enabled) {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      throbber_->Stop();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bluetooth_discovering_ = bluetooth_enabled;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void BluetoothStopDiscovering() {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::SystemTrayDelegate* delegate =
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ash::Shell::GetInstance()->system_tray_delegate();
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (delegate && bluetooth_discovering_) {
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bluetooth_discovering_ = false;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate->BluetoothStopDiscovering();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      throbber_->Stop();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateBlueToothDeviceList() {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connected_devices_.clear();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    paired_not_connected_devices_.clear();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    discovered_not_paired_devices_.clear();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BluetoothDeviceList list;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Shell::GetInstance()->system_tray_delegate()->
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetAvailableBluetoothDevices(&list);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < list.size(); ++i) {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (list[i].connected)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        connected_devices_.push_back(list[i]);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else if (list[i].paired)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        paired_not_connected_devices_.push_back(list[i]);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else if (list[i].visible)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        discovered_not_paired_devices_.push_back(list[i]);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AppendHeaderEntry() {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateSpecialRow(IDS_ASH_STATUS_TRAY_BLUETOOTH, this);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (login_ == user::LOGGED_IN_LOCKED)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    throbber_ = new ThrobberView;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    throbber_->SetTooltipText(
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH_DISCOVERING));
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    footer()->AddThrobber(throbber_);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do not allow toggling bluetooth in the lock screen.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ash::SystemTrayDelegate* delegate =
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ash::Shell::GetInstance()->system_tray_delegate();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toggle_bluetooth_ = new TrayPopupHeaderButton(this,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDR_AURA_UBER_TRAY_BLUETOOTH_ENABLED,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDR_AURA_UBER_TRAY_BLUETOOTH_DISABLED,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDR_AURA_UBER_TRAY_BLUETOOTH_ENABLED_HOVER,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDR_AURA_UBER_TRAY_BLUETOOTH_DISABLED_HOVER,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_ASH_STATUS_TRAY_BLUETOOTH);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toggle_bluetooth_->SetToggled(!delegate->GetBluetoothEnabled());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toggle_bluetooth_->SetTooltipText(
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_BLUETOOTH));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    toggle_bluetooth_->SetToggledTooltipText(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_BLUETOOTH));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    footer()->AddButton(toggle_bluetooth_);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateHeaderEntry() {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (toggle_bluetooth_) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      toggle_bluetooth_->SetToggled(
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          !ash::Shell::GetInstance()->system_tray_delegate()->
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetBluetoothEnabled());
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateDeviceScrollList() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    device_map_.clear();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_content()->RemoveAllChildViews(true);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    enable_bluetooth_ = NULL;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::SystemTrayDelegate* delegate =
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ash::Shell::GetInstance()->system_tray_delegate();
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool bluetooth_enabled = delegate->GetBluetoothEnabled();
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool blueooth_available = delegate->GetBluetoothAvailable();
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (blueooth_available && !bluetooth_enabled &&
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        toggle_bluetooth_) {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      enable_bluetooth_ =
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          AddScrollListItem(
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_BLUETOOTH),
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              gfx::Font::NORMAL, false, true);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendSameTypeDevicesToScrollList(
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        connected_devices_, true, true, bluetooth_enabled);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendSameTypeDevicesToScrollList(
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        paired_not_connected_devices_, false, false, bluetooth_enabled);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (discovered_not_paired_devices_.size() > 0)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AddScrollSeparator();
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendSameTypeDevicesToScrollList(
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        discovered_not_paired_devices_, false, false, bluetooth_enabled);
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Show user Bluetooth state if there is no bluetooth devices in list.
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (device_map_.size() == 0) {
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (blueooth_available && bluetooth_enabled) {
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddScrollListItem(
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            l10n_util::GetStringUTF16(
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                IDS_ASH_STATUS_TRAY_BLUETOOTH_DISCOVERING),
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            gfx::Font::NORMAL, false, true);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_content()->SizeToPreferredSize();
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static_cast<views::View*>(scroller())->Layout();
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AppendSameTypeDevicesToScrollList(const BluetoothDeviceList& list,
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         bool bold,
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         bool checked,
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         bool enabled) {
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < list.size(); ++i) {
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      HoverHighlightView* container = AddScrollListItem(
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          list[i].display_name,
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          bold? gfx::Font::BOLD : gfx::Font::NORMAL,
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          checked, enabled);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      device_map_[container] = list[i].address;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HoverHighlightView* AddScrollListItem(const string16& text,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        gfx::Font::FontStyle style,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        bool checked,
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        bool enabled) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HoverHighlightView* container = new HoverHighlightView(this);
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Label* label = container->AddCheckableLabel(text, style, checked);
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    label->SetEnabled(enabled);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scroll_content()->AddChildView(container);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return container;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add settings entries.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AppendSettingsEntries() {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add bluetooth device requires a browser window, hide it for non logged in
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // user.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (login_ == user::LOGGED_IN_NONE ||
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        login_ == user::LOGGED_IN_LOCKED)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ash::SystemTrayDelegate* delegate =
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ash::Shell::GetInstance()->system_tray_delegate();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HoverHighlightView* container = new HoverHighlightView(this);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddLabel(
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_BLUETOOTH_ADD_DEVICE),
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Font::NORMAL);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    container->SetEnabled(delegate->GetBluetoothAvailable());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildView(container);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    add_device_ = container;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if the device with |device_id| is found in |device_list|,
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and the display_name of the device will be returned in |display_name|.
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool FoundDevice(const std::string& device_id,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   const BluetoothDeviceList& device_list,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   string16* display_name) {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < device_list.size(); ++i) {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (device_list[i].address == device_id) {
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *display_name = device_list[i].display_name;
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return true;
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates UI of the clicked bluetooth device to show it is being connected
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or disconnected if such an operation is going to be performed underway.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateClickedDevice(std::string device_id, views::View* item_container) {
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16 display_name;
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (FoundDevice(device_id, connected_devices_, &display_name)) {
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_name = l10n_util::GetStringFUTF16(
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_BLUETOOTH_DISCONNECTING, display_name);
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (FoundDevice(device_id, paired_not_connected_devices_,
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           &display_name)) {
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_name = l10n_util::GetStringFUTF16(
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_BLUETOOTH_CONNECTING, display_name);
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (display_name.length() > 0) {
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      item_container->RemoveAllChildViews(true);
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<HoverHighlightView*>(item_container)->
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          AddCheckableLabel(display_name, gfx::Font::BOLD, false);
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_content()->SizeToPreferredSize();
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<views::View*>(scroller())->Layout();
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ViewClickListener.
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnViewClicked(views::View* sender) OVERRIDE {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ash::SystemTrayDelegate* delegate =
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ash::Shell::GetInstance()->system_tray_delegate();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sender == footer()->content()) {
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      owner()->system_tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (sender == add_device_) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!delegate->GetBluetoothEnabled())
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delegate->ToggleBluetooth();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate->AddBluetoothDevice();
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (sender == enable_bluetooth_) {
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate->ToggleBluetooth();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::map<views::View*, std::string>::iterator find;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      find = device_map_.find(sender);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (find != device_map_.end()) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::string device_id = find->second;
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        UpdateClickedDevice(device_id, sender);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delegate->ToggleBluetoothConnection(device_id);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ButtonListener.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const ui::Event& event) OVERRIDE {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ash::SystemTrayDelegate* delegate =
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ash::Shell::GetInstance()->system_tray_delegate();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sender == toggle_bluetooth_)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate->ToggleBluetooth();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user::LoginStatus login_;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<views::View*, std::string> device_map_;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* add_device_;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ThrobberView* throbber_;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrayPopupHeaderButton* toggle_bluetooth_;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HoverHighlightView* enable_bluetooth_;
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BluetoothDeviceList connected_devices_;
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BluetoothDeviceList paired_not_connected_devices_;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BluetoothDeviceList discovered_not_paired_devices_;
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool bluetooth_discovering_;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BluetoothDetailedView);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tray
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayBluetooth::TrayBluetooth(SystemTray* system_tray)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default_(NULL),
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      detailed_(NULL) {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddBluetoothObserver(this);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayBluetooth::~TrayBluetooth() {
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->RemoveBluetoothObserver(this);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayBluetooth::CreateTrayView(user::LoginStatus status) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayBluetooth::CreateDefaultView(user::LoginStatus status) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(default_ == NULL);
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  default_ = new tray::BluetoothDefaultView(
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this, status != user::LOGGED_IN_LOCKED);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayBluetooth::CreateDetailedView(user::LoginStatus status) {
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!Shell::GetInstance()->system_tray_delegate()->GetBluetoothAvailable())
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(detailed_ == NULL);
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  detailed_ = new tray::BluetoothDetailedView(this, status);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return detailed_;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayBluetooth::DestroyTrayView() {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayBluetooth::DestroyDefaultView() {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = NULL;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayBluetooth::DestroyDetailedView() {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_ = NULL;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayBluetooth::UpdateAfterLoginStatusChange(user::LoginStatus status) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayBluetooth::OnBluetoothRefresh() {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (default_)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_->UpdateLabel();
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (detailed_)
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_->Update();
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayBluetooth::OnBluetoothDiscoveringChanged() {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!detailed_)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  detailed_->Update();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
409