hid_detection_screen_handler.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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" 8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/compiler_specific.h" 9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/macros.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/metrics/histogram.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/prefs/pref_service.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/string16.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/browser_process.h" 16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/pref_names.h" 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "device/bluetooth/bluetooth_adapter_factory.h" 19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "grit/chromium_strings.h" 20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "grit/generated_resources.h" 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace { 24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kJsScreenPath[] = "login.HIDDetectionScreen"; 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Variants of pairing state. 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kRemotePinCode[] = "bluetoothRemotePinCode"; 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kRemotePasskey[] = "bluetoothRemotePasskey"; 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Possible ui-states for device-blocks. 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kSearchingState[] = "searching"; 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kUSBConnectedState[] = "connected"; 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kBTPairedState[] = "paired"; 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kBTPairingState[] = "pairing"; 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Special state for notifications that don't switch ui-state, but add info. 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kBTUpdateState[] = "update"; 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Names of possible arguments used for ui update. 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kPincodeArgName[] = "pincode"; 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kDeviceNameArgName[] = "name"; 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kLabelArgName[] = "keyboard-label"; 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Standard length of pincode for pairing BT keyboards. 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kPincodeLength = 6; 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool DeviceIsPointing(device::BluetoothDevice::DeviceType device_type) { 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return device_type == device::BluetoothDevice::DEVICE_MOUSE || 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_type == device::BluetoothDevice::DEVICE_KEYBOARD_MOUSE_COMBO || 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_type == device::BluetoothDevice::DEVICE_TABLET; 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool DeviceIsPointing(const device::InputServiceLinux::InputDeviceInfo& info) { 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return info.is_mouse || info.is_touchpad || info.is_touchscreen || 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) info.is_tablet; 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool DeviceIsKeyboard(device::BluetoothDevice::DeviceType device_type) { 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return device_type == device::BluetoothDevice::DEVICE_KEYBOARD || 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_type == device::BluetoothDevice::DEVICE_KEYBOARD_MOUSE_COMBO; 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} // namespace 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace chromeos { 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 67a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochHIDDetectionScreenHandler::HIDDetectionScreenHandler() 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : BaseScreenHandler(kJsScreenPath), 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch delegate_(NULL), 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) show_on_init_(false), 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mouse_is_pairing_(false), 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_is_pairing_(false), 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) switch_on_adapter_when_ready_(false), 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) first_time_screen_show_(true), 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_(this) { 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 78a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochHIDDetectionScreenHandler::~HIDDetectionScreenHandler() { 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (adapter_.get()) 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->RemoveObserver(this); 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_service_proxy_.RemoveObserver(this); 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (delegate_) 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch delegate_->OnActorDestroyed(this); 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::OnStartDiscoverySession( 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<device::BluetoothDiscoverySession> discovery_session) { 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "BT Discovery session started"; 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) discovery_session_ = discovery_session.Pass(); 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateDevices(); 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::SetPoweredError() { 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(ERROR) << "Failed to power BT adapter"; 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::FindDevicesError() { 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "Failed to start Bluetooth discovery."; 99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::Show() { 102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!page_is_ready()) { 103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch show_on_init_ = true; 104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_service_proxy_.AddObserver(this); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) first_time_screen_show_ = true; 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetDevicesFirstTime(); 109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ShowScreen(OobeUI::kScreenHIDDetection, NULL); 110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::Hide() { 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (adapter_.get()) 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->RemoveObserver(this); 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_service_proxy_.RemoveObserver(this); 116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::SetDelegate(Delegate* delegate) { 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch delegate_ = delegate; 120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (page_is_ready()) 121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Initialize(); 122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::DeclareLocalizedValues( 125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch LocalizedValuesBuilder* builder) { 126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch builder->Add("hidDetectionContinue", IDS_HID_DETECTION_CONTINUE_BUTTON); 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionInvitation", IDS_HID_DETECTION_INVITATION_TEXT); 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionPrerequisites", 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_PRECONDITION_TEXT); 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionMouseSearching", IDS_HID_DETECTION_SEARCHING_MOUSE); 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionKeyboardSearching", 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_SEARCHING_KEYBOARD); 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionUSBMouseConnected", 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_CONNECTED_USB_MOUSE); 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionUSBKeyboardConnected", 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_CONNECTED_USB_KEYBOARD); 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionBTMousePaired", 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_PAIRED_BLUETOOTH_MOUSE); 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder->Add("hidDetectionBTEnterKey", IDS_HID_DETECTION_BLUETOOTH_ENTER_KEY); 140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::Initialize() { 143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!page_is_ready() || !delegate_) 144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothAdapterFactory::GetAdapter( 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::InitializeAdapter, 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (show_on_init_) { 151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Show(); 152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch show_on_init_ = false; 153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 156a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::RegisterMessages() { 157a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch AddCallback( 158a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "HIDDetectionOnContinue", &HIDDetectionScreenHandler::HandleOnContinue); 159a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 160a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 161a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid HIDDetectionScreenHandler::HandleOnContinue() { 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!first_time_screen_show_) { 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Continue button pressed. 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ContinueScenarioType scenario_type; 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!pointing_device_id_.empty() && !keyboard_device_id_.empty()) 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scenario_type = All_DEVICES_DETECTED; 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else if (pointing_device_id_.empty()) 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scenario_type = KEYBOARD_DEVICE_ONLY_DETECTED; 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scenario_type = POINTING_DEVICE_ONLY_DETECTED; 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "HIDDetection.OOBEDevicesDetectedOnContinuePressed", 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scenario_type, 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CONTINUE_SCENARIO_TYPE_SIZE); 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (delegate_) 178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch delegate_->OnExit(); 179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::InitializeAdapter( 182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<device::BluetoothAdapter> adapter) { 183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_ = adapter; 184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK(adapter_.get()); 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->AddObserver(this); 187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateDevices(); 188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::StartBTDiscoverySession() { 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->StartDiscoverySession( 192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::OnStartDiscoverySession, 193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::FindDevicesError, 195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::RequestPinCode( 199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "RequestPinCode id = " << device->GetDeviceID() 201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << " name = " << device->GetName(); 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->CancelPairing(); 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::RequestPasskey( 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "RequestPassKey id = " << device->GetDeviceID() 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << " name = " << device->GetName(); 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->CancelPairing(); 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::DisplayPinCode(device::BluetoothDevice* device, 213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& pincode) { 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "DisplayPinCode id = " << device->GetDeviceID() 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << " name = " << device->GetName(); 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::DictionaryValue params; 217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("state", kBTPairingState); 218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("pairing-state", kRemotePinCode); 219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("pincode", pincode); 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString(kDeviceNameArgName, device->GetName()); 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendKeyboardDeviceNotification(¶ms); 222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::DisplayPasskey( 225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device, uint32 passkey) { 226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "DisplayPassKey id = " << device->GetDeviceID() 227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << " name = " << device->GetName(); 228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::DictionaryValue params; 229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("state", kBTPairingState); 230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("pairing-state", kRemotePasskey); 231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetInteger("passkey", passkey); 232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string pincode = base::UintToString(passkey); 233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pincode = std::string(kPincodeLength - pincode.length(), '0').append(pincode); 234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("pincode", pincode); 235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString(kDeviceNameArgName, device->GetName()); 236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendKeyboardDeviceNotification(¶ms); 237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::KeysEntered( 240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device, uint32 entered) { 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "Keys entered"; 242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::DictionaryValue params; 243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetString("state", kBTUpdateState); 244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.SetInteger("keysEntered", entered); 245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendKeyboardDeviceNotification(¶ms); 246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::ConfirmPasskey( 249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device, uint32 passkey) { 250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "Confirm Passkey"; 251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->CancelPairing(); 252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::AuthorizePairing( 255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // There is never any circumstance where this will be called, since the 257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // HID detection screen handler will only be used for outgoing pairing 258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // requests, but play it safe. 259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "Authorize pairing"; 260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->ConfirmPairing(); 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::AdapterPresentChanged( 264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothAdapter* adapter, bool present) { 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (present && switch_on_adapter_when_ready_) { 266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->SetPowered( 267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) true, 268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::StartBTDiscoverySession, 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::SetPoweredError, 271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::TryPairingAsPointingDevice( 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pointing_device_id_.empty() && 278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeviceIsPointing(device->GetDeviceType()) && 279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->IsPairable() && !device->IsPaired() && !mouse_is_pairing_) { 280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ConnectBTDevice(device); 281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::TryPairingAsKeyboardDevice( 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (keyboard_device_id_.empty() && 287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeviceIsKeyboard(device->GetDeviceType()) && 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->IsPairable() && !device->IsPaired() && !keyboard_is_pairing_) { 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ConnectBTDevice(device); 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::DeviceAdded( 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothAdapter* adapter, device::BluetoothDevice* device) { 295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "BT input device added id = " << device->GetDeviceID() << 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " name = " << device->GetName(); 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsPointingDevice(device); 298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsKeyboardDevice(device); 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::DeviceChanged( 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothAdapter* adapter, device::BluetoothDevice* device) { 303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "BT device changed id = " << device->GetDeviceID() << " name = " << 304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->GetName(); 305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsPointingDevice(device); 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsKeyboardDevice(device); 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::DeviceRemoved( 310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothAdapter* adapter, device::BluetoothDevice* device) { 311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "BT device removed id = " << device->GetDeviceID() << " name = " << 312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->GetName(); 313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::OnInputDeviceAdded( 316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const InputDeviceInfo& info) { 317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VLOG(1) << "Input device added id = " << info.id << " name = " << info.name; 318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(merkulova): deal with all available device types, e.g. joystick. 319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!keyboard_device_id_.empty() && !pointing_device_id_.empty()) 320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pointing_device_id_.empty() && DeviceIsPointing(info)) { 323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_id_ = info.id; 324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_name_ = info.name; 325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_connect_type_ = info.type; 326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendPointingDeviceNotification(); 327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (keyboard_device_id_.empty() && info.is_keyboard) { 329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_id_ = info.id; 330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_name_ = info.name; 331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_connect_type_ = info.type; 332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendKeyboardDeviceNotification(NULL); 333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::OnInputDeviceRemoved(const std::string& id) { 337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (id == keyboard_device_id_) { 338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_id_.clear(); 339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_name_.clear(); 340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_connect_type_ = InputDeviceInfo::TYPE_UNKNOWN; 341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendKeyboardDeviceNotification(NULL); 342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateDevices(); 343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (id == pointing_device_id_) { 344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_id_.clear(); 345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_name_.clear(); 346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_connect_type_ = InputDeviceInfo::TYPE_UNKNOWN; 347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendPointingDeviceNotification(); 348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateDevices(); 349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HIDDetectionScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) { 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) registry->RegisterIntegerPref(prefs::kTimesHIDDialogShown, 0); 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HIDDetectionScreenHandler::GetDevicesFirstTime() { 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) input_service_proxy_.GetDevices( 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::OnGetInputDevicesListFirstTime, 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::UpdateDevices() { 364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input_service_proxy_.GetDevices( 365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::OnGetInputDevicesList, 366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::UpdateBTDevices() { 370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!adapter_ || !adapter_->IsPresent() || !adapter_->IsPowered()) 371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // If no connected devices found as pointing device and keyboard, we try to 374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // connect some type-suitable active bluetooth device. 375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<device::BluetoothDevice*> bt_devices = adapter_->GetDevices(); 376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (std::vector<device::BluetoothDevice*>::const_iterator it = 377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bt_devices.begin(); 378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) it != bt_devices.end() && 379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) (keyboard_device_id_.empty() || pointing_device_id_.empty()); 380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ++it) { 381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsPointingDevice(*it); 382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TryPairingAsKeyboardDevice(*it); 383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HIDDetectionScreenHandler::ProcessConnectedDevicesList( 387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::vector<InputDeviceInfo>& devices) { 388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (std::vector<InputDeviceInfo>::const_iterator it = devices.begin(); 389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) it != devices.end() && 390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) (pointing_device_id_.empty() || keyboard_device_id_.empty()); 391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ++it) { 392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pointing_device_id_.empty() && DeviceIsPointing(*it)) { 393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_id_ = it->id; 394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_name_ = it->name; 395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointing_device_connect_type_ = it->type; 396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendPointingDeviceNotification(); 397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (keyboard_device_id_.empty() && it->is_keyboard) { 399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_id_ = it->id; 400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_name_ = it->name; 401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_device_connect_type_ = it->type; 402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendKeyboardDeviceNotification(NULL); 403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HIDDetectionScreenHandler::TryInitiateBTDevicesUpdate() { 408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if ((pointing_device_id_.empty() || keyboard_device_id_.empty()) && 409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_) { 410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!adapter_->IsPresent()) { 411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Switch on BT adapter later when it's available. 412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) switch_on_adapter_when_ready_ = true; 413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (!adapter_->IsPowered()) { 414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) adapter_->SetPowered( 415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) true, 416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::StartBTDiscoverySession, 417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::SetPoweredError, 419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateBTDevices(); 422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HIDDetectionScreenHandler::OnGetInputDevicesListFirstTime( 427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<InputDeviceInfo>& devices) { 428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProcessConnectedDevicesList(devices); 429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Skip screen if both devices are present. 431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool all_devices_autodetected = !pointing_device_id_.empty() && 432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !keyboard_device_id_.empty(); 433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("HIDDetection.OOBEDialogShown", 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !all_devices_autodetected); 435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (all_devices_autodetected) { 436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HandleOnContinue(); 437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefService* local_state = g_browser_process->local_state(); 440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int num_of_times_dialog_was_shown = local_state->GetInteger( 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prefs::kTimesHIDDialogShown); 442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) local_state->SetInteger(prefs::kTimesHIDDialogShown, 443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_of_times_dialog_was_shown + 1); 444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) first_time_screen_show_ = false; 445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TryInitiateBTDevicesUpdate(); 447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HIDDetectionScreenHandler::OnGetInputDevicesList( 450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<InputDeviceInfo>& devices) { 451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProcessConnectedDevicesList(devices); 452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TryInitiateBTDevicesUpdate(); 453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::ConnectBTDevice( 456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice* device) { 457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!device->IsPairable() || device->IsPaired()) 458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice::DeviceType device_type = device->GetDeviceType(); 460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (device_type == device::BluetoothDevice::DEVICE_MOUSE || 462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_type == device::BluetoothDevice::DEVICE_TABLET) { 463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mouse_is_pairing_) 464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mouse_is_pairing_ = true; 466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (device_type == device::BluetoothDevice::DEVICE_KEYBOARD) { 467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (keyboard_is_pairing_) 468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_is_pairing_ = true; 470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (device_type == 471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice::DEVICE_KEYBOARD_MOUSE_COMBO) { 472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mouse_is_pairing_ || keyboard_is_pairing_) 473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mouse_is_pairing_ = true; 475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_is_pairing_ = true; 476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->Connect(this, 478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::BTConnected, 479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), device_type), 480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&HIDDetectionScreenHandler::BTConnectError, 481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device->GetAddress(), device_type)); 483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::BTConnected( 486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice::DeviceType device_type) { 487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (DeviceIsPointing(device_type)) 488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mouse_is_pairing_ = false; 489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (DeviceIsKeyboard(device_type)) 490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_is_pairing_ = false; 491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::BTConnectError( 494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& address, 495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice::DeviceType device_type, 496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device::BluetoothDevice::ConnectErrorCode error_code) { 497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(WARNING) << "BTConnectError while connecting " << address 498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << " error code = " << error_code; 499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (DeviceIsPointing(device_type)) 500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mouse_is_pairing_ = false; 501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (DeviceIsKeyboard(device_type)) 502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) keyboard_is_pairing_ = false; 503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pointing_device_id_.empty() || keyboard_device_id_.empty()) 505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateDevices(); 506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::SendPointingDeviceNotification() { 510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string state; 511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (pointing_device_id_.empty()) 512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state = kSearchingState; 513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else if (pointing_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH) 514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state = kBTPairedState; 515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else 516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state = kUSBConnectedState; 517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CallJS("setPointingDeviceState", state); 518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HIDDetectionScreenHandler::SendKeyboardDeviceNotification( 521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::DictionaryValue* params) { 522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::DictionaryValue state_info; 523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (params) 524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.MergeDictionary(params); 525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::string16 device_name; 527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!state_info.GetString(kDeviceNameArgName, &device_name)) { 528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_name = l10n_util::GetStringUTF16( 529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_DEFAULT_KEYBOARD_NAME); 530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (keyboard_device_id_.empty()) { 533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!state_info.HasKey("state")) { 534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.SetString("state", kSearchingState); 535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (state_info.HasKey(kPincodeArgName)) { 536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.SetString( 537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kLabelArgName, 538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) l10n_util::GetStringFUTF16( 539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_BLUETOOTH_REMOTE_PIN_CODE_REQUEST, 540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_name)); 541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (keyboard_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH) { 543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.SetString("state", kBTPairedState); 544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.SetString( 545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kLabelArgName, 546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) l10n_util::GetStringFUTF16( 547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDS_HID_DETECTION_PAIRED_BLUETOOTH_KEYBOARD, 548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::UTF8ToUTF16(keyboard_device_name_))); 549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_info.SetString("state", kUSBConnectedState); 551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CallJS("setKeyboardDeviceState", state_info); 553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 555a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} // namespace chromeos 556