| Index: chrome/browser/resources/bluetooth_internals/service_list.js
|
| diff --git a/chrome/browser/resources/bluetooth_internals/service_list.js b/chrome/browser/resources/bluetooth_internals/service_list.js
|
| index f189b3d067b34ff72d49a40abfd6f9600eef6c37..2fce378cfd035f1c530746c675515b7ac1278bf9 100644
|
| --- a/chrome/browser/resources/bluetooth_internals/service_list.js
|
| +++ b/chrome/browser/resources/bluetooth_internals/service_list.js
|
| @@ -8,8 +8,11 @@
|
| */
|
|
|
| cr.define('service_list', function() {
|
| + /** @const */ var ArrayDataModel = cr.ui.ArrayDataModel;
|
| /** @const */ var ExpandableList = expandable_list.ExpandableList;
|
| /** @const */ var ExpandableListItem = expandable_list.ExpandableListItem;
|
| + /** @const */ var Snackbar = snackbar.Snackbar;
|
| + /** @const */ var SnackbarType = snackbar.SnackbarType;
|
|
|
| /**
|
| * Property names that will be displayed in the ObjectFieldSet which contains
|
| @@ -25,15 +28,18 @@ cr.define('service_list', function() {
|
| * A list item that displays the data in a ServiceInfo object. The brief
|
| * section contains the UUID of the given |serviceInfo|. The expanded section
|
| * contains an ObjectFieldSet that displays all of the properties in the
|
| - * given |serviceInfo|.
|
| + * given |serviceInfo|. Data is not loaded until the ServiceListItem is
|
| + * expanded for the first time.
|
| * @param {!interfaces.BluetoothDevice.ServiceInfo} serviceInfo
|
| + * @param {string} deviceAddress
|
| * @constructor
|
| */
|
| - function ServiceListItem(serviceInfo) {
|
| + function ServiceListItem(serviceInfo, deviceAddress) {
|
| var listItem = new ExpandableListItem();
|
| listItem.__proto__ = ServiceListItem.prototype;
|
|
|
| listItem.info = serviceInfo;
|
| + listItem.deviceAddress_ = deviceAddress;
|
| listItem.decorate();
|
|
|
| return listItem;
|
| @@ -50,10 +56,6 @@ cr.define('service_list', function() {
|
| decorate: function() {
|
| this.classList.add('service-list-item');
|
|
|
| - /** @private {!HTMLElement} */
|
| - this.infoDiv_ = document.createElement('div');
|
| - this.infoDiv_.classList.add('info-container');
|
| -
|
| /** @private {!object_fieldset.ObjectFieldSet} */
|
| this.serviceFieldSet_ = object_fieldset.ObjectFieldSet();
|
| this.serviceFieldSet_.setPropertyDisplayNames(PROPERTY_NAMES);
|
| @@ -83,9 +85,23 @@ cr.define('service_list', function() {
|
| serviceDiv.classList.add('flex');
|
| serviceDiv.appendChild(this.serviceFieldSet_);
|
|
|
| - this.infoDiv_.appendChild(serviceInfoHeader);
|
| - this.infoDiv_.appendChild(serviceDiv);
|
| - this.expandedContent_.appendChild(this.infoDiv_);
|
| + var characteristicsListHeader = document.createElement('h4');
|
| + characteristicsListHeader.textContent = 'Characteristics';
|
| + this.characteristicList_ = new characteristic_list.CharacteristicList();
|
| +
|
| + var infoDiv = document.createElement('div');
|
| + infoDiv.classList.add('info-container');
|
| + infoDiv.appendChild(serviceInfoHeader);
|
| + infoDiv.appendChild(serviceDiv);
|
| + infoDiv.appendChild(characteristicsListHeader);
|
| + infoDiv.appendChild(this.characteristicList_);
|
| +
|
| + this.expandedContent_.appendChild(infoDiv);
|
| + },
|
| +
|
| + /** @override */
|
| + onExpandInternal: function(expanded) {
|
| + this.characteristicList_.load(this.deviceAddress_, this.info.id);
|
| },
|
| };
|
|
|
| @@ -101,13 +117,47 @@ cr.define('service_list', function() {
|
| /** @override */
|
| decorate: function() {
|
| ExpandableList.prototype.decorate.call(this);
|
| +
|
| + /** @private {string} */
|
| + this.deviceAddress_ = null;
|
| + /** @private {boolean} */
|
| + this.servicesRequested_ = false;
|
| +
|
| this.classList.add('service-list');
|
| this.setEmptyMessage('No Services Found');
|
| },
|
|
|
| /** @override */
|
| createItem: function(data) {
|
| - return new ServiceListItem(data);
|
| + return new ServiceListItem(data, this.deviceAddress_);
|
| + },
|
| +
|
| + /**
|
| + * Loads the service list with an array of ServiceInfo from the
|
| + * device with |deviceAddress|. If no active connection to the device
|
| + * exists, one is created.
|
| + * @param {string} deviceAddress
|
| + */
|
| + load: function(deviceAddress) {
|
| + if (this.servicesRequested_ || !this.isLoading())
|
| + return;
|
| +
|
| + this.deviceAddress_ = deviceAddress;
|
| + this.servicesRequested_ = true;
|
| +
|
| + device_broker.connectToDevice(this.deviceAddress_).then(
|
| + function(device) {
|
| + return device.getServices();
|
| + }.bind(this)).then(function(response) {
|
| + this.setData(new ArrayDataModel(response.services));
|
| + this.setLoading(false);
|
| + this.servicesRequested_ = false;
|
| + }.bind(this)).catch(function(error) {
|
| + this.servicesRequested_ = false;
|
| + Snackbar.show(
|
| + deviceAddress + ': ' + error.message, SnackbarType.ERROR,
|
| + 'Retry', function() { this.load(deviceAddress); }.bind(this));
|
| + }.bind(this));
|
| },
|
| };
|
|
|
|
|