| Index: chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
 | 
| diff --git a/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
 | 
| index 7d562da0bf4effe19da6c18742f5eebe68c252a2..896354a0925ee2214396912588807544ad279117 100644
 | 
| --- a/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
 | 
| +++ b/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
 | 
| @@ -8,65 +8,20 @@
 | 
|  #include "base/command_line.h"
 | 
|  #include "base/compiler_specific.h"
 | 
|  #include "base/macros.h"
 | 
| -#include "base/metrics/histogram.h"
 | 
|  #include "base/prefs/pref_service.h"
 | 
|  #include "base/strings/string16.h"
 | 
| -#include "base/strings/string_number_conversions.h"
 | 
| -#include "base/strings/utf_string_conversions.h"
 | 
|  #include "chrome/browser/browser_process.h"
 | 
| +#include "chrome/browser/chromeos/login/screens/hid_detection_model.h"
 | 
|  #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
 | 
|  #include "chrome/common/pref_names.h"
 | 
|  #include "chrome/grit/generated_resources.h"
 | 
|  #include "chromeos/chromeos_switches.h"
 | 
|  #include "components/login/localized_values_builder.h"
 | 
| -#include "device/bluetooth/bluetooth_adapter_factory.h"
 | 
| -#include "ui/base/l10n/l10n_util.h"
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
|  const char kJsScreenPath[] = "login.HIDDetectionScreen";
 | 
|  
 | 
| -// Variants of pairing state.
 | 
| -const char kRemotePinCode[] = "bluetoothRemotePinCode";
 | 
| -const char kRemotePasskey[] = "bluetoothRemotePasskey";
 | 
| -
 | 
| -// Possible ui-states for device-blocks. Same as CONNECTION dict of
 | 
| -// HIDDetectionScreen
 | 
| -const char kSearchingState[] = "searching";
 | 
| -const char kUSBConnectedState[] = "connected";
 | 
| -const char kBTPairedState[] = "paired";
 | 
| -const char kBTPairingState[] = "pairing";
 | 
| -// Special state for notifications that doesn't switch ui-state, but adds info.
 | 
| -const char kBTUpdateState[] = "update";
 | 
| -
 | 
| -// Names of possible arguments used for ui update.
 | 
| -const char kPincodeArgName[] = "pincode";
 | 
| -const char kDeviceNameArgName[] = "name";
 | 
| -const char kLabelArgName[] = "keyboard-label";
 | 
| -
 | 
| -// Standard length of pincode for pairing BT keyboards.
 | 
| -const int kPincodeLength = 6;
 | 
| -
 | 
| -bool DeviceIsPointing(device::BluetoothDevice::DeviceType device_type) {
 | 
| -  return device_type == device::BluetoothDevice::DEVICE_MOUSE ||
 | 
| -         device_type == device::BluetoothDevice::DEVICE_KEYBOARD_MOUSE_COMBO ||
 | 
| -         device_type == device::BluetoothDevice::DEVICE_TABLET;
 | 
| -}
 | 
| -
 | 
| -bool DeviceIsPointing(const device::InputServiceLinux::InputDeviceInfo& info) {
 | 
| -  return info.is_mouse || info.is_touchpad || info.is_touchscreen ||
 | 
| -         info.is_tablet;
 | 
| -}
 | 
| -
 | 
| -bool DeviceIsKeyboard(device::BluetoothDevice::DeviceType device_type) {
 | 
| -  return device_type == device::BluetoothDevice::DEVICE_KEYBOARD ||
 | 
| -         device_type == device::BluetoothDevice::DEVICE_KEYBOARD_MOUSE_COMBO;
 | 
| -}
 | 
| -
 | 
| -bool DeviceIsKeyboard(const device::InputServiceLinux::InputDeviceInfo& info) {
 | 
| -  return info.is_keyboard || info.is_touchscreen || info.is_tablet;
 | 
| -}
 | 
| -
 | 
|  }  // namespace
 | 
|  
 | 
