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

Unified Diff: chrome/browser/resources/bluetooth_internals/service_list.js

Issue 2622393002: bluetooth: Add characteristic list to DeviceDetailsPage in internals page. (Closed)
Patch Set: Simplifications Created 3 years, 11 months 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/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));
},
};

Powered by Google App Engine
This is Rietveld 408576698