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

Side by Side Diff: chrome/browser/resources/bluetooth_internals/bluetooth_internals.js

Issue 2564113003: bluetooth: Add basic scanning to chrome://bluetooth-internals. (Closed)
Patch Set: Update comments 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 /** 5 /**
6 * Javascript for bluetooth_internals.html, served from 6 * Javascript for bluetooth_internals.html, served from
7 * chrome://bluetooth-internals/. 7 * chrome://bluetooth-internals/.
8 */ 8 */
9 9
10 // Expose for testing. 10 // Expose for testing.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 43
44 /** @type {!Map<string, !interfaces.BluetoothDevice.DevicePtr>} */ 44 /** @type {!Map<string, !interfaces.BluetoothDevice.DevicePtr>} */
45 var deviceAddressToProxy = new Map(); 45 var deviceAddressToProxy = new Map();
46 46
47 /** @type {!device_collection.DeviceCollection} */ 47 /** @type {!device_collection.DeviceCollection} */
48 devices = new device_collection.DeviceCollection([]); 48 devices = new device_collection.DeviceCollection([]);
49 49
50 /** @type {devices_page.DevicesPage} */ 50 /** @type {devices_page.DevicesPage} */
51 var devicesPage = null; 51 var devicesPage = null;
52 52
53 /** @type {interfaces.BluetoothAdapter.DiscoverySession.ptrClass} */
54 var discoverySession = null;
55
56 /** @type {boolean} */
57 var userRequestedScanStop = false;
58
53 function handleInspect(event) { 59 function handleInspect(event) {
54 // TODO(crbug.com/663470): Move connection logic to DeviceDetailsView 60 // TODO(crbug.com/663470): Move connection logic to DeviceDetailsView
55 // when it's added in chrome://bluetooth-internals. 61 // when it's added in chrome://bluetooth-internals.
56 var address = event.detail.address; 62 var address = event.detail.address;
57 var proxy = deviceAddressToProxy.get(address); 63 var proxy = deviceAddressToProxy.get(address);
58 64
59 if (proxy) { 65 if (proxy) {
60 // Device is already connected, so disconnect. 66 // Device is already connected, so disconnect.
61 proxy.disconnect(); 67 proxy.disconnect();
62 deviceAddressToProxy.delete(address); 68 deviceAddressToProxy.delete(address);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 107
102 devices.updateConnectionStatus( 108 devices.updateConnectionStatus(
103 address, device_collection.ConnectionStatus.DISCONNECTED); 109 address, device_collection.ConnectionStatus.DISCONNECTED);
104 110
105 var deviceInfo = devices.getByAddress(address); 111 var deviceInfo = devices.getByAddress(address);
106 Snackbar.show(deviceInfo.name_for_display + ': ' + error.message, 112 Snackbar.show(deviceInfo.name_for_display + ': ' + error.message,
107 SnackbarType.ERROR, 'Retry', function() { handleInspect(event); }); 113 SnackbarType.ERROR, 'Retry', function() { handleInspect(event); });
108 }); 114 });
109 } 115 }
110 116
117 function updateStoppedDiscoverySession() {
118 devicesPage.setScanStatus(devices_page.ScanStatus.OFF);
119 discoverySession.ptr.reset();
120 discoverySession = null;
121 }
122
123 function setupAdapterSystem(response) {
124 console.log('adapter', response.info);
125
126 adapterBroker.addEventListener('adapterchanged', function(event) {
127 if (event.detail.property === 'discovering') {
dpapad 2017/01/05 23:30:33 Is there a need for two separate if conditions? Ho
mbrunson 2017/01/06 01:18:56 Done.
128 if (!event.detail.value && !userRequestedScanStop && discoverySession) {
129 updateStoppedDiscoverySession();
130 Snackbar.show(
131 'Discovery session ended unexpectedly', SnackbarType.WARNING);
132 }
133 }
134 });
135 }
136
111 function setupDeviceSystem(response) { 137 function setupDeviceSystem(response) {
112 // Hook up device collection events. 138 // Hook up device collection events.
113 adapterBroker.addEventListener('deviceadded', function(event) { 139 adapterBroker.addEventListener('deviceadded', function(event) {
114 devices.addOrUpdate(event.detail.deviceInfo); 140 devices.addOrUpdate(event.detail.deviceInfo);
115 }); 141 });
116 adapterBroker.addEventListener('devicechanged', function(event) { 142 adapterBroker.addEventListener('devicechanged', function(event) {
117 devices.addOrUpdate(event.detail.deviceInfo); 143 devices.addOrUpdate(event.detail.deviceInfo);
118 }); 144 });
119 adapterBroker.addEventListener('deviceremoved', function(event) { 145 adapterBroker.addEventListener('deviceremoved', function(event) {
120 devices.remove(event.detail.deviceInfo); 146 devices.remove(event.detail.deviceInfo);
121 }); 147 });
122 148
123 response.devices.forEach(devices.addOrUpdate, devices /* this */); 149 response.devices.forEach(devices.addOrUpdate, devices /* this */);
124 150
125 devicesPage.setDevices(devices); 151 devicesPage.setDevices(devices);
126 devicesPage.pageDiv.addEventListener('inspectpressed', handleInspect); 152 devicesPage.pageDiv.addEventListener('inspectpressed', handleInspect);
153
154 devicesPage.pageDiv.addEventListener('scanpressed', function(event) {
155 if (discoverySession && discoverySession.ptr.isBound()) {
156 userRequestedScanStop = true;
157 devicesPage.setScanStatus(devices_page.ScanStatus.STOPPING);
158
159 discoverySession.stop().then(function(response) {
160 if (response.success) {
161 updateStoppedDiscoverySession();
dpapad 2017/01/05 23:30:33 Is the |userRequestedScanStop| really necessary? M
mbrunson 2017/01/06 01:18:56 It's because of the 'adapterchanged' event that I
162 userRequestedScanStop = false;
163 return;
164 }
165
166 devicesPage.setScanStatus(devices_page.ScanStatus.ON);
167 Snackbar.show(
168 'Failed to stop discovery session', SnackbarType.ERROR);
169 userRequestedScanStop = false;
170 });
171
172 return;
173 }
174
175 devicesPage.setScanStatus(devices_page.ScanStatus.STARTING);
176 adapterBroker.startDiscoverySession().then(function(session) {
177 discoverySession = session;
178
179 discoverySession.ptr.setConnectionErrorHandler(function() {
180 updateStoppedDiscoverySession();
181 Snackbar.show('Discovery session ended', SnackbarType.WARNING);
182 });
183
184 devicesPage.setScanStatus(devices_page.ScanStatus.ON);
185 }).catch(function(error) {
186 devicesPage.setScanStatus(devices_page.ScanStatus.OFF);
187 Snackbar.show('Failed to start discovery session', SnackbarType.ERROR);
188 console.error(error);
189 });
190 });
127 } 191 }
128 192
129 function setupPages() { 193 function setupPages() {
130 sidebarObj = new window.sidebar.Sidebar($('sidebar')); 194 sidebarObj = new window.sidebar.Sidebar($('sidebar'));
131 $('menu-btn').addEventListener('click', function() { sidebarObj.open(); }); 195 $('menu-btn').addEventListener('click', function() { sidebarObj.open(); });
132 PageManager.addObserver(sidebarObj); 196 PageManager.addObserver(sidebarObj);
133 PageManager.addObserver(new PageObserver()); 197 PageManager.addObserver(new PageObserver());
134 198
135 devicesPage = new DevicesPage(); 199 devicesPage = new DevicesPage();
136 PageManager.register(devicesPage); 200 PageManager.register(devicesPage);
137 201
138 // Set up hash-based navigation. 202 // Set up hash-based navigation.
139 window.addEventListener('hashchange', function() { 203 window.addEventListener('hashchange', function() {
140 PageManager.showPageByName(window.location.hash.substr(1)); 204 PageManager.showPageByName(window.location.hash.substr(1));
141 }); 205 });
142 206
143 if (!window.location.hash) { 207 if (!window.location.hash) {
144 PageManager.showPageByName(devicesPage.name); 208 PageManager.showPageByName(devicesPage.name);
145 return; 209 return;
146 } 210 }
147 211
148 PageManager.showPageByName(window.location.hash.substr(1)); 212 PageManager.showPageByName(window.location.hash.substr(1));
149 } 213 }
150 214
151 function initializeViews() { 215 function initializeViews() {
152 setupPages(); 216 setupPages();
153 217
154 adapter_broker.getAdapterBroker() 218 adapter_broker.getAdapterBroker()
155 .then(function(broker) { adapterBroker = broker; }) 219 .then(function(broker) { adapterBroker = broker; })
156 .then(function() { return adapterBroker.getInfo(); }) 220 .then(function() { return adapterBroker.getInfo(); })
dpapad 2017/01/05 23:30:33 The info returned by this call is never used by se
mbrunson 2017/01/06 01:18:56 The info returned is currently logged to console b
157 .then(function(response) { console.log('adapter', response.info); }) 221 .then(setupAdapterSystem)
158 .then(function() { return adapterBroker.getDevices(); }) 222 .then(function() { return adapterBroker.getDevices(); })
159 .then(setupDeviceSystem) 223 .then(setupDeviceSystem)
160 .catch(function(error) { 224 .catch(function(error) {
161 Snackbar.show(error.message, SnackbarType.ERROR); 225 Snackbar.show(error.message, SnackbarType.ERROR);
162 console.error(error); 226 console.error(error);
163 }); 227 });
164 } 228 }
165 229
166 return { 230 return {
167 initializeViews: initializeViews 231 initializeViews: initializeViews
168 }; 232 };
169 }); 233 });
170 234
171 document.addEventListener( 235 document.addEventListener(
172 'DOMContentLoaded', bluetooth_internals.initializeViews); 236 'DOMContentLoaded', bluetooth_internals.initializeViews);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698