| Index: ash/system/status_area_widget.cc
 | 
| diff --git a/ash/system/status_area_widget.cc b/ash/system/status_area_widget.cc
 | 
| index 2e665121c22a16ed87963c52e6adf68afcbfc45a..f0ae1d011962800493d8f33a8df2a7e57476aafe 100644
 | 
| --- a/ash/system/status_area_widget.cc
 | 
| +++ b/ash/system/status_area_widget.cc
 | 
| @@ -5,16 +5,283 @@
 | 
|  #include "ash/system/status_area_widget.h"
 | 
|  
 | 
|  #include "ash/shell.h"
 | 
| +#include "ash/shell_delegate.h"
 | 
|  #include "ash/shell_window_ids.h"
 | 
| +#include "ash/system/bluetooth/bluetooth_observer.h"
 | 
| +#include "ash/system/network/network_observer.h"
 | 
|  #include "ash/system/status_area_widget_delegate.h"
 | 
| +#include "ash/system/tray/system_tray.h"
 | 
| +#include "ash/system/tray/system_tray_delegate.h"
 | 
| +#include "base/i18n/time_formatting.h"
 | 
| +#include "base/utf_string_conversions.h"
 | 
|  #include "ui/aura/window.h"
 | 
|  
 | 
|  namespace ash {
 | 
| -namespace internal {
 | 
|  
 | 
| -StatusAreaWidget::StatusAreaWidget() {
 | 
| -  widget_delegate_ = new internal::StatusAreaWidgetDelegate;
 | 
| +namespace {
 | 
| +
 | 
| +class DummySystemTrayDelegate : public SystemTrayDelegate {
 | 
| + public:
 | 
| +  DummySystemTrayDelegate()
 | 
| +      : muted_(false),
 | 
| +        wifi_enabled_(true),
 | 
| +        cellular_enabled_(true),
 | 
| +        bluetooth_enabled_(true),
 | 
| +        volume_(0.5),
 | 
| +        caps_lock_enabled_(false) {
 | 
| +  }
 | 
| +
 | 
| +  virtual ~DummySystemTrayDelegate() {}
 | 
| +
 | 
| + private:
 | 
| +  virtual bool GetTrayVisibilityOnStartup() OVERRIDE { return true; }
 | 
| +
 | 
| +  // Overridden from SystemTrayDelegate:
 | 
| +  virtual const string16 GetUserDisplayName() const OVERRIDE {
 | 
| +    return UTF8ToUTF16("Über tray Über tray Über tray Über tray");
 | 
| +  }
 | 
| +
 | 
| +  virtual const std::string GetUserEmail() const OVERRIDE {
 | 
| +    return "über@tray";
 | 
| +  }
 | 
| +
 | 
| +  virtual const gfx::ImageSkia& GetUserImage() const OVERRIDE {
 | 
| +    return null_image_;
 | 
| +  }
 | 
| +
 | 
| +  virtual user::LoginStatus GetUserLoginStatus() const OVERRIDE {
 | 
| +    return user::LOGGED_IN_USER;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool SystemShouldUpgrade() const OVERRIDE {
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  virtual base::HourClockType GetHourClockType() const OVERRIDE {
 | 
| +    return base::k24HourClock;
 | 
| +  }
 | 
| +
 | 
| +  virtual PowerSupplyStatus GetPowerSupplyStatus() const OVERRIDE {
 | 
| +    return PowerSupplyStatus();
 | 
| +  }
 | 
| +
 | 
| +  virtual void RequestStatusUpdate() const OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ShowSettings() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ShowDateSettings() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ShowNetworkSettings() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ShowBluetoothSettings() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ShowDriveSettings() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ShowIMESettings() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ShowHelp() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual bool IsAudioMuted() const OVERRIDE {
 | 
| +    return muted_;
 | 
| +  }
 | 
| +
 | 
| +  virtual void SetAudioMuted(bool muted) OVERRIDE {
 | 
| +    muted_ = muted;
 | 
| +  }
 | 
| +
 | 
| +  virtual float GetVolumeLevel() const OVERRIDE {
 | 
| +    return volume_;
 | 
| +  }
 | 
| +
 | 
| +  virtual void SetVolumeLevel(float volume) OVERRIDE {
 | 
| +    volume_ = volume;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool IsCapsLockOn() const OVERRIDE {
 | 
| +    return caps_lock_enabled_;
 | 
| +  }
 | 
| +
 | 
| +  virtual void SetCapsLockEnabled(bool enabled) OVERRIDE {
 | 
| +    caps_lock_enabled_ = enabled;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool IsInAccessibilityMode() const OVERRIDE {
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  virtual void SetEnableSpokenFeedback(bool enable) OVERRIDE {}
 | 
| +
 | 
| +  virtual void ShutDown() OVERRIDE {}
 | 
| +
 | 
| +  virtual void SignOut() OVERRIDE {
 | 
| +    MessageLoop::current()->Quit();
 | 
| +  }
 | 
| +
 | 
| +  virtual void RequestLockScreen() OVERRIDE {}
 | 
| +
 | 
| +  virtual void RequestRestart() OVERRIDE {}
 | 
| +
 | 
| +  virtual void GetAvailableBluetoothDevices(
 | 
| +      BluetoothDeviceList* list) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ToggleBluetoothConnection(const std::string& address) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void GetCurrentIME(IMEInfo* info) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void GetAvailableIMEList(IMEInfoList* list) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void GetCurrentIMEProperties(IMEPropertyInfoList* list) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void SwitchIME(const std::string& ime_id) OVERRIDE {
 | 
| +  }
 | 
|  
 | 
| +  virtual void ActivateIMEProperty(const std::string& key) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void CancelDriveOperation(const FilePath&) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void GetDriveOperationStatusList(
 | 
| +      ash::DriveOperationStatusList*) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void GetMostRelevantNetworkIcon(NetworkIconInfo* info,
 | 
| +                                          bool large) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void GetAvailableNetworks(
 | 
| +      std::vector<NetworkIconInfo>* list) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ConnectToNetwork(const std::string& network_id) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void GetNetworkAddresses(std::string* ip_address,
 | 
| +                                   std::string* ethernet_mac_address,
 | 
| +                                   std::string* wifi_mac_address) OVERRIDE {
 | 
| +    *ip_address = "127.0.0.1";
 | 
| +    *ethernet_mac_address = "00:11:22:33:44:55";
 | 
| +    *wifi_mac_address = "66:77:88:99:00:11";
 | 
| +  }
 | 
| +
 | 
| +  virtual void RequestNetworkScan() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void AddBluetoothDevice() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ToggleAirplaneMode() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ToggleWifi() OVERRIDE {
 | 
| +    wifi_enabled_ = !wifi_enabled_;
 | 
| +    ash::NetworkObserver* observer =
 | 
| +        ash::Shell::GetInstance()->system_tray()->network_observer();
 | 
| +    if (observer) {
 | 
| +      ash::NetworkIconInfo info;
 | 
| +      observer->OnNetworkRefresh(info);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  virtual void ToggleMobile() OVERRIDE {
 | 
| +    cellular_enabled_ = !cellular_enabled_;
 | 
| +    ash::NetworkObserver* observer =
 | 
| +        ash::Shell::GetInstance()->system_tray()->network_observer();
 | 
| +    if (observer) {
 | 
| +      ash::NetworkIconInfo info;
 | 
| +      observer->OnNetworkRefresh(info);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  virtual void ToggleBluetooth() OVERRIDE {
 | 
| +    bluetooth_enabled_ = !bluetooth_enabled_;
 | 
| +    ash::BluetoothObserver* observer =
 | 
| +        ash::Shell::GetInstance()->system_tray()->bluetooth_observer();
 | 
| +    if (observer)
 | 
| +      observer->OnBluetoothRefresh();
 | 
| +  }
 | 
| +
 | 
| +  virtual void ShowOtherWifi() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ShowOtherCellular() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual bool IsNetworkConnected() OVERRIDE {
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool GetWifiAvailable() OVERRIDE {
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool GetMobileAvailable() OVERRIDE {
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool GetBluetoothAvailable() OVERRIDE {
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool GetWifiEnabled() OVERRIDE {
 | 
| +    return wifi_enabled_;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool GetMobileEnabled() OVERRIDE {
 | 
| +    return cellular_enabled_;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool GetBluetoothEnabled() OVERRIDE {
 | 
| +    return bluetooth_enabled_;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool GetMobileScanSupported() OVERRIDE {
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool GetCellularCarrierInfo(std::string* carrier_id,
 | 
| +                                      std::string* topup_url,
 | 
| +                                      std::string* setup_url) OVERRIDE {
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  virtual void ShowCellularURL(const std::string& url) OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  virtual void ChangeProxySettings() OVERRIDE {
 | 
| +  }
 | 
| +
 | 
| +  bool muted_;
 | 
| +  bool wifi_enabled_;
 | 
| +  bool cellular_enabled_;
 | 
| +  bool bluetooth_enabled_;
 | 
| +  float volume_;
 | 
| +  bool caps_lock_enabled_;
 | 
| +  gfx::ImageSkia null_image_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(DummySystemTrayDelegate);
 | 
| +};
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
| +namespace internal {
 | 
| +
 | 
| +StatusAreaWidget::StatusAreaWidget()
 | 
| +    : widget_delegate_(new internal::StatusAreaWidgetDelegate),
 | 
| +      system_tray_(NULL) {
 | 
|    views::Widget::InitParams params(
 | 
|        views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
 | 
|    params.delegate = widget_delegate_;
 | 
| @@ -31,16 +298,37 @@ StatusAreaWidget::StatusAreaWidget() {
 | 
|  StatusAreaWidget::~StatusAreaWidget() {
 | 
|  }
 | 
|  
 | 
| -void StatusAreaWidget::AddTray(views::View* tray) {
 | 
| -  widget_delegate_->AddChildView(tray);
 | 
| -  widget_delegate_->Layout();
 | 
| +void StatusAreaWidget::CreateTrayViews(ShellDelegate* shell_delegate) {
 | 
| +  AddSystemTray(new SystemTray(), shell_delegate);
 | 
| +}
 | 
| +
 | 
| +void StatusAreaWidget::Shutdown() {
 | 
| +  // Destroy the trays early, causing them to be removed from the view
 | 
| +  // hierarchy. Do not used scoped pointers since we don't want to destroy them
 | 
| +  // in the destructor if Shutdown() is not called (e.g. in tests).
 | 
| +  delete system_tray_;
 | 
| +  system_tray_ = NULL;
 | 
| +}
 | 
| +
 | 
| +void StatusAreaWidget::AddSystemTray(SystemTray* system_tray,
 | 
| +                                     ShellDelegate* shell_delegate) {
 | 
| +  system_tray_ = system_tray;
 | 
| +  widget_delegate_->AddTray(system_tray);
 | 
| +  system_tray_->Initialize();  // Called after added to widget.
 | 
| +
 | 
| +  if (shell_delegate) {
 | 
| +    system_tray_delegate_.reset(
 | 
| +        shell_delegate->CreateSystemTrayDelegate(system_tray));
 | 
| +  }
 | 
| +  if (!system_tray_delegate_.get())
 | 
| +    system_tray_delegate_.reset(new DummySystemTrayDelegate());
 | 
| +
 | 
| +  system_tray->CreateItems();  // Called after delegate is created.
 | 
|  }
 | 
|  
 | 
|  void StatusAreaWidget::SetShelfAlignment(ShelfAlignment alignment) {
 | 
| -  if (alignment == SHELF_ALIGNMENT_BOTTOM)
 | 
| -    widget_delegate_->SetLayout(views::BoxLayout::kHorizontal);
 | 
| -  else
 | 
| -    widget_delegate_->SetLayout(views::BoxLayout::kVertical);
 | 
| +  widget_delegate_->set_alignment(alignment);
 | 
| +  widget_delegate_->UpdateLayout();
 | 
|  }
 | 
|  
 | 
|  }  // namespace internal
 | 
| 
 |