OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/webui/options/chromeos/system_options_handler.h" | 5 #include "chrome/browser/ui/webui/options/chromeos/system_options_handler.h" |
6 | 6 |
7 #include <string> | |
8 | |
9 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
10 #include "base/bind.h" | 8 #include "base/bind.h" |
11 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
12 #include "base/command_line.h" | 10 #include "base/command_line.h" |
13 #include "base/json/json_value_serializer.h" | 11 #include "base/json/json_value_serializer.h" |
14 #include "base/string_number_conversions.h" | 12 #include "base/string_number_conversions.h" |
15 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
16 #include "base/values.h" | 14 #include "base/values.h" |
17 #include "content/browser/tab_contents/tab_contents.h" | 15 #include "content/browser/tab_contents/tab_contents.h" |
18 #include "chrome/browser/browser_process.h" | 16 #include "chrome/browser/browser_process.h" |
19 #include "chrome/browser/chromeos/accessibility_util.h" | 17 #include "chrome/browser/chromeos/accessibility_util.h" |
| 18 #include "chrome/browser/chromeos/bluetooth/bluetooth_device.h" |
20 #include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" | 19 #include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" |
21 #include "chrome/browser/chromeos/dbus/power_manager_client.h" | 20 #include "chrome/browser/chromeos/dbus/power_manager_client.h" |
22 #include "chrome/browser/chromeos/language_preferences.h" | 21 #include "chrome/browser/chromeos/language_preferences.h" |
| 22 #include "chrome/browser/chromeos/system/runtime_environment.h" |
23 #include "chrome/browser/extensions/extension_service.h" | 23 #include "chrome/browser/extensions/extension_service.h" |
24 #include "chrome/browser/prefs/pref_service.h" | 24 #include "chrome/browser/prefs/pref_service.h" |
25 #include "chrome/browser/profiles/profile.h" | 25 #include "chrome/browser/profiles/profile.h" |
26 #include "chrome/browser/ui/webui/options/chromeos/system_settings_provider.h" | 26 #include "chrome/browser/ui/webui/options/chromeos/system_settings_provider.h" |
27 #include "chrome/common/chrome_switches.h" | 27 #include "chrome/common/chrome_switches.h" |
28 #include "chrome/common/pref_names.h" | 28 #include "chrome/common/pref_names.h" |
29 #include "chrome/common/extensions/extension.h" | 29 #include "chrome/common/extensions/extension.h" |
30 #include "grit/browser_resources.h" | 30 #include "grit/browser_resources.h" |
31 #include "grit/chromium_strings.h" | 31 #include "grit/chromium_strings.h" |
32 #include "grit/generated_resources.h" | 32 #include "grit/generated_resources.h" |
33 #include "grit/locale_settings.h" | 33 #include "grit/locale_settings.h" |
34 #include "grit/theme_resources.h" | 34 #include "grit/theme_resources.h" |
35 #include "ui/base/l10n/l10n_util.h" | 35 #include "ui/base/l10n/l10n_util.h" |
36 #include "ui/base/resource/resource_bundle.h" | 36 #include "ui/base/resource/resource_bundle.h" |
37 | 37 |
38 SystemOptionsHandler::SystemOptionsHandler() | 38 SystemOptionsHandler::SystemOptionsHandler() |
39 : chromeos::CrosOptionsPageUIHandler( | 39 : chromeos::CrosOptionsPageUIHandler( |
40 new chromeos::SystemSettingsProvider()) { | 40 new chromeos::SystemSettingsProvider()) { |
41 } | 41 } |
42 | 42 |
43 SystemOptionsHandler::~SystemOptionsHandler() { | 43 SystemOptionsHandler::~SystemOptionsHandler() { |
| 44 ShutdownBluetooth(); |
44 } | 45 } |
45 | 46 |
46 void SystemOptionsHandler::GetLocalizedValues( | 47 void SystemOptionsHandler::GetLocalizedValues( |
47 DictionaryValue* localized_strings) { | 48 DictionaryValue* localized_strings) { |
48 DCHECK(localized_strings); | 49 DCHECK(localized_strings); |
49 | 50 |
50 RegisterTitle(localized_strings, "systemPage", IDS_OPTIONS_SYSTEM_TAB_LABEL); | 51 RegisterTitle(localized_strings, "systemPage", IDS_OPTIONS_SYSTEM_TAB_LABEL); |
51 localized_strings->SetString("datetimeTitle", | 52 localized_strings->SetString("datetimeTitle", |
52 l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_SECTION_TITLE_DATETIME)); | 53 l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_SECTION_TITLE_DATETIME)); |
53 localized_strings->SetString("timezone", | 54 localized_strings->SetString("timezone", |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 settings_provider_.get())->GetTimezoneList()); | 117 settings_provider_.get())->GetTimezoneList()); |
117 } | 118 } |
118 | 119 |
119 void SystemOptionsHandler::Initialize() { | 120 void SystemOptionsHandler::Initialize() { |
120 DCHECK(web_ui_); | 121 DCHECK(web_ui_); |
121 PrefService* pref_service = g_browser_process->local_state(); | 122 PrefService* pref_service = g_browser_process->local_state(); |
122 bool acc_enabled = pref_service->GetBoolean(prefs::kAccessibilityEnabled); | 123 bool acc_enabled = pref_service->GetBoolean(prefs::kAccessibilityEnabled); |
123 base::FundamentalValue checked(acc_enabled); | 124 base::FundamentalValue checked(acc_enabled); |
124 web_ui_->CallJavascriptFunction( | 125 web_ui_->CallJavascriptFunction( |
125 "options.SystemOptions.SetAccessibilityCheckboxState", checked); | 126 "options.SystemOptions.SetAccessibilityCheckboxState", checked); |
126 | 127 InitializeBluetooth(); |
127 // Bluetooth support is a work in progress. Supress the feature unless | |
128 // explicitly enabled via a command line flag. | |
129 // TODO (kevers) - Test for presence of bluetooth hardware. | |
130 if (CommandLine::ForCurrentProcess() | |
131 ->HasSwitch(switches::kEnableBluetooth)) { | |
132 web_ui_->CallJavascriptFunction( | |
133 "options.SystemOptions.showBluetoothSettings"); | |
134 } | |
135 } | 128 } |
136 | 129 |
137 void SystemOptionsHandler::RegisterMessages() { | 130 void SystemOptionsHandler::RegisterMessages() { |
138 DCHECK(web_ui_); | 131 DCHECK(web_ui_); |
139 web_ui_->RegisterMessageCallback("accessibilityChange", | 132 web_ui_->RegisterMessageCallback("accessibilityChange", |
140 base::Bind(&SystemOptionsHandler::AccessibilityChangeCallback, | 133 base::Bind(&SystemOptionsHandler::AccessibilityChangeCallback, |
141 base::Unretained(this))); | 134 base::Unretained(this))); |
142 | 135 |
143 web_ui_->RegisterMessageCallback("decreaseScreenBrightness", | 136 web_ui_->RegisterMessageCallback("decreaseScreenBrightness", |
144 base::Bind(&SystemOptionsHandler::DecreaseScreenBrightnessCallback, | 137 base::Bind(&SystemOptionsHandler::DecreaseScreenBrightnessCallback, |
(...skipping 27 matching lines...) Expand all Loading... |
172 } | 165 } |
173 | 166 |
174 void SystemOptionsHandler::IncreaseScreenBrightnessCallback( | 167 void SystemOptionsHandler::IncreaseScreenBrightnessCallback( |
175 const ListValue* args) { | 168 const ListValue* args) { |
176 chromeos::DBusThreadManager::Get()->power_manager_client()-> | 169 chromeos::DBusThreadManager::Get()->power_manager_client()-> |
177 IncreaseScreenBrightness(); | 170 IncreaseScreenBrightness(); |
178 } | 171 } |
179 | 172 |
180 void SystemOptionsHandler::BluetoothEnableChangeCallback( | 173 void SystemOptionsHandler::BluetoothEnableChangeCallback( |
181 const ListValue* args) { | 174 const ListValue* args) { |
182 // TODO (kevers) - Call Bluetooth API to enable or disable. | 175 // TODO(kevers) - Call Bluetooth API to enable or disable. |
183 } | 176 } |
184 | 177 |
185 void SystemOptionsHandler::FindBluetoothDevicesCallback( | 178 void SystemOptionsHandler::FindBluetoothDevicesCallback( |
186 const ListValue* args) { | 179 const ListValue* args) { |
187 // TODO (kevers) - Call Bluetooth API to fetch devices. | 180 // We only initiate a scan if we're running on Chrome OS. Otherwise, we |
188 // Generate a fake list until the bluetooth API is ready. | 181 // generate a fake device list. |
189 // Afterwards keep fake list only for cases where emulating | 182 if (!chromeos::system::runtime_environment::IsRunningOnChromeOS()) { |
190 // ChromeOS from the desktop launch. | 183 GenerateFakeDeviceList(); |
191 GenerateFakeDeviceList(); | 184 return; |
| 185 } |
| 186 |
| 187 chromeos::BluetoothManager* bluetooth_manager = |
| 188 chromeos::BluetoothManager::GetInstance(); |
| 189 CHECK(bluetooth_manager != NULL); |
| 190 |
| 191 chromeos::BluetoothAdapter* default_adapter = |
| 192 bluetooth_manager->DefaultAdapter(); |
| 193 |
| 194 if ((default_adapter == NULL && !default_adapter_id_.empty()) || |
| 195 (default_adapter != NULL && |
| 196 default_adapter_id_ != default_adapter->id())) { |
| 197 LOG(WARNING) << "unexpected default adapter change from \"" |
| 198 << default_adapter_id_ << "\" to \"" << default_adapter->id() << "\""; |
| 199 DefaultAdapterChanged(default_adapter); |
| 200 } |
| 201 |
| 202 if (default_adapter == NULL) { |
| 203 LOG(WARNING) << "FindBluetoothDevicesCallback: no default adapter"; |
| 204 return; |
| 205 } |
| 206 |
| 207 default_adapter->StartDiscovery(); |
192 } | 208 } |
193 | 209 |
194 void SystemOptionsHandler::BluetoothDeviceNotification( | 210 void SystemOptionsHandler::BluetoothDeviceNotification( |
195 const DictionaryValue& device) { | 211 const DictionaryValue& device) { |
196 web_ui_->CallJavascriptFunction( | 212 web_ui_->CallJavascriptFunction( |
197 "options.SystemOptions.addBluetoothDevice", device); | 213 "options.SystemOptions.addBluetoothDevice", device); |
198 } | 214 } |
199 | 215 |
| 216 void SystemOptionsHandler::DefaultAdapterChanged( |
| 217 chromeos::BluetoothAdapter* adapter) { |
| 218 std::string old_default_adapter_id = default_adapter_id_; |
| 219 |
| 220 if (adapter == NULL) { |
| 221 default_adapter_id_.clear(); |
| 222 LOG(INFO) << "DefaultAdapterChanged: no default bluetooth adapter"; |
| 223 } else { |
| 224 default_adapter_id_ = adapter->id(); |
| 225 LOG(INFO) << "DefaultAdapterChanged: " << default_adapter_id_; |
| 226 } |
| 227 |
| 228 if (default_adapter_id_ == old_default_adapter_id) { |
| 229 return; |
| 230 } |
| 231 |
| 232 if (adapter != NULL) { |
| 233 adapter->AddObserver(this); |
| 234 } |
| 235 |
| 236 // TODO(vlaviano): Respond to adapter change. |
| 237 } |
| 238 |
| 239 void SystemOptionsHandler::DiscoveryStarted(const std::string& adapter_id) { |
| 240 VLOG(1) << "Discovery started on " << adapter_id; |
| 241 } |
| 242 |
| 243 void SystemOptionsHandler::DiscoveryEnded(const std::string& adapter_id) { |
| 244 VLOG(1) << "Discovery ended on " << adapter_id; |
| 245 web_ui_->CallJavascriptFunction( |
| 246 "options.SystemOptions.notifyBluetoothSearchComplete"); |
| 247 |
| 248 // Stop the discovery session. |
| 249 // TODO(vlaviano): We may want to expose DeviceDisappeared, remove the |
| 250 // "Find devices" button, and let the discovery session continue throughout |
| 251 // the time that the page is visible rather than just doing a single discovery |
| 252 // cycle in response to a button click. |
| 253 chromeos::BluetoothManager* bluetooth_manager = |
| 254 chromeos::BluetoothManager::GetInstance(); |
| 255 CHECK(bluetooth_manager != NULL); |
| 256 |
| 257 chromeos::BluetoothAdapter* default_adapter = |
| 258 bluetooth_manager->DefaultAdapter(); |
| 259 |
| 260 if ((default_adapter == NULL && !default_adapter_id_.empty()) || |
| 261 (default_adapter != NULL && |
| 262 default_adapter_id_ != default_adapter->id())) { |
| 263 LOG(WARNING) << "unexpected default adapter change from \"" |
| 264 << default_adapter_id_ << "\" to \"" << default_adapter->id() << "\""; |
| 265 DefaultAdapterChanged(default_adapter); |
| 266 } |
| 267 |
| 268 if (default_adapter == NULL) { |
| 269 LOG(WARNING) << "FindBluetoothDevicesCallback: no default adapter"; |
| 270 return; |
| 271 } |
| 272 |
| 273 default_adapter->StopDiscovery(); |
| 274 } |
| 275 |
| 276 void SystemOptionsHandler::DeviceFound(const std::string& adapter_id, |
| 277 chromeos::BluetoothDevice* device) { |
| 278 VLOG(1) << "Device found on " << adapter_id; |
| 279 CHECK(device != NULL); |
| 280 |
| 281 // TODO(vlaviano): create more consistency between the UI and the |
| 282 // underlying BluetoothDevice properties so that we can use |
| 283 // BluetoothDevice::dictionary_rep() here. |
| 284 DictionaryValue device_js_rep; |
| 285 device_js_rep.SetString("deviceName", device->name()); |
| 286 device_js_rep.SetString("deviceId", device->address()); |
| 287 device_js_rep.SetString("deviceType", device->icon()); |
| 288 if (device->paired()) { |
| 289 device_js_rep.SetString("deviceStatus", "bluetoothDeviceConnected"); |
| 290 } else { |
| 291 device_js_rep.SetString("deviceStatus", "bluetoothDeviceNotPaired"); |
| 292 } |
| 293 |
| 294 web_ui_->CallJavascriptFunction( |
| 295 "options.SystemOptions.addBluetoothDevice", device_js_rep); |
| 296 } |
| 297 |
| 298 void SystemOptionsHandler::InitializeBluetooth() { |
| 299 // Bluetooth support is a work in progress. Supress the feature unless |
| 300 // explicitly enabled via a command line flag. |
| 301 // TODO(kevers) - Test for presence of bluetooth hardware. |
| 302 if (!CommandLine::ForCurrentProcess() |
| 303 ->HasSwitch(switches::kEnableBluetooth)) { |
| 304 return; |
| 305 } |
| 306 VLOG(1) << "InitializeBluetooth"; |
| 307 |
| 308 web_ui_->CallJavascriptFunction( |
| 309 "options.SystemOptions.showBluetoothSettings"); |
| 310 |
| 311 chromeos::BluetoothManager* bluetooth_manager = |
| 312 chromeos::BluetoothManager::GetInstance(); |
| 313 CHECK(bluetooth_manager != NULL); |
| 314 bluetooth_manager->AddObserver(this); |
| 315 |
| 316 chromeos::BluetoothAdapter* default_adapter = |
| 317 bluetooth_manager->DefaultAdapter(); |
| 318 DefaultAdapterChanged(default_adapter); |
| 319 } |
| 320 |
| 321 void SystemOptionsHandler::ShutdownBluetooth() { |
| 322 if (!CommandLine::ForCurrentProcess() |
| 323 ->HasSwitch(switches::kEnableBluetooth)) { |
| 324 return; |
| 325 } |
| 326 VLOG(1) << "ShutdownBluetooth"; |
| 327 |
| 328 chromeos::BluetoothManager* bluetooth_manager = |
| 329 chromeos::BluetoothManager::GetInstance(); |
| 330 CHECK(bluetooth_manager != NULL); |
| 331 |
| 332 chromeos::BluetoothAdapter* default_adapter = |
| 333 bluetooth_manager->DefaultAdapter(); |
| 334 |
| 335 if (default_adapter != NULL) { |
| 336 default_adapter->RemoveObserver(this); |
| 337 } |
| 338 |
| 339 bluetooth_manager->RemoveObserver(this); |
| 340 } |
| 341 |
200 void SystemOptionsHandler::GenerateFakeDeviceList() { | 342 void SystemOptionsHandler::GenerateFakeDeviceList() { |
201 // TODO (kevers) - Send notifications asynchronously simulating that the | 343 // TODO(kevers) - Send notifications asynchronously simulating that the |
202 // process of discovering bluetooth devices takes time. | 344 // process of discovering bluetooth devices takes time. |
203 // Fire each notification using OneShotTimer with a | 345 // Fire each notification using OneShotTimer with a |
204 // varying delay. | 346 // varying delay. |
205 std::string data[9] = { | 347 std::string data[9] = { |
206 "Fake Wireless Keyboard", "01-02-03-04-05", "keyboard", | 348 "Fake Wireless Keyboard", "01-02-03-04-05", "keyboard", |
207 "Fake Wireless Mouse", "02-03-04-05-01", "mouse", | 349 "Fake Wireless Mouse", "02-03-04-05-01", "mouse", |
208 "Fake Wireless Headset", "03-04-05-01-02", "headset"}; | 350 "Fake Wireless Headset", "03-04-05-01-02", "headset"}; |
209 | 351 |
210 for (int i = 0; i < 3; i++) { | 352 for (int i = 0; i < 3; i++) { |
211 DictionaryValue device; | 353 DictionaryValue device; |
212 device.SetString("deviceName", data[3*i]); | 354 device.SetString("deviceName", data[3*i]); |
213 device.SetString("deviceId", data[3*i+1]); | 355 device.SetString("deviceId", data[3*i+1]); |
214 device.SetString("deviceType", data[3*i+2]); | 356 device.SetString("deviceType", data[3*i+2]); |
215 device.SetString("deviceStatus", "bluetoothDeviceNotPaired"); | 357 device.SetString("deviceStatus", "bluetoothDeviceNotPaired"); |
216 web_ui_->CallJavascriptFunction( | 358 web_ui_->CallJavascriptFunction( |
217 "options.SystemOptions.addBluetoothDevice", device); | 359 "options.SystemOptions.addBluetoothDevice", device); |
218 } | 360 } |
219 web_ui_->CallJavascriptFunction( | 361 web_ui_->CallJavascriptFunction( |
220 "options.SystemOptions.notifyBluetoothSearchComplete"); | 362 "options.SystemOptions.notifyBluetoothSearchComplete"); |
221 } | 363 } |
OLD | NEW |