Index: chrome/browser/ui/webui/options/chromeos/bluetooth_options_handler.cc |
diff --git a/chrome/browser/ui/webui/options/chromeos/bluetooth_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/bluetooth_options_handler.cc |
index 847e29a163852b853fc78a7c74b5ef3eeaa02d05..d3ab23c22ae86c816ee3edcef382e532a6f8088f 100644 |
--- a/chrome/browser/ui/webui/options/chromeos/bluetooth_options_handler.cc |
+++ b/chrome/browser/ui/webui/options/chromeos/bluetooth_options_handler.cc |
@@ -8,6 +8,7 @@ |
#include "base/command_line.h" |
#include "base/utf_string_conversions.h" |
#include "base/values.h" |
+#include "chrome/browser/chromeos/bluetooth/bluetooth_device.h" |
#include "chrome/browser/chromeos/system/runtime_environment.h" |
#include "chrome/browser/ui/webui/options/chromeos/system_settings_provider.h" |
#include "chrome/common/chrome_switches.h" |
@@ -23,7 +24,23 @@ BluetoothOptionsHandler::BluetoothOptionsHandler() |
} |
BluetoothOptionsHandler::~BluetoothOptionsHandler() { |
- // TODO(kevers): Shutdown bluetooth. |
+ if (!CommandLine::ForCurrentProcess() |
+ ->HasSwitch(switches::kEnableBluetooth)) { |
+ return; |
+ } |
+ |
+ chromeos::BluetoothManager* bluetooth_manager = |
+ chromeos::BluetoothManager::GetInstance(); |
+ DCHECK(bluetooth_manager); |
+ |
+ chromeos::BluetoothAdapter* default_adapter = |
+ bluetooth_manager->DefaultAdapter(); |
+ |
+ if (default_adapter != NULL) { |
+ default_adapter->RemoveObserver(this); |
+ } |
+ |
+ bluetooth_manager->RemoveObserver(this); |
} |
void BluetoothOptionsHandler::GetLocalizedValues( |
@@ -52,14 +69,22 @@ void BluetoothOptionsHandler::Initialize() { |
DCHECK(web_ui_); |
// Bluetooth support is a work in progress. Supress the feature unless |
// explicitly enabled via a command line flag. |
- // TODO(kevers): Test for presence of bluetooth hardware. |
if (!CommandLine::ForCurrentProcess() |
->HasSwitch(switches::kEnableBluetooth)) { |
return; |
} |
+ |
web_ui_->CallJavascriptFunction( |
"options.SystemOptions.showBluetoothSettings"); |
- // TODO(kevers): Initialize bluetooth. |
+ |
+ chromeos::BluetoothManager* bluetooth_manager = |
+ chromeos::BluetoothManager::GetInstance(); |
+ DCHECK(bluetooth_manager); |
+ bluetooth_manager->AddObserver(this); |
+ |
+ chromeos::BluetoothAdapter* default_adapter = |
+ bluetooth_manager->DefaultAdapter(); |
+ DefaultAdapterChanged(default_adapter); |
} |
void BluetoothOptionsHandler::RegisterMessages() { |
@@ -88,7 +113,22 @@ void BluetoothOptionsHandler::FindDevicesCallback( |
GenerateFakeDeviceList(); |
return; |
} |
- // TODO(kevers): Fetch real Bluetooth devices. |
+ |
+ chromeos::BluetoothManager* bluetooth_manager = |
+ chromeos::BluetoothManager::GetInstance(); |
+ DCHECK(bluetooth_manager); |
+ |
+ chromeos::BluetoothAdapter* default_adapter = |
+ bluetooth_manager->DefaultAdapter(); |
+ |
+ ValidateDefaultAdapter(default_adapter); |
+ |
+ if (default_adapter == NULL) { |
+ VLOG(1) << "FindDevicesCallback: no default adapter"; |
+ return; |
+ } |
+ |
+ default_adapter->StartDiscovery(); |
} |
void BluetoothOptionsHandler::UpdateDeviceCallback( |
@@ -102,6 +142,91 @@ void BluetoothOptionsHandler::DeviceNotification( |
"options.SystemOptions.addBluetoothDevice", device); |
} |
+void BluetoothOptionsHandler::DefaultAdapterChanged( |
+ chromeos::BluetoothAdapter* adapter) { |
+ std::string old_default_adapter_id = default_adapter_id_; |
+ |
+ if (adapter == NULL) { |
+ default_adapter_id_.clear(); |
+ VLOG(2) << "DefaultAdapterChanged: no default bluetooth adapter"; |
+ } else { |
+ default_adapter_id_ = adapter->Id(); |
+ VLOG(2) << "DefaultAdapterChanged: " << default_adapter_id_; |
+ } |
+ |
+ if (default_adapter_id_ == old_default_adapter_id) { |
+ return; |
+ } |
+ |
+ if (adapter != NULL) { |
+ adapter->AddObserver(this); |
+ } |
+ |
+ // TODO(vlaviano): Respond to adapter change. |
+} |
+ |
+void BluetoothOptionsHandler::DiscoveryStarted(const std::string& adapter_id) { |
+ VLOG(2) << "Discovery started on " << adapter_id; |
+} |
+ |
+void BluetoothOptionsHandler::DiscoveryEnded(const std::string& adapter_id) { |
+ VLOG(2) << "Discovery ended on " << adapter_id; |
+ web_ui_->CallJavascriptFunction( |
+ "options.SystemOptions.notifyBluetoothSearchComplete"); |
+ |
+ // Stop the discovery session. |
+ // TODO(vlaviano): We may want to expose DeviceDisappeared, remove the |
+ // "Find devices" button, and let the discovery session continue throughout |
+ // the time that the page is visible rather than just doing a single discovery |
+ // cycle in response to a button click. |
+ chromeos::BluetoothManager* bluetooth_manager = |
+ chromeos::BluetoothManager::GetInstance(); |
+ DCHECK(bluetooth_manager); |
+ |
+ chromeos::BluetoothAdapter* default_adapter = |
+ bluetooth_manager->DefaultAdapter(); |
+ |
+ ValidateDefaultAdapter(default_adapter); |
+ |
+ if (default_adapter == NULL) { |
+ VLOG(1) << "DiscoveryEnded: no default adapter"; |
+ return; |
+ } |
+ |
+ default_adapter->StopDiscovery(); |
+} |
+ |
+void BluetoothOptionsHandler::DeviceFound(const std::string& adapter_id, |
+ chromeos::BluetoothDevice* device) { |
+ VLOG(2) << "Device found on " << adapter_id; |
+ DCHECK(device); |
+ |
+ // TODO(vlaviano): eliminate inconsistencies between the javascript rep and |
+ // BluetoothDevice so that we can use BluetoothDevice::AsDictionary() here. |
+ DictionaryValue device_js_rep; |
+ device_js_rep.SetString("deviceName", device->GetName()); |
+ device_js_rep.SetString("deviceId", device->GetAddress()); |
+ device_js_rep.SetString("deviceType", device->GetIcon()); |
+ if (device->IsPaired()) { |
+ device_js_rep.SetString("deviceStatus", "bluetoothDeviceConnected"); |
+ } else { |
+ device_js_rep.SetString("deviceStatus", "bluetoothDeviceNotPaired"); |
+ } |
+ |
+ web_ui_->CallJavascriptFunction( |
+ "options.SystemOptions.addBluetoothDevice", device_js_rep); |
+} |
+ |
+void BluetoothOptionsHandler::ValidateDefaultAdapter( |
+ chromeos::BluetoothAdapter* adapter) { |
+ if ((adapter == NULL && !default_adapter_id_.empty()) || |
+ (adapter != NULL && default_adapter_id_ != adapter->Id())) { |
+ VLOG(1) << "unexpected default adapter change from \"" |
+ << default_adapter_id_ << "\" to \"" << adapter->Id() << "\""; |
+ DefaultAdapterChanged(adapter); |
+ } |
+} |
+ |
void BluetoothOptionsHandler::GenerateFakeDeviceList() { |
// TODO(kevers): Send notifications asynchronously simulating that the |
// process of discovering bluetooth devices takes time. |
@@ -125,5 +250,4 @@ void BluetoothOptionsHandler::GenerateFakeDeviceList() { |
"options.SystemOptions.notifyBluetoothSearchComplete"); |
} |
-} |
- |
+} // namespace chromeos |