blob: 2dd6976e916a2d9d329d728b4277b07ba5f08273 [file] [log] [blame]
// Copyright 2018 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
* Subpage of settings-multidevice-feature for managing the Smart Lock feature.
*/
cr.exportPath('settings');
cr.define('settings', function() {
/**
* The state of the preference controlling Smart Lock's ability to sign-in the
* user.
* @enum {string}
*/
SignInEnabledState = {
ENABLED: 'enabled',
DISABLED: 'disabled',
};
/** @const {string} */
SmartLockSignInEnabledPrefName = 'proximity_auth.is_chromeos_login_enabled';
return {
SignInEnabledState: SignInEnabledState,
SmartLockSignInEnabledPrefName: SmartLockSignInEnabledPrefName,
};
});
Polymer({
is: 'settings-multidevice-smartlock-subpage',
behaviors: [
MultiDeviceFeatureBehavior,
WebUIListenerBehavior,
],
properties: {
/** @type {?SettingsRoutes} */
routes: {
type: Object,
value: settings.routes,
},
/**
* True if Smart Lock is enabled.
* @private
*/
smartLockEnabled_: {
type: Boolean,
computed: 'computeIsSmartLockEnabled_(pageContentData)',
},
/**
* Whether Smart Lock may be used to sign-in the user (as opposed to only
* being able to unlock the user's screen).
* @private {!settings.SignInEnabledState}
*/
smartLockSignInEnabled_: {
type: Object,
value: settings.SignInEnabledState.DISABLED,
},
/**
* True if the user is allowed to enable Smart Lock sign-in.
* @private
*/
smartLockSignInAllowed_: {
type: Boolean,
value: true,
},
/** @private */
showPasswordPromptDialog_: {
type: Boolean,
value: false,
},
/**
* Authentication token provided by password-prompt-dialog.
* @private {string}
*/
authToken_: {
type: String,
value: '',
},
},
/** @private {?settings.MultiDeviceBrowserProxy} */
browserProxy_: null,
/** @override */
ready: function() {
this.browserProxy_ = settings.MultiDeviceBrowserProxyImpl.getInstance();
this.addWebUIListener(
'smart-lock-signin-enabled-changed',
this.updateSmartLockSignInEnabled_.bind(this));
this.addWebUIListener(
'smart-lock-signin-allowed-changed',
this.updateSmartLockSignInAllowed_.bind(this));
this.browserProxy_.getSmartLockSignInEnabled().then(enabled => {
this.updateSmartLockSignInEnabled_(enabled);
});
this.browserProxy_.getSmartLockSignInAllowed().then(allowed => {
this.updateSmartLockSignInAllowed_(allowed);
});
},
/**
* Returns true if Smart Lock is an enabled feature.
* @return {boolean}
* @private
*/
computeIsSmartLockEnabled_: function() {
return !!this.pageContentData &&
this.getFeatureState(settings.MultiDeviceFeature.SMART_LOCK) ==
settings.MultiDeviceFeatureState.ENABLED_BY_USER;
},
/**
* Updates the state of the Smart Lock 'sign-in enabled' toggle.
* @private
*/
updateSmartLockSignInEnabled_: function(enabled) {
this.smartLockSignInEnabled_ = enabled ?
settings.SignInEnabledState.ENABLED :
settings.SignInEnabledState.DISABLED;
},
/**
* Updates the Smart Lock 'sign-in enabled' toggle such that disallowing
* sign-in disables the toggle.
* @private
*/
updateSmartLockSignInAllowed_: function(allowed) {
this.smartLockSignInAllowed_ = allowed;
},
/** @private */
openPasswordPromptDialog_: function() {
this.showPasswordPromptDialog_ = true;
},
/**
* Sets the Smart Lock 'sign-in enabled' pref based on the value of the
* radio group representing the pref.
* @private
*/
onSmartLockSignInEnabledChanged_: function() {
const radioGroup = this.$$('cr-radio-group');
const enabled = radioGroup.selected == settings.SignInEnabledState.ENABLED;
if (!enabled) {
// No authentication check is required to disable.
this.browserProxy_.setSmartLockSignInEnabled(false /* enabled */);
return;
}
// Toggle the enabled state back to disabled, as authentication may not
// succeed. The toggle state updates automatically by the pref listener.
radioGroup.selected = settings.SignInEnabledState.DISABLED;
this.openPasswordPromptDialog_();
},
/**
* Updates the state of the password dialog controller flag when the UI
* element closes.
* @private
*/
onEnableSignInDialogClose_: function() {
this.showPasswordPromptDialog_ = false;
// If |this.authToken_| is set when the dialog has been closed, this means
// that the user entered the correct password into the dialog when
// attempting to enable SignIn with Smart Lock.
if (this.authToken_ !== '') {
this.browserProxy_.setSmartLockSignInEnabled(
true /* enabled */, this.authToken_);
}
// Always require password entry if re-enabling SignIn with Smart Lock.
this.authToken_ = '';
},
});