OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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); |
OLD | NEW |