| 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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 * Creates a DeviceDetailsPage with the given |deviceInfo|, appends it to | 86 * Creates a DeviceDetailsPage with the given |deviceInfo|, appends it to |
| 87 * '#page-container', and adds a sidebar item to show the new page. If a | 87 * '#page-container', and adds a sidebar item to show the new page. If a |
| 88 * page exists that matches |deviceInfo.address|, nothing is created and the | 88 * page exists that matches |deviceInfo.address|, nothing is created and the |
| 89 * existing page is returned. | 89 * existing page is returned. |
| 90 * @param {!interfaces.BluetoothDevice.Device} deviceInfo | 90 * @param {!interfaces.BluetoothDevice.Device} deviceInfo |
| 91 * @return {!device_details_page.DeviceDetailsPage} | 91 * @return {!device_details_page.DeviceDetailsPage} |
| 92 */ | 92 */ |
| 93 function makeDeviceDetailsPage(deviceInfo) { | 93 function makeDeviceDetailsPage(deviceInfo) { |
| 94 var deviceDetailsPageId = 'devices/' + deviceInfo.address.toLowerCase(); | 94 var deviceDetailsPageId = 'devices/' + deviceInfo.address.toLowerCase(); |
| 95 var deviceDetailsPage = PageManager.registeredPages[deviceDetailsPageId]; | 95 var deviceDetailsPage = PageManager.registeredPages[deviceDetailsPageId]; |
| 96 if (deviceDetailsPage) return deviceDetailsPage; | 96 if (deviceDetailsPage) |
| 97 return deviceDetailsPage; |
| 97 | 98 |
| 98 var pageSection = document.createElement('section'); | 99 var pageSection = document.createElement('section'); |
| 99 pageSection.hidden = true; | 100 pageSection.hidden = true; |
| 100 pageSection.id = deviceDetailsPageId; | 101 pageSection.id = deviceDetailsPageId; |
| 101 $('page-container').appendChild(pageSection); | 102 $('page-container').appendChild(pageSection); |
| 102 | 103 |
| 103 deviceDetailsPage = new DeviceDetailsPage(deviceDetailsPageId, deviceInfo); | 104 deviceDetailsPage = new DeviceDetailsPage(deviceDetailsPageId, deviceInfo); |
| 104 deviceDetailsPage.pageDiv.addEventListener('connectionchanged', | 105 deviceDetailsPage.pageDiv.addEventListener( |
| 105 function(event) { | 106 'connectionchanged', function(event) { |
| 106 devices.updateConnectionStatus( | 107 devices.updateConnectionStatus( |
| 107 event.detail.address, event.detail.status); | 108 event.detail.address, event.detail.status); |
| 108 }); | 109 }); |
| 109 | 110 |
| 110 deviceDetailsPage.pageDiv.addEventListener('infochanged', function(event) { | 111 deviceDetailsPage.pageDiv.addEventListener('infochanged', function(event) { |
| 111 devices.addOrUpdate(event.detail.info); | 112 devices.addOrUpdate(event.detail.info); |
| 112 }); | 113 }); |
| 113 | 114 |
| 114 deviceDetailsPage.pageDiv.addEventListener('forgetpressed', | 115 deviceDetailsPage.pageDiv.addEventListener( |
| 115 function(event) { | 116 'forgetpressed', function(event) { |
| 116 PageManager.showPageByName(devicesPage.name); | 117 PageManager.showPageByName(devicesPage.name); |
| 117 removeDeviceDetailsPage(event.detail.address); | 118 removeDeviceDetailsPage(event.detail.address); |
| 118 }); | 119 }); |
| 119 | 120 |
| 120 // Inform the devices page that the user is inspecting this device. | 121 // Inform the devices page that the user is inspecting this device. |
| 121 // This will update the links in the device table. | 122 // This will update the links in the device table. |
| 122 devicesPage.setInspecting(deviceInfo, true /* isInspecting */); | 123 devicesPage.setInspecting(deviceInfo, true /* isInspecting */); |
| 123 PageManager.register(deviceDetailsPage); | 124 PageManager.register(deviceDetailsPage); |
| 124 | 125 |
| 125 sidebarObj.addItem({ | 126 sidebarObj.addItem({ |
| 126 pageName: deviceDetailsPageId, | 127 pageName: deviceDetailsPageId, |
| 127 text: deviceInfo.name_for_display, | 128 text: deviceInfo.name_for_display, |
| 128 }); | 129 }); |
| 129 | 130 |
| 130 deviceDetailsPage.connect(); | 131 deviceDetailsPage.connect(); |
| 131 return deviceDetailsPage; | 132 return deviceDetailsPage; |
| 132 } | 133 } |
| 133 | 134 |
| 134 /** | 135 /** |
| 135 * Updates the DeviceDetailsPage with the matching device |address| and | 136 * Updates the DeviceDetailsPage with the matching device |address| and |
| 136 * redraws it. | 137 * redraws it. |
| 137 * @param {string} address | 138 * @param {string} address |
| 138 */ | 139 */ |
| 139 function updateDeviceDetailsPage(address) { | 140 function updateDeviceDetailsPage(address) { |
| 140 var detailPageId = 'devices/' + address.toLowerCase(); | 141 var detailPageId = 'devices/' + address.toLowerCase(); |
| 141 var page = PageManager.registeredPages[detailPageId]; | 142 var page = PageManager.registeredPages[detailPageId]; |
| 142 if (page) page.redraw(); | 143 if (page) |
| 144 page.redraw(); |
| 143 } | 145 } |
| 144 | 146 |
| 145 function updateStoppedDiscoverySession() { | 147 function updateStoppedDiscoverySession() { |
| 146 devicesPage.setScanStatus(devices_page.ScanStatus.OFF); | 148 devicesPage.setScanStatus(devices_page.ScanStatus.OFF); |
| 147 discoverySession.ptr.reset(); | 149 discoverySession.ptr.reset(); |
| 148 discoverySession = null; | 150 discoverySession = null; |
| 149 } | 151 } |
| 150 | 152 |
| 151 function setupAdapterSystem(response) { | 153 function setupAdapterSystem(response) { |
| 152 adapterBroker.addEventListener('adapterchanged', function(event) { | 154 adapterBroker.addEventListener('adapterchanged', function(event) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 adapterBroker.addEventListener('deviceremoved', function(event) { | 186 adapterBroker.addEventListener('deviceremoved', function(event) { |
| 185 devices.remove(event.detail.deviceInfo); | 187 devices.remove(event.detail.deviceInfo); |
| 186 updateDeviceDetailsPage(event.detail.deviceInfo.address); | 188 updateDeviceDetailsPage(event.detail.deviceInfo.address); |
| 187 }); | 189 }); |
| 188 | 190 |
| 189 response.devices.forEach(devices.addOrUpdate, devices /* this */); | 191 response.devices.forEach(devices.addOrUpdate, devices /* this */); |
| 190 | 192 |
| 191 devicesPage.setDevices(devices); | 193 devicesPage.setDevices(devices); |
| 192 | 194 |
| 193 devicesPage.pageDiv.addEventListener('inspectpressed', function(event) { | 195 devicesPage.pageDiv.addEventListener('inspectpressed', function(event) { |
| 194 var detailsPage = makeDeviceDetailsPage( | 196 var detailsPage = |
| 195 devices.getByAddress(event.detail.address)); | 197 makeDeviceDetailsPage(devices.getByAddress(event.detail.address)); |
| 196 PageManager.showPageByName(detailsPage.name); | 198 PageManager.showPageByName(detailsPage.name); |
| 197 }); | 199 }); |
| 198 | 200 |
| 199 devicesPage.pageDiv.addEventListener('forgetpressed', function(event) { | 201 devicesPage.pageDiv.addEventListener('forgetpressed', function(event) { |
| 200 PageManager.showPageByName(devicesPage.name); | 202 PageManager.showPageByName(devicesPage.name); |
| 201 removeDeviceDetailsPage(event.detail.address); | 203 removeDeviceDetailsPage(event.detail.address); |
| 202 }); | 204 }); |
| 203 | 205 |
| 204 devicesPage.pageDiv.addEventListener('scanpressed', function(event) { | 206 devicesPage.pageDiv.addEventListener('scanpressed', function(event) { |
| 205 if (discoverySession && discoverySession.ptr.isBound()) { | 207 if (discoverySession && discoverySession.ptr.isBound()) { |
| 206 userRequestedScanStop = true; | 208 userRequestedScanStop = true; |
| 207 devicesPage.setScanStatus(devices_page.ScanStatus.STOPPING); | 209 devicesPage.setScanStatus(devices_page.ScanStatus.STOPPING); |
| 208 | 210 |
| 209 discoverySession.stop().then(function(response) { | 211 discoverySession.stop().then(function(response) { |
| 210 if (response.success) { | 212 if (response.success) { |
| 211 updateStoppedDiscoverySession(); | 213 updateStoppedDiscoverySession(); |
| 212 userRequestedScanStop = false; | 214 userRequestedScanStop = false; |
| 213 return; | 215 return; |
| 214 } | 216 } |
| 215 | 217 |
| 216 devicesPage.setScanStatus(devices_page.ScanStatus.ON); | 218 devicesPage.setScanStatus(devices_page.ScanStatus.ON); |
| 217 Snackbar.show( | 219 Snackbar.show('Failed to stop discovery session', SnackbarType.ERROR); |
| 218 'Failed to stop discovery session', SnackbarType.ERROR); | |
| 219 userRequestedScanStop = false; | 220 userRequestedScanStop = false; |
| 220 }); | 221 }); |
| 221 | 222 |
| 222 return; | 223 return; |
| 223 } | 224 } |
| 224 | 225 |
| 225 devicesPage.setScanStatus(devices_page.ScanStatus.STARTING); | 226 devicesPage.setScanStatus(devices_page.ScanStatus.STARTING); |
| 226 adapterBroker.startDiscoverySession().then(function(session) { | 227 adapterBroker.startDiscoverySession() |
| 227 discoverySession = session; | 228 .then(function(session) { |
| 229 discoverySession = session; |
| 228 | 230 |
| 229 discoverySession.ptr.setConnectionErrorHandler(function() { | 231 discoverySession.ptr.setConnectionErrorHandler(function() { |
| 230 updateStoppedDiscoverySession(); | 232 updateStoppedDiscoverySession(); |
| 231 Snackbar.show('Discovery session ended', SnackbarType.WARNING); | 233 Snackbar.show('Discovery session ended', SnackbarType.WARNING); |
| 232 }); | 234 }); |
| 233 | 235 |
| 234 devicesPage.setScanStatus(devices_page.ScanStatus.ON); | 236 devicesPage.setScanStatus(devices_page.ScanStatus.ON); |
| 235 }).catch(function(error) { | 237 }) |
| 236 devicesPage.setScanStatus(devices_page.ScanStatus.OFF); | 238 .catch(function(error) { |
| 237 Snackbar.show('Failed to start discovery session', SnackbarType.ERROR); | 239 devicesPage.setScanStatus(devices_page.ScanStatus.OFF); |
| 238 console.error(error); | 240 Snackbar.show( |
| 239 }); | 241 'Failed to start discovery session', SnackbarType.ERROR); |
| 242 console.error(error); |
| 243 }); |
| 240 }); | 244 }); |
| 241 } | 245 } |
| 242 | 246 |
| 243 function setupPages() { | 247 function setupPages() { |
| 244 sidebarObj = new window.sidebar.Sidebar($('sidebar')); | 248 sidebarObj = new window.sidebar.Sidebar($('sidebar')); |
| 245 $('menu-btn').addEventListener('click', function() { sidebarObj.open(); }); | 249 $('menu-btn').addEventListener('click', function() { |
| 250 sidebarObj.open(); |
| 251 }); |
| 246 PageManager.addObserver(sidebarObj); | 252 PageManager.addObserver(sidebarObj); |
| 247 PageManager.addObserver(new PageObserver()); | 253 PageManager.addObserver(new PageObserver()); |
| 248 | 254 |
| 249 devicesPage = new DevicesPage(); | 255 devicesPage = new DevicesPage(); |
| 250 PageManager.register(devicesPage); | 256 PageManager.register(devicesPage); |
| 251 adapterPage = new AdapterPage(); | 257 adapterPage = new AdapterPage(); |
| 252 PageManager.register(adapterPage); | 258 PageManager.register(adapterPage); |
| 253 | 259 |
| 254 // Set up hash-based navigation. | 260 // Set up hash-based navigation. |
| 255 window.addEventListener('hashchange', function() { | 261 window.addEventListener('hashchange', function() { |
| 256 // If a user navigates and the page doesn't exist, do nothing. | 262 // If a user navigates and the page doesn't exist, do nothing. |
| 257 var pageName = window.location.hash.substr(1); | 263 var pageName = window.location.hash.substr(1); |
| 258 if ($(pageName)) | 264 if ($(pageName)) |
| 259 PageManager.showPageByName(pageName); | 265 PageManager.showPageByName(pageName); |
| 260 }); | 266 }); |
| 261 | 267 |
| 262 if (!window.location.hash) { | 268 if (!window.location.hash) { |
| 263 PageManager.showPageByName(adapterPage.name); | 269 PageManager.showPageByName(adapterPage.name); |
| 264 return; | 270 return; |
| 265 } | 271 } |
| 266 | 272 |
| 267 // Only the root pages are available on page load. | 273 // Only the root pages are available on page load. |
| 268 PageManager.showPageByName(window.location.hash.split('/')[0].substr(1)); | 274 PageManager.showPageByName(window.location.hash.split('/')[0].substr(1)); |
| 269 } | 275 } |
| 270 | 276 |
| 271 function initializeViews() { | 277 function initializeViews() { |
| 272 setupPages(); | 278 setupPages(); |
| 273 | 279 |
| 274 adapter_broker.getAdapterBroker() | 280 adapter_broker.getAdapterBroker() |
| 275 .then(function(broker) { adapterBroker = broker; }) | 281 .then(function(broker) { |
| 276 .then(function() { return adapterBroker.getInfo(); }) | 282 adapterBroker = broker; |
| 277 .then(setupAdapterSystem) | 283 }) |
| 278 .then(function() { return adapterBroker.getDevices(); }) | 284 .then(function() { |
| 279 .then(setupDeviceSystem) | 285 return adapterBroker.getInfo(); |
| 280 .catch(function(error) { | 286 }) |
| 281 Snackbar.show(error.message, SnackbarType.ERROR); | 287 .then(setupAdapterSystem) |
| 282 console.error(error); | 288 .then(function() { |
| 283 }); | 289 return adapterBroker.getDevices(); |
| 290 }) |
| 291 .then(setupDeviceSystem) |
| 292 .catch(function(error) { |
| 293 Snackbar.show(error.message, SnackbarType.ERROR); |
| 294 console.error(error); |
| 295 }); |
| 284 } | 296 } |
| 285 | 297 |
| 286 return { | 298 return { |
| 287 initializeViews: initializeViews, | 299 initializeViews: initializeViews, |
| 288 }; | 300 }; |
| 289 }); | 301 }); |
| 290 | 302 |
| 291 document.addEventListener( | 303 document.addEventListener( |
| 292 'DOMContentLoaded', bluetooth_internals.initializeViews); | 304 'DOMContentLoaded', bluetooth_internals.initializeViews); |
| OLD | NEW |