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.
4
5#ifndef CHROME_BROWSER_UI_ASH_SYSTEM_TRAY_DELEGATE_CHROMEOS_H_
6#define CHROME_BROWSER_UI_ASH_SYSTEM_TRAY_DELEGATE_CHROMEOS_H_
7
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"
33
34namespace chromeos {
35
36class 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 {
49 public:
50  SystemTrayDelegateChromeOS();
51
52  virtual ~SystemTrayDelegateChromeOS();
53
54  void InitializeOnAdapterReady(
55      scoped_refptr<device::BluetoothAdapter> adapter);
56
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)
96      OVERRIDE;
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)
121      OVERRIDE;
122  virtual bool GetSessionLengthLimit(base::TimeDelta* session_length_limit)
123      OVERRIDE;
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;
129
130  // browser tests need to call ShouldUse24HourClock().
131  bool GetShouldUse24HourClockForTesting() const;
132
133 private:
134  // Should be the same as CrosSettings::ObserverSubscription.
135  typedef base::CallbackList<void(void)>::Subscription
136      CrosSettingsObserverSubscription;
137
138  ash::SystemTray* GetPrimarySystemTray();
139
140  ash::SystemTrayNotifier* GetSystemTrayNotifier();
141
142  void SetProfile(Profile* profile);
143
144  bool UnsetProfile(Profile* profile);
145
146  bool ShouldUse24HourClock() const;
147
148  void UpdateClockType();
149
150  void UpdateShowLogoutButtonInTray();
151
152  void UpdateLogoutDialogDuration();
153
154  void UpdateSessionStartTime();
155
156  void UpdateSessionLengthLimit();
157
158  void StopObservingAppWindowRegistry();
159
160  // Notify observers if the current user has no more open browser or app
161  // windows.
162  void NotifyIfLastWindowClosed();
163
164  // LoginState::Observer overrides.
165  virtual void LoggedInStateChanged() OVERRIDE;
166
167  // Overridden from SessionManagerClient::Observer.
168  virtual void ScreenIsLocked() OVERRIDE;
169  virtual void ScreenIsUnlocked() OVERRIDE;
170
171  gfx::NativeWindow GetNativeWindow() const;
172
173  // content::NotificationObserver implementation.
174  virtual void Observe(int type,
175                       const content::NotificationSource& source,
176                       const content::NotificationDetails& details) OVERRIDE;
177
178  void OnLanguageRemapSearchKeyToChanged();
179
180  void OnAccessibilityModeChanged(
181      ash::AccessibilityNotificationVisibility notify);
182
183  void UpdatePerformanceTracing();
184
185  // Overridden from InputMethodManager::Observer.
186  virtual void InputMethodChanged(input_method::InputMethodManager* manager,
187                                  bool show_message) OVERRIDE;
188
189  // Overridden from InputMethodMenuManager::Observer.
190  virtual void InputMethodMenuItemChanged(
191      ash::ime::InputMethodMenuManager* manager) OVERRIDE;
192
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;
201
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;
215
216  void OnStartBluetoothDiscoverySession(
217      scoped_ptr<device::BluetoothDiscoverySession> discovery_session);
218
219  void UpdateEnterpriseDomain();
220
221  // Overridden from CloudPolicyStore::Observer
222  virtual void OnStoreLoaded(policy::CloudPolicyStore* store) OVERRIDE;
223  virtual void OnStoreError(policy::CloudPolicyStore* store) OVERRIDE;
224
225  // Overridden from ash::SessionStateObserver
226  virtual void UserAddedToSession(const std::string& user_id) OVERRIDE;
227
228  // Overridden from chrome::BrowserListObserver:
229  virtual void OnBrowserRemoved(Browser* browser) OVERRIDE;
230
231  // Overridden from extensions::AppWindowRegistry::Observer:
232  virtual void OnAppWindowRemoved(extensions::AppWindow* app_window) OVERRIDE;
233
234  void OnAccessibilityStatusChanged(
235      const AccessibilityStatusEventDetails& details);
236
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_;
243  bool screen_locked_;
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_;
250
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>
257      accounts_delegates_;
258
259  base::WeakPtrFactory<SystemTrayDelegateChromeOS> weak_ptr_factory_;
260
261  DISALLOW_COPY_AND_ASSIGN(SystemTrayDelegateChromeOS);
262};
263
264ash::SystemTrayDelegate* CreateSystemTrayDelegate();
265
266}  // namespace chromeos
267#endif  // CHROME_BROWSER_UI_ASH_SYSTEM_TRAY_DELEGATE_CHROMEOS_H_
268