Index: chrome/browser/chromeos/system/ash_system_tray_delegate.cc |
diff --git a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc |
index 1474c3c5ea9a7292ecbd10444aa6881e210b22b7..27efb1afc30d1c9ae97a9ba2dce21336d98128e0 100644 |
--- a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc |
+++ b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc |
@@ -16,6 +16,7 @@ |
#include "ash/system/power/power_status_observer.h" |
#include "ash/system/tray/system_tray.h" |
#include "ash/system/tray/system_tray_delegate.h" |
+#include "ash/system/tray/system_tray_observers.h" |
#include "ash/system/tray_accessibility.h" |
#include "ash/system/tray_caps_lock.h" |
#include "ash/system/user/update_observer.h" |
@@ -174,8 +175,8 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
screen_locked_(false), |
connected_network_state_(STATE_UNKNOWN), |
data_promo_notification_(new DataPromoNotification()), |
- volume_control_delegate_(ALLOW_THIS_IN_INITIALIZER_LIST( |
- new VolumeController)) { |
+ volume_control_delegate_(new VolumeController()), |
+ system_tray_observers_(new ash::SystemTrayObservers()) { |
// Register notifications on construction so that events such as |
// PROFILE_CREATED do not get missed if they happen before Initialize(). |
registrar_.Add(this, |
@@ -228,6 +229,9 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
} |
virtual ~SystemTrayDelegate() { |
+ // Clear observers first. |
+ system_tray_observers_.reset(); |
+ |
AudioHandler* audiohandler = AudioHandler::GetInstance(); |
if (audiohandler) |
audiohandler->RemoveVolumeObserver(this); |
@@ -251,6 +255,10 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
} |
} |
+ virtual ash::SystemTrayObservers* GetSystemTrayObservers() OVERRIDE { |
+ return system_tray_observers_.get(); |
+ } |
+ |
// Overridden from ash::SystemTrayDelegate: |
virtual bool GetTrayVisibilityOnStartup() OVERRIDE { |
// In case of OOBE / sign in screen tray will be shown later. |
@@ -625,7 +633,9 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
} |
virtual void ToggleWifi() OVERRIDE { |
- GetSystemTray()->network_observer()->OnWillToggleWifi(); |
+ FOR_EACH_OBSERVER(ash::NetworkObserver, |
+ system_tray_observers_->network_observers(), |
+ OnWillToggleWifi()); |
network_menu_->ToggleWifi(); |
} |
@@ -768,35 +778,29 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
void UpdateClockType(PrefService* service) { |
clock_type_ = service->GetBoolean(prefs::kUse24HourClock) ? |
base::k24HourClock : base::k12HourClock; |
- ash::ClockObserver* observer = GetSystemTray()->clock_observer(); |
- if (observer) |
- observer->OnDateFormatChanged(); |
+ FOR_EACH_OBSERVER(ash::ClockObserver, |
+ system_tray_observers_->clock_observers(), |
+ OnDateFormatChanged()); |
} |
void NotifyRefreshClock() { |
- ash::ClockObserver* observer = GetSystemTray()->clock_observer(); |
- if (observer) |
- observer->Refresh(); |
+ FOR_EACH_OBSERVER(ash::ClockObserver, |
+ system_tray_observers_->clock_observers(), |
+ Refresh()); |
} |
void NotifyRefreshNetwork() { |
- ash::NetworkObserver* observer = GetSystemTray()->network_observer(); |
chromeos::NetworkLibrary* crosnet = |
chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
- if (observer) { |
- ash::NetworkIconInfo info; |
- info.image = network_icon_->GetIconAndText(&info.description); |
- info.tray_icon_visible = network_icon_->ShouldShowIconInTray(); |
- observer->OnNetworkRefresh(info); |
- } |
- |
- ash::NetworkObserver* vpn_observer = GetSystemTray()->vpn_observer(); |
- if (vpn_observer) { |
- ash::NetworkIconInfo info; |
- info.image = network_icon_->GetIconAndText(&info.description); |
- info.tray_icon_visible = network_icon_->ShouldShowIconInTray(); |
- vpn_observer->OnNetworkRefresh(info); |
- } |
+ ash::NetworkIconInfo info; |
+ info.image = network_icon_->GetIconAndText(&info.description); |
+ info.tray_icon_visible = network_icon_->ShouldShowIconInTray(); |
+ FOR_EACH_OBSERVER(ash::NetworkObserver, |
+ system_tray_observers_->network_observers(), |
+ OnNetworkRefresh(info)); |
+ FOR_EACH_OBSERVER(ash::NetworkObserver, |
+ system_tray_observers_->vpn_observers(), |
+ OnNetworkRefresh(info)); |
// Update Accessibility. |
@@ -827,27 +831,27 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
} |
void NotifyRefreshBluetooth() { |
- ash::BluetoothObserver* observer = GetSystemTray()->bluetooth_observer(); |
- if (observer) |
- observer->OnBluetoothRefresh(); |
+ FOR_EACH_OBSERVER(ash::BluetoothObserver, |
+ system_tray_observers_->bluetooth_observers(), |
+ OnBluetoothRefresh()); |
} |
void NotifyBluetoothDiscoveringChanged() { |
- ash::BluetoothObserver* observer = GetSystemTray()->bluetooth_observer(); |
- if (observer) |
- observer->OnBluetoothDiscoveringChanged(); |
+ FOR_EACH_OBSERVER(ash::BluetoothObserver, |
+ system_tray_observers_->bluetooth_observers(), |
+ OnBluetoothDiscoveringChanged()); |
} |
void NotifyRefreshIME(bool show_message) { |
- ash::IMEObserver* observer = GetSystemTray()->ime_observer(); |
- if (observer) |
- observer->OnIMERefresh(show_message); |
+ FOR_EACH_OBSERVER(ash::IMEObserver, |
+ system_tray_observers_->ime_observers(), |
+ OnIMERefresh(show_message)); |
} |
void NotifyRefreshDrive(ash::DriveOperationStatusList& list) { |
- ash::DriveObserver* observer = GetSystemTray()->drive_observer(); |
- if (observer) |
- observer->OnDriveRefresh(list); |
+ FOR_EACH_OBSERVER(ash::DriveObserver, |
+ system_tray_observers_->drive_observers(), |
+ OnDriveRefresh(list)); |
} |
void RefreshNetworkObserver(NetworkLibrary* crosnet) { |
@@ -971,24 +975,30 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
// Overridden from AudioHandler::VolumeObserver. |
virtual void OnVolumeChanged() OVERRIDE { |
float level = AudioHandler::GetInstance()->GetVolumePercent() / 100.f; |
- GetSystemTray()->audio_observer()->OnVolumeChanged(level); |
+ FOR_EACH_OBSERVER(ash::AudioObserver, |
+ system_tray_observers_->audio_observers(), |
+ OnVolumeChanged(level)); |
} |
// Overridden from AudioHandler::VolumeObserver. |
virtual void OnMuteToggled() OVERRIDE { |
- GetSystemTray()->audio_observer()->OnMuteToggled(); |
+ FOR_EACH_OBSERVER(ash::AudioObserver, |
+ system_tray_observers_->audio_observers(), |
+ OnMuteToggled()); |
} |
// Overridden from PowerManagerClient::Observer. |
virtual void BrightnessChanged(int level, bool user_initiated) OVERRIDE { |
- GetSystemTray()->brightness_observer()-> |
- OnBrightnessChanged(static_cast<double>(level), user_initiated); |
+ FOR_EACH_OBSERVER( |
+ ash::BrightnessObserver, |
+ system_tray_observers_->brightness_observers(), |
+ OnBrightnessChanged(static_cast<double>(level), user_initiated)); |
} |
virtual void PowerChanged(const PowerSupplyStatus& power_status) OVERRIDE { |
power_supply_status_ = power_status; |
FOR_EACH_OBSERVER(ash::PowerStatusObserver, |
- GetSystemTray()->power_status_observers(), |
+ system_tray_observers_->power_status_observers(), |
OnPowerStatusChanged(power_status)); |
} |
@@ -1082,18 +1092,18 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
severity = ash::UpdateObserver::UPDATE_NORMAL; |
break; |
} |
- ash::UpdateObserver* observer = GetSystemTray()->update_observer(); |
- if (observer) |
- observer->OnUpdateRecommended(severity); |
+ FOR_EACH_OBSERVER(ash::UpdateObserver, |
+ system_tray_observers_->update_observers(), |
+ OnUpdateRecommended(severity)); |
break; |
} |
case chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED: { |
// This notification is also sent on login screen when user avatar |
// is loaded from file. |
if (GetUserLoginStatus() != ash::user::LOGGED_IN_NONE) { |
- ash::UserObserver* observer = GetSystemTray()->user_observer(); |
- if (observer) |
- observer->OnUserUpdate(); |
+ FOR_EACH_OBSERVER(ash::UserObserver, |
+ system_tray_observers_->user_observers(), |
+ OnUserUpdate()); |
} |
break; |
} |
@@ -1128,12 +1138,11 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
search_key_mapped_to_ = |
service->GetInteger(prefs::kLanguageRemapSearchKeyTo); |
} else if (pref == prefs::kSpokenFeedbackEnabled) { |
- ash::AccessibilityObserver* observer = |
- GetSystemTray()->accessibility_observer(); |
- if (observer) { |
- observer->OnAccessibilityModeChanged( |
- service->GetBoolean(prefs::kSpokenFeedbackEnabled)); |
- } |
+ FOR_EACH_OBSERVER( |
+ ash::AccessibilityObserver, |
+ system_tray_observers_->accessibility_observers(), |
+ OnAccessibilityModeChanged( |
+ service->GetBoolean(prefs::kSpokenFeedbackEnabled))); |
} else { |
NOTREACHED(); |
} |
@@ -1244,9 +1253,9 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
search_key_mapped_to_ == input_method::kCapsLockKey) |
search_mapped_to_caps_lock = true; |
- ash::CapsLockObserver* observer = GetSystemTray()->caps_lock_observer(); |
- if (observer) |
- observer->OnCapsLockChanged(enabled, search_mapped_to_caps_lock); |
+ FOR_EACH_OBSERVER(ash::CapsLockObserver, |
+ system_tray_observers_->caps_lock_observers(), |
+ OnCapsLockChanged(enabled, search_mapped_to_caps_lock)); |
} |
// Overridden from ash::NetworkTrayDelegate |
@@ -1309,6 +1318,8 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
scoped_ptr<ash::VolumeControlDelegate> volume_control_delegate_; |
+ scoped_ptr<ash::SystemTrayObservers> system_tray_observers_; |
+ |
DISALLOW_COPY_AND_ASSIGN(SystemTrayDelegate); |
}; |