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

Unified Diff: chrome/browser/resources/options2/chromeos/bluetooth_device_list.js

Issue 8895023: Options2: Pull the trigger. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: DIAF. Created 9 years 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/options2/chromeos/bluetooth_device_list.js
diff --git a/chrome/browser/resources/options2/chromeos/bluetooth_device_list.js b/chrome/browser/resources/options2/chromeos/bluetooth_device_list.js
new file mode 100644
index 0000000000000000000000000000000000000000..6187cbb656effabd050c6093798d042334fcc7f2
--- /dev/null
+++ b/chrome/browser/resources/options2/chromeos/bluetooth_device_list.js
@@ -0,0 +1,232 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+cr.define('options.system.bluetooth', function() {
+ const ArrayDataModel = cr.ui.ArrayDataModel;
+ const DeletableItem = options.DeletableItem;
+ const DeletableItemList = options.DeletableItemList;
+
+ /**
+ * Bluetooth settings constants.
+ */
+ function Constants() {}
+
+ /**
+ * Enumeration of supported device types.
+ * @enum {string}
+ */
+ // TODO(kevers): Prune list based on the set of devices that will be
+ // supported for V1 of the feature. The set will likely be restricted to
+ // mouse and keyboard. Others are temporarily included for testing device
+ // discovery.
+ Constants.DEVICE_TYPE = {
+ COMPUTER: 'computer',
+ HEADSET: 'headset',
+ KEYBOARD: 'input-keyboard',
+ MOUSE: 'input-mouse',
+ PHONE: 'phone',
+ };
+
+ /**
+ * Creates a new bluetooth list item.
+ * @param {{name: string,
+ * address: string,
+ * icon: Constants.DEVICE_TYPE,
+ * paired: boolean,
+ * connected: boolean,
+ * pairing: string|undefined,
+ * passkey: number|undefined,
+ * entered: number|undefined}} device
+ * Description of the Bluetooth device.
+ * @constructor
+ * @extends {options.DeletableItem}
+ */
+ function BluetoothListItem(device) {
+ var el = cr.doc.createElement('div');
+ el.__proto__ = BluetoothListItem.prototype;
+ el.data = {};
+ for (var key in device)
+ el.data[key] = device[key];
+ el.decorate();
+ // Only show the close button for paired devices.
+ el.deletable = device.paired;
+ return el;
+ }
+
+ BluetoothListItem.prototype = {
+ __proto__: DeletableItem.prototype,
+
+ /**
+ * Description of the Bluetooth device.
+ * @type {{name: string,
+ * address: string,
+ * icon: Constants.DEVICE_TYPE,
+ * paired: boolean,
+ * connected: boolean,
+ * pairing: string|undefined,
+ * passkey: number|undefined,
+ * entered: number|undefined}}
+ */
+ data: null,
+
+ /** @inheritDoc */
+ decorate: function() {
+ DeletableItem.prototype.decorate.call(this);
+ var label = this.ownerDocument.createElement('div');
+ label.className = 'bluetooth-device-label';
+ this.classList.add('bluetooth-device');
+ this.connected = this.data.connected;
+ // Though strictly speaking, a connected device will also be paired, we
+ // are interested in tracking paired devices that are not connected.
+ this.paired = this.data.paired && !this.data.connected;
+ this.connecting = !!this.data.pairing;
+ var content = this.data.name;
+ // Update label for devices that are paired but not connected.
+ if (this.paired) {
+ content = content + ' (' +
+ templateData['bluetoothDeviceNotConnected'] + ')';
+ }
+ label.textContent = content;
+ this.contentElement.appendChild(label);
+ },
+ };
+
+ /**
+ * Class for displaying a list of Bluetooth devices.
+ * @constructor
+ * @extends {options.DeletableItemList}
+ */
+ var BluetoothDeviceList = cr.ui.define('list');
+
+ BluetoothDeviceList.prototype = {
+ __proto__: DeletableItemList.prototype,
+
+ /** @inheritDoc */
+ decorate: function() {
+ DeletableItemList.prototype.decorate.call(this);
+ this.addEventListener('blur', this.onBlur_);
+ this.addEventListener('change', this.onChange_);
+ this.clear();
+ },
+
+ /**
+ * When the list loses focus, unselect all items in the list.
+ * @private
+ */
+ onBlur_: function() {
+ // TODO(kevers): Should this be pushed up to the list class?
+ this.selectionModel.unselectAll();
+ },
+
+ /**
+ * Updates the state of the button for adding a Bluetooth device in
+ * response to a change in the selected item.
+ * @private
+ */
+ onChange_: function() {
+ var item = this.selectedItem;
+ var disabled = !item || item.paired || item.conencted;
+ $('bluetooth-add-device-apply-button').disabled = disabled;
+ },
+
+ /**
+ * Adds a bluetooth device to the list of available devices. A check is
+ * made to see if the device is already in the list, in which case the
+ * existing device is updated.
+ * @param {{name: string,
+ * address: string,
+ * icon: Constants.DEVICE_TYPE,
+ * paired: boolean,
+ * connected: boolean,
+ * pairing: string|undefined,
+ * passkey: number|undefined,
+ * entered: number|undefined}} device
+ * Description of the bluetooth device.
+ * @return {boolean} True if the devies was successfully added or updated.
+ */
+ appendDevice: function(device) {
+ if (!this.isSupported_(device))
+ return false;
+ var index = this.find(device.address);
+ if (index == undefined) {
+ this.dataModel.push(device);
+ this.redraw();
+ } else {
+ this.dataModel.splice(index, 1, device);
+ this.redrawItem(index);
+ }
+ return true;
+ },
+
+ /**
+ * Perges all devices from the list.
+ */
+ clear: function() {
+ this.dataModel = new ArrayDataModel([]);
+ this.redraw();
+ },
+
+ /**
+ * Returns the index of the list entry with the matching address.
+ * @param {string} address Unique address of the Bluetooth device.
+ * @return {number|undefined} Index of the matching entry or
+ * undefined if no match found.
+ */
+ find: function(address) {
+ var size = this.dataModel.length;
+ for (var i = 0; i < size; i++) {
+ var entry = this.dataModel.item(i);
+ if (entry.address == address)
+ return i;
+ }
+ },
+
+ /** @inheritDoc */
+ createItem: function(entry) {
+ return new BluetoothListItem(entry);
+ },
+
+ /** @inheritDoc */
+ deleteItemAtIndex: function(index) {
+ var item = this.dataModel.item(index);
+ if (item && (item.connected || item.paired)) {
+ // Inform the bluetooth adapter that we are disconnecting the device.
+ chrome.send('updateBluetoothDevice',
+ [item.address, item.connected ? 'disconnect' : 'forget']);
+ }
+ this.dataModel.splice(index, 1);
+ // Invalidate the list since it has a stale cache after a splice
+ // involving a deletion.
+ this.invalidate();
+ this.redraw();
+ },
+
+ /**
+ * Tests if the bluetooth device is supported based on the type of device.
+ * @param {Object.<string,string>} device Desription of the device.
+ * @return {boolean} true if the device is supported.
+ * @private
+ */
+ isSupported_: function(device) {
+ var target = device.icon;
+ for (var key in Constants.DEVICE_TYPE) {
+ if (Constants.DEVICE_TYPE[key] == target)
+ return true;
+ }
+ return false;
+ }
+ };
+
+ cr.defineProperty(BluetoothListItem, 'connected', cr.PropertyKind.BOOL_ATTR);
+
+ cr.defineProperty(BluetoothListItem, 'paired', cr.PropertyKind.BOOL_ATTR);
+
+ cr.defineProperty(BluetoothListItem, 'connecting', cr.PropertyKind.BOOL_ATTR);
+
+ return {
+ BluetoothListItem: BluetoothListItem,
+ BluetoothDeviceList: BluetoothDeviceList,
+ Constants: Constants
+ };
+});

Powered by Google App Engine
This is Rietveld 408576698