| 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. |
| 11 var adapterBroker = null; | 11 var adapterBroker = null; |
| 12 var devices = null; | 12 var devices = null; |
| 13 var sidebarObj = null; | 13 var sidebarObj = null; |
| 14 | 14 |
| 15 cr.define('bluetooth_internals', function() { | 15 cr.define('bluetooth_internals', function() { |
| 16 /** @const */ var DevicesPage = devices_page.DevicesPage; | 16 /** @const */ var DevicesPage = devices_page.DevicesPage; |
| 17 /** @const */ var PageManager = cr.ui.pageManager.PageManager; | 17 /** @const */ var PageManager = cr.ui.pageManager.PageManager; |
| 18 /** @const */ var Snackbar = snackbar.Snackbar; |
| 19 /** @const */ var SnackbarType = snackbar.SnackbarType; |
| 18 | 20 |
| 19 /** | 21 /** |
| 20 * Observer for page changes. Used to update page title header. | 22 * Observer for page changes. Used to update page title header. |
| 21 * @extends {cr.ui.pageManager.PageManager.Observer} | 23 * @extends {cr.ui.pageManager.PageManager.Observer} |
| 22 */ | 24 */ |
| 23 var PageObserver = function() {}; | 25 var PageObserver = function() {}; |
| 24 | 26 |
| 25 PageObserver.prototype = { | 27 PageObserver.prototype = { |
| 26 __proto__: PageManager.Observer.prototype, | 28 __proto__: PageManager.Observer.prototype, |
| 27 | 29 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 41 | 43 |
| 42 /** @type {!Map<string, !interfaces.BluetoothDevice.Device.proxyClass>} */ | 44 /** @type {!Map<string, !interfaces.BluetoothDevice.Device.proxyClass>} */ |
| 43 var deviceAddressToProxy = new Map(); | 45 var deviceAddressToProxy = new Map(); |
| 44 | 46 |
| 45 /** @type {!device_collection.DeviceCollection} */ | 47 /** @type {!device_collection.DeviceCollection} */ |
| 46 devices = new device_collection.DeviceCollection([]); | 48 devices = new device_collection.DeviceCollection([]); |
| 47 | 49 |
| 48 /** @type {devices_page.DevicesPage} */ | 50 /** @type {devices_page.DevicesPage} */ |
| 49 var devicesPage = null; | 51 var devicesPage = null; |
| 50 | 52 |
| 53 function handleInspect(event) { |
| 54 // TODO(crbug.com/663470): Move connection logic to DeviceDetailsView |
| 55 // when it's added in chrome://bluetooth-internals. |
| 56 var address = event.detail.address; |
| 57 var proxy = deviceAddressToProxy.get(address); |
| 58 |
| 59 if (proxy) { |
| 60 // Device is already connected, so disconnect. |
| 61 proxy.disconnect(); |
| 62 deviceAddressToProxy.delete(address); |
| 63 devices.updateConnectionStatus( |
| 64 address, device_collection.ConnectionStatus.DISCONNECTED); |
| 65 return; |
| 66 } |
| 67 |
| 68 devices.updateConnectionStatus( |
| 69 address, device_collection.ConnectionStatus.CONNECTING); |
| 70 |
| 71 adapterBroker.connectToDevice(address).then(function(deviceProxy) { |
| 72 var deviceInfo = devices.getByAddress(address); |
| 73 if (!deviceInfo) { |
| 74 // Device no longer in list, so drop the connection. |
| 75 deviceProxy.disconnect(); |
| 76 return; |
| 77 } |
| 78 |
| 79 deviceAddressToProxy.set(address, deviceProxy); |
| 80 devices.updateConnectionStatus( |
| 81 address, device_collection.ConnectionStatus.CONNECTED); |
| 82 Snackbar.show(deviceInfo.name_for_display + ': Connected', |
| 83 SnackbarType.SUCCESS); |
| 84 |
| 85 // Fetch services asynchronously. |
| 86 return deviceProxy.getServices(); |
| 87 }).then(function(response) { |
| 88 if (!response) return; |
| 89 |
| 90 var deviceInfo = devices.getByAddress(address); |
| 91 deviceInfo.services = response.services; |
| 92 devices.addOrUpdate(deviceInfo); |
| 93 }).catch(function(error) { |
| 94 // If a connection error occurs while fetching the services, the proxy |
| 95 // reference must be removed. |
| 96 var proxy = deviceAddressToProxy.get(address); |
| 97 if (proxy) { |
| 98 proxy.disconnect(); |
| 99 deviceAddressToProxy.delete(address); |
| 100 } |
| 101 |
| 102 devices.updateConnectionStatus( |
| 103 address, device_collection.ConnectionStatus.DISCONNECTED); |
| 104 |
| 105 var deviceInfo = devices.getByAddress(address); |
| 106 Snackbar.show(deviceInfo.name_for_display + ': ' + error.message, |
| 107 SnackbarType.ERROR, 'Retry', function() { handleInspect(event); }); |
| 108 }); |
| 109 } |
| 110 |
| 51 function setupDeviceSystem(response) { | 111 function setupDeviceSystem(response) { |
| 52 // Hook up device collection events. | 112 // Hook up device collection events. |
| 53 adapterBroker.addEventListener('deviceadded', function(event) { | 113 adapterBroker.addEventListener('deviceadded', function(event) { |
| 54 devices.addOrUpdate(event.detail.deviceInfo); | 114 devices.addOrUpdate(event.detail.deviceInfo); |
| 55 }); | 115 }); |
| 56 adapterBroker.addEventListener('devicechanged', function(event) { | 116 adapterBroker.addEventListener('devicechanged', function(event) { |
| 57 devices.addOrUpdate(event.detail.deviceInfo); | 117 devices.addOrUpdate(event.detail.deviceInfo); |
| 58 }); | 118 }); |
| 59 adapterBroker.addEventListener('deviceremoved', function(event) { | 119 adapterBroker.addEventListener('deviceremoved', function(event) { |
| 60 devices.remove(event.detail.deviceInfo); | 120 devices.remove(event.detail.deviceInfo); |
| 61 }); | 121 }); |
| 62 | 122 |
| 63 response.devices.forEach(devices.addOrUpdate, devices /* this */); | 123 response.devices.forEach(devices.addOrUpdate, devices /* this */); |
| 64 | 124 |
| 65 devicesPage.setDevices(devices); | 125 devicesPage.setDevices(devices); |
| 66 devicesPage.pageDiv.addEventListener('inspectpressed', function() { | 126 devicesPage.pageDiv.addEventListener('inspectpressed', handleInspect); |
| 67 // TODO(crbug.com/663470): Move connection logic to DeviceDetailsView | |
| 68 // when it's added in chrome://bluetooth-internals. | |
| 69 var address = event.detail.address; | |
| 70 var proxy = deviceAddressToProxy.get(address); | |
| 71 | |
| 72 if (proxy) { | |
| 73 // Device is already connected, so disconnect. | |
| 74 proxy.disconnect(); | |
| 75 deviceAddressToProxy.delete(address); | |
| 76 devices.updateConnectionStatus( | |
| 77 address, device_collection.ConnectionStatus.DISCONNECTED); | |
| 78 return; | |
| 79 } | |
| 80 | |
| 81 devices.updateConnectionStatus( | |
| 82 address, device_collection.ConnectionStatus.CONNECTING); | |
| 83 | |
| 84 adapterBroker.connectToDevice(address).then(function(deviceProxy) { | |
| 85 if (!devices.getByAddress(address)) { | |
| 86 // Device no longer in list, so drop the connection. | |
| 87 deviceProxy.disconnect(); | |
| 88 return; | |
| 89 } | |
| 90 | |
| 91 deviceAddressToProxy.set(address, deviceProxy); | |
| 92 devices.updateConnectionStatus( | |
| 93 address, device_collection.ConnectionStatus.CONNECTED); | |
| 94 | |
| 95 // Fetch services asynchronously. | |
| 96 return deviceProxy.getServices(); | |
| 97 }).then(function(response) { | |
| 98 if (!response) return; | |
| 99 | |
| 100 var deviceInfo = devices.getByAddress(address); | |
| 101 deviceInfo.services = response.services; | |
| 102 devices.addOrUpdate(deviceInfo); | |
| 103 }).catch(function(error) { | |
| 104 devices.updateConnectionStatus( | |
| 105 address, | |
| 106 device_collection.ConnectionStatus.DISCONNECTED, | |
| 107 error); | |
| 108 }); | |
| 109 }); | |
| 110 } | 127 } |
| 111 | 128 |
| 112 function setupPages() { | 129 function setupPages() { |
| 113 sidebarObj = new window.sidebar.Sidebar($('sidebar')); | 130 sidebarObj = new window.sidebar.Sidebar($('sidebar')); |
| 114 $('menu-btn').addEventListener('click', function() { sidebarObj.open(); }); | 131 $('menu-btn').addEventListener('click', function() { sidebarObj.open(); }); |
| 115 PageManager.addObserver(sidebarObj); | 132 PageManager.addObserver(sidebarObj); |
| 116 PageManager.addObserver(new PageObserver()); | 133 PageManager.addObserver(new PageObserver()); |
| 117 | 134 |
| 118 devicesPage = new DevicesPage(); | 135 devicesPage = new DevicesPage(); |
| 119 PageManager.register(devicesPage); | 136 PageManager.register(devicesPage); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 133 | 150 |
| 134 function initializeViews() { | 151 function initializeViews() { |
| 135 setupPages(); | 152 setupPages(); |
| 136 | 153 |
| 137 adapter_broker.getAdapterBroker() | 154 adapter_broker.getAdapterBroker() |
| 138 .then(function(broker) { adapterBroker = broker; }) | 155 .then(function(broker) { adapterBroker = broker; }) |
| 139 .then(function() { return adapterBroker.getInfo(); }) | 156 .then(function() { return adapterBroker.getInfo(); }) |
| 140 .then(function(response) { console.log('adapter', response.info); }) | 157 .then(function(response) { console.log('adapter', response.info); }) |
| 141 .then(function() { return adapterBroker.getDevices(); }) | 158 .then(function() { return adapterBroker.getDevices(); }) |
| 142 .then(setupDeviceSystem) | 159 .then(setupDeviceSystem) |
| 143 .catch(function(error) { console.error(error); }); | 160 .catch(function(error) { |
| 161 Snackbar.show(error.message, SnackbarType.ERROR); |
| 162 console.error(error); |
| 163 }); |
| 144 } | 164 } |
| 145 | 165 |
| 146 return { | 166 return { |
| 147 initializeViews: initializeViews | 167 initializeViews: initializeViews |
| 148 }; | 168 }; |
| 149 }); | 169 }); |
| 150 | 170 |
| 151 document.addEventListener( | 171 document.addEventListener( |
| 152 'DOMContentLoaded', bluetooth_internals.initializeViews); | 172 'DOMContentLoaded', bluetooth_internals.initializeViews); |
| OLD | NEW |