// Copyright (c) 2012 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. cr.define('mobile', function() { function SimUnlock() { } cr.addSingletonGetter(SimUnlock); // State of the dialog. SimUnlock.SIM_UNLOCK_LOADING = -1; SimUnlock.SIM_ABSENT_NOT_LOCKED = 0, SimUnlock.SIM_NOT_LOCKED_ASK_PIN = 1; SimUnlock.SIM_NOT_LOCKED_CHANGE_PIN = 2; SimUnlock.SIM_LOCKED_PIN = 3; SimUnlock.SIM_LOCKED_NO_PIN_TRIES_LEFT = 4; SimUnlock.SIM_LOCKED_PUK = 5; SimUnlock.SIM_LOCKED_NO_PUK_TRIES_LEFT = 6; SimUnlock.SIM_DISABLED = 7; // Mode of the dialog. SimUnlock.SIM_DIALOG_UNLOCK = 0; SimUnlock.SIM_DIALOG_CHANGE_PIN = 1; SimUnlock.SIM_DIALOG_SET_LOCK_ON = 2; SimUnlock.SIM_DIALOG_SET_LOCK_OFF = 3; // Error codes. SimUnlock.ERROR_PIN = 'incorrectPin'; SimUnlock.ERROR_PUK = 'incorrectPuk'; SimUnlock.ERROR_OK = 'ok'; // Misc constants. SimUnlock.PIN_MIN_LENGTH = 4; SimUnlock.PUK_LENGTH = 8; SimUnlock.localStrings_ = new LocalStrings(); SimUnlock.prototype = { initialized_: false, mode_: SimUnlock.SIM_DIALOG_UNLOCK, pukValue_: '', defaultDialogSize_: { 'width': window.innerWidth, 'height': window.innerHeight }, state_: SimUnlock.SIM_UNLOCK_LOADING, changeState_: function(simInfo) { var newState = simInfo.state; var error = simInfo.error; var tries = simInfo.tries; var pinMessage; this.hideAll_(); switch (newState) { case SimUnlock.SIM_UNLOCK_LOADING: break; case SimUnlock.SIM_ABSENT_NOT_LOCKED: SimUnlock.close(); break; case SimUnlock.SIM_LOCKED_PIN: if (error == SimUnlock.ERROR_OK) { pinMessage = SimUnlock.localStrings_.getStringF( 'enterPinTriesMessage', tries); $('pin-error-msg').classList.remove('error'); } else if (error == SimUnlock.ERROR_PIN) { pinMessage = SimUnlock.localStrings_.getStringF( 'incorrectPinTriesMessage', tries); $('pin-error-msg').classList.add('error'); } $('pin-error-msg').textContent = pinMessage; $('pin-input').value = ''; SimUnlock.enablePinDialog(true); $('locked-pin-overlay').hidden = false; $('pin-input').focus(); break; case SimUnlock.SIM_NOT_LOCKED_ASK_PIN: if (error == SimUnlock.ERROR_OK) { pinMessage = SimUnlock.localStrings_.getString('enterPinMessage'); $('pin-error-msg').classList.remove('error'); } else if (error == SimUnlock.ERROR_PIN) { pinMessage = SimUnlock.localStrings_.getStringF( 'incorrectPinTriesMessage', tries); $('pin-error-msg').classList.add('error'); } $('pin-error-msg').textContent = pinMessage; $('pin-input').value = ''; SimUnlock.enablePinDialog(true); $('locked-pin-overlay').hidden = false; $('pin-input').focus(); break; case SimUnlock.SIM_NOT_LOCKED_CHANGE_PIN: SimUnlock.prepareChoosePinDialog(true); if (error == SimUnlock.ERROR_OK) { pinMessage = SimUnlock.localStrings_.getString('changePinMessage'); $('choose-pin-msg').classList.remove('error'); } else if (error == SimUnlock.ERROR_PIN) { pinMessage = SimUnlock.localStrings_.getStringF( 'incorrectPinTriesMessage', tries); $('choose-pin-msg').classList.add('error'); } $('choose-pin-msg').textContent = pinMessage; $('old-pin-input').value = ''; $('new-pin-input').value = ''; $('retype-new-pin-input').value = ''; $('choose-pin-overlay').hidden = false; SimUnlock.enableChoosePinDialog(true); $('old-pin-input').focus(); break; case SimUnlock.SIM_LOCKED_NO_PIN_TRIES_LEFT: $('locked-pin-no-tries-overlay').hidden = false; break; case SimUnlock.SIM_LOCKED_PUK: $('puk-input').value = ''; if (tries && tries >= 0) { var pukMessage = SimUnlock.localStrings_.getStringF( 'enterPukWarning', tries); $('puk-warning-msg').textContent = pukMessage; } $('enter-puk-confirm').disabled = true; $('locked-puk-overlay').hidden = false; $('puk-input').focus(); // Resize the dialog to accomodate the PUK contents. this.updateDialogSize_(0, 45); break; case SimUnlock.SIM_LOCKED_NO_PUK_TRIES_LEFT: $('locked-puk-no-tries-overlay').hidden = false; break; case SimUnlock.SIM_DISABLED: $('sim-disabled-overlay').hidden = false; break; } this.state_ = newState; }, /** * Returns current state of the dialog. * @type {number} value of the state. */ get state() { return this.state_; }, updateDialogSize_: function(deltaX, deltaY) { window.resizeTo(this.defaultDialogSize_.width + deltaX, this.defaultDialogSize_.height + deltaY); }, hideAll_: function() { $('locked-pin-overlay').hidden = true; $('locked-pin-no-tries-overlay').hidden = true; $('locked-puk-overlay').hidden = true; $('choose-pin-overlay').hidden = true; $('locked-puk-no-tries-overlay').hidden = true; $('sim-disabled-overlay').hidden = true; }, newPinEntered_: function(newPin, newPin2) { var changePinMode = this.state_ == SimUnlock.SIM_NOT_LOCKED_CHANGE_PIN; if (newPin.length < SimUnlock.PIN_MIN_LENGTH || newPin2.length < SimUnlock.PIN_MIN_LENGTH || (changePinMode && $('old-pin-input').value.length < SimUnlock.PIN_MIN_LENGTH)) { return; } if (newPin != newPin2) { $('choose-pin-error').hidden = false; $('old-pin-input').value = ''; $('new-pin-input').value = ''; $('retype-new-pin-input').value = ''; if (changePinMode) $('old-pin-input').focus(); else $('new-pin-input').focus(); } else { $('choose-pin-error').hidden = true; SimUnlock.enableChoosePinDialog(false); if (changePinMode) { var oldPin = $('old-pin-input').value; chrome.send('changePinCode', [oldPin, newPin]); } else { chrome.send('enterPukCode', [this.pukValue_, newPin]); this.pukValue_ = ''; } } }, pukEntered_: function(pukValue) { if (pukValue.length < SimUnlock.PUK_LENGTH) return; this.pukValue_ = pukValue; this.hideAll_(); SimUnlock.prepareChoosePinDialog(false); SimUnlock.enableChoosePinDialog(true); $('new-pin-input').value = ''; $('retype-new-pin-input').value = ''; $('choose-pin-overlay').hidden = false; $('new-pin-input').focus(); this.updateDialogSize_(0, 18); }, updateSimStatus_: function(simInfo) { this.changeState_(simInfo); }, }; SimUnlock.cancel = function() { chrome.send('cancel'); SimUnlock.close(); }; SimUnlock.close = function() { window.close(); }; SimUnlock.initialize = function() { this.initialized_ = true; var modePattern = /(^\?|&)mode=([^&#]*)/; var results = modePattern.exec(window.location.search); if (results == null) { this.mode_ = SimUnlock.SIM_DIALOG_UNLOCK; } else { var mode = results[2]; if (mode == 'change-pin') this.mode_ = SimUnlock.SIM_DIALOG_CHANGE_PIN; else if (mode == 'set-lock-on') this.mode_ = SimUnlock.SIM_DIALOG_SET_LOCK_ON; else if (mode == 'set-lock-off') this.mode_ = SimUnlock.SIM_DIALOG_SET_LOCK_OFF; } // PIN input screen. $('pin-input').addEventListener('keydown', function(event) { if (event.keyIdentifier == 'Enter') { SimUnlock.submitPin(); return; } }); $('pin-input').addEventListener('keyup', function(event) { $('enter-pin-confirm').disabled = $('enter-pin-dismiss').disabled || this.value.length < SimUnlock.PIN_MIN_LENGTH; }); $('pin-input').addEventListener('textInput', SimUnlock.processInput.bind(this)); $('enter-pin-confirm').addEventListener('click', function(event) { SimUnlock.submitPin(); }); $('enter-pin-dismiss').addEventListener('click', function(event) { SimUnlock.cancel(); }); // No PIN retries left screen. $('pin-no-tries-proceed').addEventListener('click', function(event) { chrome.send('proceedToPukInput'); }); $('pin-no-tries-dismiss').addEventListener('click', function(event) { SimUnlock.cancel(); }); // PUK input screen. $('puk-input').addEventListener('keydown', function(event) { if (event.keyIdentifier == 'Enter') { SimUnlock.pukEntered($('puk-input').value); return; } }); $('puk-input').addEventListener('keyup', function(event) { $('enter-puk-confirm').disabled = $('enter-puk-dismiss').disabled || this.value.length < SimUnlock.PUK_LENGTH; }); $('puk-input').addEventListener('textInput', SimUnlock.processInput.bind(this)); $('enter-puk-confirm').addEventListener('click', function(event) { SimUnlock.pukEntered($('puk-input').value); }); $('enter-puk-dismiss').addEventListener('click', function(event) { SimUnlock.cancel(); }); // Change PIN / new PIN screen. $('old-pin-input').addEventListener('keydown', function(event) { if (event.keyIdentifier == 'Enter') { if (this.value.length >= SimUnlock.PIN_MIN_LENGTH) $('new-pin-input').focus(); return; } }); $('old-pin-input').addEventListener('keyup', function(event) { $('choose-pin-confirm').disabled = $('choose-pin-dismiss').disabled || this.value.length < SimUnlock.PIN_MIN_LENGTH || $('new-pin-input').value.length < SimUnlock.PIN_MIN_LENGTH || $('retype-new-pin-input').value.length < SimUnlock.PIN_MIN_LENGTH; }); $('old-pin-input').addEventListener('textInput', SimUnlock.processInput.bind(this)); $('new-pin-input').addEventListener('keydown', function(event) { if (event.keyIdentifier == 'Enter') { if (this.value.length >= SimUnlock.PIN_MIN_LENGTH) $('retype-new-pin-input').focus(); return; } }); $('new-pin-input').addEventListener('keyup', function(event) { var changePinMode = SimUnlock.getInstance().state == SimUnlock.SIM_NOT_LOCKED_CHANGE_PIN; var oldPinLengthOk = $('old-pin-input').value.length >= SimUnlock.PIN_MIN_LENGTH; var oldPinOk = !changePinMode || oldPinLengthOk; $('choose-pin-confirm').disabled = $('choose-pin-dismiss').disabled || this.value.length < SimUnlock.PIN_MIN_LENGTH || $('retype-new-pin-input').value.length < SimUnlock.PIN_MIN_LENGTH || !oldPinOk; }); $('new-pin-input').addEventListener('textInput', SimUnlock.processInput.bind(this)); $('retype-new-pin-input').addEventListener('keyup', function(event) { var changePinMode = SimUnlock.getInstance().state == SimUnlock.SIM_NOT_LOCKED_CHANGE_PIN; var oldPinLengthOk = $('old-pin-input').value.length >= SimUnlock.PIN_MIN_LENGTH; var oldPinOk = !changePinMode || oldPinLengthOk; $('choose-pin-confirm').disabled = $('choose-pin-dismiss').disabled || this.value.length < SimUnlock.PIN_MIN_LENGTH || $('new-pin-input').value.length < SimUnlock.PIN_MIN_LENGTH || !oldPinOk; }); $('retype-new-pin-input').addEventListener('keydown', function(event) { if (event.keyIdentifier == 'Enter') { SimUnlock.newPinEntered($('new-pin-input').value, $('retype-new-pin-input').value); return; } }); $('retype-new-pin-input').addEventListener('textInput', SimUnlock.processInput.bind(this)); $('choose-pin-confirm').addEventListener('click', function(event) { SimUnlock.newPinEntered($('new-pin-input').value, $('retype-new-pin-input').value); }); $('choose-pin-dismiss').addEventListener('click', function(event) { SimUnlock.cancel(); }); // SIM blocked screens. $('puk-no-tries-confirm').addEventListener('click', function(event) { SimUnlock.close(); }); $('sim-disabled-confirm').addEventListener('click', function(event) { SimUnlock.close(); }); chrome.send('simStatusInitialize', [this.mode_]); }; SimUnlock.enablePinDialog = function(enabled) { $('pin-input').disabled = !enabled; // Ok button is initially disabled. $('enter-pin-confirm').disabled = true; $('enter-pin-dismiss').disabled = !enabled; }; SimUnlock.enableChoosePinDialog = function(enabled) { $('old-pin-input').disabled = !enabled; $('new-pin-input').disabled = !enabled; $('retype-new-pin-input').disabled = !enabled; // Ok button is initially disabled. $('choose-pin-confirm').disabled = true; $('choose-pin-dismiss').disabled = !enabled; }; SimUnlock.submitPin = function() { var pin = $('pin-input').value; if (pin.length < SimUnlock.PIN_MIN_LENGTH) return; SimUnlock.enablePinDialog(false); chrome.send('enterPinCode', [pin]); }; SimUnlock.prepareChoosePinDialog = function(changePin) { // Our dialog has different height than choose-pin step of the // unlock process which we're reusing. if (changePin) { $('choose-pin-content-area').classList.remove('choose-pin-content-area'); $('choose-pin-content-area').classList.add('change-pin-content-area'); var title = SimUnlock.localStrings_.getString('changePinTitle'); $('choose-pin-title').textContent = title; } else { $('choose-pin-content-area').classList.remove('change-pin-content-area'); $('choose-pin-content-area').classList.add('choose-pin-content-area'); var pinMessage = SimUnlock.localStrings_.getString('choosePinMessage'); $('choose-pin-msg').classList.remove('error'); $('choose-pin-msg').textContent = pinMessage; var title = SimUnlock.localStrings_.getString('choosePinTitle'); $('choose-pin-title').textContent = title; } $('old-pin-label').hidden = !changePin; $('old-pin-input-area').hidden = !changePin; }; SimUnlock.newPinEntered = function(newPin, newPin2) { SimUnlock.getInstance().newPinEntered_(newPin, newPin2); }; SimUnlock.pukEntered = function(pukValue) { SimUnlock.getInstance().pukEntered_(pukValue); }; /** * Processes PIN/PUK fields input, restricting it to 0..9. */ SimUnlock.processInput = function(event) { if (/[^0-9]+/gi.test(event.data)) event.preventDefault(); }; SimUnlock.simStateChanged = function(simInfo) { SimUnlock.getInstance().updateSimStatus_(simInfo); }; // Export return { SimUnlock: SimUnlock }; }); disableTextSelectAndDrag();