OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 cr.exportPath('settings'); | 5 cr.exportPath('settings'); |
6 | 6 |
7 (function() { | 7 (function() { |
8 | 8 |
9 var PairingEventType = chrome.bluetoothPrivate.PairingEventType; | 9 var PairingEventType = chrome.bluetoothPrivate.PairingEventType; |
10 | 10 |
(...skipping 11 matching lines...) Expand all Loading... |
22 type: Object, | 22 type: Object, |
23 observer: 'adapterStateChanged_', | 23 observer: 'adapterStateChanged_', |
24 }, | 24 }, |
25 | 25 |
26 /** | 26 /** |
27 * The ordered list of bluetooth devices. | 27 * The ordered list of bluetooth devices. |
28 * @type {!Array<!chrome.bluetooth.Device>} | 28 * @type {!Array<!chrome.bluetooth.Device>} |
29 */ | 29 */ |
30 deviceList: { | 30 deviceList: { |
31 type: Array, | 31 type: Array, |
32 value: /** @return {Array} */ function() { return []; }, | 32 value: /** @return {Array} */ function() { |
| 33 return []; |
| 34 }, |
33 }, | 35 }, |
34 }, | 36 }, |
35 | 37 |
36 /** @private */ | 38 /** @private */ |
37 adapterStateChanged_: function() { | 39 adapterStateChanged_: function() { |
38 if (!this.adapterState.powered) | 40 if (!this.adapterState.powered) |
39 this.close(); | 41 this.close(); |
40 }, | 42 }, |
41 | 43 |
42 /** | 44 /** |
43 * @param {!chrome.bluetooth.Device} device | 45 * @param {!chrome.bluetooth.Device} device |
44 * @return {boolean} | 46 * @return {boolean} |
45 * @private | 47 * @private |
46 */ | 48 */ |
47 deviceNotPaired_: function(device) { return !device.paired; }, | 49 deviceNotPaired_: function(device) { |
| 50 return !device.paired; |
| 51 }, |
48 | 52 |
49 /** | 53 /** |
50 * @param {!Array<!chrome.bluetooth.Device>} deviceList | |
51 * @return {boolean} True if deviceList contains any unpaired devices. | 54 * @return {boolean} True if deviceList contains any unpaired devices. |
52 * @private | 55 * @private |
53 */ | 56 */ |
54 haveDevices_: function(deviceList) { | 57 haveDevices_: function(deviceList) { |
55 return this.deviceList.findIndex(function(d) { return !d.paired; }) != -1; | 58 return this.deviceList.findIndex(function(d) { |
| 59 return !d.paired; |
| 60 }) != -1; |
56 }, | 61 }, |
57 | 62 |
58 /** | 63 /** |
59 * @param {!{detail: {action: string, device: !chrome.bluetooth.Device}}} e | 64 * @param {!{detail: {action: string, device: !chrome.bluetooth.Device}}} e |
60 * @private | 65 * @private |
61 */ | 66 */ |
62 onDeviceEvent_: function(e) { | 67 onDeviceEvent_: function(e) { |
63 this.fire('device-event', e.detail); | 68 this.fire('device-event', e.detail); |
64 /** @type {Event} */ (e).stopPropagation(); | 69 /** @type {Event} */ (e).stopPropagation(); |
65 }, | 70 }, |
(...skipping 25 matching lines...) Expand all Loading... |
91 type: Array, | 96 type: Array, |
92 readOnly: true, | 97 readOnly: true, |
93 value: [0, 1, 2, 3, 4, 5], | 98 value: [0, 1, 2, 3, 4, 5], |
94 }, | 99 }, |
95 }, | 100 }, |
96 | 101 |
97 observers: [ | 102 observers: [ |
98 'pairingChanged_(pairingDevice, pairingEvent)', | 103 'pairingChanged_(pairingDevice, pairingEvent)', |
99 ], | 104 ], |
100 | 105 |
101 /** | 106 /** @private */ |
102 * @param {?chrome.bluetooth.Device} pairingDevice | 107 pairingChanged_: function() { |
103 * @param {?chrome.bluetoothPrivate.PairingEvent} pairingEvent | |
104 * @private | |
105 */ | |
106 pairingChanged_: function(pairingDevice, pairingEvent) { | |
107 // Auto-close the dialog when pairing completes. | 108 // Auto-close the dialog when pairing completes. |
108 if (pairingDevice && pairingDevice.connected) { | 109 if (this.pairingDevice && this.pairingDevice.connected) { |
109 this.close(); | 110 this.close(); |
110 return; | 111 return; |
111 } | 112 } |
112 this.pinOrPass = ''; | 113 this.pinOrPass = ''; |
113 }, | 114 }, |
114 | 115 |
115 /** | 116 /** |
116 * @param {?chrome.bluetooth.Device} device | |
117 * @param {?chrome.bluetoothPrivate.PairingEvent} pairingEvent | |
118 * @return {string} | 117 * @return {string} |
119 * @private | 118 * @private |
120 */ | 119 */ |
121 getMessage_: function(device, pairingEvent) { | 120 getMessage_: function() { |
122 if (!device) | 121 if (!this.pairingDevice) |
123 return ''; | 122 return ''; |
124 var message; | 123 var message; |
125 if (!pairingEvent) | 124 if (!this.pairingEvent) |
126 message = 'bluetoothStartConnecting'; | 125 message = 'bluetoothStartConnecting'; |
127 else | 126 else |
128 message = this.getEventDesc_(pairingEvent.pairing); | 127 message = this.getEventDesc_(this.pairingEvent.pairing); |
129 return this.i18n(message, device.name); | 128 return this.i18n(message, this.pairingDevice.name); |
130 }, | 129 }, |
131 | 130 |
132 /** | 131 /** |
133 * @param {?chrome.bluetoothPrivate.PairingEvent} pairingEvent | |
134 * @return {boolean} | 132 * @return {boolean} |
135 * @private | 133 * @private |
136 */ | 134 */ |
137 showEnterPincode_: function(pairingEvent) { | 135 showEnterPincode_: function() { |
138 return !!pairingEvent && | 136 return !!this.pairingEvent && |
139 pairingEvent.pairing == PairingEventType.REQUEST_PINCODE; | 137 this.pairingEvent.pairing == PairingEventType.REQUEST_PINCODE; |
140 }, | 138 }, |
141 | 139 |
142 /** | 140 /** |
143 * @param {?chrome.bluetoothPrivate.PairingEvent} pairingEvent | |
144 * @return {boolean} | 141 * @return {boolean} |
145 * @private | 142 * @private |
146 */ | 143 */ |
147 showEnterPasskey_: function(pairingEvent) { | 144 showEnterPasskey_: function() { |
148 return !!pairingEvent && | 145 return !!this.pairingEvent && |
149 pairingEvent.pairing == PairingEventType.REQUEST_PASSKEY; | 146 this.pairingEvent.pairing == PairingEventType.REQUEST_PASSKEY; |
150 }, | 147 }, |
151 | 148 |
152 /** | 149 /** |
153 * @param {?chrome.bluetoothPrivate.PairingEvent} pairingEvent | |
154 * @return {boolean} | 150 * @return {boolean} |
155 * @private | 151 * @private |
156 */ | 152 */ |
157 showDisplayPassOrPin_: function(pairingEvent) { | 153 showDisplayPassOrPin_: function() { |
158 if (!pairingEvent) | 154 if (!this.pairingEvent) |
159 return false; | 155 return false; |
160 var pairing = pairingEvent.pairing; | 156 var pairing = this.pairingEvent.pairing; |
161 return ( | 157 return ( |
162 pairing == PairingEventType.DISPLAY_PINCODE || | 158 pairing == PairingEventType.DISPLAY_PINCODE || |
163 pairing == PairingEventType.DISPLAY_PASSKEY || | 159 pairing == PairingEventType.DISPLAY_PASSKEY || |
164 pairing == PairingEventType.CONFIRM_PASSKEY || | 160 pairing == PairingEventType.CONFIRM_PASSKEY || |
165 pairing == PairingEventType.KEYS_ENTERED); | 161 pairing == PairingEventType.KEYS_ENTERED); |
166 }, | 162 }, |
167 | 163 |
168 /** | 164 /** |
169 * @param {?chrome.bluetoothPrivate.PairingEvent} pairingEvent | |
170 * @return {boolean} | 165 * @return {boolean} |
171 * @private | 166 * @private |
172 */ | 167 */ |
173 showAcceptReject_: function(pairingEvent) { | 168 showAcceptReject_: function() { |
174 return !!pairingEvent && | 169 return !!this.pairingEvent && |
175 pairingEvent.pairing == PairingEventType.CONFIRM_PASSKEY; | 170 this.pairingEvent.pairing == PairingEventType.CONFIRM_PASSKEY; |
176 }, | 171 }, |
177 | 172 |
178 /** | 173 /** |
179 * @param {?chrome.bluetoothPrivate.PairingEvent} pairingEvent | |
180 * @return {boolean} | 174 * @return {boolean} |
181 * @private | 175 * @private |
182 */ | 176 */ |
183 showConnect_: function(pairingEvent) { | 177 showConnect_: function() { |
184 if (!pairingEvent) | 178 if (!this.pairingEvent) |
185 return false; | 179 return false; |
186 var pairing = pairingEvent.pairing; | 180 var pairing = this.pairingEvent.pairing; |
187 return pairing == PairingEventType.REQUEST_PINCODE || | 181 return pairing == PairingEventType.REQUEST_PINCODE || |
188 pairing == PairingEventType.REQUEST_PASSKEY; | 182 pairing == PairingEventType.REQUEST_PASSKEY; |
189 }, | 183 }, |
190 | 184 |
191 /** | 185 /** |
192 * @param {?chrome.bluetoothPrivate.PairingEvent} pairingEvent | |
193 * @param {string} pinOrPass Unused; call is triggered when this changes. | |
194 * @return {boolean} | 186 * @return {boolean} |
195 * @private | 187 * @private |
196 */ | 188 */ |
197 enableConnect_: function(pairingEvent, pinOrPass) { | 189 enableConnect_: function() { |
198 if (!this.showConnect_(this.pairingEvent)) | 190 if (!this.showConnect_()) |
199 return false; | 191 return false; |
200 var inputId = | 192 var inputId = |
201 (this.pairingEvent.pairing == PairingEventType.REQUEST_PINCODE) ? | 193 (this.pairingEvent.pairing == PairingEventType.REQUEST_PINCODE) ? |
202 '#pincode' : | 194 '#pincode' : |
203 '#passkey'; | 195 '#passkey'; |
204 var paperInput = /** @type {!PaperInputElement} */ (this.$$(inputId)); | 196 var paperInput = /** @type {!PaperInputElement} */ (this.$$(inputId)); |
205 assert(paperInput); | 197 assert(paperInput); |
206 /** @type {string} */ var value = paperInput.value; | 198 /** @type {string} */ var value = paperInput.value; |
207 return !!value && paperInput.validate(); | 199 return !!value && paperInput.validate(); |
208 }, | 200 }, |
209 | 201 |
210 /** | 202 /** |
211 * @param {?chrome.bluetooth.Device} device | |
212 * @param {?chrome.bluetoothPrivate.PairingEvent} pairingEvent | |
213 * @return {boolean} | 203 * @return {boolean} |
214 * @private | 204 * @private |
215 */ | 205 */ |
216 showDismiss_: function(device, pairingEvent) { | 206 showDismiss_: function() { |
217 return (!!device && device.paired) || | 207 return (!!this.paringDevice && this.pairingDevice.paired) || |
218 (!!pairingEvent && pairingEvent.pairing == PairingEventType.COMPLETE); | 208 (!!this.pairingEvent && |
| 209 this.pairingEvent.pairing == PairingEventType.COMPLETE); |
219 }, | 210 }, |
220 | 211 |
221 /** @private */ | 212 /** @private */ |
222 onAcceptTap_: function() { | 213 onAcceptTap_: function() { |
223 this.sendResponse_(chrome.bluetoothPrivate.PairingResponse.CONFIRM); | 214 this.sendResponse_(chrome.bluetoothPrivate.PairingResponse.CONFIRM); |
224 }, | 215 }, |
225 | 216 |
226 /** @private */ | 217 /** @private */ |
227 onConnectTap_: function() { | 218 onConnectTap_: function() { |
228 this.sendResponse_(chrome.bluetoothPrivate.PairingResponse.CONFIRM); | 219 this.sendResponse_(chrome.bluetoothPrivate.PairingResponse.CONFIRM); |
229 }, | 220 }, |
230 | 221 |
231 /** @private */ | 222 /** @private */ |
232 onRejectTap_: function() { | 223 onRejectTap_: function() { |
233 this.sendResponse_(chrome.bluetoothPrivate.PairingResponse.REJECT); | 224 this.sendResponse_(chrome.bluetoothPrivate.PairingResponse.REJECT); |
234 }, | 225 }, |
235 | 226 |
236 /** @private */ | 227 /** |
| 228 * @param {!chrome.bluetoothPrivate.PairingResponse} response |
| 229 * @private |
| 230 */ |
237 sendResponse_: function(response) { | 231 sendResponse_: function(response) { |
238 if (!this.pairingDevice) | 232 if (!this.pairingDevice) |
239 return; | 233 return; |
240 var options = | 234 var options = |
241 /** @type {!chrome.bluetoothPrivate.SetPairingResponseOptions} */ { | 235 /** @type {!chrome.bluetoothPrivate.SetPairingResponseOptions} */ { |
242 device: this.pairingDevice, | 236 device: this.pairingDevice, |
243 response: response | 237 response: response |
244 }; | 238 }; |
245 if (response == chrome.bluetoothPrivate.PairingResponse.CONFIRM) { | 239 if (response == chrome.bluetoothPrivate.PairingResponse.CONFIRM) { |
246 var pairing = this.pairingEvent.pairing; | 240 var pairing = this.pairingEvent.pairing; |
(...skipping 14 matching lines...) Expand all Loading... |
261 assert(eventType); | 255 assert(eventType); |
262 if (eventType == PairingEventType.COMPLETE || | 256 if (eventType == PairingEventType.COMPLETE || |
263 eventType == PairingEventType.KEYS_ENTERED || | 257 eventType == PairingEventType.KEYS_ENTERED || |
264 eventType == PairingEventType.REQUEST_AUTHORIZATION) { | 258 eventType == PairingEventType.REQUEST_AUTHORIZATION) { |
265 return 'bluetoothStartConnecting'; | 259 return 'bluetoothStartConnecting'; |
266 } | 260 } |
267 return 'bluetooth_' + /** @type {string} */ (eventType); | 261 return 'bluetooth_' + /** @type {string} */ (eventType); |
268 }, | 262 }, |
269 | 263 |
270 /** | 264 /** |
271 * @param {?chrome.bluetoothPrivate.PairingEvent} pairingEvent | |
272 * @param {number} index | 265 * @param {number} index |
273 * @return {string} | 266 * @return {string} |
274 * @private | 267 * @private |
275 */ | 268 */ |
276 getPinDigit_: function(pairingEvent, index) { | 269 getPinDigit_: function(index) { |
277 if (!pairingEvent) | 270 if (!this.pairingEvent) |
278 return ''; | 271 return ''; |
279 var digit = '0'; | 272 var digit = '0'; |
280 var pairing = pairingEvent.pairing; | 273 var pairing = this.pairingEvent.pairing; |
281 if (pairing == PairingEventType.DISPLAY_PINCODE && pairingEvent.pincode && | 274 if (pairing == PairingEventType.DISPLAY_PINCODE && |
282 index < pairingEvent.pincode.length) { | 275 this.pairingEvent.pincode && index < this.pairingEvent.pincode.length) { |
283 digit = pairingEvent.pincode[index]; | 276 digit = this.pairingEvent.pincode[index]; |
284 } else if ( | 277 } else if ( |
285 pairingEvent.passkey && (pairing == PairingEventType.DISPLAY_PASSKEY || | 278 this.pairingEvent.passkey && |
286 pairing == PairingEventType.KEYS_ENTERED || | 279 (pairing == PairingEventType.DISPLAY_PASSKEY || |
287 pairing == PairingEventType.CONFIRM_PASSKEY)) { | 280 pairing == PairingEventType.KEYS_ENTERED || |
288 var passkeyString = String(pairingEvent.passkey); | 281 pairing == PairingEventType.CONFIRM_PASSKEY)) { |
| 282 var passkeyString = String(this.pairingEvent.passkey); |
289 if (index < passkeyString.length) | 283 if (index < passkeyString.length) |
290 digit = passkeyString[index]; | 284 digit = passkeyString[index]; |
291 } | 285 } |
292 return digit; | 286 return digit; |
293 }, | 287 }, |
294 | 288 |
295 /** | 289 /** |
296 * @param {?chrome.bluetoothPrivate.PairingEvent} pairingEvent | |
297 * @param {number} index | 290 * @param {number} index |
298 * @return {string} | 291 * @return {string} |
299 * @private | 292 * @private |
300 */ | 293 */ |
301 getPinClass_: function(pairingEvent, index) { | 294 getPinClass_: function(index) { |
302 if (!pairingEvent) | 295 if (!this.pairingEvent) |
303 return ''; | 296 return ''; |
304 if (pairingEvent.pairing == PairingEventType.CONFIRM_PASSKEY) | 297 if (this.pairingEvent.pairing == PairingEventType.CONFIRM_PASSKEY) |
305 return 'confirm'; | 298 return 'confirm'; |
306 var cssClass = 'display'; | 299 var cssClass = 'display'; |
307 if (pairingEvent.pairing == PairingEventType.DISPLAY_PASSKEY) { | 300 if (this.pairingEvent.pairing == PairingEventType.DISPLAY_PASSKEY) { |
308 if (index == 0) | 301 if (index == 0) |
309 cssClass += ' next'; | 302 cssClass += ' next'; |
310 else | 303 else |
311 cssClass += ' untyped'; | 304 cssClass += ' untyped'; |
312 } else if ( | 305 } else if ( |
313 pairingEvent.pairing == PairingEventType.KEYS_ENTERED && | 306 this.pairingEvent.pairing == PairingEventType.KEYS_ENTERED && |
314 pairingEvent.enteredKey) { | 307 this.pairingEvent.enteredKey) { |
315 var enteredKey = pairingEvent.enteredKey; // 1-7 | 308 var enteredKey = this.pairingEvent.enteredKey; // 1-7 |
316 var lastKey = this.digits.length; // 6 | 309 var lastKey = this.digits.length; // 6 |
317 if ((index == -1 && enteredKey > lastKey) || (index + 1 == enteredKey)) | 310 if ((index == -1 && enteredKey > lastKey) || (index + 1 == enteredKey)) |
318 cssClass += ' next'; | 311 cssClass += ' next'; |
319 else if (index > enteredKey) | 312 else if (index > enteredKey) |
320 cssClass += ' untyped'; | 313 cssClass += ' untyped'; |
321 } | 314 } |
322 return cssClass; | 315 return cssClass; |
323 }, | 316 }, |
324 }; | 317 }; |
325 | 318 |
326 Polymer({ | 319 Polymer({ |
327 is: 'bluetooth-device-dialog', | 320 is: 'bluetooth-device-dialog', |
328 | 321 |
329 behaviors: [ | 322 behaviors: [ |
330 I18nBehavior, | 323 I18nBehavior, |
331 settings.BluetoothAddDeviceBehavior, | 324 settings.BluetoothAddDeviceBehavior, |
332 settings.BluetoothPairDeviceBehavior, | 325 settings.BluetoothPairDeviceBehavior, |
333 ], | 326 ], |
334 | 327 |
335 properties: { | 328 properties: { |
336 /** Which version of this dialog to show (adding or pairing). */ | 329 /** Which version of this dialog to show (adding or pairing). */ |
337 dialogId: String, | 330 dialogId: String, |
338 }, | 331 }, |
339 | 332 |
| 333 observers: [ |
| 334 'dialogUpdated_(dialogId, pairingEvent)', |
| 335 ], |
| 336 |
340 open: function() { | 337 open: function() { |
341 this.pinOrPass = ''; | 338 this.pinOrPass = ''; |
342 this.getDialog_().showModal(); | 339 this.getDialog_().showModal(); |
343 }, | 340 }, |
344 | 341 |
345 close: function() { | 342 close: function() { |
346 var dialog = this.getDialog_(); | 343 var dialog = this.getDialog_(); |
347 if (dialog.open) | 344 if (dialog.open) |
348 dialog.close(); | 345 dialog.close(); |
349 }, | 346 }, |
350 | 347 |
| 348 /** @private */ |
| 349 dialogUpdated_: function() { |
| 350 if (this.showEnterPincode_()) |
| 351 this.$$('#pincode').focus(); |
| 352 else if (this.showEnterPasskey_()) |
| 353 this.$$('#passkey').focus(); |
| 354 }, |
| 355 |
351 /** | 356 /** |
352 * @return {!CrDialogElement} | 357 * @return {!CrDialogElement} |
353 * @private | 358 * @private |
354 */ | 359 */ |
355 getDialog_: function() { | 360 getDialog_: function() { |
356 return /** @type {!CrDialogElement} */ (this.$.dialog); | 361 return /** @type {!CrDialogElement} */ (this.$.dialog); |
357 }, | 362 }, |
358 | 363 |
359 /** | 364 /** |
360 * @param {string} dialogId | 365 * @param {string} dialogId |
361 * @return {string} The title of for that |dialogId|. | 366 * @return {string} The title of for that |dialogId|. |
362 */ | 367 */ |
363 getTitle_: function(dialogId) { | 368 getTitle_: function(dialogId) { |
364 if (dialogId == 'addDevice') | 369 if (dialogId == 'addDevice') |
365 return this.i18n('bluetoothAddDevicePageTitle'); | 370 return this.i18n('bluetoothAddDevicePageTitle'); |
366 // Use the 'pair' title for the pairing dialog and error dialog. | 371 // Use the 'pair' title for the pairing dialog and error dialog. |
367 return this.i18n('bluetoothPairDevicePageTitle'); | 372 return this.i18n('bluetoothPairDevicePageTitle'); |
368 }, | 373 }, |
369 | 374 |
370 /** | 375 /** |
371 * @param {string} currentDialogType | 376 * @param {string} desiredDialogType |
372 * @param {string} wantedDialogType | |
373 * @return {boolean} | 377 * @return {boolean} |
374 * @private | 378 * @private |
375 */ | 379 */ |
376 isDialogType_: function(currentDialogType, wantedDialogType) { | 380 isDialogType_: function(desiredDialogType, currentDialogType) { |
377 return currentDialogType == wantedDialogType; | 381 return currentDialogType == desiredDialogType; |
378 }, | 382 }, |
379 | 383 |
380 /** @private */ | 384 /** @private */ |
381 onCancelTap_: function() { | 385 onCancelTap_: function() { |
382 this.getDialog_().cancel(); | 386 this.getDialog_().cancel(); |
383 }, | 387 }, |
384 | 388 |
385 /** @private */ | 389 /** @private */ |
386 onDialogCanceled_: function() { | 390 onDialogCanceled_: function() { |
387 if (this.dialogId == 'pairDevice') | 391 if (this.dialogId == 'pairDevice') |
388 this.sendResponse_(chrome.bluetoothPrivate.PairingResponse.CANCEL); | 392 this.sendResponse_(chrome.bluetoothPrivate.PairingResponse.CANCEL); |
389 }, | 393 }, |
390 }); | 394 }); |
391 | 395 |
392 })(); | 396 })(); |
OLD | NEW |