OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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.define('options.system.bluetooth', function() { | 5 cr.define('options.system.bluetooth', function() { |
6 /** | 6 /** |
7 * Bluetooth settings constants. | 7 * Bluetooth settings constants. |
8 */ | 8 */ |
9 function Constants() {} | 9 function Constants() {} |
10 | 10 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
76 this.appendChild(new BluetoothItem(devices[i])); | 76 this.appendChild(new BluetoothItem(devices[i])); |
77 } | 77 } |
78 }, | 78 }, |
79 | 79 |
80 /** | 80 /** |
81 * Adds a bluetooth device to the list of available devices. A check is | 81 * Adds a bluetooth device to the list of available devices. A check is |
82 * made to see if the device is already in the list, in which case the | 82 * made to see if the device is already in the list, in which case the |
83 * existing device is updated. | 83 * existing device is updated. |
84 * @param {Object.<string,string>} device Description of the bluetooth | 84 * @param {Object.<string,string>} device Description of the bluetooth |
85 * device. | 85 * device. |
86 * @return {boolean} True if the devies was successfully added or updated. | |
86 */ | 87 */ |
87 appendDevice: function(device) { | 88 appendDevice: function(device) { |
88 if (!this.isSupported_(device)) | 89 if (!this.isSupported_(device)) |
89 return; | 90 return false; |
90 var item = new BluetoothItem(device); | 91 var item = new BluetoothItem(device); |
91 var existing = this.findDevice(device.address); | 92 var existing = this.findDevice(device.address); |
92 if (existing) { | 93 if (existing) |
93 this.replaceChild(item, existing); | 94 this.replaceChild(item, existing); |
94 return; | 95 else |
95 } | 96 this.appendChild(item); |
96 this.appendChild(item); | 97 return true; |
97 }, | 98 }, |
98 | 99 |
99 /** | 100 /** |
100 * Scans the list of elements corresponding to discovered Bluetooth | 101 * Scans the list of elements corresponding to discovered Bluetooth |
101 * devices for one with a matching address. | 102 * devices for one with a matching address. |
102 * @param {string} address The address of the device. | 103 * @param {string} address The address of the device. |
103 * @return {Element|undefined} Element corresponding to the device address | 104 * @return {Element|undefined} Element corresponding to the device address |
104 * or undefined if no corresponding element is found. | 105 * or undefined if no corresponding element is found. |
105 */ | 106 */ |
106 findDevice: function(address) { | 107 findDevice: function(address) { |
(...skipping 28 matching lines...) Expand all Loading... | |
135 * icon: Constants.DEVICE_TYPE, | 136 * icon: Constants.DEVICE_TYPE, |
136 * paired: boolean, | 137 * paired: boolean, |
137 * connected: boolean, | 138 * connected: boolean, |
138 * pairing: string|undefined, | 139 * pairing: string|undefined, |
139 * passkey: number|undefined, | 140 * passkey: number|undefined, |
140 * entered: number|undefined}} device | 141 * entered: number|undefined}} device |
141 * Decription of the bluetooth device. | 142 * Decription of the bluetooth device. |
142 * @constructor | 143 * @constructor |
143 */ | 144 */ |
144 function BluetoothItem(device) { | 145 function BluetoothItem(device) { |
145 var el = cr.doc.createElement('div'); | 146 var el = $('bluetooth-item-template').cloneNode(true); |
147 el.__proto__ = BluetoothItem.prototype; | |
148 el.removeAttribute('id'); | |
149 el.hidden = false; | |
146 el.data = {}; | 150 el.data = {}; |
147 for (var key in device) | 151 for (var key in device) |
148 el.data[key] = device[key]; | 152 el.data[key] = device[key]; |
149 BluetoothItem.decorate(el); | 153 el.decorate(); |
150 return el; | 154 return el; |
151 } | 155 } |
152 | 156 |
153 /** | |
154 * Decorates an element as a bluetooth item. | |
155 * @param {!HTMLElement} el The element to decorate. | |
156 */ | |
157 BluetoothItem.decorate = function(el) { | |
158 el.__proto__ = BluetoothItem.prototype; | |
159 el.decorate(); | |
160 }; | |
161 | |
162 BluetoothItem.prototype = { | 157 BluetoothItem.prototype = { |
163 __proto__: HTMLDivElement.prototype, | 158 __proto__: HTMLDivElement.prototype, |
164 | 159 |
165 /** @inheritDoc */ | 160 /** @inheritDoc */ |
166 decorate: function() { | 161 decorate: function() { |
167 this.className = 'bluetooth-item'; | 162 this.className = 'bluetooth-item'; |
168 this.connected = this.data.connected; | 163 this.connected = this.data.connected; |
169 // Though strictly speaking, a connected device will also be paired, | 164 // Though strictly speaking, a connected device will also be paired, |
170 // we are interested in tracking paired devices that are not connected. | 165 // we are interested in tracking paired devices that are not connected. |
171 this.paired = this.data.paired && !this.data.connected; | 166 this.paired = this.data.paired && !this.data.connected; |
172 this.connecting = !!this.data.pairing; | 167 this.connecting = !!this.data.pairing; |
173 this.addIcon_(); | |
174 this.addLabels_(); | 168 this.addLabels_(); |
175 this.addButtons_(); | 169 this.addButtons_(); |
176 }, | 170 }, |
177 | 171 |
178 /** | 172 /** |
179 * Adds an icon corresponding to the device category. | 173 * Retrieves the descendent element with the matching class name. |
174 * @param {string} className The class name for the target element. | |
175 * @return {Element|undefined} Returns the matching element if | |
176 * found and unique. | |
180 * @private | 177 * @private |
181 */ | 178 */ |
182 addIcon_: function() { | 179 getNodeByClass_:function(className) { |
183 var iconElement = this.ownerDocument.createElement('div'); | 180 var elements = this.getElementsByClassName(className); |
184 iconElement.className = 'bluetooth-' + this.data.icon; | 181 if (elements && elements.length == 1) |
185 iconElement.classList.add('bluetooth-icon'); | 182 return elements[0]; |
186 this.appendChild(iconElement); | 183 }, |
184 | |
185 /** | |
186 * Sets the text content for an element. | |
187 * @param {string} className The class name of the target element. | |
188 * @param {string} label Text content for the element. | |
189 * @private | |
190 */ | |
191 setLabel_: function(className, label) { | |
192 var el = this.getNodeByClass_(className); | |
193 el.textContent = label; | |
187 }, | 194 }, |
188 | 195 |
189 /** | 196 /** |
190 * Adds an element containing the display name, status and device pairing | 197 * Adds an element containing the display name, status and device pairing |
191 * instructions. | 198 * instructions. |
192 * @private | 199 * @private |
193 */ | 200 */ |
194 addLabels_: function() { | 201 addLabels_: function() { |
195 var textDiv = this.ownerDocument.createElement('div'); | 202 this.setLabel_('network-name-label', this.data.name); |
196 textDiv.className = 'bluetooth-item-text'; | 203 var status; |
197 var nameEl = this.ownerDocument.createElement('div'); | 204 if (this.data.connected) |
198 nameEl.className = 'network-name-label'; | 205 status = Constants.DEVICE_STATUS.CONNECTED; |
199 nameEl.textContent = this.data.name; | 206 else if (this.data.pairing) |
200 textDiv.appendChild(nameEl); | 207 status = Constants.DEVICE_STATUS.CONNECTING; |
201 this.appendChild(textDiv); | 208 if (status) { |
202 this.setDeviceStatus_(textDiv); | 209 var statusMessage = templateData[status]; |
203 if (this.data.pairing) { | 210 if (statusMessage) |
204 this.addPairingInstructions_(textDiv); | 211 this.setLabel_('network-status-label', statusMessage); |
212 if (this.connecting) { | |
213 var spinner = this.getNodeByClass_('inline-spinner'); | |
214 if (spinner) | |
flackr
2011/11/11 22:55:38
Ditto here.
kevers
2011/11/14 17:51:17
Done.
| |
215 spinner.hidden = false; | |
216 } | |
205 } | 217 } |
218 if (this.data.pairing) | |
219 this.addPairingInstructions_(); | |
206 }, | 220 }, |
207 | 221 |
208 /** | 222 /** |
209 * Adds a label showing the status of the device. | |
210 * @param {!Element} textDiv Target element for inserting the status label. | |
211 * @private | |
212 */ | |
213 setDeviceStatus_: function(textDiv) { | |
214 var status; | |
215 if (this.data.connected) | |
216 status = Constants.DEVICE_STATUS.CONNECTED; | |
217 else if (this.data.paired) | |
218 status = Constants.DEVICE_STATUS.PAIRED; | |
219 else if (this.data.pairing) | |
220 status = Constants.DEVICE_STATUS.CONNECTING; | |
221 else | |
222 status = Constants.DEVICE_STATUS.NOT_PAIRED; | |
223 var statusMessage = templateData[status]; | |
224 if (statusMessage) { | |
225 var statusEl = this.ownerDocument.createElement('div'); | |
226 statusEl.className = 'network-status-label'; | |
227 statusEl.textContent = statusMessage; | |
228 if (this.connecting) { | |
229 var throbber = this.ownerDocument.createElement('div'); | |
230 throbber.className = 'throbber'; | |
231 statusEl.appendChild(throbber); | |
232 } | |
233 textDiv.appendChild(statusEl); | |
234 } | |
235 }, | |
236 | |
237 /** | |
238 * Adds instructions on how to complete the pairing process. | 223 * Adds instructions on how to complete the pairing process. |
239 * @param {!Element} textDiv Target element for inserting the instructions. | 224 * @param {!Element} textDiv Target element for inserting the instructions. |
240 * @private | 225 * @private |
241 */ | 226 */ |
242 addPairingInstructions_: function(textDiv) { | 227 addPairingInstructions_: function() { |
243 var instructionsEl = this.ownerDocument.createElement('div'); | 228 var instructionsEl = this.getNodeByClass_('bluetooth-instructions'); |
244 instructionsEl.className = 'bluetooth-instructions'; | |
245 var message = templateData[this.data.pairing]; | 229 var message = templateData[this.data.pairing]; |
246 var array = this.formatInstructions_(message); | 230 var array = this.formatInstructions_(message); |
247 for (var i = 0; i < array.length; i++) { | 231 for (var i = 0; i < array.length; i++) { |
248 instructionsEl.appendChild(array[i]); | 232 instructionsEl.appendChild(array[i]); |
249 } | 233 } |
250 if (this.data.pairing == Constants.PAIRING.ENTER_PASSKEY) { | 234 if (this.data.pairing == Constants.PAIRING.ENTER_PASSKEY) { |
251 var input = this.ownerDocument.createElement('input'); | 235 var input = this.ownerDocument.createElement('input'); |
252 input.type = 'text'; | 236 input.type = 'text'; |
253 input.className = 'bluetooth-passkey-field'; | 237 input.className = 'bluetooth-passkey-field'; |
254 instructionsEl.appendChild(input); | 238 instructionsEl.appendChild(input); |
255 } | 239 } |
256 textDiv.appendChild(instructionsEl); | |
257 }, | 240 }, |
258 | 241 |
259 /** | 242 /** |
260 * Formats the pairing instruction, which may contain labels for | 243 * Formats the pairing instruction, which may contain labels for |
261 * substitution. The label '%1' is replaced with the passkey, and '%2' | 244 * substitution. The label '%1' is replaced with the passkey, and '%2' |
262 * is replaced with the name of the bluetooth device. Formatting of the | 245 * is replaced with the name of the bluetooth device. Formatting of the |
263 * passkey depends on the type of validation. | 246 * passkey depends on the type of validation. |
264 * @param {string} instructions The source instructions to format. | 247 * @param {string} instructions The source instructions to format. |
265 * @return {Array.<Element>} Array of formatted elements. | 248 * @return {Array.<Element>} Array of formatted elements. |
266 */ | 249 */ |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
329 if (opt_style) | 312 if (opt_style) |
330 el.className = opt_style; | 313 el.className = opt_style; |
331 return el; | 314 return el; |
332 }, | 315 }, |
333 | 316 |
334 /** | 317 /** |
335 * Adds buttons for updating the connectivity of a device. | 318 * Adds buttons for updating the connectivity of a device. |
336 * @private. | 319 * @private. |
337 */ | 320 */ |
338 addButtons_: function() { | 321 addButtons_: function() { |
339 var buttonsDiv = this.ownerDocument.createElement('div'); | 322 var buttonsDiv = this.getNodeByClass_('bluetooth-button-group'); |
340 buttonsDiv.className = 'bluetooth-button-group'; | |
341 var buttonLabelKey = null; | 323 var buttonLabelKey = null; |
342 var callbackType = null; | 324 var callbackType = null; |
343 if (this.connected) { | 325 if (this.connected) { |
344 buttonLabelKey = 'bluetoothDisconnectDevice'; | 326 buttonLabelKey = 'bluetoothDisconnectDevice'; |
345 callbackType = 'disconnect'; | 327 callbackType = 'disconnect'; |
346 } else if (this.paired) { | 328 } else if (this.paired) { |
347 buttonLabelKey = 'bluetoothForgetDevice'; | 329 buttonLabelKey = 'bluetoothForgetDevice'; |
348 callbackType = 'disconnect'; | 330 callbackType = 'disconnect'; |
349 } else if (this.connecting) { | 331 } else if (this.connecting) { |
350 buttonLabelKey = 'bluetoothCancel'; | 332 buttonLabelKey = 'bluetoothCancel'; |
(...skipping 28 matching lines...) Expand all Loading... | |
379 | 361 |
380 cr.defineProperty(BluetoothItem, 'paired', cr.PropertyKind.BOOL_ATTR); | 362 cr.defineProperty(BluetoothItem, 'paired', cr.PropertyKind.BOOL_ATTR); |
381 | 363 |
382 cr.defineProperty(BluetoothItem, 'connecting', cr.PropertyKind.BOOL_ATTR); | 364 cr.defineProperty(BluetoothItem, 'connecting', cr.PropertyKind.BOOL_ATTR); |
383 | 365 |
384 return { | 366 return { |
385 Constants: Constants, | 367 Constants: Constants, |
386 BluetoothListElement: BluetoothListElement | 368 BluetoothListElement: BluetoothListElement |
387 }; | 369 }; |
388 }); | 370 }); |
OLD | NEW |