hid_detection_screen_handler.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file. 4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h" 6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/bind.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/command_line.h" 9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/compiler_specific.h" 10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/macros.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/metrics/histogram.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/prefs/pref_service.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/string16.h" 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/browser_process.h" 17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/pref_names.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/chromeos_switches.h" 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "device/bluetooth/bluetooth_adapter_factory.h" 21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "grit/chromium_strings.h" 22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "grit/generated_resources.h" 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace { 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kJsScreenPath[] = "login.HIDDetectionScreen"; 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Variants of pairing state. 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kRemotePinCode[] = "bluetoothRemotePinCode"; 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kRemotePasskey[] = "bluetoothRemotePasskey"; 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Possible ui-states for device-blocks. 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kSearchingState[] = "searching"; 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kUSBConnectedState[] = "connected"; 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kBTPairedState[] = "paired"; 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kBTPairingState[] = "pairing"; 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Special state for notifications that don't switch ui-state, but add info. 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kBTUpdateState[] = "update"; 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Names of possible arguments used for ui update. 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kPincodeArgName[] = "pincode"; 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kDeviceNameArgName[] = "name"; 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kLabelArgName[] = "keyboard-label"; 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Standard length of pincode for pairing BT keyboards. 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kPincodeLength = 6; 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool DeviceIsPointing(device::BluetoothDevice::DeviceType device_type) { 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return device_type == device::BluetoothDevice::DEVICE_MOUSE || 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_type == device::BluetoothDevice::DEVICE_KEYBOARD_MOUSE_COMBO || 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_type == device::BluetoothDevice::DEVICE_TABLET; 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool DeviceIsPointing(const device::InputServiceLinux::InputDeviceInfo& info) { 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return info.is_mouse || info.is_touchpad || info.is_touchscreen || 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) info.is_tablet; 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool DeviceIsKeyboard(device::BluetoothDevice::DeviceType device_type) { 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return device_type == device::BluetoothDevice::DEVICE_KEYBOARD || 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_type == device::BluetoothDevice::DEVICE_KEYBOARD_MOUSE_COMBO; 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} // namespace 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace chromeos { 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)HIDDetectionScreenHandler::HIDDetectionScreenHandler( 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CoreOobeActor* core_oobe_actor) 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : BaseScreenHandler(kJsScreenPath), 72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch delegate_(NULL), 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) core_oobe_actor_(core_oobe_actor), 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) show_on_init_(false), 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mouse_is_pairing_(false), 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_is_pairing_(false), 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) switch_on_adapter_when_ready_(false), 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_(this) { 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 81a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochHIDDetectionScreenHandler::~HIDDetectionScreenHandler() { 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (adapter_.get()) 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->RemoveObserver(this); 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_service_proxy_.RemoveObserver(this); 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (delegate_) 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch delegate_->OnActorDestroyed(this); 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::OnStartDiscoverySession( 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<device::BluetoothDiscoverySession> discovery_session) { 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "BT Discovery session started"; 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) discovery_session_ = discovery_session.Pass(); 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateDevices(); 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::SetPoweredError() { 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(ERROR) << "Failed to power BT adapter"; 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::FindDevicesError() { 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "Failed to start Bluetooth discovery."; 102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::Show() { 105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!page_is_ready()) { 106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch show_on_init_ = true; 107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableDemoMode)) 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch core_oobe_actor_->InitDemoModeDetection(); 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_service_proxy_.AddObserver(this); 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateDevices(); 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PrefService* local_state = g_browser_process->local_state(); 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int num_of_times_dialog_was_shown = local_state->GetInteger( 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) prefs::kTimesHIDDialogShown); 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) local_state->SetInteger(prefs::kTimesHIDDialogShown, 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) num_of_times_dialog_was_shown + 1); 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ShowScreen(OobeUI::kScreenHIDDetection, NULL); 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!pointing_device_id_.empty()) 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendPointingDeviceNotification(); 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!keyboard_device_id_.empty()) 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendKeyboardDeviceNotification(NULL); 125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::Hide() { 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (adapter_.get()) 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->RemoveObserver(this); 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_service_proxy_.RemoveObserver(this); 131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::SetDelegate(Delegate* delegate) { 134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch delegate_ = delegate; 135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (page_is_ready()) 136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Initialize(); 137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void HIDDetectionScreenHandler::CheckIsScreenRequired( 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Callback<void(bool)>& on_check_done) { 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) input_service_proxy_.GetDevices( 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::OnGetInputDevicesListForCheck, 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) on_check_done)); 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::DeclareLocalizedValues( 148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch LocalizedValuesBuilder* builder) { 149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch builder->Add("hidDetectionContinue", IDS_HID_DETECTION_CONTINUE_BUTTON); 150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionInvitation", IDS_HID_DETECTION_INVITATION_TEXT); 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionPrerequisites", 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_PRECONDITION_TEXT); 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionMouseSearching", IDS_HID_DETECTION_SEARCHING_MOUSE); 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionKeyboardSearching", 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_SEARCHING_KEYBOARD); 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionUSBMouseConnected", 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_CONNECTED_USB_MOUSE); 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionUSBKeyboardConnected", 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_CONNECTED_USB_KEYBOARD); 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionBTMousePaired", 161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_PAIRED_BLUETOOTH_MOUSE); 162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionBTEnterKey", IDS_HID_DETECTION_BLUETOOTH_ENTER_KEY); 163a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::Initialize() { 166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!page_is_ready() || !delegate_) 167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothAdapterFactory::GetAdapter( 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::InitializeAdapter, 171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (show_on_init_) { 174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Show(); 175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch show_on_init_ = false; 176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::RegisterMessages() { 180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch AddCallback( 181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "HIDDetectionOnContinue", &HIDDetectionScreenHandler::HandleOnContinue); 182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::HandleOnContinue() { 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Continue button pressed. 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ContinueScenarioType scenario_type; 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!pointing_device_id_.empty() && !keyboard_device_id_.empty()) 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scenario_type = All_DEVICES_DETECTED; 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else if (pointing_device_id_.empty()) 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scenario_type = KEYBOARD_DEVICE_ONLY_DETECTED; 1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scenario_type = POINTING_DEVICE_ONLY_DETECTED; 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "HIDDetection.OOBEDevicesDetectedOnContinuePressed", 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scenario_type, 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CONTINUE_SCENARIO_TYPE_SIZE); 1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) core_oobe_actor_->StopDemoModeDetection(); 200a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (delegate_) 201a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch delegate_->OnExit(); 202a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 203a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::InitializeAdapter( 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<device::BluetoothAdapter> adapter) { 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_ = adapter; 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK(adapter_.get()); 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->AddObserver(this); 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateDevices(); 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::StartBTDiscoverySession() { 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->StartDiscoverySession( 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::OnStartDiscoverySession, 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::FindDevicesError, 218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::RequestPinCode( 222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "RequestPinCode id = " << device->GetDeviceID() 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << " name = " << device->GetName(); 225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->CancelPairing(); 226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::RequestPasskey( 229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "RequestPassKey id = " << device->GetDeviceID() 231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << " name = " << device->GetName(); 232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->CancelPairing(); 233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::DisplayPinCode(device::BluetoothDevice* device, 236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& pincode) { 237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "DisplayPinCode id = " << device->GetDeviceID() 238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << " name = " << device->GetName(); 239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::DictionaryValue params; 240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("state", kBTPairingState); 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("pairing-state", kRemotePinCode); 242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("pincode", pincode); 243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString(kDeviceNameArgName, device->GetName()); 244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendKeyboardDeviceNotification(¶ms); 245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::DisplayPasskey( 248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device, uint32 passkey) { 249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "DisplayPassKey id = " << device->GetDeviceID() 250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << " name = " << device->GetName(); 251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::DictionaryValue params; 252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("state", kBTPairingState); 253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("pairing-state", kRemotePasskey); 254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetInteger("passkey", passkey); 255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string pincode = base::UintToString(passkey); 256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pincode = std::string(kPincodeLength - pincode.length(), '0').append(pincode); 257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("pincode", pincode); 258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString(kDeviceNameArgName, device->GetName()); 259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendKeyboardDeviceNotification(¶ms); 260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::KeysEntered( 263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device, uint32 entered) { 264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "Keys entered"; 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::DictionaryValue params; 266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("state", kBTUpdateState); 267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetInteger("keysEntered", entered); 268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendKeyboardDeviceNotification(¶ms); 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::ConfirmPasskey( 272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device, uint32 passkey) { 273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "Confirm Passkey"; 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->CancelPairing(); 275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::AuthorizePairing( 278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // There is never any circumstance where this will be called, since the 280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // HID detection screen handler will only be used for outgoing pairing 281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // requests, but play it safe. 282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "Authorize pairing"; 283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->ConfirmPairing(); 284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::AdapterPresentChanged( 287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothAdapter* adapter, bool present) { 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (present && switch_on_adapter_when_ready_) { 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->SetPowered( 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) true, 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::StartBTDiscoverySession, 292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::SetPoweredError, 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::TryPairingAsPointingDevice( 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pointing_device_id_.empty() && 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeviceIsPointing(device->GetDeviceType()) && 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->IsPairable() && !device->IsPaired() && !mouse_is_pairing_) { 303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ConnectBTDevice(device); 304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::TryPairingAsKeyboardDevice( 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (keyboard_device_id_.empty() && 310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeviceIsKeyboard(device->GetDeviceType()) && 311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->IsPairable() && !device->IsPaired() && !keyboard_is_pairing_) { 312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ConnectBTDevice(device); 313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::DeviceAdded( 317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothAdapter* adapter, device::BluetoothDevice* device) { 318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "BT input device added id = " << device->GetDeviceID() << 319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " name = " << device->GetName(); 320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsPointingDevice(device); 321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsKeyboardDevice(device); 322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::DeviceChanged( 325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothAdapter* adapter, device::BluetoothDevice* device) { 326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "BT device changed id = " << device->GetDeviceID() << " name = " << 327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->GetName(); 328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsPointingDevice(device); 329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsKeyboardDevice(device); 330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::DeviceRemoved( 333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothAdapter* adapter, device::BluetoothDevice* device) { 334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "BT device removed id = " << device->GetDeviceID() << " name = " << 335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->GetName(); 336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::OnInputDeviceAdded( 339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const InputDeviceInfo& info) { 340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "Input device added id = " << info.id << " name = " << info.name; 341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(merkulova): deal with all available device types, e.g. joystick. 342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!keyboard_device_id_.empty() && !pointing_device_id_.empty()) 343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pointing_device_id_.empty() && DeviceIsPointing(info)) { 346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_id_ = info.id; 347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_name_ = info.name; 348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_connect_type_ = info.type; 349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendPointingDeviceNotification(); 350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (keyboard_device_id_.empty() && info.is_keyboard) { 352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_id_ = info.id; 353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_name_ = info.name; 354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_connect_type_ = info.type; 355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendKeyboardDeviceNotification(NULL); 356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::OnInputDeviceRemoved(const std::string& id) { 360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (id == keyboard_device_id_) { 361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_id_.clear(); 362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_name_.clear(); 363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_connect_type_ = InputDeviceInfo::TYPE_UNKNOWN; 364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendKeyboardDeviceNotification(NULL); 365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateDevices(); 366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (id == pointing_device_id_) { 367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_id_.clear(); 368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_name_.clear(); 369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_connect_type_ = InputDeviceInfo::TYPE_UNKNOWN; 370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendPointingDeviceNotification(); 371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateDevices(); 372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static 376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HIDDetectionScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) { 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) registry->RegisterIntegerPref(prefs::kTimesHIDDialogShown, 0); 378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::UpdateDevices() { 381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_service_proxy_.GetDevices( 382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::OnGetInputDevicesList, 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::UpdateBTDevices() { 387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!adapter_ || !adapter_->IsPresent() || !adapter_->IsPowered()) 388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // If no connected devices found as pointing device and keyboard, we try to 391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // connect some type-suitable active bluetooth device. 392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<device::BluetoothDevice*> bt_devices = adapter_->GetDevices(); 393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (std::vector<device::BluetoothDevice*>::const_iterator it = 394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bt_devices.begin(); 395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) it != bt_devices.end() && 396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) (keyboard_device_id_.empty() || pointing_device_id_.empty()); 397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ++it) { 398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsPointingDevice(*it); 399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsKeyboardDevice(*it); 400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HIDDetectionScreenHandler::ProcessConnectedDevicesList( 404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::vector<InputDeviceInfo>& devices) { 405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (std::vector<InputDeviceInfo>::const_iterator it = devices.begin(); 406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) it != devices.end() && 407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) (pointing_device_id_.empty() || keyboard_device_id_.empty()); 408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ++it) { 409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pointing_device_id_.empty() && DeviceIsPointing(*it)) { 410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_id_ = it->id; 411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_name_ = it->name; 412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_connect_type_ = it->type; 4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (page_is_ready()) 4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendPointingDeviceNotification(); 415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (keyboard_device_id_.empty() && it->is_keyboard) { 417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_id_ = it->id; 418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_name_ = it->name; 419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_connect_type_ = it->type; 4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (page_is_ready()) 4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendKeyboardDeviceNotification(NULL); 422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HIDDetectionScreenHandler::TryInitiateBTDevicesUpdate() { 427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if ((pointing_device_id_.empty() || keyboard_device_id_.empty()) && 428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_) { 429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!adapter_->IsPresent()) { 430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Switch on BT adapter later when it's available. 431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) switch_on_adapter_when_ready_ = true; 432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (!adapter_->IsPowered()) { 433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->SetPowered( 434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) true, 435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::StartBTDiscoverySession, 436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::SetPoweredError, 438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateBTDevices(); 441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void HIDDetectionScreenHandler::OnGetInputDevicesListForCheck( 4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Callback<void(bool)>& on_check_done, 447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<InputDeviceInfo>& devices) { 448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProcessConnectedDevicesList(devices); 449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Screen is not required if both devices are present. 451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool all_devices_autodetected = !pointing_device_id_.empty() && 452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !keyboard_device_id_.empty(); 453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("HIDDetection.OOBEDialogShown", 454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !all_devices_autodetected); 455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) on_check_done.Run(!all_devices_autodetected); 457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HIDDetectionScreenHandler::OnGetInputDevicesList( 460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<InputDeviceInfo>& devices) { 461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProcessConnectedDevicesList(devices); 462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TryInitiateBTDevicesUpdate(); 463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::ConnectBTDevice( 466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!device->IsPairable() || device->IsPaired()) 468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice::DeviceType device_type = device->GetDeviceType(); 470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (device_type == device::BluetoothDevice::DEVICE_MOUSE || 472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_type == device::BluetoothDevice::DEVICE_TABLET) { 473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mouse_is_pairing_) 474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mouse_is_pairing_ = true; 476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (device_type == device::BluetoothDevice::DEVICE_KEYBOARD) { 477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (keyboard_is_pairing_) 478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_is_pairing_ = true; 480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (device_type == 481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice::DEVICE_KEYBOARD_MOUSE_COMBO) { 482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mouse_is_pairing_ || keyboard_is_pairing_) 483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mouse_is_pairing_ = true; 485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_is_pairing_ = true; 486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->Connect(this, 488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::BTConnected, 489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), device_type), 490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::BTConnectError, 491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->GetAddress(), device_type)); 493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::BTConnected( 496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice::DeviceType device_type) { 497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (DeviceIsPointing(device_type)) 498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mouse_is_pairing_ = false; 499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (DeviceIsKeyboard(device_type)) 500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_is_pairing_ = false; 501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::BTConnectError( 504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& address, 505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice::DeviceType device_type, 506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice::ConnectErrorCode error_code) { 507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(WARNING) << "BTConnectError while connecting " << address 508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << " error code = " << error_code; 509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (DeviceIsPointing(device_type)) 510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mouse_is_pairing_ = false; 511f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (DeviceIsKeyboard(device_type)) { 512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_is_pairing_ = false; 513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SendKeyboardDeviceNotification(NULL); 514f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pointing_device_id_.empty() || keyboard_device_id_.empty()) 517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateDevices(); 518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::SendPointingDeviceNotification() { 522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string state; 523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pointing_device_id_.empty()) 524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state = kSearchingState; 525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else if (pointing_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH) 526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state = kBTPairedState; 527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else 528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state = kUSBConnectedState; 529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CallJS("setPointingDeviceState", state); 530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::SendKeyboardDeviceNotification( 533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::DictionaryValue* params) { 534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::DictionaryValue state_info; 535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (params) 536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.MergeDictionary(params); 537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::string16 device_name; 539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!state_info.GetString(kDeviceNameArgName, &device_name)) { 540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_name = l10n_util::GetStringUTF16( 541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_DEFAULT_KEYBOARD_NAME); 542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (keyboard_device_id_.empty()) { 545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!state_info.HasKey("state")) { 546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.SetString("state", kSearchingState); 547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (state_info.HasKey(kPincodeArgName)) { 548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.SetString( 549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kLabelArgName, 550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) l10n_util::GetStringFUTF16( 551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_BLUETOOTH_REMOTE_PIN_CODE_REQUEST, 552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_name)); 553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (keyboard_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH) { 555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.SetString("state", kBTPairedState); 556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.SetString( 557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kLabelArgName, 558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) l10n_util::GetStringFUTF16( 559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_PAIRED_BLUETOOTH_KEYBOARD, 560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::UTF8ToUTF16(keyboard_device_name_))); 561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.SetString("state", kUSBConnectedState); 563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CallJS("setKeyboardDeviceState", state_info); 565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 567a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} // namespace chromeos 568