Index: ui/webui/resources/cr_elements/network/cr_network_icon.js |
diff --git a/ui/webui/resources/cr_elements/network/cr_network_icon.js b/ui/webui/resources/cr_elements/network/cr_network_icon.js |
index 4ab986e2ac236bd3690a4e446a72fe0ec22b024b..e4a90c0a7edc4155cbbb90b00099a0f452aef5dd 100644 |
--- a/ui/webui/resources/cr_elements/network/cr_network_icon.js |
+++ b/ui/webui/resources/cr_elements/network/cr_network_icon.js |
@@ -28,6 +28,24 @@ Polymer({ |
type: Boolean, |
value: false, |
}, |
+ |
+ /** |
+ * Animation frame, updated while the icon is in a connecting state. |
+ * Exposed to the DOM to trigger getIcon_ calls when it changes. |
+ * @private |
+ */ |
+ animationFrame_: { |
+ type: Number, |
+ value: 0, |
+ }, |
+ }, |
+ |
+ /** @private {?number} */ |
+ animationId_: null, |
+ |
+ /** @override */ |
+ detached: function() { |
+ this.resetAnimation_(); |
}, |
/** |
@@ -35,37 +53,36 @@ Polymer({ |
* @private |
*/ |
getIcon_: function() { |
- if (!this.networkState) |
+ var networkState = this.networkState; |
+ if (!networkState) |
return ''; |
- let showDisconnected = |
- !this.isListItem && (!this.networkState.ConnectionState || |
- this.networkState.ConnectionState == |
- CrOnc.ConnectionState.NOT_CONNECTED); |
- |
- switch (this.networkState.Type) { |
- case CrOnc.Type.ETHERNET: { |
- return 'network:settings-ethernet'; |
- } |
- case CrOnc.Type.VPN: { |
- return 'network:vpn-key'; |
- } |
- case CrOnc.Type.CELLULAR: { |
- let strength = |
- showDisconnected ? 0 : CrOnc.getSignalStrength(this.networkState); |
- let index = this.strengthToIndex_(strength); |
- return 'network:signal-cellular-' + index.toString(10) + '-bar'; |
- } |
- case CrOnc.Type.WI_FI: |
- case CrOnc.Type.WI_MAX: { |
- if (showDisconnected) |
- return 'network:signal-wifi-off'; |
- let strength = CrOnc.getSignalStrength(this.networkState); |
- let index = this.strengthToIndex_(strength); |
- return 'network:signal-wifi-' + index.toString(10) + '-bar'; |
- } |
- default: |
- assertNotReached(); |
+ var type = networkState.Type; |
+ if (type == CrOnc.Type.ETHERNET) |
+ return 'network:settings-ethernet'; |
+ if (type == CrOnc.Type.VPN) |
+ return 'network:vpn-key'; |
+ |
+ var connectionState = networkState.ConnectionState; |
+ var showDisconnected = !this.isListItem && |
+ (!connectionState || |
+ connectionState == CrOnc.ConnectionState.NOT_CONNECTED); |
+ var index = 0; |
+ if (connectionState == CrOnc.ConnectionState.CONNECTING) { |
+ index = this.getAnimationIndex_(); |
+ } else { |
+ this.resetAnimation_(); |
+ if (!showDisconnected) |
+ index = this.strengthToIndex_(CrOnc.getSignalStrength(networkState)); |
} |
+ |
+ if (type == CrOnc.Type.CELLULAR) { |
+ return 'network:signal-cellular-' + index.toString(10) + '-bar'; |
+ } else if (type == CrOnc.Type.WI_FI || type == CrOnc.Type.WI_MAX) { |
+ if (showDisconnected) |
+ return 'network:signal-wifi-off'; |
+ return 'network:signal-wifi-' + index.toString(10) + '-bar'; |
+ } |
+ assertNotReached(); |
return ''; |
}, |
@@ -81,6 +98,35 @@ Polymer({ |
}, |
/** |
+ * Returns an index from 0-4 for animating a connecting wireless icon. |
+ * The index will cycle from 0 -> 4 then from 4 -> 0. |
+ * @return {number} |
+ * @private |
+ */ |
+ getAnimationIndex_() { |
+ if (this.animationId_ == null) { |
+ /** const */ var INTERVAL_MS = 750 / 4; // Matches network_icon.cc. |
+ this.animationFrame_ = 0; |
+ this.animationId_ = window.setInterval(function() { |
+ this.animationFrame_ = |
+ (this.animationFrame_ >= 9) ? 0 : this.animationFrame_ + 1; |
+ }.bind(this), INTERVAL_MS); |
+ } |
+ if (this.animationFrame_ > 4) |
+ return 9 - this.animationFrame_; |
+ return this.animationFrame_; |
+ }, |
+ |
+ /** @private */ |
+ resetAnimation_() { |
+ this.animationFrame_ = 0; |
+ if (this.animationId_ != null) { |
+ window.clearInterval(this.animationId_); |
+ this.animationId_ = null; |
+ } |
+ }, |
+ |
+ /** |
* @return {boolean} |
* @private |
*/ |