blob: cb5de2623e9fdc2bb2f9dcd48ed5312ea14f41c9 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview
* 'settings-internet-known-networks' is the settings subpage listing the
* known networks for a type (currently always WiFi).
*/
Polymer({
is: 'settings-internet-known-networks-page',
behaviors: [
CrNetworkListenerBehavior,
CrPolicyNetworkBehaviorMojo,
],
properties: {
/**
* The type of networks to list.
* @type {chromeos.networkConfig.mojom.NetworkType|undefined}
*/
networkType: {
type: Number,
observer: 'networkTypeChanged_',
},
/**
* List of all network state data for the network type.
* @private {!Array<!OncMojo.NetworkStateProperties>}
*/
networkStateList_: {
type: Array,
value: function() {
return [];
}
},
/** @private */
showAddPreferred_: Boolean,
/** @private */
showRemovePreferred_: Boolean,
/**
* We always show 'Forget' since we do not know whether or not to enable
* it until we fetch the managed properties, and we do not want an empty
* menu.
* @private
*/
enableForget_: Boolean,
},
/** @private {string} */
selectedGuid_: '',
/** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
networkConfig_: null,
/** @override */
created: function() {
this.networkConfig_ = network_config.MojoInterfaceProviderImpl.getInstance()
.getMojoServiceRemote();
},
/** CrosNetworkConfigObserver impl */
onNetworkStateListChanged: function() {
this.refreshNetworks_();
},
/** @private */
networkTypeChanged_: function() {
this.refreshNetworks_();
},
/**
* Requests the list of network states from Chrome. Updates networkStates
* once the results are returned from Chrome.
* @private
*/
refreshNetworks_: function() {
if (this.networkType === undefined) {
return;
}
const filter = {
filter: chromeos.networkConfig.mojom.FilterType.kConfigured,
limit: chromeos.networkConfig.mojom.NO_LIMIT,
networkType: this.networkType,
};
this.networkConfig_.getNetworkStateList(filter).then(response => {
this.networkStateList_ = response.result;
});
},
/**
* @param {!OncMojo.NetworkStateProperties} networkState
* @return {boolean}
* @private
*/
networkIsPreferred_: function(networkState) {
// Currently we treat NetworkStateProperties.Priority as a boolean.
return networkState.priority > 0;
},
/**
* @param {!OncMojo.NetworkStateProperties} networkState
* @return {boolean}
* @private
*/
networkIsNotPreferred_: function(networkState) {
return networkState.priority == 0;
},
/**
* @return {boolean}
* @private
*/
havePreferred_: function() {
return this.networkStateList_.find(
state => this.networkIsPreferred_(state)) !== undefined;
},
/**
* @return {boolean}
* @private
*/
haveNotPreferred_: function() {
return this.networkStateList_.find(
state => this.networkIsNotPreferred_(state)) !== undefined;
},
/**
* @param {!OncMojo.NetworkStateProperties} networkState
* @return {string}
* @private
*/
getNetworkDisplayName_: function(networkState) {
return OncMojo.getNetworkStateDisplayName(networkState);
},
/**
* @param {!Event} event
* @private
*/
onMenuButtonTap_: function(event) {
const button = event.target;
const networkState =
/** @type {!OncMojo.NetworkStateProperties} */ (event.model.item);
this.selectedGuid_ = networkState.guid;
// We need to make a round trip to Chrome in order to retrieve the managed
// properties for the network. The delay is not noticeable (~5ms) and is
// preferable to initiating a query for every known network at load time.
this.networkConfig_.getManagedProperties(this.selectedGuid_)
.then(response => {
const properties = response.result;
if (!properties) {
console.error('Properties not found for: ' + this.selectedGuid_);
return;
}
if (properties.priority &&
this.isNetworkPolicyEnforced(properties.priority)) {
this.showAddPreferred_ = false;
this.showRemovePreferred_ = false;
} else {
const preferred = this.networkIsPreferred_(networkState);
this.showAddPreferred_ = !preferred;
this.showRemovePreferred_ = preferred;
}
this.enableForget_ = !this.isPolicySource(networkState.source);
/** @type {!CrActionMenuElement} */ (this.$.dotsMenu)
.showAt(/** @type {!Element} */ (button));
});
event.stopPropagation();
},
/**
* @param {!chromeos.networkConfig.mojom.ConfigProperties} config
* @private
*/
setProperties_: function(config) {
this.networkConfig_.setProperties(this.selectedGuid_, config)
.then(response => {
if (!response.success) {
console.error(
'Unable to set properties for: ' + this.selectedGuid_ + ': ' +
JSON.stringify(config));
}
});
},
/** @private */
onRemovePreferredTap_: function() {
assert(this.networkType !== undefined);
this.setProperties_({type: this.networkType, priority: {value: 0}});
/** @type {!CrActionMenuElement} */ (this.$.dotsMenu).close();
},
/** @private */
onAddPreferredTap_: function() {
assert(this.networkType !== undefined);
this.setProperties_({type: this.networkType, priority: {value: 1}});
/** @type {!CrActionMenuElement} */ (this.$.dotsMenu).close();
},
/** @private */
onForgetTap_: function() {
this.networkConfig_.forgetNetwork(this.selectedGuid_).then(response => {
if (!response.success) {
console.error('Froget network failed for: ' + this.selectedGuid_);
}
});
/** @type {!CrActionMenuElement} */ (this.$.dotsMenu).close();
},
/**
* Fires a 'show-detail' event with an item containing a |networkStateList_|
* entry in the event model.
* @param {!Event} event
* @private
*/
fireShowDetails_: function(event) {
const networkState =
/** @type {!OncMojo.NetworkStateProperties} */ (event.model.item);
this.fire('show-detail', networkState);
event.stopPropagation();
},
/**
* Make sure events in embedded components do not propagate to onDetailsTap_.
* @param {!Event} event
* @private
*/
doNothing_: function(event) {
event.stopPropagation();
},
});