1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_UI_ASH_SYSTEM_TRAY_DELEGATE_CHROMEOS_H_
6 #define CHROME_BROWSER_UI_ASH_SYSTEM_TRAY_DELEGATE_CHROMEOS_H_
8 #include "ash/ime/input_method_menu_manager.h"
9 #include "ash/session/session_state_observer.h"
10 #include "ash/system/tray/system_tray.h"
11 #include "ash/system/tray/system_tray_delegate.h"
12 #include "ash/system/tray/system_tray_notifier.h"
13 #include "base/callback_list.h"
14 #include "base/compiler_specific.h"
15 #include "base/containers/scoped_ptr_hash_map.h"
16 #include "base/memory/ref_counted.h"
17 #include "base/memory/weak_ptr.h"
18 #include "base/prefs/pref_change_registrar.h"
19 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
20 #include "chrome/browser/profiles/profile.h"
21 #include "chrome/browser/ui/ash/system_tray_delegate_chromeos.h"
22 #include "chrome/browser/ui/browser_list_observer.h"
23 #include "chromeos/audio/cras_audio_handler.h"
24 #include "chromeos/dbus/session_manager_client.h"
25 #include "chromeos/ime/input_method_manager.h"
26 #include "chromeos/login/login_state.h"
27 #include "components/policy/core/common/cloud/cloud_policy_store.h"
28 #include "content/public/browser/notification_observer.h"
29 #include "content/public/browser/notification_registrar.h"
30 #include "device/bluetooth/bluetooth_adapter.h"
31 #include "device/bluetooth/bluetooth_discovery_session.h"
32 #include "extensions/browser/app_window/app_window_registry.h"
36 class SystemTrayDelegateChromeOS
37 : public ash::ime::InputMethodMenuManager::Observer,
38 public ash::SystemTrayDelegate,
39 public SessionManagerClient::Observer,
40 public content::NotificationObserver,
41 public input_method::InputMethodManager::Observer,
42 public chromeos::LoginState::Observer,
43 public chromeos::CrasAudioHandler::AudioObserver,
44 public device::BluetoothAdapter::Observer,
45 public policy::CloudPolicyStore::Observer,
46 public ash::SessionStateObserver,
47 public chrome::BrowserListObserver,
48 public extensions::AppWindowRegistry::Observer {
50 SystemTrayDelegateChromeOS();
52 virtual ~SystemTrayDelegateChromeOS();
54 void InitializeOnAdapterReady(
55 scoped_refptr<device::BluetoothAdapter> adapter);
57 // Overridden from ash::SystemTrayDelegate:
58 virtual void Initialize() OVERRIDE;
59 virtual void Shutdown() OVERRIDE;
60 virtual bool GetTrayVisibilityOnStartup() OVERRIDE;
61 virtual ash::user::LoginStatus GetUserLoginStatus() const OVERRIDE;
62 virtual void ChangeProfilePicture() OVERRIDE;
63 virtual const std::string GetEnterpriseDomain() const OVERRIDE;
64 virtual const base::string16 GetEnterpriseMessage() const OVERRIDE;
65 virtual const std::string GetSupervisedUserManager() const OVERRIDE;
66 virtual const base::string16 GetSupervisedUserManagerName() const OVERRIDE;
67 virtual const base::string16 GetSupervisedUserMessage() const OVERRIDE;
68 virtual bool IsUserSupervised() const OVERRIDE;
69 virtual bool SystemShouldUpgrade() const OVERRIDE;
70 virtual base::HourClockType GetHourClockType() const OVERRIDE;
71 virtual void ShowSettings() OVERRIDE;
72 virtual bool ShouldShowSettings() OVERRIDE;
73 virtual void ShowDateSettings() OVERRIDE;
74 virtual void ShowSetTimeDialog() OVERRIDE;
75 virtual void ShowNetworkSettings(const std::string& service_path) OVERRIDE;
76 virtual void ShowBluetoothSettings() OVERRIDE;
77 virtual void ShowDisplaySettings() OVERRIDE;
78 virtual void ShowChromeSlow() OVERRIDE;
79 virtual bool ShouldShowDisplayNotification() OVERRIDE;
80 virtual void ShowIMESettings() OVERRIDE;
81 virtual void ShowHelp() OVERRIDE;
82 virtual void ShowAccessibilityHelp() OVERRIDE;
83 virtual void ShowAccessibilitySettings() OVERRIDE;
84 virtual void ShowPublicAccountInfo() OVERRIDE;
85 virtual void ShowSupervisedUserInfo() OVERRIDE;
86 virtual void ShowEnterpriseInfo() OVERRIDE;
87 virtual void ShowUserLogin() OVERRIDE;
88 virtual bool ShowSpringChargerReplacementDialog() OVERRIDE;
89 virtual bool IsSpringChargerReplacementDialogVisible() OVERRIDE;
90 virtual bool HasUserConfirmedSafeSpringCharger() OVERRIDE;
91 virtual void ShutDown() OVERRIDE;
92 virtual void SignOut() OVERRIDE;
93 virtual void RequestLockScreen() OVERRIDE;
94 virtual void RequestRestartForUpdate() OVERRIDE;
95 virtual void GetAvailableBluetoothDevices(ash::BluetoothDeviceList* list)
97 virtual void BluetoothStartDiscovering() OVERRIDE;
98 virtual void BluetoothStopDiscovering() OVERRIDE;
99 virtual void ConnectToBluetoothDevice(const std::string& address) OVERRIDE;
100 virtual bool IsBluetoothDiscovering() OVERRIDE;
101 virtual void GetCurrentIME(ash::IMEInfo* info) OVERRIDE;
102 virtual void GetAvailableIMEList(ash::IMEInfoList* list) OVERRIDE;
103 virtual void GetCurrentIMEProperties(ash::IMEPropertyInfoList* list) OVERRIDE;
104 virtual void SwitchIME(const std::string& ime_id) OVERRIDE;
105 virtual void ActivateIMEProperty(const std::string& key) OVERRIDE;
106 virtual void ShowNetworkConfigure(const std::string& network_id) OVERRIDE;
107 virtual bool EnrollNetwork(const std::string& network_id) OVERRIDE;
108 virtual void ManageBluetoothDevices() OVERRIDE;
109 virtual void ToggleBluetooth() OVERRIDE;
110 virtual void ShowMobileSimDialog() OVERRIDE;
111 virtual void ShowMobileSetupDialog(const std::string& service_path) OVERRIDE;
112 virtual void ShowOtherNetworkDialog(const std::string& type) OVERRIDE;
113 virtual bool GetBluetoothAvailable() OVERRIDE;
114 virtual bool GetBluetoothEnabled() OVERRIDE;
115 virtual bool GetBluetoothDiscovering() OVERRIDE;
116 virtual void ChangeProxySettings() OVERRIDE;
117 virtual ash::VolumeControlDelegate* GetVolumeControlDelegate() const OVERRIDE;
118 virtual void SetVolumeControlDelegate(
119 scoped_ptr<ash::VolumeControlDelegate> delegate) OVERRIDE;
120 virtual bool GetSessionStartTime(base::TimeTicks* session_start_time)
122 virtual bool GetSessionLengthLimit(base::TimeDelta* session_length_limit)
124 virtual int GetSystemTrayMenuWidth() OVERRIDE;
125 virtual void ActiveUserWasChanged() OVERRIDE;
126 virtual bool IsSearchKeyMappedToCapsLock() OVERRIDE;
127 virtual ash::tray::UserAccountsDelegate* GetUserAccountsDelegate(
128 const std::string& user_id) OVERRIDE;
130 // browser tests need to call ShouldUse24HourClock().
131 bool GetShouldUse24HourClockForTesting() const;
134 // Should be the same as CrosSettings::ObserverSubscription.
135 typedef base::CallbackList<void(void)>::Subscription
136 CrosSettingsObserverSubscription;
138 ash::SystemTray* GetPrimarySystemTray();
140 ash::SystemTrayNotifier* GetSystemTrayNotifier();
142 void SetProfile(Profile* profile);
144 bool UnsetProfile(Profile* profile);
146 bool ShouldUse24HourClock() const;
148 void UpdateClockType();
150 void UpdateShowLogoutButtonInTray();
152 void UpdateLogoutDialogDuration();
154 void UpdateSessionStartTime();
156 void UpdateSessionLengthLimit();
158 void StopObservingAppWindowRegistry();
160 // Notify observers if the current user has no more open browser or app
162 void NotifyIfLastWindowClosed();
164 // LoginState::Observer overrides.
165 virtual void LoggedInStateChanged() OVERRIDE;
167 // Overridden from SessionManagerClient::Observer.
168 virtual void ScreenIsLocked() OVERRIDE;
169 virtual void ScreenIsUnlocked() OVERRIDE;
171 gfx::NativeWindow GetNativeWindow() const;
173 // content::NotificationObserver implementation.
174 virtual void Observe(int type,
175 const content::NotificationSource& source,
176 const content::NotificationDetails& details) OVERRIDE;
178 void OnLanguageRemapSearchKeyToChanged();
180 void OnAccessibilityModeChanged(
181 ash::AccessibilityNotificationVisibility notify);
183 void UpdatePerformanceTracing();
185 // Overridden from InputMethodManager::Observer.
186 virtual void InputMethodChanged(input_method::InputMethodManager* manager,
187 bool show_message) OVERRIDE;
189 // Overridden from InputMethodMenuManager::Observer.
190 virtual void InputMethodMenuItemChanged(
191 ash::ime::InputMethodMenuManager* manager) OVERRIDE;
193 // Overridden from CrasAudioHandler::AudioObserver.
194 virtual void OnOutputVolumeChanged() OVERRIDE;
195 virtual void OnOutputMuteChanged() OVERRIDE;
196 virtual void OnInputGainChanged() OVERRIDE;
197 virtual void OnInputMuteChanged() OVERRIDE;
198 virtual void OnAudioNodesChanged() OVERRIDE;
199 virtual void OnActiveOutputNodeChanged() OVERRIDE;
200 virtual void OnActiveInputNodeChanged() OVERRIDE;
202 // Overridden from BluetoothAdapter::Observer.
203 virtual void AdapterPresentChanged(device::BluetoothAdapter* adapter,
204 bool present) OVERRIDE;
205 virtual void AdapterPoweredChanged(device::BluetoothAdapter* adapter,
206 bool powered) OVERRIDE;
207 virtual void AdapterDiscoveringChanged(device::BluetoothAdapter* adapter,
208 bool discovering) OVERRIDE;
209 virtual void DeviceAdded(device::BluetoothAdapter* adapter,
210 device::BluetoothDevice* device) OVERRIDE;
211 virtual void DeviceChanged(device::BluetoothAdapter* adapter,
212 device::BluetoothDevice* device) OVERRIDE;
213 virtual void DeviceRemoved(device::BluetoothAdapter* adapter,
214 device::BluetoothDevice* device) OVERRIDE;
216 void OnStartBluetoothDiscoverySession(
217 scoped_ptr<device::BluetoothDiscoverySession> discovery_session);
219 void UpdateEnterpriseDomain();
221 // Overridden from CloudPolicyStore::Observer
222 virtual void OnStoreLoaded(policy::CloudPolicyStore* store) OVERRIDE;
223 virtual void OnStoreError(policy::CloudPolicyStore* store) OVERRIDE;
225 // Overridden from ash::SessionStateObserver
226 virtual void UserAddedToSession(const std::string& user_id) OVERRIDE;
228 // Overridden from chrome::BrowserListObserver:
229 virtual void OnBrowserRemoved(Browser* browser) OVERRIDE;
231 // Overridden from extensions::AppWindowRegistry::Observer:
232 virtual void OnAppWindowRemoved(extensions::AppWindow* app_window) OVERRIDE;
234 void OnAccessibilityStatusChanged(
235 const AccessibilityStatusEventDetails& details);
237 scoped_ptr<content::NotificationRegistrar> registrar_;
238 scoped_ptr<PrefChangeRegistrar> local_state_registrar_;
239 scoped_ptr<PrefChangeRegistrar> user_pref_registrar_;
240 Profile* user_profile_;
241 base::HourClockType clock_type_;
242 int search_key_mapped_to_;
244 bool have_session_start_time_;
245 base::TimeTicks session_start_time_;
246 bool have_session_length_limit_;
247 base::TimeDelta session_length_limit_;
248 std::string enterprise_domain_;
249 bool should_run_bluetooth_discovery_;
251 scoped_refptr<device::BluetoothAdapter> bluetooth_adapter_;
252 scoped_ptr<device::BluetoothDiscoverySession> bluetooth_discovery_session_;
253 scoped_ptr<ash::VolumeControlDelegate> volume_control_delegate_;
254 scoped_ptr<CrosSettingsObserverSubscription> device_settings_observer_;
255 scoped_ptr<AccessibilityStatusSubscription> accessibility_subscription_;
256 base::ScopedPtrHashMap<std::string, ash::tray::UserAccountsDelegate>
259 base::WeakPtrFactory<SystemTrayDelegateChromeOS> weak_ptr_factory_;
261 DISALLOW_COPY_AND_ASSIGN(SystemTrayDelegateChromeOS);
264 ash::SystemTrayDelegate* CreateSystemTrayDelegate();
266 } // namespace chromeos
267 #endif // CHROME_BROWSER_UI_ASH_SYSTEM_TRAY_DELEGATE_CHROMEOS_H_