Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 * @fileoverview Polymer element for rendering network icons based on ONC | 6 * @fileoverview Polymer element for rendering network icons based on ONC |
| 7 * state properties. | 7 * state properties. |
| 8 */ | 8 */ |
| 9 | 9 |
| 10 /** | 10 Polymer({ |
| 11 * @typedef {{ | 11 is: 'cr-network-icon', |
| 12 * showBadges: boolean, | |
| 13 * showDisconnected: boolean, | |
| 14 * strength: number | |
| 15 * }} | |
| 16 */ | |
| 17 var NetworkIconParamType; | |
| 18 | 12 |
| 19 (function() { | 13 properties: { |
| 20 /** @const {string} */ var RESOURCE_IMAGE_BASE = | 14 /** |
| 21 'chrome://resources/cr_elements/network/'; | 15 * If set, the ONC properties will be used to display the icon. This may |
| 16 * either be the complete set of NetworkProperties or the subset of | |
| 17 * NetworkStateProperties. | |
| 18 * @type {!CrOnc.NetworkProperties|!CrOnc.NetworkStateProperties|undefined} | |
| 19 */ | |
| 20 networkState: Object, | |
| 22 | 21 |
| 23 /** @const {string} */ var RESOURCE_IMAGE_EXT = '.png'; | 22 /** |
| 23 * If true, the icon is part of a list of networks and may be displayed | |
| 24 * differently, e.g. the disconnected image will never be shown for | |
| 25 * list items. | |
| 26 */ | |
| 27 isListItem: { | |
| 28 type: Boolean, | |
| 29 value: false, | |
| 30 }, | |
| 31 }, | |
| 24 | 32 |
| 25 /** | 33 /** |
| 26 * Gets the icon type from the network type. This allows multiple types | 34 * @return {string} The name of the svg icon image to show. |
| 27 * (i.e. Cellular, WiMAX) to map to the same icon type (i.e. mobile). | 35 * @private |
| 28 * @param {chrome.networkingPrivate.NetworkType} networkType | 36 */ |
| 29 * @return {string} The icon type: ethernet, wifi, mobile, or vpn. | 37 getIcon_: function() { |
| 30 */ | 38 let showDisconnected = |
| 31 function getIconTypeFromNetworkType(networkType) { | 39 !this.isListItem && (!this.networkState.ConnectionState || |
| 32 if (!networkType || networkType == CrOnc.Type.ETHERNET) | 40 this.networkState.ConnectionState == |
| 33 return 'ethernet'; | 41 CrOnc.ConnectionState.NOT_CONNECTED); |
| 34 else if (networkType == CrOnc.Type.WI_FI) | |
| 35 return 'wifi'; | |
| 36 else if (networkType == CrOnc.Type.CELLULAR) | |
| 37 return 'mobile'; | |
| 38 else if (networkType == CrOnc.Type.WI_MAX) | |
| 39 return 'mobile'; | |
| 40 else if (networkType == CrOnc.Type.VPN) | |
| 41 return 'vpn'; | |
| 42 | 42 |
| 43 console.error('Unrecognized network type for icon: ' + networkType); | 43 switch (this.networkState.Type) { |
| 44 return 'ethernet'; | 44 case CrOnc.Type.ETHERNET: { |
| 45 } | 45 return 'network:settings-ethernet'; |
| 46 } | |
| 47 case CrOnc.Type.VPN: { | |
| 48 return 'network:vpn-key'; | |
| 49 } | |
| 50 case CrOnc.Type.CELLULAR: { | |
| 51 let strength = | |
| 52 showDisconnected ? 0 : CrOnc.getSignalStrength(this.networkState); | |
| 53 let index = this.strengthToIndex_(strength); | |
| 54 return 'network:signal-cellular-' + index.toString(10) + '-bar'; | |
| 55 } | |
| 56 case CrOnc.Type.WI_FI: | |
| 57 case CrOnc.Type.WI_MAX: { | |
| 58 if (showDisconnected) | |
| 59 return 'network:signal-wifi-off'; | |
| 60 let strength = CrOnc.getSignalStrength(this.networkState); | |
| 61 let index = this.strengthToIndex_(strength); | |
| 62 return 'network:signal-wifi-' + index.toString(10) + '-bar'; | |
| 63 } | |
| 64 default: | |
| 65 assertNotReached(); | |
| 66 } | |
| 67 return ''; | |
| 68 }, | |
| 46 | 69 |
| 47 /** | 70 /** |
| 48 * Polymer class definition for 'cr-network-icon'. | 71 * @param {number} strength The signal strength from [0 - 100]. |
| 49 */ | 72 * @return {number} An index from 0-4 corresponding to |strength|. |
| 50 Polymer({ | |
| 51 is: 'cr-network-icon', | |
| 52 | |
| 53 properties: { | |
| 54 /** | |
| 55 * If set, the ONC properties will be used to display the icon. This may | |
| 56 * either be the complete set of NetworkProperties or the subset of | |
| 57 * NetworkStateProperties. | |
| 58 * @type | |
| 59 * {!CrOnc.NetworkProperties|!CrOnc.NetworkStateProperties|undefined} | |
| 60 */ | |
| 61 networkState: { | |
| 62 type: Object, | |
| 63 observer: 'networkStateChanged_', | |
| 64 }, | |
| 65 | |
| 66 /** | |
| 67 * If set, the ONC network type will be used to display the icon. | |
| 68 * @type {?chrome.networkingPrivate.NetworkType} | |
| 69 */ | |
| 70 networkType: { | |
| 71 type: String, | |
| 72 value: null, | |
| 73 observer: 'networkTypeChanged_', | |
| 74 }, | |
| 75 | |
| 76 /** | |
| 77 * If true, the icon is part of a list of networks and may be displayed | |
| 78 * differently, e.g. the disconnected image will never be shown for | |
| 79 * list items. | |
| 80 */ | |
| 81 isListItem: { | |
| 82 type: Boolean, | |
| 83 value: false, | |
| 84 observer: 'isListItemChanged_', | |
| 85 }, | |
| 86 | |
| 87 /** The icon type to use for the base image of the icon. */ | |
| 88 iconType_: { | |
| 89 type: String, | |
| 90 value: 'ethernet', | |
| 91 }, | |
| 92 | |
| 93 /** Set to true to show a badge for roaming networks. */ | |
| 94 roaming_: { | |
| 95 type: Boolean, | |
| 96 value: false, | |
| 97 }, | |
| 98 | |
| 99 /** Set to true to show a badge for secure networks. */ | |
| 100 secure_: { | |
| 101 type: Boolean, | |
| 102 value: false, | |
| 103 }, | |
| 104 | |
| 105 /** Set to the name of a technology to show show a badge. */ | |
| 106 technology_: { | |
| 107 type: String, | |
| 108 value: '', | |
| 109 }, | |
| 110 }, | |
| 111 | |
| 112 /** | |
| 113 * Polymer networkState changed method. Updates the icon based on the | |
| 114 * network state. | |
| 115 * @private | |
| 116 */ | |
| 117 networkStateChanged_: function() { | |
| 118 if (!this.networkState) | |
| 119 return; | |
| 120 | |
| 121 this.networkType = null; | |
| 122 this.iconType_ = getIconTypeFromNetworkType(this.networkState.Type); | |
| 123 var strength = CrOnc.getSignalStrength(this.networkState); | |
| 124 var params = /** @type {NetworkIconParamType} */ { | |
| 125 showBadges: true, | |
| 126 showDisconnected: !this.isListItem, | |
| 127 strength: strength | |
| 128 }; | |
| 129 this.setIcon_(params); | |
| 130 }, | |
| 131 | |
| 132 /** | |
| 133 * Polymer networkType changed method. Updates the icon based on the type | |
| 134 * of network, showing a disconnected icon where appropriate and no badges. | |
| 135 * @private | |
| 136 */ | |
| 137 networkTypeChanged_: function() { | |
| 138 if (!this.networkType) | |
| 139 return; | |
| 140 | |
| 141 this.networkState = undefined; | |
| 142 this.iconType_ = getIconTypeFromNetworkType(this.networkType); | |
| 143 var params = /** @type {NetworkIconParamType} */ { | |
| 144 showBadges: false, | |
| 145 showDisconnected: true, | |
| 146 strength: 0, | |
| 147 }; | |
| 148 this.setIcon_(params); | |
| 149 }, | |
| 150 | |
| 151 /** | |
| 152 * Polymer isListItem changed method. | |
| 153 * @private | |
| 154 */ | |
| 155 isListItemChanged_: function() { | |
| 156 if (this.networkState) | |
| 157 this.networkStateChanged_(); | |
| 158 else if (this.networkType) | |
| 159 this.networkTypeChanged_(); | |
| 160 }, | |
| 161 | |
| 162 /** | |
| 163 * Returns the url for an image based on identifier |id|. | |
| 164 * @param {string} id The identifier describing the image. | |
| 165 * @return {string} The url to use for the image 'src' property. | |
| 166 * @private | 73 * @private |
| 167 */ | 74 */ |
| 168 toImageSrc_: function(id) { | 75 strengthToIndex_: function(strength) { |
| 169 return id ? RESOURCE_IMAGE_BASE + id + RESOURCE_IMAGE_EXT : ''; | 76 if (strength == 0) |
| 170 }, | 77 return 0; |
| 78 return Math.min(Math.trunc((strength - 1) / 25) + 1, 4); | |
| 79 }, | |
| 171 | 80 |
| 172 /** | 81 /** |
| 173 * Returns the url for a badge image based on identifier |id|. | 82 * @return {boolean} |
| 174 * @param {string} id The identifier describing the badge. | |
| 175 * @return {string} The url to use for the badge image 'src' property. | |
| 176 * @private | 83 * @private |
| 177 */ | 84 */ |
| 178 toBadgeImageSrc_: function(id) { | 85 showTechnology_: function() { |
|
Dan Beam
2017/01/05 02:49:13
you can probably use [[getTechnology_()]] directly
stevenjb
2017/01/05 17:37:37
Acknowledged.
| |
| 179 return id ? this.toImageSrc_('badge_' + id) : ''; | 86 return this.getTechnology_() != ''; |
| 180 }, | 87 }, |
| 181 | 88 |
| 182 /** | 89 /** |
| 183 * Sets the icon and badge based on the current state and |strength|. | 90 * @return {string} |
| 184 * @param {!NetworkIconParamType} params Set of params describing the icon. | 91 * @private |
| 185 * @private | 92 */ |
| 186 */ | 93 getTechnology_: function() { |
| 187 setIcon_: function(params) { | 94 let networkState = this.networkState; |
| 188 var icon = this.$.icon; | 95 let type = networkState.Type; |
| 96 if (type == CrOnc.Type.WI_MAX) | |
| 97 return 'network:4g'; | |
| 98 if (type == CrOnc.Type.CELLULAR && networkState.Cellular) { | |
| 99 let technology = | |
| 100 this.getTechnologyId_(networkState.Cellular.NetworkTechnology); | |
| 101 if (technology != '') | |
| 102 return 'network:' + technology; | |
| 103 } | |
| 104 return ''; | |
| 105 }, | |
| 189 | 106 |
| 190 var multiLevel = (this.iconType_ == 'wifi' || this.iconType_ == 'mobile'); | 107 /** |
| 108 * @param {string|undefined} networkTechnology | |
| 109 * @return {string} | |
| 110 * @private | |
| 111 */ | |
| 112 getTechnologyId_: function(networkTechnology) { | |
| 113 switch (networkTechnology) { | |
| 114 case CrOnc.NetworkTechnology.CDMA1XRTT: | |
| 115 return 'badge-1x'; | |
| 116 case CrOnc.NetworkTechnology.EDGE: | |
| 117 return 'badge-edge'; | |
| 118 case CrOnc.NetworkTechnology.EVDO: | |
| 119 return 'badge-evdo'; | |
| 120 case CrOnc.NetworkTechnology.GPRS: | |
| 121 case CrOnc.NetworkTechnology.GSM: | |
| 122 return 'badge-gsm'; | |
| 123 case CrOnc.NetworkTechnology.HSPA: | |
| 124 return 'badge-hspa'; | |
| 125 case CrOnc.NetworkTechnology.HSPA_PLUS: | |
| 126 return 'badge-hspa-plus'; | |
| 127 case CrOnc.NetworkTechnology.LTE: | |
| 128 return 'badge-lte'; | |
| 129 case CrOnc.NetworkTechnology.LTE_ADVANCED: | |
| 130 return 'badge-lte-advanced'; | |
| 131 case CrOnc.NetworkTechnology.UMTS: | |
| 132 return 'badge-3g'; | |
| 133 } | |
| 134 return ''; | |
| 135 }, | |
| 191 | 136 |
| 192 if (this.networkState && multiLevel) { | 137 /** |
| 193 this.setMultiLevelIcon_(params); | 138 * @return {boolean} |
| 194 } else { | 139 * @private |
| 195 icon.classList.toggle('multi-level', multiLevel); | 140 */ |
| 196 icon.classList.toggle('level0', multiLevel); | 141 showSecure_: function() { |
| 197 icon.classList.toggle('level1', false); | 142 let networkState = this.networkState; |
| 198 icon.classList.toggle('level2', false); | 143 if (networkState.Type == CrOnc.Type.WI_FI && networkState.WiFi) { |
| 199 icon.classList.toggle('level3', false); | 144 let security = networkState.WiFi.Security; |
| 200 icon.classList.toggle('level4', false); | 145 return !!security && security != 'None'; |
| 201 } | 146 } |
| 202 | 147 return false; |
| 203 this.setIconBadges_(params); | 148 }, |
| 204 }, | 149 }); |
| 205 | |
| 206 /** | |
| 207 * Toggles icon classes based on strength and connecting properties. | |
| 208 * |this.networkState| is expected to be specified. | |
| 209 * @param {!NetworkIconParamType} params Set of params describing the icon. | |
| 210 * @private | |
| 211 */ | |
| 212 setMultiLevelIcon_: function(params) { | |
| 213 // Set the strength or connecting properties. | |
| 214 var networkState = this.networkState; | |
| 215 | |
| 216 var connectionState = networkState.ConnectionState; | |
| 217 var connecting = false; | |
| 218 var strength = -1; | |
| 219 if (connectionState == CrOnc.ConnectionState.CONNECTING) { | |
| 220 strength = 0; | |
| 221 connecting = true; | |
| 222 } else if ( | |
| 223 connectionState == CrOnc.ConnectionState.CONNECTED || | |
| 224 !params.showDisconnected) { | |
| 225 strength = params.strength || 0; | |
| 226 } | |
| 227 | |
| 228 var icon = this.$.icon; | |
| 229 icon.classList.toggle('multi-level', true); | |
| 230 icon.classList.toggle('connecting', connecting); | |
| 231 icon.classList.toggle('level0', strength < 0); | |
| 232 icon.classList.toggle('level1', strength >= 0 && strength <= 25); | |
| 233 icon.classList.toggle('level2', strength > 25 && strength <= 50); | |
| 234 icon.classList.toggle('level3', strength > 50 && strength <= 75); | |
| 235 icon.classList.toggle('level4', strength > 75); | |
| 236 }, | |
| 237 | |
| 238 /** | |
| 239 * Sets the icon badge visibility properties: roaming, secure, technology. | |
| 240 * @param {!NetworkIconParamType} params Set of params describing the icon. | |
| 241 * @private | |
| 242 */ | |
| 243 setIconBadges_: function(params) { | |
| 244 var networkState = this.networkState; | |
| 245 | |
| 246 var type = (params.showBadges && networkState) ? networkState.Type : ''; | |
| 247 if (type == CrOnc.Type.WI_FI) { | |
| 248 this.roaming_ = false; | |
| 249 var security = networkState.WiFi ? networkState.WiFi.Security : ''; | |
| 250 this.secure_ = !!security && security != 'None'; | |
| 251 this.technology_ = ''; | |
| 252 } else if (type == CrOnc.Type.WI_MAX) { | |
| 253 this.roaming_ = false; | |
| 254 this.secure_ = false; | |
| 255 this.technology_ = '4g'; | |
| 256 } else if (type == CrOnc.Type.CELLULAR && networkState.Cellular) { | |
| 257 this.roaming_ = | |
| 258 networkState.Cellular.RoamingState == CrOnc.RoamingState.ROAMING; | |
| 259 this.secure_ = false; | |
| 260 var oncTechnology = networkState.Cellular.NetworkTechnology; | |
| 261 switch (oncTechnology) { | |
| 262 case CrOnc.NetworkTechnology.CDMA1XRTT: | |
| 263 this.technology_ = '1x'; | |
| 264 break; | |
| 265 case CrOnc.NetworkTechnology.EDGE: | |
| 266 this.technology_ = 'edge'; | |
| 267 break; | |
| 268 case CrOnc.NetworkTechnology.EVDO: | |
| 269 this.technology_ = 'evdo'; | |
| 270 break; | |
| 271 case CrOnc.NetworkTechnology.GPRS: | |
| 272 case CrOnc.NetworkTechnology.GSM: | |
| 273 this.technology_ = 'gsm'; | |
| 274 break; | |
| 275 case CrOnc.NetworkTechnology.HSPA: | |
| 276 this.technology_ = 'hspa'; | |
| 277 break; | |
| 278 case CrOnc.NetworkTechnology.HSPA_PLUS: | |
| 279 this.technology_ = 'hspa_plus'; | |
| 280 break; | |
| 281 case CrOnc.NetworkTechnology.LTE: | |
| 282 this.technology_ = 'lte'; | |
| 283 break; | |
| 284 case CrOnc.NetworkTechnology.LTE_ADVANCED: | |
| 285 this.technology_ = 'lte_advanced'; | |
| 286 break; | |
| 287 case CrOnc.NetworkTechnology.UMTS: | |
| 288 this.technology_ = '3g'; | |
| 289 break; | |
| 290 } | |
| 291 } else { | |
| 292 this.roaming_ = false; | |
| 293 this.secure_ = false; | |
| 294 this.technology_ = ''; | |
| 295 } | |
| 296 }, | |
| 297 }); | |
| 298 })(); | |
| OLD | NEW |