|  namespace chromeos {
 | 
| @@ -74,43 +29,14 @@ namespace chromeos {
 | 
|  HIDDetectionScreenHandler::HIDDetectionScreenHandler(
 | 
|      CoreOobeActor* core_oobe_actor)
 | 
|      : BaseScreenHandler(kJsScreenPath),
 | 
| -      delegate_(NULL),
 | 
| +      model_(NULL),
 | 
|        core_oobe_actor_(core_oobe_actor),
 | 
| -      show_on_init_(false),
 | 
| -      mouse_is_pairing_(false),
 | 
| -      pointing_device_connect_type_(InputDeviceInfo::TYPE_UNKNOWN),
 | 
| -      keyboard_is_pairing_(false),
 | 
| -      keyboard_device_connect_type_(InputDeviceInfo::TYPE_UNKNOWN),
 | 
| -      switch_on_adapter_when_ready_(false),
 | 
| -      weak_ptr_factory_(this) {
 | 
| +      show_on_init_(false) {
 | 
|  }
 | 
|  
 | 
|  HIDDetectionScreenHandler::~HIDDetectionScreenHandler() {
 | 
| -  adapter_initially_powered_.reset();
 | 
| -  if (adapter_.get())
 | 
| -    adapter_->RemoveObserver(this);
 | 
| -  input_service_proxy_.RemoveObserver(this);
 | 
| -  if (delegate_)
 | 
| -    delegate_->OnActorDestroyed(this);
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::OnStartDiscoverySession(
 | 
| -    scoped_ptr<device::BluetoothDiscoverySession> discovery_session) {
 | 
| -  VLOG(1) << "BT Discovery session started";
 | 
| -  discovery_session_ = discovery_session.Pass();
 | 
| -  UpdateDevices();
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::SetPoweredError() {
 | 
| -  LOG(ERROR) << "Failed to power BT adapter";
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::SetPoweredOffError() {
 | 
| -  LOG(ERROR) << "Failed to power off BT adapter";
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::FindDevicesError() {
 | 
| -  VLOG(1) << "Failed to start Bluetooth discovery.";
 | 
| +  if (model_)
 | 
| +    model_->OnViewDestroyed(this);
 | 
|  }
 | 
|  
 | 
|  void HIDDetectionScreenHandler::Show() {
 | 
| @@ -119,8 +45,6 @@ void HIDDetectionScreenHandler::Show() {
 | 
|      return;
 | 
|    }
 | 
|    core_oobe_actor_->InitDemoModeDetection();
 | 
| -  input_service_proxy_.AddObserver(this);
 | 
| -  UpdateDevices();
 | 
|  
 | 
|    PrefService* local_state = g_browser_process->local_state();
 | 
|    int num_of_times_dialog_was_shown = local_state->GetInteger(
 | 
| @@ -129,28 +53,29 @@ void HIDDetectionScreenHandler::Show() {
 | 
|                            num_of_times_dialog_was_shown + 1);
 | 
|  
 | 
|    ShowScreen(OobeUI::kScreenHIDDetection, NULL);
 | 
| -  SendPointingDeviceNotification();
 | 
| -  SendKeyboardDeviceNotification(NULL);
 | 
|  }
 | 
|  
 | 
|  void HIDDetectionScreenHandler::Hide() {
 | 
| -  if (adapter_.get())
 | 
| -    adapter_->RemoveObserver(this);
 | 
| -  input_service_proxy_.RemoveObserver(this);
 | 
|  }
 | 
|  
 | 
| -void HIDDetectionScreenHandler::SetDelegate(Delegate* delegate) {
 | 
| -  delegate_ = delegate;
 | 
| +void HIDDetectionScreenHandler::Bind(HIDDetectionModel& model) {
 | 
| +  model_ = &model;
 | 
| +  BaseScreenHandler::SetBaseScreen(model_);
 | 
|    if (page_is_ready())
 | 
|      Initialize();
 | 
|  }
 | 
|  
 | 
| +void HIDDetectionScreenHandler::Unbind() {
 | 
| +  model_ = nullptr;
 | 
| +  BaseScreenHandler::SetBaseScreen(nullptr);
 | 
| +}
 | 
| +
 | 
| +void HIDDetectionScreenHandler::PrepareToShow() {
 | 
| +}
 | 
| +
 | 
|  void HIDDetectionScreenHandler::CheckIsScreenRequired(
 | 
| -    const base::Callback<void(bool)>& on_check_done) {
 | 
| -  input_service_proxy_.GetDevices(
 | 
| -      base::Bind(&HIDDetectionScreenHandler::OnGetInputDevicesListForCheck,
 | 
| -                 weak_ptr_factory_.GetWeakPtr(),
 | 
| -                 on_check_done));
 | 
| +      const base::Callback<void(bool)>& on_check_done) {
 | 
| +  model_->CheckIsScreenRequired(on_check_done);
 | 
|  }
 | 
|  
 | 
|  void HIDDetectionScreenHandler::DeclareLocalizedValues(
 | 
| @@ -171,230 +96,23 @@ void HIDDetectionScreenHandler::DeclareLocalizedValues(
 | 
|    builder->Add("hidDetectionBTEnterKey", IDS_HID_DETECTION_BLUETOOTH_ENTER_KEY);
 | 
|  }
 | 
|  
 | 
| -void HIDDetectionScreenHandler::Initialize() {
 | 
| -  if (!page_is_ready() || !delegate_)
 | 
| -    return;
 | 
| -
 | 
| -  device::BluetoothAdapterFactory::GetAdapter(
 | 
| -      base::Bind(&HIDDetectionScreenHandler::InitializeAdapter,
 | 
| -                 weak_ptr_factory_.GetWeakPtr()));
 | 
| +void HIDDetectionScreenHandler::DeclareJSCallbacks() {
 | 
| +  AddCallback(
 | 
| +      "HIDDetectionOnContinue", &HIDDetectionScreenHandler::HandleOnContinue);
 | 
| +}
 | 
|  
 | 
| +void HIDDetectionScreenHandler::Initialize() {
 | 
|    if (show_on_init_) {
 | 
|      Show();
 | 
|      show_on_init_ = false;
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -void HIDDetectionScreenHandler::RegisterMessages() {
 | 
| -  AddCallback(
 | 
| -      "HIDDetectionOnContinue", &HIDDetectionScreenHandler::HandleOnContinue);
 | 
| -}
 | 
| -
 | 
|  void HIDDetectionScreenHandler::HandleOnContinue() {
 | 
|    // Continue button pressed.
 | 
| -  ContinueScenarioType scenario_type;
 | 
| -  if (!pointing_device_id_.empty() && !keyboard_device_id_.empty())
 | 
| -    scenario_type = All_DEVICES_DETECTED;
 | 
| -  else if (pointing_device_id_.empty())
 | 
| -    scenario_type = KEYBOARD_DEVICE_ONLY_DETECTED;
 | 
| -  else
 | 
| -    scenario_type = POINTING_DEVICE_ONLY_DETECTED;
 | 
| -
 | 
| -  UMA_HISTOGRAM_ENUMERATION(
 | 
| -      "HIDDetection.OOBEDevicesDetectedOnContinuePressed",
 | 
| -      scenario_type,
 | 
| -      CONTINUE_SCENARIO_TYPE_SIZE);
 | 
| -
 | 
| -  // Switch off BT adapter if it was off before the screen and no BT device
 | 
| -  // connected.
 | 
| -  if (adapter_.get() && adapter_->IsPresent() && adapter_->IsPowered() &&
 | 
| -      !(pointing_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH ||
 | 
| -        keyboard_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH) &&
 | 
| -      adapter_initially_powered_ && !(*adapter_initially_powered_)) {
 | 
| -    VLOG(1) << "Switching off BT adapter after HID OOBE screen as unused.";
 | 
| -    adapter_->SetPowered(
 | 
| -        false,
 | 
| -        base::Bind(&base::DoNothing),
 | 
| -        base::Bind(&HIDDetectionScreenHandler::SetPoweredOffError,
 | 
| -                   weak_ptr_factory_.GetWeakPtr()));
 | 
| -  }
 | 
| -
 | 
|    core_oobe_actor_->StopDemoModeDetection();
 | 
| -  if (delegate_)
 | 
| -    delegate_->OnExit();
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::InitializeAdapter(
 | 
| -    scoped_refptr<device::BluetoothAdapter> adapter) {
 | 
| -  adapter_ = adapter;
 | 
| -  CHECK(adapter_.get());
 | 
| -
 | 
| -  adapter_->AddObserver(this);
 | 
| -  UpdateDevices();
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::StartBTDiscoverySession() {
 | 
| -  adapter_->StartDiscoverySession(
 | 
| -      base::Bind(&HIDDetectionScreenHandler::OnStartDiscoverySession,
 | 
| -                 weak_ptr_factory_.GetWeakPtr()),
 | 
| -      base::Bind(&HIDDetectionScreenHandler::FindDevicesError,
 | 
| -                 weak_ptr_factory_.GetWeakPtr()));
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::RequestPinCode(
 | 
| -    device::BluetoothDevice* device) {
 | 
| -  VLOG(1) << "RequestPinCode id = " << device->GetDeviceID()
 | 
| -          << " name = " << device->GetName();
 | 
| -  device->CancelPairing();
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::RequestPasskey(
 | 
| -    device::BluetoothDevice* device) {
 | 
| -  VLOG(1) << "RequestPassKey id = " << device->GetDeviceID()
 | 
| -          << " name = " << device->GetName();
 | 
| -  device->CancelPairing();
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::DisplayPinCode(device::BluetoothDevice* device,
 | 
| -                                               const std::string& pincode) {
 | 
| -  VLOG(1) << "DisplayPinCode id = " << device->GetDeviceID()
 | 
| -          << " name = " << device->GetName();
 | 
| -  base::DictionaryValue params;
 | 
| -  params.SetString("state", kBTPairingState);
 | 
| -  params.SetString("pairing-state", kRemotePinCode);
 | 
| -  params.SetString("pincode", pincode);
 | 
| -  params.SetString(kDeviceNameArgName, device->GetName());
 | 
| -  SendKeyboardDeviceNotification(¶ms);
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::DisplayPasskey(
 | 
| -    device::BluetoothDevice* device, uint32 passkey) {
 | 
| -  VLOG(1) << "DisplayPassKey id = " << device->GetDeviceID()
 | 
| -          << " name = " << device->GetName();
 | 
| -  base::DictionaryValue params;
 | 
| -  params.SetString("state", kBTPairingState);
 | 
| -  params.SetString("pairing-state", kRemotePasskey);
 | 
| -  params.SetInteger("passkey", passkey);
 | 
| -  std::string pincode = base::UintToString(passkey);
 | 
| -  pincode = std::string(kPincodeLength - pincode.length(), '0').append(pincode);
 | 
| -  params.SetString("pincode", pincode);
 | 
| -  params.SetString(kDeviceNameArgName, device->GetName());
 | 
| -  SendKeyboardDeviceNotification(¶ms);
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::KeysEntered(
 | 
| -    device::BluetoothDevice* device, uint32 entered) {
 | 
| -  VLOG(1) << "Keys entered";
 | 
| -  base::DictionaryValue params;
 | 
| -  params.SetString("state", kBTUpdateState);
 | 
| -  params.SetInteger("keysEntered", entered);
 | 
| -  SendKeyboardDeviceNotification(¶ms);
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::ConfirmPasskey(
 | 
| -    device::BluetoothDevice* device, uint32 passkey) {
 | 
| -  VLOG(1) << "Confirm Passkey";
 | 
| -  device->CancelPairing();
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::AuthorizePairing(
 | 
| -    device::BluetoothDevice* device) {
 | 
| -  // There is never any circumstance where this will be called, since the
 | 
| -  // HID detection screen  handler will only be used for outgoing pairing
 | 
| -  // requests, but play it safe.
 | 
| -  VLOG(1) << "Authorize pairing";
 | 
| -  device->ConfirmPairing();
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::AdapterPresentChanged(
 | 
| -    device::BluetoothAdapter* adapter, bool present) {
 | 
| -  if (present && switch_on_adapter_when_ready_) {
 | 
| -    VLOG(1) << "Switching on BT adapter on HID OOBE screen.";
 | 
| -    adapter_initially_powered_.reset(new bool(adapter_->IsPowered()));
 | 
| -    adapter_->SetPowered(
 | 
| -        true,
 | 
| -        base::Bind(&HIDDetectionScreenHandler::StartBTDiscoverySession,
 | 
| -                   weak_ptr_factory_.GetWeakPtr()),
 | 
| -        base::Bind(&HIDDetectionScreenHandler::SetPoweredError,
 | 
| -                   weak_ptr_factory_.GetWeakPtr()));
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::TryPairingAsPointingDevice(
 | 
| -    device::BluetoothDevice* device) {
 | 
| -  if (pointing_device_id_.empty() &&
 | 
| -      DeviceIsPointing(device->GetDeviceType()) &&
 | 
| -      device->IsPairable() && !device->IsPaired() && !mouse_is_pairing_) {
 | 
| -    ConnectBTDevice(device);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::TryPairingAsKeyboardDevice(
 | 
| -    device::BluetoothDevice* device) {
 | 
| -  if (keyboard_device_id_.empty() &&
 | 
| -      DeviceIsKeyboard(device->GetDeviceType()) &&
 | 
| -      device->IsPairable() && !device->IsPaired() && !keyboard_is_pairing_) {
 | 
| -    ConnectBTDevice(device);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::DeviceAdded(
 | 
| -    device::BluetoothAdapter* adapter, device::BluetoothDevice* device) {
 | 
| -  VLOG(1) << "BT input device added id = " << device->GetDeviceID() <<
 | 
| -      " name = " << device->GetName();
 | 
| -  TryPairingAsPointingDevice(device);
 | 
| -  TryPairingAsKeyboardDevice(device);
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::DeviceChanged(
 | 
| -    device::BluetoothAdapter* adapter, device::BluetoothDevice* device) {
 | 
| -  VLOG(1) << "BT device changed id = " << device->GetDeviceID() << " name = " <<
 | 
| -      device->GetName();
 | 
| -  TryPairingAsPointingDevice(device);
 | 
| -  TryPairingAsKeyboardDevice(device);
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::DeviceRemoved(
 | 
| -    device::BluetoothAdapter* adapter, device::BluetoothDevice* device) {
 | 
| -  VLOG(1) << "BT device removed id = " << device->GetDeviceID() << " name = " <<
 | 
| -      device->GetName();
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::OnInputDeviceAdded(
 | 
| -    const InputDeviceInfo& info) {
 | 
| -  VLOG(1) << "Input device added id = " << info.id << " name = " << info.name;
 | 
| -  // TODO(merkulova): deal with all available device types, e.g. joystick.
 | 
| -  if (!keyboard_device_id_.empty() && !pointing_device_id_.empty())
 | 
| -    return;
 | 
| -
 | 
| -  if (pointing_device_id_.empty() && DeviceIsPointing(info)) {
 | 
| -    pointing_device_id_ = info.id;
 | 
| -    pointing_device_name_ = info.name;
 | 
| -    pointing_device_connect_type_ = info.type;
 | 
| -    SendPointingDeviceNotification();
 | 
| -  }
 | 
| -  if (keyboard_device_id_.empty() && DeviceIsKeyboard(info)) {
 | 
| -    keyboard_device_id_ = info.id;
 | 
| -    keyboard_device_name_ = info.name;
 | 
| -    keyboard_device_connect_type_ = info.type;
 | 
| -    SendKeyboardDeviceNotification(NULL);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::OnInputDeviceRemoved(const std::string& id) {
 | 
| -  if (id == keyboard_device_id_) {
 | 
| -    keyboard_device_id_.clear();
 | 
| -    keyboard_device_name_.clear();
 | 
| -    keyboard_device_connect_type_ = InputDeviceInfo::TYPE_UNKNOWN;
 | 
| -    SendKeyboardDeviceNotification(NULL);
 | 
| -    UpdateDevices();
 | 
| -  } else if (id == pointing_device_id_) {
 | 
| -    pointing_device_id_.clear();
 | 
| -    pointing_device_name_.clear();
 | 
| -    pointing_device_connect_type_ = InputDeviceInfo::TYPE_UNKNOWN;
 | 
| -    SendPointingDeviceNotification();
 | 
| -    UpdateDevices();
 | 
| -  }
 | 
| +  if (model_)
 | 
| +    model_->OnContinueButtonClicked();
 | 
|  }
 | 
|  
 | 
|  // static
 | 
| @@ -402,193 +120,4 @@ void HIDDetectionScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) {
 | 
|    registry->RegisterIntegerPref(prefs::kTimesHIDDialogShown, 0);
 | 
|  }
 | 
|  
 | 
| -void HIDDetectionScreenHandler::UpdateDevices() {
 | 
| -  input_service_proxy_.GetDevices(
 | 
| -      base::Bind(&HIDDetectionScreenHandler::OnGetInputDevicesList,
 | 
| -                 weak_ptr_factory_.GetWeakPtr()));
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::UpdateBTDevices() {
 | 
| -  if (!adapter_.get() || !adapter_->IsPresent() || !adapter_->IsPowered())
 | 
| -    return;
 | 
| -
 | 
| -  // If no connected devices found as pointing device and keyboard, we try to
 | 
| -  // connect some type-suitable active bluetooth device.
 | 
| -  std::vector<device::BluetoothDevice*> bt_devices = adapter_->GetDevices();
 | 
| -  for (std::vector<device::BluetoothDevice*>::const_iterator it =
 | 
| -           bt_devices.begin();
 | 
| -       it != bt_devices.end() &&
 | 
| -           (keyboard_device_id_.empty() || pointing_device_id_.empty());
 | 
| -       ++it) {
 | 
| -    TryPairingAsPointingDevice(*it);
 | 
| -    TryPairingAsKeyboardDevice(*it);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::ProcessConnectedDevicesList(
 | 
| -    const std::vector<InputDeviceInfo>& devices) {
 | 
| -  for (std::vector<InputDeviceInfo>::const_iterator it = devices.begin();
 | 
| -       it != devices.end() &&
 | 
| -       (pointing_device_id_.empty() || keyboard_device_id_.empty());
 | 
| -       ++it) {
 | 
| -    if (pointing_device_id_.empty() && DeviceIsPointing(*it)) {
 | 
| -      pointing_device_id_ = it->id;
 | 
| -      pointing_device_name_ = it->name;
 | 
| -      pointing_device_connect_type_ = it->type;
 | 
| -      if (page_is_ready())
 | 
| -        SendPointingDeviceNotification();
 | 
| -    }
 | 
| -    if (keyboard_device_id_.empty() && it->is_keyboard) {
 | 
| -      keyboard_device_id_ = it->id;
 | 
| -      keyboard_device_name_ = it->name;
 | 
| -      keyboard_device_connect_type_ = it->type;
 | 
| -      if (page_is_ready())
 | 
| -        SendKeyboardDeviceNotification(NULL);
 | 
| -    }
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::TryInitiateBTDevicesUpdate() {
 | 
| -  if ((pointing_device_id_.empty() || keyboard_device_id_.empty()) &&
 | 
| -      adapter_.get()) {
 | 
| -    if (!adapter_->IsPresent()) {
 | 
| -      // Switch on BT adapter later when it's available.
 | 
| -      switch_on_adapter_when_ready_ = true;
 | 
| -    } else if (!adapter_->IsPowered()) {
 | 
| -      VLOG(1) << "Switching on BT adapter on HID OOBE screen.";
 | 
| -      adapter_initially_powered_.reset(new bool(false));
 | 
| -      adapter_->SetPowered(
 | 
| -          true,
 | 
| -          base::Bind(&HIDDetectionScreenHandler::StartBTDiscoverySession,
 | 
| -                     weak_ptr_factory_.GetWeakPtr()),
 | 
| -          base::Bind(&HIDDetectionScreenHandler::SetPoweredError,
 | 
| -                     weak_ptr_factory_.GetWeakPtr()));
 | 
| -    } else {
 | 
| -      UpdateBTDevices();
 | 
| -    }
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::OnGetInputDevicesListForCheck(
 | 
| -    const base::Callback<void(bool)>& on_check_done,
 | 
| -    const std::vector<InputDeviceInfo>& devices) {
 | 
| -  ProcessConnectedDevicesList(devices);
 | 
| -
 | 
| -  // Screen is not required if both devices are present.
 | 
| -  bool all_devices_autodetected = !pointing_device_id_.empty() &&
 | 
| -                                  !keyboard_device_id_.empty();
 | 
| -  UMA_HISTOGRAM_BOOLEAN("HIDDetection.OOBEDialogShown",
 | 
| -                        !all_devices_autodetected);
 | 
| -
 | 
| -  on_check_done.Run(!all_devices_autodetected);
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::OnGetInputDevicesList(
 | 
| -    const std::vector<InputDeviceInfo>& devices) {
 | 
| -  ProcessConnectedDevicesList(devices);
 | 
| -  TryInitiateBTDevicesUpdate();
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::ConnectBTDevice(
 | 
| -    device::BluetoothDevice* device) {
 | 
| -  if (!device->IsPairable() || device->IsPaired())
 | 
| -    return;
 | 
| -  device::BluetoothDevice::DeviceType device_type = device->GetDeviceType();
 | 
| -
 | 
| -  if (device_type == device::BluetoothDevice::DEVICE_MOUSE ||
 | 
| -      device_type == device::BluetoothDevice::DEVICE_TABLET) {
 | 
| -    if (mouse_is_pairing_)
 | 
| -      return;
 | 
| -    mouse_is_pairing_ = true;
 | 
| -  } else if (device_type == device::BluetoothDevice::DEVICE_KEYBOARD) {
 | 
| -    if (keyboard_is_pairing_)
 | 
| -      return;
 | 
| -    keyboard_is_pairing_ = true;
 | 
| -  } else if (device_type ==
 | 
| -      device::BluetoothDevice::DEVICE_KEYBOARD_MOUSE_COMBO) {
 | 
| -    if (mouse_is_pairing_ || keyboard_is_pairing_)
 | 
| -      return;
 | 
| -    mouse_is_pairing_ = true;
 | 
| -    keyboard_is_pairing_ = true;
 | 
| -  }
 | 
| -  device->Connect(this,
 | 
| -            base::Bind(&HIDDetectionScreenHandler::BTConnected,
 | 
| -                       weak_ptr_factory_.GetWeakPtr(), device_type),
 | 
| -            base::Bind(&HIDDetectionScreenHandler::BTConnectError,
 | 
| -                       weak_ptr_factory_.GetWeakPtr(),
 | 
| -                       device->GetAddress(), device_type));
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::BTConnected(
 | 
| -    device::BluetoothDevice::DeviceType device_type) {
 | 
| -  if (DeviceIsPointing(device_type))
 | 
| -    mouse_is_pairing_ = false;
 | 
| -  if (DeviceIsKeyboard(device_type))
 | 
| -    keyboard_is_pairing_ = false;
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::BTConnectError(
 | 
| -    const std::string& address,
 | 
| -    device::BluetoothDevice::DeviceType device_type,
 | 
| -    device::BluetoothDevice::ConnectErrorCode error_code) {
 | 
| -  LOG(WARNING) << "BTConnectError while connecting " << address
 | 
| -               << " error code = " << error_code;
 | 
| -  if (DeviceIsPointing(device_type))
 | 
| -    mouse_is_pairing_ = false;
 | 
| -  if (DeviceIsKeyboard(device_type)) {
 | 
| -    keyboard_is_pairing_ = false;
 | 
| -    SendKeyboardDeviceNotification(NULL);
 | 
| -  }
 | 
| -
 | 
| -  if (pointing_device_id_.empty() || keyboard_device_id_.empty())
 | 
| -    UpdateDevices();
 | 
| -}
 | 
| -
 | 
| -
 | 
| -void HIDDetectionScreenHandler::SendPointingDeviceNotification() {
 | 
| -  std::string state;
 | 
| -  if (pointing_device_id_.empty())
 | 
| -    state = kSearchingState;
 | 
| -  else if (pointing_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH)
 | 
| -    state = kBTPairedState;
 | 
| -  else
 | 
| -    state = kUSBConnectedState;
 | 
| -  CallJS("setPointingDeviceState", state);
 | 
| -}
 | 
| -
 | 
| -void HIDDetectionScreenHandler::SendKeyboardDeviceNotification(
 | 
| -    base::DictionaryValue* params) {
 | 
| -  base::DictionaryValue state_info;
 | 
| -  if (params)
 | 
| -    state_info.MergeDictionary(params);
 | 
| -
 | 
| -  base::string16 device_name;
 | 
| -  if (!state_info.GetString(kDeviceNameArgName, &device_name)) {
 | 
| -    device_name = l10n_util::GetStringUTF16(
 | 
| -        IDS_HID_DETECTION_DEFAULT_KEYBOARD_NAME);
 | 
| -  }
 | 
| -
 | 
| -  if (keyboard_device_id_.empty()) {
 | 
| -    if (!state_info.HasKey("state")) {
 | 
| -      state_info.SetString("state", kSearchingState);
 | 
| -    } else if (state_info.HasKey(kPincodeArgName)) {
 | 
| -      state_info.SetString(
 | 
| -          kLabelArgName,
 | 
| -          l10n_util::GetStringFUTF16(
 | 
| -              IDS_HID_DETECTION_BLUETOOTH_REMOTE_PIN_CODE_REQUEST,
 | 
| -              device_name));
 | 
| -    }
 | 
| -  } else if (keyboard_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH) {
 | 
| -    state_info.SetString("state", kBTPairedState);
 | 
| -    state_info.SetString(
 | 
| -        kLabelArgName,
 | 
| -        l10n_util::GetStringFUTF16(
 | 
| -            IDS_HID_DETECTION_PAIRED_BLUETOOTH_KEYBOARD,
 | 
| -            base::UTF8ToUTF16(keyboard_device_name_)));
 | 
| -  } else {
 | 
| -    state_info.SetString("state", kUSBConnectedState);
 | 
| -  }
 | 
| -  CallJS("setKeyboardDeviceState", state_info);
 | 
| -}
 | 
| -
 | 
|  }  // namespace chromeos
 | 
| 
 |