Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(567)

Side by Side Diff: device/bluetooth/bluetooth_pairing_chromeos.cc

Issue 183853010: Bluetooth: notify user of incoming pairing requests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fit nits, add unit tests dep Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "device/bluetooth/bluetooth_pairing_chromeos.h" 5 #include "device/bluetooth/bluetooth_pairing_chromeos.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/metrics/histogram.h" 8 #include "base/metrics/histogram.h"
9 #include "device/bluetooth/bluetooth_device.h" 9 #include "device/bluetooth/bluetooth_device.h"
10 #include "device/bluetooth/bluetooth_device_chromeos.h" 10 #include "device/bluetooth/bluetooth_device_chromeos.h"
11 11
12 using device::BluetoothDevice; 12 using device::BluetoothDevice;
13 13
14 namespace { 14 namespace {
15 15
16 // Histogram enumerations for pairing methods. 16 // Histogram enumerations for pairing methods.
17 enum UMAPairingMethod { 17 enum UMAPairingMethod {
18 UMA_PAIRING_METHOD_NONE, 18 UMA_PAIRING_METHOD_NONE,
19 UMA_PAIRING_METHOD_REQUEST_PINCODE, 19 UMA_PAIRING_METHOD_REQUEST_PINCODE,
20 UMA_PAIRING_METHOD_REQUEST_PASSKEY, 20 UMA_PAIRING_METHOD_REQUEST_PASSKEY,
21 UMA_PAIRING_METHOD_DISPLAY_PINCODE, 21 UMA_PAIRING_METHOD_DISPLAY_PINCODE,
22 UMA_PAIRING_METHOD_DISPLAY_PASSKEY, 22 UMA_PAIRING_METHOD_DISPLAY_PASSKEY,
23 UMA_PAIRING_METHOD_CONFIRM_PASSKEY, 23 UMA_PAIRING_METHOD_CONFIRM_PASSKEY,
24 // NOTE: Add new pairing methods immediately above this line. Make sure to 24 // NOTE: Add new pairing methods immediately above this line. Make sure to
25 // update the enum list in tools/histogram/histograms.xml accordingly. 25 // update the enum list in tools/histogram/histograms.xml accordingly.
26 UMA_PAIRING_METHOD_COUNT 26 UMA_PAIRING_METHOD_COUNT
27 }; 27 };
28 28
29 // Number of keys that will be entered for a passkey, six digits plus the
30 // final enter.
31 const uint16 kPasskeyMaxKeysEntered = 7;
32
29 } // namespace 33 } // namespace
30 34
31 namespace chromeos { 35 namespace chromeos {
32 36
33 BluetoothPairingChromeOS::BluetoothPairingChromeOS( 37 BluetoothPairingChromeOS::BluetoothPairingChromeOS(
34 BluetoothDeviceChromeOS* device, 38 BluetoothDeviceChromeOS* device,
35 BluetoothDevice::PairingDelegate* pairing_delegate) 39 BluetoothDevice::PairingDelegate* pairing_delegate)
36 : device_(device), 40 : device_(device),
37 pairing_delegate_(pairing_delegate), 41 pairing_delegate_(pairing_delegate),
38 pairing_delegate_used_(false) { 42 pairing_delegate_used_(false) {
(...skipping 28 matching lines...) Expand all
67 71
68 pairing_delegate_ = NULL; 72 pairing_delegate_ = NULL;
69 } 73 }
70 74
71 void BluetoothPairingChromeOS::RequestPinCode( 75 void BluetoothPairingChromeOS::RequestPinCode(
72 const BluetoothAgentServiceProvider::Delegate::PinCodeCallback& callback) { 76 const BluetoothAgentServiceProvider::Delegate::PinCodeCallback& callback) {
73 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod", 77 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod",
74 UMA_PAIRING_METHOD_REQUEST_PINCODE, 78 UMA_PAIRING_METHOD_REQUEST_PINCODE,
75 UMA_PAIRING_METHOD_COUNT); 79 UMA_PAIRING_METHOD_COUNT);
76 80
77 DCHECK(pincode_callback_.is_null()); 81 ResetCallbacks();
78 pincode_callback_ = callback; 82 pincode_callback_ = callback;
83 pairing_delegate_used_ = true;
79 pairing_delegate_->RequestPinCode(device_); 84 pairing_delegate_->RequestPinCode(device_);
80 pairing_delegate_used_ = true;
81 } 85 }
82 86
83 bool BluetoothPairingChromeOS::ExpectingPinCode() const { 87 bool BluetoothPairingChromeOS::ExpectingPinCode() const {
84 return !pincode_callback_.is_null(); 88 return !pincode_callback_.is_null();
85 } 89 }
86 90
87 void BluetoothPairingChromeOS::SetPinCode(const std::string& pincode) { 91 void BluetoothPairingChromeOS::SetPinCode(const std::string& pincode) {
88 if (pincode_callback_.is_null()) 92 if (pincode_callback_.is_null())
89 return; 93 return;
90 94
91 pincode_callback_.Run(BluetoothAgentServiceProvider::Delegate::SUCCESS, 95 pincode_callback_.Run(BluetoothAgentServiceProvider::Delegate::SUCCESS,
92 pincode); 96 pincode);
93 pincode_callback_.Reset(); 97 pincode_callback_.Reset();
94 98
95 // If this is not an outgoing connection to the device, clean up the pairing 99 // If this is not an outgoing connection to the device, clean up the pairing
96 // context since the pairing is done. The outgoing connection case is cleaned 100 // context since the pairing is done. The outgoing connection case is cleaned
97 // up in the callback for the underlying Pair() call. 101 // up in the callback for the underlying Pair() call.
98 if (!device_->IsConnecting()) 102 if (!device_->IsConnecting())
99 device_->EndPairing(); 103 device_->EndPairing();
100 } 104 }
101 105
102 void BluetoothPairingChromeOS::DisplayPinCode(const std::string& pincode) { 106 void BluetoothPairingChromeOS::DisplayPinCode(const std::string& pincode) {
103 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod", 107 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod",
104 UMA_PAIRING_METHOD_DISPLAY_PINCODE, 108 UMA_PAIRING_METHOD_DISPLAY_PINCODE,
105 UMA_PAIRING_METHOD_COUNT); 109 UMA_PAIRING_METHOD_COUNT);
106 110
111 ResetCallbacks();
112 pairing_delegate_used_ = true;
107 pairing_delegate_->DisplayPinCode(device_, pincode); 113 pairing_delegate_->DisplayPinCode(device_, pincode);
108 pairing_delegate_used_ = true;
109 114
110 // If this is not an outgoing connection to the device, the pairing context 115 // If this is not an outgoing connection to the device, the pairing context
111 // needs to be cleaned up again as there's no reliable indication of 116 // needs to be cleaned up again as there's no reliable indication of
112 // completion of incoming pairing. 117 // completion of incoming pairing.
113 if (!device_->IsConnecting()) 118 if (!device_->IsConnecting())
114 device_->EndPairing(); 119 device_->EndPairing();
115 } 120 }
116 121
117 void BluetoothPairingChromeOS::RequestPasskey( 122 void BluetoothPairingChromeOS::RequestPasskey(
118 const BluetoothAgentServiceProvider::Delegate::PasskeyCallback& callback) { 123 const BluetoothAgentServiceProvider::Delegate::PasskeyCallback& callback) {
119 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod", 124 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod",
120 UMA_PAIRING_METHOD_REQUEST_PASSKEY, 125 UMA_PAIRING_METHOD_REQUEST_PASSKEY,
121 UMA_PAIRING_METHOD_COUNT); 126 UMA_PAIRING_METHOD_COUNT);
122 127
123 DCHECK(passkey_callback_.is_null()); 128 ResetCallbacks();
124 passkey_callback_ = callback; 129 passkey_callback_ = callback;
130 pairing_delegate_used_ = true;
125 pairing_delegate_->RequestPasskey(device_); 131 pairing_delegate_->RequestPasskey(device_);
126 pairing_delegate_used_ = true;
127 } 132 }
128 133
129 bool BluetoothPairingChromeOS::ExpectingPasskey() const { 134 bool BluetoothPairingChromeOS::ExpectingPasskey() const {
130 return !passkey_callback_.is_null(); 135 return !passkey_callback_.is_null();
131 } 136 }
132 137
133 void BluetoothPairingChromeOS::SetPasskey(uint32 passkey) { 138 void BluetoothPairingChromeOS::SetPasskey(uint32 passkey) {
134 if (passkey_callback_.is_null()) 139 if (passkey_callback_.is_null())
135 return; 140 return;
136 141
137 passkey_callback_.Run(BluetoothAgentServiceProvider::Delegate::SUCCESS, 142 passkey_callback_.Run(BluetoothAgentServiceProvider::Delegate::SUCCESS,
138 passkey); 143 passkey);
139 passkey_callback_.Reset(); 144 passkey_callback_.Reset();
140 145
141 // If this is not an outgoing connection to the device, clean up the pairing 146 // If this is not an outgoing connection to the device, clean up the pairing
142 // context since the pairing is done. The outgoing connection case is cleaned 147 // context since the pairing is done. The outgoing connection case is cleaned
143 // up in the callback for the underlying Pair() call. 148 // up in the callback for the underlying Pair() call.
144 if (!device_->IsConnecting()) 149 if (!device_->IsConnecting())
145 device_->EndPairing(); 150 device_->EndPairing();
146 } 151 }
147 152
148 void BluetoothPairingChromeOS::DisplayPasskey(uint32 passkey) { 153 void BluetoothPairingChromeOS::DisplayPasskey(uint32 passkey) {
149 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod", 154 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod",
150 UMA_PAIRING_METHOD_DISPLAY_PASSKEY, 155 UMA_PAIRING_METHOD_DISPLAY_PASSKEY,
151 UMA_PAIRING_METHOD_COUNT); 156 UMA_PAIRING_METHOD_COUNT);
152 157
158 ResetCallbacks();
159 pairing_delegate_used_ = true;
160 pairing_delegate_->DisplayPasskey(device_, passkey);
153 161
154 pairing_delegate_->DisplayPasskey(device_, passkey); 162 }
163
164 void BluetoothPairingChromeOS::KeysEntered(uint16 entered) {
155 pairing_delegate_used_ = true; 165 pairing_delegate_used_ = true;
166 pairing_delegate_->KeysEntered(device_, entered);
156 167
157 // If this is not an outgoing connection to the device, the pairing context 168 // If this is not an outgoing connection to the device, the pairing context
158 // needs to be cleaned up again as there's no reliable indication of 169 // needs to be cleaned up again as there's no reliable indication of
159 // completion of incoming pairing. 170 // completion of incoming pairing.
160 if (!device_->IsConnecting()) 171 if (entered >= kPasskeyMaxKeysEntered && !device_->IsConnecting())
161 device_->EndPairing(); 172 device_->EndPairing();
162 } 173 }
163 174
164 void BluetoothPairingChromeOS::KeysEntered(uint16 entered) {
165 pairing_delegate_->KeysEntered(device_, entered);
166 pairing_delegate_used_ = true;
167 }
168
169 void BluetoothPairingChromeOS::RequestConfirmation( 175 void BluetoothPairingChromeOS::RequestConfirmation(
170 uint32 passkey, 176 uint32 passkey,
171 const BluetoothAgentServiceProvider::Delegate::ConfirmationCallback& 177 const BluetoothAgentServiceProvider::Delegate::ConfirmationCallback&
172 callback) { 178 callback) {
173 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod", 179 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod",
174 UMA_PAIRING_METHOD_CONFIRM_PASSKEY, 180 UMA_PAIRING_METHOD_CONFIRM_PASSKEY,
175 UMA_PAIRING_METHOD_COUNT); 181 UMA_PAIRING_METHOD_COUNT);
176 182
177 DCHECK(confirmation_callback_.is_null()); 183 ResetCallbacks();
178 confirmation_callback_ = callback; 184 confirmation_callback_ = callback;
185 pairing_delegate_used_ = true;
179 pairing_delegate_->ConfirmPasskey(device_, passkey); 186 pairing_delegate_->ConfirmPasskey(device_, passkey);
180 pairing_delegate_used_ = true;
181 } 187 }
182 188
183 void BluetoothPairingChromeOS::RequestAuthorization( 189 void BluetoothPairingChromeOS::RequestAuthorization(
184 const BluetoothAgentServiceProvider::Delegate::ConfirmationCallback& 190 const BluetoothAgentServiceProvider::Delegate::ConfirmationCallback&
185 callback) { 191 callback) {
186 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod", 192 UMA_HISTOGRAM_ENUMERATION("Bluetooth.PairingMethod",
187 UMA_PAIRING_METHOD_NONE, 193 UMA_PAIRING_METHOD_NONE,
188 UMA_PAIRING_METHOD_COUNT); 194 UMA_PAIRING_METHOD_COUNT);
189 195
190 DCHECK(confirmation_callback_.is_null()); 196 ResetCallbacks();
191 confirmation_callback_ = callback; 197 confirmation_callback_ = callback;
198 pairing_delegate_used_ = true;
192 pairing_delegate_->AuthorizePairing(device_); 199 pairing_delegate_->AuthorizePairing(device_);
193 pairing_delegate_used_ = true;
194 } 200 }
195 201
196 bool BluetoothPairingChromeOS::ExpectingConfirmation() const { 202 bool BluetoothPairingChromeOS::ExpectingConfirmation() const {
197 return !confirmation_callback_.is_null(); 203 return !confirmation_callback_.is_null();
198 } 204 }
199 205
200 void BluetoothPairingChromeOS::ConfirmPairing() { 206 void BluetoothPairingChromeOS::ConfirmPairing() {
201 if (confirmation_callback_.is_null()) 207 if (confirmation_callback_.is_null())
202 return; 208 return;
203 209
(...skipping 15 matching lines...) Expand all
219 bool BluetoothPairingChromeOS::CancelPairing() { 225 bool BluetoothPairingChromeOS::CancelPairing() {
220 return RunPairingCallbacks( 226 return RunPairingCallbacks(
221 BluetoothAgentServiceProvider::Delegate::CANCELLED); 227 BluetoothAgentServiceProvider::Delegate::CANCELLED);
222 } 228 }
223 229
224 BluetoothDevice::PairingDelegate* 230 BluetoothDevice::PairingDelegate*
225 BluetoothPairingChromeOS::GetPairingDelegate() const { 231 BluetoothPairingChromeOS::GetPairingDelegate() const {
226 return pairing_delegate_; 232 return pairing_delegate_;
227 } 233 }
228 234
235 void BluetoothPairingChromeOS::ResetCallbacks() {
236 pincode_callback_.Reset();
237 passkey_callback_.Reset();
238 confirmation_callback_.Reset();
239 }
240
229 bool BluetoothPairingChromeOS::RunPairingCallbacks( 241 bool BluetoothPairingChromeOS::RunPairingCallbacks(
230 BluetoothAgentServiceProvider::Delegate::Status status) { 242 BluetoothAgentServiceProvider::Delegate::Status status) {
231 pairing_delegate_used_ = true; 243 pairing_delegate_used_ = true;
232 244
233 bool callback_run = false; 245 bool callback_run = false;
234 if (!pincode_callback_.is_null()) { 246 if (!pincode_callback_.is_null()) {
235 pincode_callback_.Run(status, ""); 247 pincode_callback_.Run(status, "");
236 pincode_callback_.Reset(); 248 pincode_callback_.Reset();
237 callback_run = true; 249 callback_run = true;
238 } 250 }
(...skipping 13 matching lines...) Expand all
252 // If this is not an outgoing connection to the device, clean up the pairing 264 // If this is not an outgoing connection to the device, clean up the pairing
253 // context since the pairing is done. The outgoing connection case is cleaned 265 // context since the pairing is done. The outgoing connection case is cleaned
254 // up in the callback for the underlying Pair() call. 266 // up in the callback for the underlying Pair() call.
255 if (!device_->IsConnecting()) 267 if (!device_->IsConnecting())
256 device_->EndPairing(); 268 device_->EndPairing();
257 269
258 return callback_run; 270 return callback_run;
259 } 271 }
260 272
261 } // namespace chromeos 273 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698