Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge pull request #7322 from fcampo/pukCode

[816152] Adding PUK management to FTU (r=fbsc,kaze,l10n)
  • Loading branch information...
commit 2a3b7e85e8d115b004224c91323abe8da62d45fb 2 parents 061cef6 + 259613a
@fcampo fcampo authored
View
36 apps/communications/ftu/css/style.css
@@ -199,45 +199,54 @@ html, body {
/*
Pin code screen
*/
+#unlock-sim-screen {
+ z-index: 2000;
+}
-#pincode-screen .pin_container {
+#unlock-sim-screen .unlock_container {
height: calc(100% - 10rem);
}
-#pincode-screen section header {
+#unlock-sim-screen section label {
padding: 1.5rem 3rem 0.5rem 3rem;
color: black;
font-size: 1.5rem;
+ width: auto;
+ height: 2rem;
}
-#pincode-screen .input-wrapper {
+#unlock-sim-screen .input-wrapper {
padding: 0 1.5rem;
position: relative;
}
-#pincode-screen #pin-error {
+#unlock-sim-screen .info {
+ font-size: 1.5rem;
+ padding: 1rem 1.5rem;
+}
+
+#unlock-sim-screen .error {
padding: 1rem 2rem;
font-size: 1.5rem;
color: red;
}
-#pincode-screen #pin-input.onerror {
- border-color: red;
+#unlock-sim-screen .onerror {
+ border: 0.1rem solid red;
}
-#pincode-screen .input-wrapper input {
+#unlock-sim-screen .input-wrapper input {
font-size: 2rem;
padding-left: 1.5rem;
- pointer-events: none;
}
-#pincode-screen #fake-sim-pin {
+#unlock-sim-screen .fake-input {
margin-top: -4rem;
opacity: 0;
- pointer-events: auto;
+
}
-#pincode-screen input[type="number"] {
+#unlock-sim-screen input[type="number"] {
-moz-box-sizing: border-box;
display: block;
overflow: hidden;
@@ -245,6 +254,11 @@ html, body {
height: 4rem;
resize: none;
padding: 0 0.8rem;
+ pointer-events: auto;
+}
+
+#unlock-sim-screen input[type="password"] {
+ pointer-events: none;
}
/*
View
51 apps/communications/ftu/index.html
@@ -63,24 +63,49 @@
<section id="splash-screen" role="region" class="show">
</section>
- <section id="pincode-screen" role="region" class="skin-organic">
+ <section id="unlock-sim-screen" role="region" class="skin-organic">
<header>
- <h1 data-l10n-id="pincode">Pin code</h1>
+ <h1 id="unlock-sim-header" data-l10n-id="pincode2">Enter PIN code</h1>
</header>
- <section class="pin_container">
- <header data-l10n-id="type_pin">Type your PIN code:</header>
- <section class="input-wrapper">
- <input id="pin-input" name="simpin" type="password" size="8" maxlength="8" />
- <input id="fake-sim-pin" name="fakesimpin" type="number" size="8" maxlength="8" />
- <div id="pin-error"></div>
+ <article role="main">
+ <section id="pincode-screen" role="region">
+ <label id="pin-label" data-l10n-id="type_pin">Type your PIN code</label>
+ <section class="input-wrapper">
+ <input id="pin-input" name="simpin" type="password" size="8" maxlength="8" />
+ <input id="fake-pin-input" class="fake-input" name="fake-simpin" type="number" size="8" maxlength="8" />
+ <div id="pin-error" class="hidden error"></div>
+ </section>
</section>
- </section>
+
+ <section id="pukcode-screen" role="region">
+ <label id="puk-label" data-l10n-id="simLocked">The SIM card is locked</label>
+ <section class="input-wrapper">
+ <input id="puk-input" name="simpuk" type="password" size="8" maxlength="8" />
+ <input id="fake-puk-input" class="fake-input" name="fake-simpuk" type="number" size="8" maxlength="8" />
+ <div id="puk-info" class="info" data-l10n-id="pukError">You must enter the Personal Unlocking Key (PUK) Code for the SIM card. Refer to your SIM card documentation or contact your carrier for more information.</div>
+ <div id="puk-error" class="hidden error"></div>
+ </section>
+ <label id="newpin" data-l10n-id="create_newpin">Create new PIN (4 to 8 digits)</label>
+ <section class="input-wrapper">
+ <input id="newpin-input" name="newpin" type="password" size="8" maxlength="8" />
+ <input id="fake-newpin-input" class="fake-input" name="fake-newpin" type="number" size="8" maxlength="8" />
+ <div id="newpin-error" class="hidden error"></div>
+ </section>
+ <label id="confirm-newpin" data-l10n-id="confirm_newpin">Confirm new PIN</label>
+ <section class="input-wrapper">
+ <input id="confirm-newpin-input" name="confirm-newpin" type="password" size="8" maxlength="8" />
+ <input id="fake-confirm-newpin-input" class="fake-input" name="fake-confirm-newpin" type="number" size="8" maxlength="8" />
+ <div id="confirm-newpin-error" class="hidden error"></div>
+ </section>
+ </section>
+ </article>
+
<nav role="navigation">
<button id="skip-pin-button" class="button-left" data-l10n-id="skip">
Skip
</button>
- <button id="unlock-sim-button" class="recommend" data-l10n-id="done">
- Done
+ <button id="unlock-sim-button" class="recommend" data-l10n-id="send">
+ Send
</button>
</nav>
</section>
@@ -510,7 +535,7 @@ <h1 data-l10n-id='offline-newsletter-dialog-title'>You must be connected to the
</menu>
</section>
</form>
-
+
<form role='dialog' data-type='confirm' id='invalid-email-error-dialog'>
<section>
<h1 data-l10n-id='invalid-email-dialog-title'>Your email is not valid</h1>
@@ -520,7 +545,7 @@ <h1 data-l10n-id='invalid-email-dialog-title'>Your email is not valid</h1>
</menu>
</section>
</form>
-
+
<section id="loading-overlay" role="region" class="view">
<article class="loading-container">
<header class="loading-header" id="loading-header">
View
25 apps/communications/ftu/js/app.js
@@ -3,9 +3,10 @@
var _ = navigator.mozL10n.get;
var AppManager = {
- thereIsSIM: false,
+
init: function init() {
this.isLocalized = true;
+ SimManager.init();
WifiManager.init();
FacebookIntegration.init();
TimeManager.init();
@@ -19,9 +20,10 @@ var AppManager = {
setTimeout(function() {
// For desktop
window.location.hash = '#';
- UIManager.splashScreen.classList.remove('show');
UIManager.activationScreen.classList.add('show');
window.location.hash = '#languages';
+
+ UIManager.splashScreen.classList.remove('show');
}, kSplashTimeout);
return;
}
@@ -31,23 +33,8 @@ var AppManager = {
// TODO Include VIVO SIM Card management
// https://bugzilla.mozilla.org/show_bug.cgi?id=801269#c6
var self = this;
- var req = conn.getCardLock('pin');
- req.onsuccess = function spl_checkSuccess() {
- AppManager.thereIsSIM = true;
- if (req.result.enabled) {
- UIManager.pincodeScreen.classList.add('show');
- document.getElementById('fake-sim-pin').focus();
- } else {
- // Set the unlocked status so we can still import
- SimManager.unlocked = true;
- UIManager.activationScreen.classList.add('show');
- window.location.hash = '#languages';
- }
- };
- req.onerror = function() {
- UIManager.activationScreen.classList.add('show');
- window.location.hash = '#languages';
- };
+ SimManager.handleCardState();
+
// Remove the splash
UIManager.splashScreen.classList.remove('show');
}, kSplashTimeout);
View
9 apps/communications/ftu/js/navigation.js
@@ -84,7 +84,7 @@ var Navigation = {
self.currentStep--;
if (self.currentStep > 0) {
var followingStep = steps[self.currentStep];
- if (followingStep.requireSIM && !SimManager.unlocked) {
+ if (followingStep.requireSIM && !SimManager.available()) {
goToStep();
} else {
self.manageStep();
@@ -115,7 +115,7 @@ var Navigation = {
return;
}
var followingStep = steps[self.currentStep];
- if (followingStep.requireSIM && !SimManager.unlocked) {
+ if (followingStep.requireSIM && !SimManager.available()) {
goToStepForward();
} else {
self.manageStep();
@@ -192,13 +192,14 @@ var Navigation = {
var fbOption = document.getElementById('fb_import');
var simOption = document.getElementById('sim-import-button');
// If there is an unlocked SIM we activate import from SIM
- if (AppManager.thereIsSIM && SimManager.unlocked) {
+ if (SimManager.available()) {
simOption.classList.remove('disabled');
} else {
simOption.classList.add('disabled');
}
// If we have 3G or Wifi activate FB import
- if (WifiManager.api.connection.status === 'connected' || DataMobile.isDataAvailable) {
+ if (WifiManager.api.connection.status === 'connected' ||
+ DataMobile.isDataAvailable) {
fbOption.classList.remove('disabled');
} else {
fbOption.classList.add('disabled');
View
183 apps/communications/ftu/js/sim_manager.js
@@ -1,16 +1,83 @@
'use strict';
var SimManager = {
- unlocked: false,
- showScreen: function sm_showScreen() {
+ init: function sm_init() {
+ this.mobConn = window.navigator.mozMobileConnection;
+ if (!this.mobConn)
+ return;
+
+ this.mobConn.addEventListener('icccardlockerror',
+ this.handleUnlockError.bind(this));
+ this.mobConn.addEventListener('cardstatechange',
+ this.handleCardState.bind(this));
+ },
+
+ handleUnlockError: function sm_handleUnlockError(data) {
+ switch (data.lockType) {
+ case 'pin':
+ UIManager.pinInput.value = '';
+ UIManager.fakePinInput.value = '';
+ UIManager.pinInput.classList.add('onerror');
+ UIManager.pinError.innerHTML = _('pinErrorMsg');
+ UIManager.pinError.classList.remove('hidden');
+ UIManager.pinLabel.innerHTML = _('pinAttemptMsg2', {n: data.retryCount});
+ if (data.retryCount == 1)
+ UIManager.pinError.innerHTML += _('pinLastChanceMsg');
+ break;
+ case 'puk':
+ UIManager.pukInput.value = '';
+ UIManager.fakePukInput.value = '';
+ UIManager.pukInput.classList.add('onerror');
+ UIManager.pukError.innerHTML = _('pukErrorMsg');
+ UIManager.pukError.classList.remove('hidden');
+ UIManager.pukInfo.classList.add('hidden');
+ UIManager.pukLabel.innerHTML = _('pukAttemptMsg', {n: data.retryCount});
+ // TODO what if counter gets to 0 ??
+ break;
+ }
+ },
+
+ available: function sm_available() {
+ if (!this.mobConn)
+ return false;
+ return (this.mobConn.cardState == 'ready');
+ },
+
+ handleCardState: function sm_handleCardState() {
+ switch (this.mobConn.cardState) {
+ case 'pinRequired':
+ this.showPinScreen();
+ break;
+ case 'pukRequired':
+ this.showPukScreen();
+ break;
+ default:
+ this.skip();
+ break;
+ }
+ },
+
+ showPinScreen: function sm_showScreen() {
+ UIManager.activationScreen.classList.remove('show');
+ UIManager.unlockSimScreen.classList.add('show');
UIManager.pincodeScreen.classList.add('show');
+ UIManager.fakePinInput.focus();
+ },
+
+ showPukScreen: function sm_showPukScreen() {
+ UIManager.unlockSimScreen.classList.add('show');
UIManager.activationScreen.classList.remove('show');
- UIManager.fakeSimPin.focus();
+ UIManager.pincodeScreen.classList.remove('show');
+ UIManager.pukcodeScreen.classList.add('show');
+ UIManager.unlockSimHeader.innerHTML = _('pukcode');
+ UIManager.fakePukInput.focus();
},
hideScreen: function sm_hideScreen() {
+ UIManager.unlockSimScreen.classList.remove('show');
UIManager.pincodeScreen.classList.remove('show');
+ UIManager.pukcodeScreen.classList.remove('show');
UIManager.activationScreen.classList.add('show');
window.location.hash = '#languages';
Navigation.currentStep = 1;
@@ -21,6 +88,87 @@ var SimManager = {
this.hideScreen();
},
+ unlock: function sm_unlock() {
+ switch (this.mobConn.cardState) {
+ case 'pinRequired':
+ this.unlockPin();
+ break;
+ case 'pukRequired':
+ this.unlockPuk();
+ break;
+ }
+ },
+
+ unlockPin: function sm_unlockPin() {
+ var pin = UIManager.pinInput.value;
+ if (pin.length < 4 || pin.length > 8) {
+ UIManager.pinError.innerHTML = _('pinValidation');
+ UIManager.pinInput.classList.add('onerror');
+ UIManager.pinError.classList.remove('hidden');
+ return;
+ } else {
+ UIManager.pinInput.classList.remove('onerror');
+ UIManager.pinError.classList.add('hidden');
+ }
+
+ // Unlock SIM
+ var options = {lockType: 'pin', pin: pin };
+ var req = this.mobConn.unlockCardLock(options);
+ req.onsuccess = function sm_unlockSuccess() {
+ this.hideScreen();
+ }.bind(this);
+ },
+
+ clearFields: function sm_clearFields() {
+ UIManager.pukInput.classList.remove('onerror');
+ UIManager.pukError.innerHTML = '';
+ UIManager.pukError.classList.add('hidden');
+
+ UIManager.newpinInput.classList.remove('onerror');
+ UIManager.newpinError.innerHTML = '';
+ UIManager.newpinError.classList.add('hidden');
+
+ UIManager.confirmNewpinInput.classList.remove('onerror');
+ UIManager.confirmNewpinError.innerHTML = '';
+ UIManager.confirmNewpinError.classList.add('hidden');
+ },
+ unlockPuk: function sm_unlockPuk() {
+ this.clearFields();
+ var pukCode = UIManager.pukInput.value;
+ if (pukCode.length !== 8) {
+ UIManager.pukError.innerHTML = _('pukValidation');
+ UIManager.pukError.classList.remove('hidden');
+ UIManager.pukInfo.classList.add('hidden');
+ UIManager.pukInput.classList.add('onerror');
+ UIManager.pukError.focus();
+ return;
+ }
+ var newpinCode = UIManager.newpinInput.value;
+ var confirmNewpin = UIManager.confirmNewpinInput.value;
+ if (newpinCode.length < 4 || newpinCode.length > 8) {
+ UIManager.newpinError.innerHTML = _('pinValidation');
+ UIManager.newpinError.classList.remove('hidden');
+ UIManager.newpinInput.classList.add('onerror');
+ UIManager.newpinError.focus();
+ return;
+ }
+ if (newpinCode != confirmNewpin) {
+ UIManager.confirmNewpinError.innerHTML = _('newpinConfirmation');
+ UIManager.confirmNewpinError.classList.remove('hidden');
+ UIManager.newpinInput.classList.add('onerror');
+ UIManager.confirmNewpinInput.classList.add('onerror');
+ UIManager.confirmNewpinError.focus();
+ return;
+ }
+
+ // Unlock SIM with PUK and new PIN
+ var options = {lockType: 'puk', puk: pukCode, newPin: newpinCode };
+ var req = this.mobConn.unlockCardLock(options);
+ req.onsuccess = function sm_unlockSuccess() {
+ this.hideScreen();
+ }.bind(this);
+ },
+
importContacts: function sm_importContacts() {
var feedback = UIManager.simImportFeedback;
feedback.innerHTML = _('simContacts-importing');
@@ -43,35 +191,6 @@ var SimManager = {
UIManager.loadingOverlay.classList.remove('show-overlay');
importButton.classList.remove('disabled');
}.bind(this));
- },
-
- unlock: function sm_unlock() {
- var pin = UIManager.pinInput.value;
- if (pin.length < 4 || pin.length > 8) {
- UIManager.pinError.innerHTML = _('pinValidation');
- return;
- }
-
- // Unlock SIM
- var options = {lockType: 'pin', pin: pin };
- var conn = window.navigator.mozMobileConnection;
-
- conn.addEventListener('icccardlockerror', function(data) {
- UIManager.pinInput.value = '';
- UIManager.fakeSimPin.value = '';
- UIManager.pinInput.classList.add('onerror');
- UIManager.pinError.innerHTML = _('pinErrorMsg') + ' ' +
- _('pinAttemptMsg', {n: data.retryCount});
- });
-
- var req = conn.unlockCardLock(options);
-
- req.onsuccess = function sm_unlockSuccess() {
- this.unlocked = true;
- UIManager.pincodeScreen.classList.remove('show');
- UIManager.activationScreen.classList.add('show');
- window.location.hash = '#languages';
- }.bind(this);
}
};
View
57 apps/communications/ftu/js/ui.js
@@ -15,15 +15,33 @@ var UIManager = {
'main-title',
'loading-overlay',
'loading-header',
+ // Unlock SIM Screen
+ 'unlock-sim-screen',
+ 'unlock-sim-header',
// PIN Screen
'pincode-screen',
+ 'pin-label',
'pin-input',
- 'fake-sim-pin',
+ 'fake-pin-input',
'pin-error',
- 'sim-import-button',
- 'sim-import-feedback',
'skip-pin-button',
'unlock-sim-button',
+ // PUK Screen
+ 'pukcode-screen',
+ 'puk-label',
+ 'puk-input',
+ 'puk-info',
+ 'fake-puk-input',
+ 'puk-error',
+ 'newpin-input',
+ 'fake-newpin-input',
+ 'newpin-error',
+ 'confirm-newpin-input',
+ 'fake-confirm-newpin-input',
+ 'confirm-newpin-error',
+ // Import contacts
+ 'sim-import-button',
+ 'sim-import-feedback',
// Wifi
'networks',
'wifi-refresh-button',
@@ -54,7 +72,6 @@ var UIManager = {
],
init: function ui_init() {
-
// Initialization of the DOM selectors
this.domSelectors.forEach(function createElementRef(name) {
this[toCamelCase(name)] = document.getElementById(name);
@@ -67,7 +84,13 @@ var UIManager = {
this.dateConfigurationLabel.innerHTML = currentDate.
toLocaleFormat('%Y-%m-%d');
// Add events to DOM
- this.fakeSimPin.addEventListener('input', this);
+ this.fakePinInput.addEventListener('keypress', this.fakeInputValues.bind(this));
+ this.fakePukInput.addEventListener('keypress', this.fakeInputValues.bind(this));
+ this.fakeNewpinInput.addEventListener('keypress',
+ this.fakeInputValues.bind(this));
+ this.fakeConfirmNewpinInput.addEventListener('keypress',
+ this.fakeInputValues.bind(this));
+
this.simImportButton.addEventListener('click', this);
this.skipPinButton.addEventListener('click', this);
this.unlockSimButton.addEventListener('click', this);
@@ -81,6 +104,7 @@ var UIManager = {
this.timeConfiguration.addEventListener('input', this);
this.dateConfiguration.addEventListener('input', this);
this.initTZ();
+
// Prevent form submit in case something tries to send it
this.timeForm.addEventListener('submit', function(event) {
event.preventDefault();
@@ -150,7 +174,7 @@ var UIManager = {
this.sharePerformance.addEventListener('click', this);
var button = this.offlineErrorDialog.querySelector('button');
button.addEventListener('click',
- this.onOfflineDialogButtonClick.bind(this));
+ this.onOfflineDialogButtonClick.bind(this));
},
initTZ: function ui_initTZ() {
@@ -160,6 +184,23 @@ var UIManager = {
tzSelect(tzRegion, tzCity, this.setTimeZone);
},
+ fakeInputValues: function ui_fakeInputValues(event) {
+ var fakeInput = event.target;
+ var code = event.charCode;
+ if (code === 0 || (code >= 0x30 && code <= 0x39)) {
+ var displayInput =
+ document.getElementById(fakeInput.id.substr(5, fakeInput.length));
+ var content = displayInput.value;
+ if (code === 0) { // backspace
+ content = content.substr(0, content.length - 1);
+ } else {
+ content += String.fromCharCode(code);
+ }
+ displayInput.value = content;
+ }
+ fakeInput.value = '';
+ },
+
handleEvent: function ui_handleEvent(event) {
switch (event.target.id) {
// SIM
@@ -169,10 +210,6 @@ var UIManager = {
case 'unlock-sim-button':
SimManager.unlock();
break;
- // workaround for a number-passsword input
- case 'fake-sim-pin':
- this.pinInput.value = this.fakeSimPin.value;
- break;
case 'sim-import-button':
SimManager.importContacts();
break;
View
38 apps/communications/ftu/locales/ftu.en-US.properties
@@ -1,19 +1,35 @@
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
-# PIN Code
+# Unlock Codes
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
-pincode=PIN code
-type_pin=Type your pin code
-done=Done
+pincode2=Enter PIN code
+type_pin=Type your PIN code
+skip=Skip
+send=Send
pinValidation=PIN must have between 4 and 8 characters.
pinErrorMsg=The PIN was incorrect.
-pinAttemptMsg={[ plural(n) ]}
-pinAttemptMsg[zero]=No tries left
-pinAttemptMsg[one]=One last try
-pinAttemptMsg[two]={{n}} tries left
-pinAttemptMsg[few]={{n}} tries left
-pinAttemptMsg[many]={{n}} tries left
-pinAttemptMsg[other]={{n}} tries left
+pinAttemptMsg2 ={[ plural(n) ]}
+pinAttemptMsg2[one] =Last chance.
+pinAttemptMsg2[two] ={{n}} tries left.
+pinAttemptMsg2[few] ={{n}} tries left.
+pinAttemptMsg2[many] ={{n}} tries left.
+pinAttemptMsg2[other] ={{n}} tries left.
+pinLastChanceMsg=This is your last chance to enter the correct PIN. Otherwise, you must enter the PUK code to use this SIM card.
+pukcode=Enter PUK code
+type_puk=PUK code
+create_newpin=Create new PIN (4 to 8 digits)
+confirm_newpin=Confirm new PIN
+simLocked=The SIM card is locked
+pukError=You must enter the Personal Unlocking Key (PUK) Code for the SIM card. Refer to your SIM card documentation or contact your carrier for more information.
+pukErrorMsg=The PUK was incorrect
+pukAttemptMsg ={[ plural(n) ]}
+pukAttemptMsg[one] =Last chance.
+pukAttemptMsg[two] ={{n}} tries left.
+pukAttemptMsg[few] ={{n}} tries left.
+pukAttemptMsg[many] ={{n}} tries left.
+pukAttemptMsg[other] ={{n}} tries left.
+pukValidation=PUK code must have exactly 8 characters.
+newpinConfirmation=PINs don’t match
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
# Language
View
4 apps/settings/js/simcard_dialog.js
@@ -131,9 +131,9 @@ var SimPinDialog = {
if (retry !== 1) {
var l10nArgs = { n: retry };
- this.errorMsgBody.dataset.l10nId = type + 'AttemptMsg';
+ this.errorMsgBody.dataset.l10nId = type + 'AttemptMsg2';
this.errorMsgBody.dataset.l10nArgs = JSON.stringify(l10nArgs);
- this.errorMsgBody.textContent = _(type + 'AttemptMsg', l10nArgs);
+ this.errorMsgBody.textContent = _(type + 'AttemptMsg2', l10nArgs);
} else {
this.errorMsgBody.dataset.l10nId = type + 'LastChanceMsg';
this.errorMsgBody.textContent = _(type + 'LastChanceMsg');
View
16 apps/settings/locales/settings.en-US.properties
@@ -354,17 +354,17 @@ pinTitle=Enter SIM PIN
pukTitle=Enter PUK code
newpinTitle=New PIN
pinErrorMsg=The PIN was incorrect.
-pinAttemptMsg={[ plural(n) ]}
-pinAttemptMsg[one] = one last try.
-pinAttemptMsg[two] = {{n}} tries left.
-pinAttemptMsg[few] = {{n}} tries left.
-pinAttemptMsg[many] = {{n}} tries left.
-pinAttemptMsg[other] = {{n}} tries left.
+pinAttemptMsg2={[ plural(n) ]}
+pinAttemptMsg2[one] = Last chance.
+pinAttemptMsg2[two] = {{n}} tries left.
+pinAttemptMsg2[few] = {{n}} tries left.
+pinAttemptMsg2[many] = {{n}} tries left.
+pinAttemptMsg2[other] = {{n}} tries left.
pinLastChanceMsg=This is your last chance to enter the correct PIN. Otherwise, you must enter the PUK code to use this SIM card.
simCardLockedMsg=The SIM card is locked.
enterPukMsg=You must enter the Personal Unlocking Key (PUK) code for the SIM card. Refer to your SIM card documentation or contact your carrier for more information.
pukErrorMsg=The PUK code is incorrect.
-pukAttemptMsg=You have {{n}} tries left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
+pukAttemptMsg2=You have {{n}} tries left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
pukLastChanceMsg=Last chance to enter the correct PUK code. Your SIM card will be permanently unusable if you enter in the wrong PUK code. Refer to your SIM card documentation or contact your carrier for more information.
newSimPinMsg=Create PIN (must contain 4 to 8 digits)
confirmNewSimPinMsg=Confirm new PIN
@@ -517,7 +517,7 @@ crash-reports-description-1=A crash report contains some details about the crash
crash-reports-description-2=This may include things like open pages and apps, text typed into forms and the content of open messages, recent browsing history, or geolocation used by an open app.
# LOCALIZATION NOTE (crash-reports-description-3-*): these strings are a paragraph, with a "privacy policy"
# link in the middle. Include trailing spaces as needed.
-crash-reports-description-3-start=We use crash reports to try to fix problems and improve our products. We handle your information as we describe in our
+crash-reports-description-3-start=We use crash reports to try to fix problems and improve our products. We handle your information as we describe in our
crash-reports-description-3-privacy=privacy policy
crash-reports-description-3-end=.
Please sign in to comment.
Something went wrong with that request. Please try again.