| // 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.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 = loadTimeData.getStringF('enterPinTriesMessage', tries); |
| $('pin-error-msg').classList.remove('error'); |
| } else if (error == SimUnlock.ERROR_PIN) { |
| pinMessage = loadTimeData.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 = loadTimeData.getString('enterPinMessage'); |
| $('pin-error-msg').classList.remove('error'); |
| } else if (error == SimUnlock.ERROR_PIN) { |
| pinMessage = loadTimeData.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 = loadTimeData.getString('changePinMessage'); |
| $('choose-pin-msg').classList.remove('error'); |
| } else if (error == SimUnlock.ERROR_PIN) { |
| pinMessage = loadTimeData.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 = loadTimeData.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() { |
| 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.key == '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.key == '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.key == '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.key == '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.key == '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 = loadTimeData.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 = loadTimeData.getString('choosePinMessage'); |
| $('choose-pin-msg').classList.remove('error'); |
| $('choose-pin-msg').textContent = pinMessage; |
| var title = loadTimeData.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(); |