blob: f9af143e8754c05711fefa53e45e61a398b2c256 [file] [log] [blame]
// Copyright 2016 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.
/**
* Javascript for DeviceCollection, served from
* chrome://bluetooth-internals/.
*/
cr.define('device_collection', function() {
/**
* Enum of connection status for a device. Used for
* DeviceCollection.updateConnectionStatus which sets the connectionStatus
* on the DeviceInfo object. New DeviceInfo objects have a DISCONNECTED status
* by default.
* @enum {number}
*/
var ConnectionStatus = {
DISCONNECTED: 0,
CONNECTING: 1,
CONNECTED: 2,
};
/**
* Collection of devices. Extends ArrayDataModel which provides a set of
* functions and events that notifies observers when the collection changes.
* @constructor
* @param {!Array<!bluetooth.mojom.DeviceInfo>} array The starting
* collection of devices.
* @extends {cr.ui.ArrayDataModel}
*/
var DeviceCollection = function(array) {
cr.ui.ArrayDataModel.call(this, array);
};
DeviceCollection.prototype = {
__proto__: cr.ui.ArrayDataModel.prototype,
/**
* Finds the Device in the collection with the matching address.
* @param {string} address
*/
getByAddress: function(address) {
for (var i = 0; i < this.length; i++) {
var device = this.item(i);
if (address == device.address) {
return device;
}
}
return null;
},
/**
* Adds or updates a Device with new DeviceInfo.
* @param {!bluetooth.mojom.DeviceInfo} deviceInfo
*/
addOrUpdate: function(deviceInfo) {
deviceInfo.removed = false;
var oldDeviceInfo = this.getByAddress(deviceInfo.address);
if (oldDeviceInfo) {
// Update rssi if it's valid
var rssi = (deviceInfo.rssi && deviceInfo.rssi.value) ||
(oldDeviceInfo.rssi && oldDeviceInfo.rssi.value);
// The connectionStatus and connectionMessage properties may not exist
// on |deviceInfo|. The rssi property may be null, so it must be
// re-assigned.
Object.assign(oldDeviceInfo, deviceInfo);
oldDeviceInfo.rssi = {value: rssi};
this.updateIndex(this.indexOf(oldDeviceInfo));
} else {
deviceInfo.connectionStatus = ConnectionStatus.DISCONNECTED;
this.push(deviceInfo);
}
},
/**
* Marks the Device as removed.
* @param {!bluetooth.mojom.DeviceInfo} deviceInfo
*/
remove: function(deviceInfo) {
var device = this.getByAddress(deviceInfo.address);
assert(device, 'Device does not exist.');
device.removed = true;
this.updateIndex(this.indexOf(device));
},
/**
* Updates the device connection status.
* @param {string} address The address of the device.
* @param {number} status The new connection status.
*/
updateConnectionStatus: function(address, status) {
var device = assert(this.getByAddress(address), 'Device does not exist');
device.connectionStatus = status;
this.updateIndex(this.indexOf(device));
},
};
return {
ConnectionStatus: ConnectionStatus,
DeviceCollection: DeviceCollection,
};
});