blob: 31900de4dd45f0eecc609bdc9981aa63b4d2cbe7 [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: [
DeepLinkingBehavior,
NetworkListenerBehavior,
CrPolicyNetworkBehaviorMojo,
settings.RouteObserverBehavior,
],
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() {
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,
/**
* Contains the settingId of any deep link that wasn't able to be shown,
* null otherwise.
* @private {?chromeos.settings.mojom.Setting}
*/
pendingSettingId_: {
type: Number,
value: null,
},
/**
* Used by DeepLinkingBehavior to focus this page's deep links.
* @type {!Set<!chromeos.settings.mojom.Setting>}
*/
supportedSettingIds: {
type: Object,
value: () => new Set([
chromeos.settings.mojom.Setting.kPreferWifiNetwork,
chromeos.settings.mojom.Setting.kForgetWifiNetwork,
]),
},
},
/** @private {string} */
selectedGuid_: '',
/** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
networkConfig_: null,
/** @override */
created() {
this.networkConfig_ = network_config.MojoInterfaceProviderImpl.getInstance()
.getMojoServiceRemote();
},
/**
* settings.RouteObserverBehavior
* @param {!settings.Route} route
* @param {!settings.Route} oldRoute
* @protected
*/
currentRouteChanged(route, oldRoute) {
// Does not apply to this page.
if (route !== settings.routes.KNOWN_NETWORKS) {
return;
}
this.attemptDeepLink().then(result => {
if (!result.deepLinkShown && result.pendingSettingId) {
// Store any deep link settingId that wasn't shown so we can try again
// in refreshNetworks.
this.pendingSettingId_ = result.pendingSettingId;
}
});
},
/** CrosNetworkConfigObserver impl */
onNetworkStateListChanged() {
this.refreshNetworks_();
},
/** @private */
networkTypeChanged_() {
this.refreshNetworks_();
},
/**
* Requests the list of network states from Chrome. Updates networkStates
* once the results are returned from Chrome.
* @private
*/
refreshNetworks_() {
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;
// Check if we have yet to focus a deep-linked element.
if (!this.pendingSettingId_) {
return;
}
this.showDeepLink(this.pendingSettingId_).then(result => {
if (result.deepLinkShown) {
this.pendingSettingId_ = null;
}
});
});
},
/**
* @param {!OncMojo.NetworkStateProperties} networkState
* @return {boolean}
* @private
*/
networkIsPreferred_(networkState) {
// Currently we treat NetworkStateProperties.Priority as a boolean.
return networkState.priority > 0;
},
/**
* @param {!OncMojo.NetworkStateProperties} networkState
* @return {boolean}
* @private
*/
networkIsNotPreferred_(networkState) {
return networkState.priority === 0;
},
/**
* @return {boolean}
* @private
*/
havePreferred_() {
return this.networkStateList_.find(
state => this.networkIsPreferred_(state)) !== undefined;
},
/**
* @return {boolean}
* @private
*/
haveNotPreferred_() {
return this.networkStateList_.find(
state => this.networkIsNotPreferred_(state)) !== undefined;
},
/**
* @param {!OncMojo.NetworkStateProperties} networkState
* @return {string}
* @private
*/
getNetworkDisplayName_(networkState) {
return OncMojo.getNetworkStateDisplayName(networkState);
},
/**
* @param {!Event} event
* @private
*/
onMenuButtonTap_(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_(config) {
this.networkConfig_.setProperties(this.selectedGuid_, config)
.then(response => {
if (!response.success) {
console.error(
'Unable to set properties for: ' + this.selectedGuid_ + ': ' +
JSON.stringify(config));
}
});
settings.recordSettingChange();
},
/** @private */
onRemovePreferredTap_() {
assert(this.networkType !== undefined);
const config = OncMojo.getDefaultConfigProperties(this.networkType);
config.priority = {value: 0};
this.setProperties_(config);
/** @type {!CrActionMenuElement} */ (this.$.dotsMenu).close();
},
/** @private */
onAddPreferredTap_() {
assert(this.networkType !== undefined);
const config = OncMojo.getDefaultConfigProperties(this.networkType);
config.priority = {value: 1};
this.setProperties_(config);
/** @type {!CrActionMenuElement} */ (this.$.dotsMenu).close();
},
/** @private */
onForgetTap_() {
this.networkConfig_.forgetNetwork(this.selectedGuid_).then(response => {
if (!response.success) {
console.error('Froget network failed for: ' + this.selectedGuid_);
}
});
if (this.networkType === chromeos.networkConfig.mojom.NetworkType.kWiFi) {
settings.recordSettingChange(
chromeos.settings.mojom.Setting.kForgetWifiNetwork);
} else {
settings.recordSettingChange();
}
/** @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_(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_(event) {
event.stopPropagation();
},
});