blob: fcfcd1e7a66d3840cce189307aaeb64481663df3 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_WEBUI_OPTIONS_CHROMEOS_BLUETOOTH_OPTIONS_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_OPTIONS_CHROMEOS_BLUETOOTH_OPTIONS_HANDLER_H_
#include <string>
#include "base/callback.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ui/webui/options/options_ui.h"
#include "device/bluetooth/bluetooth_adapter.h"
#include "device/bluetooth/bluetooth_device.h"
#include "device/bluetooth/bluetooth_discovery_session.h"
namespace base {
class DictionaryValue;
}
namespace chromeos {
namespace options {
// Handler for Bluetooth options on the system options page.
class BluetoothOptionsHandler
: public ::options::OptionsPageUIHandler,
public device::BluetoothAdapter::Observer,
public device::BluetoothDevice::PairingDelegate {
public:
BluetoothOptionsHandler();
virtual ~BluetoothOptionsHandler();
// OptionsPageUIHandler implementation.
virtual void GetLocalizedValues(
base::DictionaryValue* localized_strings) OVERRIDE;
virtual void RegisterMessages() OVERRIDE;
virtual void InitializeHandler() OVERRIDE;
virtual void InitializePage() OVERRIDE;
void InitializeAdapter(scoped_refptr<device::BluetoothAdapter> adapter);
// Sends a notification to the Web UI of the status of a Bluetooth device.
// |device| is the Bluetooth device.
// |params| is an optional set of parameters.
void SendDeviceNotification(const device::BluetoothDevice* device,
base::DictionaryValue* params);
// device::BluetoothDevice::PairingDelegate override.
//
// This method will be called when the Bluetooth daemon requires a
// PIN Code for authentication of the device |device|, the UI will display
// a blank entry form to obtain the PIN code from the user.
//
// PIN Codes are generally required for Bluetooth 2.0 and earlier devices
// for which there is no automatic pairing or special handling.
virtual void RequestPinCode(device::BluetoothDevice* device) OVERRIDE;
// device::BluetoothDevice::PairingDelegate override.
//
// This method will be called when the Bluetooth daemon requires a
// Passkey for authentication of the device |device|, the UI will display
// a blank entry form to obtain the passkey from the user (a numeric in the
// range 0-999999).
//
// Passkeys are generally required for Bluetooth 2.1 and later devices
// which cannot provide input or display on their own, and don't accept
// passkey-less pairing.
virtual void RequestPasskey(device::BluetoothDevice* device) OVERRIDE;
// device::BluetoothDevice::PairingDelegate override.
//
// This method will be called when the Bluetooth daemon requires that the
// user enter the PIN code |pincode| into the device |device| so that it
// may be authenticated, the UI will display the PIN code with accompanying
// instructions.
//
// This is used for Bluetooth 2.0 and earlier keyboard devices, the
// |pincode| will always be a six-digit numeric in the range 000000-999999
// for compatibilty with later specifications.
virtual void DisplayPinCode(device::BluetoothDevice* device,
const std::string& pincode) OVERRIDE;
// device::BluetoothDevice::PairingDelegate override.
//
// This method will be called when the Bluetooth daemon requires that the
// user enter the Passkey |passkey| into the device |device| so that it
// may be authenticated, the UI will display the passkey with accompanying
// instructions.
//
// This is used for Bluetooth 2.1 and later devices that support input
// but not display, such as keyboards. The Passkey is a numeric in the
// range 0-999999 and should be always presented zero-padded to six
// digits.
virtual void DisplayPasskey(
device::BluetoothDevice* device, uint32 passkey) OVERRIDE;
// device::BluetoothDevice::PairingDelegate override.
//
// This method will be called when the Bluetooth daemon gets a notification
// of a key entered on the device |device| while pairing with the device
// using a PIN code or a Passkey.
//
// The UI will show a visual indication that a given key was pressed in the
// same pairing overlay where the PIN code or Passkey is displayed.
//
// A first call with |entered| as 0 will indicate that this notification
// mechanism is supported by the device allowing the UI to display this fact.
// A last call with |entered| as the length of the key plus one will indicate
// that the [enter] key was pressed.
virtual void KeysEntered(device::BluetoothDevice* device,
uint32 entered) OVERRIDE;
// device::BluetoothDevice::PairingDelegate override.
//
// This method will be called when the Bluetooth daemon requires that the
// user confirm that the Passkey |passkey| is displayed on the screen
// of the device |device| so that it may be authenticated, the UI will
// display the passkey with accompanying instructions.
//
// This is used for Bluetooth 2.1 and later devices that support display,
// such as other computers or phones. The Passkey is a numeric in the
// range 0-999999 and should be always present zero-padded to six
// digits.
virtual void ConfirmPasskey(
device::BluetoothDevice* device, uint32 passkey) OVERRIDE;
// device::BluetoothDevice::PairingDelegate override.
virtual void AuthorizePairing(device::BluetoothDevice* device) OVERRIDE;
// Displays a Bluetooth error.
// |error| maps to a localized resource for the error message.
// |address| is the address of the Bluetooth device. May be an empty
// string if the error is not specific to a single device.
void ReportError(const std::string& error, const std::string& address);
// device::BluetoothAdapter::Observer implementation.
virtual void AdapterPresentChanged(device::BluetoothAdapter* adapter,
bool present) OVERRIDE;
virtual void AdapterPoweredChanged(device::BluetoothAdapter* adapter,
bool powered) OVERRIDE;
virtual void AdapterDiscoveringChanged(device::BluetoothAdapter* adapter,
bool discovering) OVERRIDE;
virtual void DeviceAdded(device::BluetoothAdapter* adapter,
device::BluetoothDevice* device) OVERRIDE;
virtual void DeviceChanged(device::BluetoothAdapter* adapter,
device::BluetoothDevice* device) OVERRIDE;
virtual void DeviceRemoved(device::BluetoothAdapter* adapter,
device::BluetoothDevice* device) OVERRIDE;
private:
// Displays in the UI a connecting to the device |device| message.
void DeviceConnecting(device::BluetoothDevice* device);
// Called by device::BluetoothAdapter in response to a failure to
// change the power status of the adapter.
void EnableChangeError();
// Called by device::BluetoothAdapter in response to a successful request
// to initiate a discovery session.
void OnStartDiscoverySession(
scoped_ptr<device::BluetoothDiscoverySession> discovery_session);
// Called by device::BluetoothAdapter in response to a failure to
// initiate a discovery session.
void FindDevicesError();
// Called by device::BluetoothAdapter in response to a failure to
// terminate a discovery session.
void StopDiscoveryError();
// Called by device::BluetoothDevice on a successful pairing and connection
// to a device.
void Connected();
// Called by device::BluetoothDevice in response to a failure to
// connect to the device with bluetooth address |address| due to an error
// encoded in |error_code|.
void ConnectError(const std::string& address,
device::BluetoothDevice::ConnectErrorCode error_code);
// Called by device::BluetoothDevice in response to a failure to
// disconnect the device with bluetooth address |address|.
void DisconnectError(const std::string& address);
// Called by device::BluetoothDevice in response to a failure to
// disconnect and unpair the device with bluetooth address |address|.
void ForgetError(const std::string& address);
// Called when the 'Enable bluetooth' checkbox value is changed.
// |args| will contain the checkbox checked state as a string
// ("true" or "false").
void EnableChangeCallback(const base::ListValue* args);
// Called when the 'Find Devices' button is pressed from the Bluetooth
// ssettings.
// |args| will be an empty list.
void FindDevicesCallback(const base::ListValue* args);
// Called when the user requests to connect to or disconnect from a Bluetooth
// device.
// |args| will be a list containing two or three arguments, the first argument
// is the device ID and the second is the requested action. If a third
// argument is present, it is the passkey for pairing confirmation.
void UpdateDeviceCallback(const base::ListValue* args);
// Called when the "Add a device" dialog closes to stop the discovery
// process.
// |args| will be an empty list.
void StopDiscoveryCallback(const base::ListValue* args);
// Called when the list of paired devices is initialized in order to
// populate the list.
// |args| will be an empty list.
void GetPairedDevicesCallback(const base::ListValue* args);
// Default bluetooth adapter, used for all operations.
scoped_refptr<device::BluetoothAdapter> adapter_;
// True, if the UI has requested device discovery. False, if either no device
// discovery was requested or the dialog responsible for device discovery was
// dismissed.
bool should_run_device_discovery_;
// The current device discovery session. Only one active discovery session is
// kept at a time and the instance that |discovery_session_| points to gets
// replaced by a new one when a new discovery session is initiated.
scoped_ptr<device::BluetoothDiscoverySession> discovery_session_;
// Cached information about the current pairing device, if any.
std::string pairing_device_address_;
std::string pairing_device_pairing_;
std::string pairing_device_pincode_;
int pairing_device_passkey_;
int pairing_device_entered_;
// Weak pointer factory for generating 'this' pointers that might live longer
// than this object does.
base::WeakPtrFactory<BluetoothOptionsHandler> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(BluetoothOptionsHandler);
};
} // namespace options
} // namespace chromeos
#endif // CHROME_BROWSER_UI_WEBUI_OPTIONS_CHROMEOS_BLUETOOTH_OPTIONS_HANDLER_H_